ghost 6.63.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 (883) hide show
  1. package/bin/create-migration.js +15 -0
  2. package/bin/lib/duplicate-deps.js +204 -0
  3. package/bin/validate-adapters.js +50 -6
  4. package/components/tryghost-adapter-base-scheduling-0.2.4.tgz +0 -0
  5. package/components/tryghost-adapter-base-sso-0.1.3.tgz +0 -0
  6. package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
  7. package/components/tryghost-api-framework-0.0.0.tgz +0 -0
  8. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  9. package/components/{tryghost-kg-default-cards-10.3.5.tgz → tryghost-kg-default-cards-10.3.6.tgz} +0 -0
  10. package/components/tryghost-kg-default-nodes-2.2.1.tgz +0 -0
  11. package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
  12. package/components/{tryghost-kg-lexical-html-renderer-1.5.0.tgz → tryghost-kg-lexical-html-renderer-1.5.1.tgz} +0 -0
  13. package/components/tryghost-limit-service-0.0.0.tgz +0 -0
  14. package/components/tryghost-metafield-types-0.0.0.tgz +0 -0
  15. package/content/themes/casper/assets/built/casper.js +1 -1
  16. package/content/themes/casper/assets/built/screen.css +1 -1
  17. package/content/themes/casper/assets/css/screen.css +15 -2
  18. package/content/themes/casper/assets/js/init.js +37 -9
  19. package/content/themes/casper/package.json +8 -8
  20. package/content/themes/source/assets/built/screen.css +1 -1
  21. package/content/themes/source/assets/built/source.js +1 -1
  22. package/content/themes/source/assets/css/screen.css +15 -2
  23. package/content/themes/source/assets/js/main.js +24 -4
  24. package/content/themes/source/package.json +8 -8
  25. package/core/boot.js +27 -15
  26. package/core/bridge.js +1 -1
  27. package/core/built/admin/assets/Combination-DQ6f9A5P.js +41 -0
  28. package/core/built/admin/assets/{PolarAngleAxis-pkMyqz8g.js → PolarAngleAxis-BBaU7PRV.js} +2 -2
  29. package/core/built/admin/assets/RadialBarChart-Bp20JPnA.js +1 -0
  30. package/core/built/admin/assets/about-Dp43j18M.js +1 -0
  31. package/core/built/admin/assets/accordion-h62UzFhj.js +1 -0
  32. package/core/built/admin/assets/account-migration-CBTbtX6Q.js +1 -0
  33. package/core/built/admin/assets/action-list-DC9QpX-l.js +1 -0
  34. package/core/built/admin/assets/activitypub/{account-migration-KA6Jjf9L.js → account-migration-B1DUZS4Q.js} +8 -8
  35. package/core/built/admin/assets/activitypub/activitypub.js +24 -11
  36. package/core/built/admin/assets/activitypub/avatar-CRGud8yf.js +153 -0
  37. package/core/built/admin/assets/activitypub/{avatar-flipboard-csQaNeYK.js → avatar-flipboard-BZNFAXfm.js} +3 -3
  38. package/core/built/admin/assets/activitypub/{bluesky-sharing-C7nTDMvw.js → bluesky-sharing-Cg_v-LwS.js} +30 -31
  39. package/core/built/admin/assets/activitypub/{chunk-KS7C4IRE-Ck3O4oo2.js → chunk-KS7C4IRE-CTUL98Lc.js} +2498 -1885
  40. package/core/built/admin/assets/activitypub/{content-formatters-CLcjaBwV.js → content-formatters-D7GWP7nH.js} +23 -24
  41. package/core/built/admin/assets/activitypub/{copy-DcOh8kXw.js → copy-CgzTvoeR.js} +2 -2
  42. package/core/built/admin/assets/activitypub/{domain-fZ-X8i4-.js → domain-C3G_nkHU.js} +46 -46
  43. package/core/built/admin/assets/activitypub/{edit-profile-BqMLQV88.js → edit-profile-C8cCY-AK.js} +927 -928
  44. package/core/built/admin/assets/activitypub/{explore-B4yPoP8E.js → explore-NlDT4inq.js} +11 -11
  45. package/core/built/admin/assets/activitypub/{feed-BRC_mvAe.js → feed-DF22jCTV.js} +10 -10
  46. package/core/built/admin/assets/activitypub/{field-COacNgOt.js → field-95-iuTte.js} +4 -4
  47. package/core/built/admin/assets/activitypub/{hash-C7u-irQQ.js → hash-R7LMLnhY.js} +2 -2
  48. package/core/built/admin/assets/activitypub/{inbox-CbTTdDQ3.js → inbox-DUJUiV6x.js} +2 -2
  49. package/core/built/admin/assets/activitypub/{inbox-BW-yvUoN.js → inbox-DerExBzA.js} +416 -414
  50. package/core/built/admin/assets/activitypub/{label-kPMmYI7l.js → label-EwCn1QYc.js} +4 -4
  51. package/core/built/admin/assets/activitypub/layout-Dy6NnW1G.js +1 -0
  52. package/core/built/admin/assets/activitypub/{moderation-CuidJzc0.js → moderation-BSkfiVYo.js} +73 -75
  53. package/core/built/admin/assets/activitypub/{note-CAMRRSqD.js → note-DOnAJTXK.js} +9 -9
  54. package/core/built/admin/assets/activitypub/{notifications-BmNlXGgp.js → notifications-DZc6XTjG.js} +27 -27
  55. package/core/built/admin/assets/activitypub/{onboarding-Dmun9jr_.js → onboarding-8vEIwYTH.js} +3 -3
  56. package/core/built/admin/assets/activitypub/{onboarding-Bqg7fh_L.js → onboarding-DYVqbNmp.js} +2 -2
  57. package/core/built/admin/assets/activitypub/{preferences--oH19wf9.js → preferences-DDok6F2N.js} +1418 -1390
  58. package/core/built/admin/assets/activitypub/{profile-DH_tQx2D.js → profile-DjVa2hUk.js} +254 -255
  59. package/core/built/admin/assets/activitypub/{reply-Cap9PxSH.js → reply-DtXBpHxu.js} +2 -2
  60. package/core/built/admin/assets/activitypub/routes-Cw302e1c.js +4946 -0
  61. package/core/built/admin/assets/activitypub/{separator-CAxxu8VV.js → separator-FpRpVDd3.js} +8 -9
  62. package/core/built/admin/assets/activitypub/settings-yK-puALn.js +314 -0
  63. package/core/built/admin/assets/activitypub/{site-BYps63oh.js → site-CHw0R2PA.js} +2 -2
  64. package/core/built/admin/assets/activitypub/{step-1-CKjR2KAm.js → step-1-737bnvxk.js} +7 -7
  65. package/core/built/admin/assets/activitypub/{step-2-B6PKfOUQ.js → step-2-DBaIsAsM.js} +7 -7
  66. package/core/built/admin/assets/activitypub/{step-3-C-qBbcUo.js → step-3-BBmy9m9V.js} +23 -23
  67. package/core/built/admin/assets/activitypub/tabs-LQ2xirdm.js +1101 -0
  68. package/core/built/admin/assets/activitypub/{topic-filter-DsUOuu0k.js → topic-filter-75Nu0CKj.js} +4 -4
  69. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CX9snsLs.js → use-activity-pub-queries-CYI2QJMs.js} +58 -58
  70. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-DsJTGDSS.js → use-navigate-with-base-path-B4jZ8hyg.js} +3924 -1403
  71. package/core/built/admin/assets/activitypub/{use-reply-chain-data-AJi9zkzm.js → use-reply-chain-data-BHmFxc3U.js} +6 -6
  72. package/core/built/admin/assets/activitypub/users-CSjOwpT9.js +886 -0
  73. package/core/built/admin/assets/activitypub/{x-DR8AT3-4.js → x-B9ptWCds.js} +2 -2
  74. package/core/built/admin/assets/add-integration-modal-BwePhq95.js +1 -0
  75. package/core/built/admin/assets/add-newsletter-modal-Zv0I7Msm.js +1 -0
  76. package/core/built/admin/assets/add-recommendation-modal-cdLv0wHy.js +1 -0
  77. package/core/built/admin/assets/analytics-DY8_SaP7.js +1 -0
  78. package/core/built/admin/assets/announcement-bar-modal-C-2yWwag.js +1 -0
  79. package/core/built/admin/assets/api-keys-BHKATUqQ.js +1 -0
  80. package/core/built/admin/assets/{api-keys-BGPzLHzA.js → api-keys-omLA6iYn.js} +1 -1
  81. package/core/built/admin/assets/{audience-ceV3XVHq.js → audience-wRcSN0jV.js} +1 -1
  82. package/core/built/admin/assets/automated-emails-CzUa3v4d.js +1 -0
  83. package/core/built/admin/assets/automations-DupSsSOr.js +1 -0
  84. package/core/built/admin/assets/automations-hDVcRPjh.js +1 -0
  85. package/core/built/admin/assets/avatar-flipboard-DiAGgshK.js +1 -0
  86. package/core/built/admin/assets/badge-CI1Z0xyG.js +1 -0
  87. package/core/built/admin/assets/bluesky-sharing-B8PC1SBj.js +1 -0
  88. package/core/built/admin/assets/box-LUuYRT-1.js +1 -0
  89. package/core/built/admin/assets/brand-icon-CrmbX86T.js +1 -0
  90. package/core/built/admin/assets/breadcrumb-DDDpzLyo.js +1 -0
  91. package/core/built/admin/assets/button-D414TI3B.js +1 -0
  92. package/core/built/admin/assets/calendar-Cp_opo3i.js +1 -0
  93. package/core/built/admin/assets/card-C2dfd5u0.js +1 -0
  94. package/core/built/admin/assets/chart-B_UNLXse.js +63 -0
  95. package/core/built/admin/assets/chart-helpers-Czu_9QpJ.js +1 -0
  96. package/core/built/admin/assets/checkbox-CFFqf0Nh.js +1 -0
  97. package/core/built/admin/assets/{chunk-KS7C4IRE-DCsL4i4D.js → chunk-KS7C4IRE-DhOcHQOU.js} +1 -1
  98. package/core/built/admin/assets/{chunk.254.035b85ec456ebbd7336b.js → chunk.201.6961b57ed7a281ac193e.js} +165 -122
  99. package/core/built/admin/assets/chunk.524.0b850e72ec49a0fa3882.js +25 -0
  100. package/core/built/admin/assets/chunk.582.db2ae9e968256e8d58ac.js +27 -0
  101. package/core/built/admin/assets/{chunk.901.4ccc639821020230bcca.js → chunk.972.4b8c97f93d66db15e751.js} +10625 -10088
  102. package/core/built/admin/assets/clean-tracked-url-dkN05vOf.js +1 -0
  103. package/core/built/admin/assets/code-editor-view-Bd_nnHKk.js +1 -0
  104. package/core/built/admin/assets/code-editor-view-BeU3Yf9M.js +1 -0
  105. package/core/built/admin/assets/color-picker-Bzm1V7qg.js +3 -0
  106. package/core/built/admin/assets/color-picker-field-DP0moHz9.js +1 -0
  107. package/core/built/admin/assets/combobox-6_ruuTuj.js +1 -0
  108. package/core/built/admin/assets/command-B5wfm6pd.js +1 -0
  109. package/core/built/admin/assets/comments-BB26dUSl.js +1 -0
  110. package/core/built/admin/assets/components-CwL6a6As-CCRaoCeP.js +1 -0
  111. package/core/built/admin/assets/{config-kSHvwdTG.js → config-BPljH6wF.js} +1 -1
  112. package/core/built/admin/assets/confirmation-context-znVJD4pX.js +1 -0
  113. package/core/built/admin/assets/container-CHHif8km.js +1 -0
  114. package/core/built/admin/assets/content-api-modal-DOHwl0yZ.js +1 -0
  115. package/core/built/admin/assets/context-menu-BpY46Dlb.js +1 -0
  116. package/core/built/admin/assets/copy-field-DRBx6Ady.js +1 -0
  117. package/core/built/admin/assets/create-ghost-browse-value-source-eIXo5Qws.js +1 -0
  118. package/core/built/admin/assets/{custom-field-type-option-BAuW0F-E.js → custom-field-type-option-DrSlETOI.js} +1 -1
  119. package/core/built/admin/assets/custom-integration-modal-Dgo425Ec.js +1 -0
  120. package/core/built/admin/assets/data-list-DM8yqpXi.js +1 -0
  121. package/core/built/admin/assets/date-range-select-DdC23c13.js +1 -0
  122. package/core/built/admin/assets/design-and-theme-modal-CbSu9IT4.js +2 -0
  123. package/core/built/admin/assets/detail-page-CN4NdhpV.js +1 -0
  124. package/core/built/admin/assets/dirty-confirm-dialog-BT_Vq9TD.js +1 -0
  125. package/core/built/admin/assets/disabled-sources-indicator-C5xtW0Q2.js +1 -0
  126. package/core/built/admin/assets/dist-B40T-RCQ.js +1 -0
  127. package/core/built/admin/assets/dist-BRQkNYN1.js +11 -0
  128. package/core/built/admin/assets/dist-Bm-PB47a.js +6 -0
  129. package/core/built/admin/assets/{dist-B6bJuxL3.js → dist-C2lYC76d.js} +1 -1
  130. package/core/built/admin/assets/dist-Cm2qbZKL.js +1 -0
  131. package/core/built/admin/assets/dist-CrlaEoaK.js +1 -0
  132. package/core/built/admin/assets/{dist-BtaTA7Ii.js → dist-D7yMk931.js} +1 -1
  133. package/core/built/admin/assets/{dist-zwwGt8Yf.js → dist-DNAdeRyr.js} +1 -1
  134. package/core/built/admin/assets/dist-DS6zpxid.js +1 -0
  135. package/core/built/admin/assets/dist-DVVKsyPh.js +23 -0
  136. package/core/built/admin/assets/dist-DxfQlAmn.js +1 -0
  137. package/core/built/admin/assets/dist-DziNzWI2.js +1 -0
  138. package/core/built/admin/assets/dist-nmRzULcD.js +1 -0
  139. package/core/built/admin/assets/domain-BPReCZa8.js +1 -0
  140. package/core/built/admin/assets/dropzone-B2auMkf2.js +5 -0
  141. package/core/built/admin/assets/edit-profile-B7XTBzKe.js +1 -0
  142. package/core/built/admin/assets/editor-BcaC9dqm.js +8 -0
  143. package/core/built/admin/assets/editor-screen-FuMpItC8.js +27 -0
  144. package/core/built/admin/assets/email-previews-Bs-JDhIw.js +1 -0
  145. package/core/built/admin/assets/email-sending-status-context-C76KYL1V.js +1 -0
  146. package/core/built/admin/assets/email-sending-status-provider-9d81o1C2.js +1 -0
  147. package/core/built/admin/assets/{emails-vFMk4yYl.js → emails-CgvIIz3q.js} +1 -1
  148. package/core/built/admin/assets/embed-signup-form-modal-CbVbMsxl.js +8 -0
  149. package/core/built/admin/assets/empty-indicator-CSQts7GV.js +1 -0
  150. package/core/built/admin/assets/esm--rhhUGIG.js +2 -0
  151. package/core/built/admin/assets/explore-DbSXFTJN.js +1 -0
  152. package/core/built/admin/assets/feature-flag-overrides-context-CrcQKm9Z.js +1 -0
  153. package/core/built/admin/assets/feature-image-placeholder-DFXA4vfJ.js +1 -0
  154. package/core/built/admin/assets/feed-W7RlF-Gp.js +1 -0
  155. package/core/built/admin/assets/feedback-BTPBQLT5.js +1 -0
  156. package/core/built/admin/assets/field-BXEh3ptU.js +1 -0
  157. package/core/built/admin/assets/filter-sources-DHK2IoCk.js +1 -0
  158. package/core/built/admin/assets/filters-0SYNTqyQ.js +1 -0
  159. package/core/built/admin/assets/filters-DTtZKQyq.js +1 -0
  160. package/core/built/admin/assets/first-promoter-modal-DcoN_OXu.js +1 -0
  161. package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-CkFA8EkI.js +1 -0
  162. package/core/built/admin/assets/framework-provider-DB-svAju.js +4 -0
  163. package/core/built/admin/assets/{ghost-b4e8a403baba61905cd7560e30b9732d.js → ghost-25495154132af7305cb7b646fd83f48f.js} +580 -523
  164. package/core/built/admin/assets/gift-link-modal-BX-Q1TOk.js +1 -0
  165. package/core/built/admin/assets/{gift-links-CfLSnst2.js → gift-links-D8gl_yJS.js} +1 -1
  166. package/core/built/admin/assets/global-data-context-3MItMry2.js +1 -0
  167. package/core/built/admin/assets/grid-BEUIDQX7.js +1 -0
  168. package/core/built/admin/assets/growth-G6PLO4aF.js +1 -0
  169. package/core/built/admin/assets/growth-tkD-fBOY.js +3 -0
  170. package/core/built/admin/assets/heading-ih-fOVqF.js +1 -0
  171. package/core/built/admin/assets/history-modal-Ca-gStoq.js +1 -0
  172. package/core/built/admin/assets/hooks-DYfTEQLk.js +2 -0
  173. package/core/built/admin/assets/html-field-B3CrKV9Y.js +1 -0
  174. package/core/built/admin/assets/iframe-buffering-Bq1el-gw.js +1 -0
  175. package/core/built/admin/assets/images-H-BIm8OQ.js +1 -0
  176. package/core/built/admin/assets/{inbox-gJHG7_xd.js → inbox-DBbDVMPz.js} +35 -35
  177. package/core/built/admin/assets/index-DOF2jDq0.js +4 -0
  178. package/core/built/admin/assets/index-JrrNchW1.css +2 -0
  179. package/core/built/admin/assets/index.es-Ct5XQNSj.js +1 -0
  180. package/core/built/admin/assets/input-group-CvH-3d3F.js +1 -0
  181. package/core/built/admin/assets/input-surface-CL23Mlh8.js +1 -0
  182. package/core/built/admin/assets/integration-header-C7GXGis_.js +1 -0
  183. package/core/built/admin/assets/{integrations-B4kuRBFY.js → integrations-DnJrZnHv.js} +1 -1
  184. package/core/built/admin/assets/invite-user-modal-EJ2_6RpV.js +1 -0
  185. package/core/built/admin/assets/isPlainObject-BzzgUf1E.js +1 -0
  186. package/core/built/admin/assets/jsx-runtime-BlNNh7jY.js +1 -0
  187. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +3 -3
  188. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +1 -1
  189. package/core/built/admin/assets/{koenig-lexical-CGXb0F8o.js → koenig-lexical-Dkwee5FG.js} +1 -1
  190. package/core/built/admin/assets/koenig-loader-BzXCXHoA.js +2 -0
  191. package/core/built/admin/assets/kpi-card-iCDUTgOR.js +1 -0
  192. package/core/built/admin/assets/kpi-card-jTnpLKGr.js +1 -0
  193. package/core/built/admin/assets/kpi-helpers-Criu0YAf.js +1 -0
  194. package/core/built/admin/assets/kpi-tabs-DbOmmyOo.js +1 -0
  195. package/core/built/admin/assets/label-Du0yqMqL.js +1 -0
  196. package/core/built/admin/assets/label-picker-Bq1XXr1D.js +1 -0
  197. package/core/built/admin/assets/labels-0x2NfLtC.js +1 -0
  198. package/core/built/admin/assets/layout-Ckwzsnsu.js +1 -0
  199. package/core/built/admin/assets/lib-CCz2mjm8.js +2 -0
  200. package/core/built/admin/assets/link-helpers-o9GgBTni.js +1 -0
  201. package/core/built/admin/assets/links-Ctujreuh.js +1 -0
  202. package/core/built/admin/assets/list-page-CH_wnDC3.js +1 -0
  203. package/core/built/admin/assets/luxon-BXCsmep3.js +1 -0
  204. package/core/built/admin/assets/member-activity-CsAh6MxK.js +1 -0
  205. package/core/built/admin/assets/member-activity-feed-0ytsQbtY.js +1 -0
  206. package/core/built/admin/assets/member-custom-fields-CTFGnnYv.js +1 -0
  207. package/core/built/admin/assets/member-detail-QU3vB1ML.js +1 -0
  208. package/core/built/admin/assets/members-CtMVO_AB.js +4 -0
  209. package/core/built/admin/assets/modal-page-8Ipfl51B.js +1 -0
  210. package/core/built/admin/assets/moderation-B8VtA-W0.js +1 -0
  211. package/core/built/admin/assets/multi-select-combobox-_9wEYmGv.js +1 -0
  212. package/core/built/admin/assets/navigation-modal-CGcjJvkc.js +1 -0
  213. package/core/built/admin/assets/newsletter-BpHjjqmq.js +1 -0
  214. package/core/built/admin/assets/newsletter-detail-modal-DzTbGOyo.js +1 -0
  215. package/core/built/admin/assets/newsletter-emails-BMKH4Osp.js +1 -0
  216. package/core/built/admin/assets/newsletters-BxC84_cL.js +1 -0
  217. package/core/built/admin/assets/{newsletters-Rq1M3GD-.js → newsletters-Dz77m__5.js} +1 -1
  218. package/core/built/admin/assets/note-BPtEzzZS.js +1 -0
  219. package/core/built/admin/assets/notifications-ng3ulEdp.js +1 -0
  220. package/core/built/admin/assets/{nql-BLpCn7qX.js → nql-DnDc7UuU.js} +1 -1
  221. package/core/built/admin/assets/nql-lang-CeTB_Bhv.js +19 -0
  222. package/core/built/admin/assets/{offers--e2nGvkW.js → offers-ByWSK0rR.js} +1 -1
  223. package/core/built/admin/assets/offers-container-modal-CwqnRa3T.js +1 -0
  224. package/core/built/admin/assets/onboarding-B4hfBi9a.js +1 -0
  225. package/core/built/admin/assets/onboarding-DV_XbHts.js +1 -0
  226. package/core/built/admin/assets/onboarding-route-CplZzd7F.js +1 -0
  227. package/core/built/admin/assets/overview-B0yD9OoX.js +1 -0
  228. package/core/built/admin/assets/overview-C4eJzQqi.js +1 -0
  229. package/core/built/admin/assets/page-header-CdCpekG9.js +1 -0
  230. package/core/built/admin/assets/pagemenu-CKQD9hoP.js +1 -0
  231. package/core/built/admin/assets/{pages-CjDY2CBI.js → pages-DZ_YGB1D.js} +1 -1
  232. package/core/built/admin/assets/pages-route-CKsnxIvw.js +1 -0
  233. package/core/built/admin/assets/papaparse.min-BlhnCUXn.js +10 -0
  234. package/core/built/admin/assets/pintura-modal-C5jzeyGk.js +1 -0
  235. package/core/built/admin/assets/portal-frame-DYo0bh0E.js +1 -0
  236. package/core/built/admin/assets/portal-modal-C0d8xjKa.js +1 -0
  237. package/core/built/admin/assets/post-analytics-C5C7IyAm.js +1 -0
  238. package/core/built/admin/assets/post-analytics-context-bt2YTBAC.js +1 -0
  239. package/core/built/admin/assets/post-analytics-header-DKWHwoK2.js +1 -0
  240. package/core/built/admin/assets/post-analytics-provider-BqCPPxmW.js +1 -0
  241. package/core/built/admin/assets/post-share-modal-wxmqbAv_.js +1 -0
  242. package/core/built/admin/assets/posts-list-screen-B978ZO0R.js +2 -0
  243. package/core/built/admin/assets/posts-route-CDqxKazl.js +1 -0
  244. package/core/built/admin/assets/{posts-pCPrhQeR.js → posts-tcoO3iRG.js} +1 -1
  245. package/core/built/admin/assets/preferences-CnejTRc4.js +5 -0
  246. package/core/built/admin/assets/preview-chrome-C7yZWVLZ.js +1 -0
  247. package/core/built/admin/assets/preview-modal-CFUxUGHp.js +1 -0
  248. package/core/built/admin/assets/profile-ClRGiOqA.js +1 -0
  249. package/core/built/admin/assets/prop-types-6lTeqvom.js +1 -0
  250. package/core/built/admin/assets/radio-group-CTmLo0h9.js +1 -0
  251. package/core/built/admin/assets/react-BXwhMTuc.js +1 -0
  252. package/core/built/admin/assets/{jsx-runtime-DX3WBWVO.js → react-dom-CMOtJ5MH.js} +2 -2
  253. package/core/built/admin/assets/{referrers-D8oHPmDB.js → referrers-1R8bPpoV.js} +1 -1
  254. package/core/built/admin/assets/router-provider-DDZvgS3V.js +1 -0
  255. package/core/built/admin/assets/select-D_4xWFYv.js +1 -0
  256. package/core/built/admin/assets/settings-BRl7-7a9.js +1 -0
  257. package/core/built/admin/assets/settings-BoQcPa-y.js +4 -0
  258. package/core/built/admin/assets/settings-breadcrumbs-C9Yxl81q.js +1 -0
  259. package/core/built/admin/assets/{dist-B3keLvjj.js → shade-scope-Cccj-c7I-D0XwkdKQ.js} +5 -3
  260. package/core/built/admin/assets/share-modal-DBqZobuR.js +1 -0
  261. package/core/built/admin/assets/simple-pagination-D5t_ox6x.js +1 -0
  262. package/core/built/admin/assets/skeleton-CPcTiTSX.js +1 -0
  263. package/core/built/admin/assets/slack-modal-BF9ex8cd.js +1 -0
  264. package/core/built/admin/assets/sort-button-C0EXGjnS.js +1 -0
  265. package/core/built/admin/assets/source-icon-BzzftCQ2.js +1 -0
  266. package/core/built/admin/assets/{stats-D9PDLS3x.js → stats-Cvp8Ep5m.js} +1 -1
  267. package/core/built/admin/assets/stats-view-CzpGoHzF.js +1 -0
  268. package/core/built/admin/assets/step-1-CBUYUPPF.js +1 -0
  269. package/core/built/admin/assets/step-2-CEIXUwQa.js +1 -0
  270. package/core/built/admin/assets/step-3-C1HA5i1N.js +2 -0
  271. package/core/built/admin/assets/stripe-button-DMFsLs80.js +1 -0
  272. package/core/built/admin/assets/stripe-connect-modal-CEvxCUTv.js +1 -0
  273. package/core/built/admin/assets/switch-DoOJF2yg.js +1 -0
  274. package/core/built/admin/assets/table-BDYbUHJz.js +1 -0
  275. package/core/built/admin/assets/tabs-BZyz4ZCH.js +1 -0
  276. package/core/built/admin/assets/tag-detail-CFzaz_9E.js +2 -0
  277. package/core/built/admin/assets/tag-picker-BKUCZuRc.js +1 -0
  278. package/core/built/admin/assets/tags-Bs1FiD7m.js +1 -0
  279. package/core/built/admin/assets/{tags-ChfdwJyS.js → tags-NwZ7BPK6.js} +1 -1
  280. package/core/built/admin/assets/testimonials-modal-CVm0_7E-.js +1 -0
  281. package/core/built/admin/assets/text-BLI0C8Mc.js +1 -0
  282. package/core/built/admin/assets/textarea-C5qolByg.js +1 -0
  283. package/core/built/admin/assets/themes-DtcEFQWm.js +1 -0
  284. package/core/built/admin/assets/tier-detail-modal-Cmwzi-e7.js +1 -0
  285. package/core/built/admin/assets/{tiers-BCpIOGQr.js → tiers-6mPzCXlM.js} +1 -1
  286. package/core/built/admin/assets/toggle-group-BTL1QsWY.js +1 -0
  287. package/core/built/admin/assets/topic-filter-BMjhquv7.js +1 -0
  288. package/core/built/admin/assets/transistor-modal-hMv53jF8.js +1 -0
  289. package/core/built/admin/assets/trend-badge-1w_HEzkG.js +1 -0
  290. package/core/built/admin/assets/unsplash-modal-jzC8lEB2.js +1 -0
  291. package/core/built/admin/assets/use-analytics-data-B3lGOxsC.js +1 -0
  292. package/core/built/admin/assets/use-availability-DnKqOyqd.js +1 -0
  293. package/core/built/admin/assets/{use-check-theme-limit-error-DRUjK4YM.js → use-check-theme-limit-error-C1tc2P4N.js} +2 -2
  294. package/core/built/admin/assets/use-email-sending-status-DNMtL5B9.js +1 -0
  295. package/core/built/admin/assets/use-filter-params-DU-aiaTb.js +1 -0
  296. package/core/built/admin/assets/use-filterable-api-CxCrnPxG.js +1 -0
  297. package/core/built/admin/assets/use-form-DJKZJhQh.js +1 -0
  298. package/core/built/admin/assets/use-growth-stats-E13rMQUE.js +1 -0
  299. package/core/built/admin/assets/use-host-limits-mpTkZIq8.js +1 -0
  300. package/core/built/admin/assets/use-limiter-DlL7au90.js +19 -0
  301. package/core/built/admin/assets/use-navigate-with-base-path-BzgNwMAx.js +1 -0
  302. package/core/built/admin/assets/use-pintura-config-CtEV1JQY.js +1 -0
  303. package/core/built/admin/assets/use-pintura-editor-CaxE64kD.js +1 -0
  304. package/core/built/admin/assets/use-post-referrers-DyPjyBSN.js +1 -0
  305. package/core/built/admin/assets/use-query-params-DlOHCo-R.js +1 -0
  306. package/core/built/admin/assets/use-reply-chain-data-BST2OgCM.js +1 -0
  307. package/core/built/admin/assets/use-router-history-entry-CKx9LhqD.js +1 -0
  308. package/core/built/admin/assets/use-sending-eta-DR9ueMH8.js +1 -0
  309. package/core/built/admin/assets/use-setting-group-ldtX1Vsk.js +1 -0
  310. package/core/built/admin/assets/use-settings-navigation-CzGU4sus.js +1 -0
  311. package/core/built/admin/assets/use-staff-users-DoeXaPsb.js +1 -0
  312. package/core/built/admin/assets/use-tinybird-query-BaBNCaj0.js +1 -0
  313. package/core/built/admin/assets/use-tinybird-token-CnZ19NDf.js +1 -0
  314. package/core/built/admin/assets/use-unsaved-changes-guard-CKVPWz_F.js +1 -0
  315. package/core/built/admin/assets/use-upgrade-route-CVjDlNSs.js +1 -0
  316. package/core/built/admin/assets/{use-url-input-fvp-TpPx.js → use-url-input-C5KHJw79.js} +1 -1
  317. package/core/built/admin/assets/user-detail-modal-Dm0KfPeR.js +1 -0
  318. package/core/built/admin/assets/{users-DVNWrqg9.js → users-C60_hpn6.js} +1 -1
  319. package/core/built/admin/assets/{validator-Cr0sMKuW.js → validator-DlFQP70j.js} +1 -1
  320. package/core/built/admin/assets/{vendor-2dd263291938d407802568d3357ec69e.js → vendor-97e91ff8dd1457c668f9ef103ee1a77b.js} +2748 -2977
  321. package/core/built/admin/assets/virtual-list-tAuPUICw.js +1 -0
  322. package/core/built/admin/assets/web-BQlKcW2x.js +2 -0
  323. package/core/built/admin/assets/web-NTT5DkEz.js +1 -0
  324. package/core/built/admin/assets/zapier-modal-DsHG9Oev.js +1 -0
  325. package/core/built/admin/index.html +35 -34
  326. package/core/cli/command.js +17 -2
  327. package/core/frontend/apps/private-blogging/index.js +2 -2
  328. package/core/frontend/apps/private-blogging/lib/middleware.js +1 -1
  329. package/core/frontend/apps/private-blogging/lib/router.js +1 -1
  330. package/core/frontend/helpers/cancel_link.js +3 -3
  331. package/core/frontend/helpers/content.js +2 -2
  332. package/core/frontend/helpers/content_api_url.js +1 -1
  333. package/core/frontend/helpers/date.js +1 -1
  334. package/core/frontend/helpers/foreach.js +5 -5
  335. package/core/frontend/helpers/get.js +7 -4
  336. package/core/frontend/helpers/ghost_head.js +2 -2
  337. package/core/frontend/helpers/has.js +1 -3
  338. package/core/frontend/helpers/link.js +7 -7
  339. package/core/frontend/helpers/link_class.js +2 -2
  340. package/core/frontend/helpers/navigation.js +1 -2
  341. package/core/frontend/helpers/recommendations.js +5 -6
  342. package/core/frontend/helpers/tiers.js +1 -1
  343. package/core/frontend/helpers/total_members.js +1 -1
  344. package/core/frontend/helpers/total_paid_members.js +1 -1
  345. package/core/frontend/meta/asset-url.js +1 -16
  346. package/core/frontend/meta/author-url.js +1 -1
  347. package/core/frontend/meta/modified-date.js +1 -1
  348. package/core/frontend/meta/published-date.js +1 -1
  349. package/core/frontend/meta/schema.js +3 -8
  350. package/core/frontend/meta/structured-data.js +1 -2
  351. package/core/frontend/services/asset-hash/index.js +32 -2
  352. package/core/frontend/services/assets-minification/minifier.js +1 -1
  353. package/core/frontend/services/data/entry-lookup.js +1 -1
  354. package/core/frontend/services/data/fetch-data.js +2 -2
  355. package/core/frontend/services/rendering/format-response.js +1 -1
  356. package/core/frontend/services/rendering/renderer.js +3 -0
  357. package/core/frontend/services/rendering/templates.js +1 -1
  358. package/core/frontend/services/routing/controllers/static.js +1 -1
  359. package/core/frontend/services/routing/controllers/unsubscribe.js +2 -1
  360. package/core/frontend/services/routing/parent-router.js +1 -1
  361. package/core/frontend/services/routing/registry.js +1 -1
  362. package/core/frontend/services/rss/generate-feed.js +1 -1
  363. package/core/frontend/services/sitemap/base-site-map-generator.js +68 -97
  364. package/core/frontend/services/sitemap/site-map-index-generator.js +16 -21
  365. package/core/frontend/services/sitemap/site-map-manager.js +82 -43
  366. package/core/frontend/services/sitemap/sitemap-xml.js +72 -0
  367. package/core/frontend/services/theme-engine/active.js +2 -4
  368. package/core/frontend/services/theme-engine/handlebars/utils.js +8 -8
  369. package/core/frontend/services/theme-engine/i18n/i18n.js +15 -6
  370. package/core/frontend/services/theme-engine/i18next/theme-i18n.js +1 -1
  371. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +1 -1
  372. package/core/frontend/services/theme-engine/preview.js +1 -1
  373. package/core/frontend/utils/member-count.js +2 -2
  374. package/core/frontend/web/middleware/llms-discovery.js +34 -43
  375. package/core/frontend/web/routers/serve-public-file.js +1 -1
  376. package/core/server/adapters/route-settings/S3RouteSettingsStore.js +1 -1
  377. package/core/server/adapters/scheduling/README.md +4 -0
  378. package/core/server/adapters/scheduling/get-scheduler-idempotency-key.js +21 -0
  379. package/core/server/adapters/storage/LocalFilesStorage.js +12 -2
  380. package/core/server/adapters/storage/LocalStorageBase.js +15 -1
  381. package/core/server/api/endpoints/actions.js +2 -1
  382. package/core/server/api/endpoints/automated-emails.js +11 -4
  383. package/core/server/api/endpoints/automations.js +77 -49
  384. package/core/server/api/endpoints/db.js +1 -1
  385. package/core/server/api/endpoints/emails.js +11 -6
  386. package/core/server/api/endpoints/index.js +1 -1
  387. package/core/server/api/endpoints/invites.js +2 -1
  388. package/core/server/api/endpoints/labels.js +6 -2
  389. package/core/server/api/endpoints/mail.js +1 -1
  390. package/core/server/api/endpoints/member-metafields.js +2 -2
  391. package/core/server/api/endpoints/member-signin-urls.js +1 -1
  392. package/core/server/api/endpoints/members.js +23 -7
  393. package/core/server/api/endpoints/oembed.js +1 -1
  394. package/core/server/api/endpoints/pages.js +2 -6
  395. package/core/server/api/endpoints/posts.js +4 -12
  396. package/core/server/api/endpoints/settings.js +2 -2
  397. package/core/server/api/endpoints/snippets.js +2 -1
  398. package/core/server/api/endpoints/tags.js +6 -2
  399. package/core/server/api/endpoints/themes.js +5 -5
  400. package/core/server/api/endpoints/users.js +2 -6
  401. package/core/server/api/endpoints/utils/api-filter-utils.js +62 -3
  402. package/core/server/api/endpoints/utils/serializers/input/pages.js +2 -2
  403. package/core/server/api/endpoints/utils/serializers/input/posts.js +2 -2
  404. package/core/server/api/endpoints/utils/serializers/input/tags.js +1 -1
  405. package/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js +4 -4
  406. package/core/server/api/endpoints/utils/serializers/output/mappers/comments.js +8 -5
  407. package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +1 -1
  408. package/core/server/api/endpoints/utils/serializers/output/pages.js +4 -4
  409. package/core/server/api/endpoints/utils/serializers/output/posts.js +4 -4
  410. package/core/server/api/endpoints/utils/serializers/output/search-index.js +11 -11
  411. package/core/server/api/endpoints/utils/serializers/output/settings.js +1 -1
  412. package/core/server/api/endpoints/utils/serializers/output/utils/clean.js +2 -0
  413. package/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js +6 -3
  414. package/core/server/api/endpoints/utils/validators/input/automated_emails.js +23 -33
  415. package/core/server/api/endpoints/utils/validators/input/settings.js +18 -4
  416. package/core/server/data/exporter/exporter.js +3 -3
  417. package/core/server/data/exporter/table-lists.js +4 -5
  418. package/core/server/data/importer/handlers/image.js +1 -2
  419. package/core/server/data/importer/handlers/json.js +1 -3
  420. package/core/server/data/importer/handlers/markdown.js +4 -8
  421. package/core/server/data/importer/import-manager.js +1 -1
  422. package/core/server/data/importer/importers/content-file-importer.js +4 -8
  423. package/core/server/data/importer/importers/data/base.js +10 -10
  424. package/core/server/data/importer/importers/data/custom-theme-settings-importer.js +1 -1
  425. package/core/server/data/importer/importers/data/data-importer.js +3 -4
  426. package/core/server/data/importer/importers/data/posts-importer.js +10 -10
  427. package/core/server/data/importer/importers/data/products-importer.js +3 -3
  428. package/core/server/data/importer/importers/data/settings-importer.js +10 -4
  429. package/core/server/data/importer/importers/data/stripe-prices-importer.js +1 -1
  430. package/core/server/data/importer/importers/data/stripe-products-importer.js +1 -1
  431. package/core/server/data/importer/importers/data/tags-importer.js +1 -1
  432. package/core/server/data/importer/importers/data/users-importer.js +2 -2
  433. package/core/server/data/importer/importers/json-to-html.js +12 -9
  434. package/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js +1 -1
  435. package/core/server/data/migrations/versions/6.64/2026-09-03-15-40-25-add-member-access-to-members-metafields.js +12 -0
  436. package/core/server/data/migrations/versions/6.64/2026-09-08-11-01-12-add-posts-auto-excerpt-and-reading-time-columns.js +17 -0
  437. package/core/server/data/migrations/versions/6.64/2026-09-09-13-56-18-add-automation-run-updated-at-indexes.js +6 -0
  438. package/core/server/data/migrations/versions/6.64/2026-09-09-13-56-18-add-tinybird-syncs-table.js +10 -0
  439. package/core/server/data/migrations/versions/6.65/2026-09-16-15-35-26-add-members-metafield-change-events.js +17 -0
  440. package/core/server/data/schema/fixtures/fixture-manager.js +3 -3
  441. package/core/server/data/schema/index.js +1 -1
  442. package/core/server/data/schema/schema.js +54 -2
  443. package/core/server/data/schema/validator.js +96 -123
  444. package/core/server/data/seeders/importers/automations-importer.js +0 -1
  445. package/core/server/data/seeders/importers/comments-importer.js +1 -1
  446. package/core/server/data/seeders/importers/email-recipients-importer.js +3 -3
  447. package/core/server/data/seeders/importers/emails-importer.js +1 -1
  448. package/core/server/data/seeders/importers/members-importer.js +1 -1
  449. package/core/server/data/seeders/importers/members-login-events-importer.js +2 -2
  450. package/core/server/data/seeders/importers/members-newsletters-importer.js +1 -1
  451. package/core/server/data/seeders/importers/members-paid-subscription-events-importer.js +1 -1
  452. package/core/server/data/seeders/importers/members-status-events-importer.js +1 -1
  453. package/core/server/data/seeders/importers/members-stripe-customers-importer.js +1 -1
  454. package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +2 -2
  455. package/core/server/data/seeders/importers/members-subscribe-events-importer.js +2 -2
  456. package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +1 -1
  457. package/core/server/data/seeders/utils/blog-info.js +4 -3
  458. package/core/server/data/seeders/utils/event-generator.js +72 -46
  459. package/core/server/data/tinybird/datasources/_mv_automation_run_steps.datasource +10 -0
  460. package/core/server/data/tinybird/datasources/_mv_automation_runs.datasource +10 -0
  461. package/core/server/data/tinybird/datasources/_mv_pending_automation_runs.datasource +10 -0
  462. package/core/server/data/tinybird/datasources/automation_run_events.datasource +12 -0
  463. package/core/server/data/tinybird/datasources/automation_run_step_events.datasource +12 -0
  464. package/core/server/data/tinybird/endpoints/api_automation_browse_stats.pipe +43 -0
  465. package/core/server/data/tinybird/fixtures/automation_run_events.ndjson +7 -0
  466. package/core/server/data/tinybird/fixtures/automation_run_step_events.ndjson +8 -0
  467. package/core/server/data/tinybird/pipes/mv_automation_run_steps.pipe +13 -0
  468. package/core/server/data/tinybird/pipes/mv_automation_runs.pipe +15 -0
  469. package/core/server/data/tinybird/pipes/mv_hits.pipe +25 -20
  470. package/core/server/data/tinybird/pipes/mv_pending_automation_runs.pipe +7 -0
  471. package/core/server/data/tinybird/scripts/docker-analytics-manager.js +2 -2
  472. package/core/server/data/tinybird/tests/api_automation_browse_stats.yaml +18 -0
  473. package/core/server/ghost-server.js +4 -22
  474. package/core/server/lib/generate-password.js +54 -0
  475. package/core/server/lib/image/image-size.js +1 -3
  476. package/core/server/lib/public-jwk.js +77 -0
  477. package/core/server/lib/request-external.js +53 -117
  478. package/core/server/models/base/plugins/actions.js +2 -3
  479. package/core/server/models/base/plugins/crud.js +1 -2
  480. package/core/server/models/base/plugins/events.js +4 -4
  481. package/core/server/models/base/plugins/raw-knex.js +3 -3
  482. package/core/server/models/base/plugins/sanitize.js +1 -1
  483. package/core/server/models/benefit.js +1 -1
  484. package/core/server/models/collection.js +1 -1
  485. package/core/server/models/comment.js +3 -3
  486. package/core/server/models/invite.js +2 -5
  487. package/core/server/models/label.js +3 -6
  488. package/core/server/models/member.js +7 -10
  489. package/core/server/models/newsletter.js +1 -1
  490. package/core/server/models/permission.js +3 -6
  491. package/core/server/models/post.js +20 -23
  492. package/core/server/models/product.js +4 -1
  493. package/core/server/models/relations/authors.js +9 -12
  494. package/core/server/models/role.js +2 -5
  495. package/core/server/models/settings.js +3 -3
  496. package/core/server/models/tag.js +2 -5
  497. package/core/server/models/user.js +19 -19
  498. package/core/server/models/webhook.js +2 -4
  499. package/core/server/notify.js +2 -2
  500. package/core/server/services/adapter-manager/base-classes.js +21 -3
  501. package/core/server/services/adapter-manager/utils.js +6 -1
  502. package/core/server/services/api-version-compatibility/legacy-api-path-match.js +2 -2
  503. package/core/server/services/auth/api-key/admin.js +2 -2
  504. package/core/server/services/auth/api-key/content.js +1 -1
  505. package/core/server/services/auth/passwordreset.js +1 -1
  506. package/core/server/services/auth/setup.js +1 -3
  507. package/core/server/services/automations/README.md +19 -0
  508. package/core/server/services/automations/automations-api.js +46 -1
  509. package/core/server/services/automations/poll.js +3 -1
  510. package/core/server/services/automations/service.js +2 -2
  511. package/core/server/services/automations/tinybird-automation-stats.js +56 -0
  512. package/core/server/services/automations/welcome-email-automation-poll.js +199 -293
  513. package/core/server/services/comments/comments-controller.js +9 -30
  514. package/core/server/services/comments/comments-service-email-renderer.js +1 -1
  515. package/core/server/services/comments/comments-service-emails.js +1 -1
  516. package/core/server/services/comments/comments-service.js +27 -58
  517. package/core/server/services/comments/comments-stats-service.js +1 -1
  518. package/core/server/services/content-import/import/media.js +1 -1
  519. package/core/server/services/content-import/import/staged-file.js +9 -9
  520. package/core/server/services/content-import/index.js +1 -1
  521. package/core/server/services/custom-redirects/validation.js +1 -1
  522. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +38 -84
  523. package/core/server/services/email-analytics/email-analytics-service.js +19 -3
  524. package/core/server/services/email-analytics/index.js +44 -23
  525. package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.js +31 -60
  526. package/core/server/services/email-rendering/finalize.js +7 -2
  527. package/core/server/services/email-service/README.md +38 -0
  528. package/core/server/services/email-service/batch-sending-service.js +13 -14
  529. package/core/server/services/email-service/email-renderer.js +57 -16
  530. package/core/server/services/email-service/email-service-wrapper.js +4 -3
  531. package/core/server/services/email-service/email-service.js +76 -42
  532. package/core/server/services/email-service/email-templates/partials/feedback-button.hbs +2 -1
  533. package/core/server/services/email-service/email-templates/partials/styles.hbs +0 -6
  534. package/core/server/services/email-service/email-templates/template.hbs +1 -1
  535. package/core/server/services/email-service/jobs/send-email-job.js +12 -0
  536. package/core/server/services/email-service/mailgun-email-provider.js +7 -2
  537. package/core/server/services/email-service/sending-service.js +1 -1
  538. package/core/server/services/email-service/sending-status.js +10 -4
  539. package/core/server/services/gifts/gift-email-service.js +10 -3
  540. package/core/server/services/gifts/gift-service.js +12 -3
  541. package/core/server/services/gifts/index.js +1 -2
  542. package/core/server/services/gifts/jobs/index.js +12 -24
  543. package/core/server/services/gifts/jobs/send-gift-reminders-job.js +6 -46
  544. package/core/server/services/i18n.js +1 -1
  545. package/core/server/services/identity-tokens/identity-token-service-wrapper.js +3 -4
  546. package/core/server/services/invitations/accept.js +2 -2
  547. package/core/server/services/jobs/job-service.js +0 -28
  548. package/core/server/services/jobs-service/jobs-service.js +5 -0
  549. package/core/server/services/jobs-service/register-job-handlers.js +17 -1
  550. package/core/server/services/lib/mailgun-client.js +16 -1
  551. package/core/server/services/lib/mailgun-recipient-message-id.js +49 -0
  552. package/core/server/services/limits.js +18 -2
  553. package/core/server/services/mail/ghost-mailer.js +1 -1
  554. package/core/server/services/member-attribution/member-attribution-service.js +1 -1
  555. package/core/server/services/member-attribution/referrer-translator.js +1 -1
  556. package/core/server/services/member-welcome-emails/service.js +1 -1
  557. package/core/server/services/members/account-service.js +3 -3
  558. package/core/server/services/members/api.js +1 -1
  559. package/core/server/services/members/import-export/import/importer.js +25 -16
  560. package/core/server/services/members/import-export/import/spool.js +11 -15
  561. package/core/server/services/members/import-export/index.js +11 -8
  562. package/core/server/services/members/jobs/index.js +1 -1
  563. package/core/server/services/members/jobs/members-import-job.js +18 -0
  564. package/core/server/services/members/member-avatar.js +18 -0
  565. package/core/server/services/members/members-api/controllers/member-controller.js +2 -2
  566. package/core/server/services/members/members-api/controllers/router-controller.js +7 -2
  567. package/core/server/services/members/members-api/controllers/well-known-controller.js +2 -1
  568. package/core/server/services/members/members-api/members-api.js +4 -4
  569. package/core/server/services/members/members-api/repositories/event-repository.js +40 -1
  570. package/core/server/services/members/members-api/repositories/member-repository.js +55 -17
  571. package/core/server/services/members/members-api/repositories/product-repository.js +1 -1
  572. package/core/server/services/members/members-api/services/member-bread-service.js +19 -19
  573. package/core/server/services/members/members-api/services/token-service.js +11 -12
  574. package/core/server/services/members/middleware.js +9 -2
  575. package/core/server/services/members/request-integrity-token-provider.js +2 -1
  576. package/core/server/services/members/service.js +7 -2
  577. package/core/server/services/members/stats/members-stats.js +2 -2
  578. package/core/server/services/members-events/event-storage.js +2 -2
  579. package/core/server/services/members-metafields/access.js +31 -20
  580. package/core/server/services/members-metafields/actions.js +24 -2
  581. package/core/server/services/members-metafields/bindings-service.js +5 -5
  582. package/core/server/services/members-metafields/codec.js +9 -2
  583. package/core/server/services/members-metafields/definitions-service.js +57 -52
  584. package/core/server/services/members-metafields/index.js +3 -2
  585. package/core/server/services/members-metafields/models.js +2 -0
  586. package/core/server/services/members-metafields/queries.js +45 -11
  587. package/core/server/services/members-metafields/schema.js +51 -1
  588. package/core/server/services/members-metafields/serializers.js +1 -0
  589. package/core/server/services/members-metafields/values-service.js +132 -21
  590. package/core/server/services/mentions/mention-discovery-service.js +1 -1
  591. package/core/server/services/mentions/mention-sending-service.js +3 -3
  592. package/core/server/services/mentions/mention.js +4 -5
  593. package/core/server/services/mentions/mentions-api.js +4 -1
  594. package/core/server/services/mentions-jobs/job-service.js +0 -28
  595. package/core/server/services/milestones/milestones-service.js +1 -1
  596. package/core/server/services/newsletters/newsletters-service.js +1 -1
  597. package/core/server/services/notifications/notifications.js +3 -3
  598. package/core/server/services/oembed/oembed-service.js +115 -14
  599. package/core/server/services/permissions/can-this.js +1 -2
  600. package/core/server/services/post-scheduling/post-scheduling.js +8 -1
  601. package/core/server/services/posts/post-scheduling.js +27 -0
  602. package/core/server/services/settings/settings-bread-service.js +3 -3
  603. package/core/server/services/settings/settings-utils.js +1 -1
  604. package/core/server/services/settings-helpers/settings-helpers.js +1 -1
  605. package/core/server/services/staff/staff-service-emails.js +14 -10
  606. package/core/server/services/stats/posts-stats-service.js +10 -10
  607. package/core/server/services/stats/referrers-stats-service.js +1 -1
  608. package/core/server/services/stats/stats-service.js +12 -3
  609. package/core/server/services/stats/subscription-stats-service.js +3 -3
  610. package/core/server/services/stats/utils/tinybird.js +8 -1
  611. package/core/server/services/stripe/stripe-api.js +3 -3
  612. package/core/server/services/stripe/stripe-migrations.js +6 -6
  613. package/core/server/services/themes/storage.js +21 -26
  614. package/core/server/services/themes/theme-storage.js +2 -2
  615. package/core/server/services/tier-checkout-config/service.js +17 -1
  616. package/core/server/services/tiers/tier.js +15 -15
  617. package/core/server/services/tinybird/tinybird-service.js +1 -0
  618. package/core/server/services/tinybird-sync/get-ingest-config.js +39 -0
  619. package/core/server/services/tinybird-sync/index.js +31 -0
  620. package/core/server/services/tinybird-sync/sync-table-to-tinybird.js +149 -0
  621. package/core/server/services/tinybird-sync/tinybird-sync-service.js +67 -0
  622. package/core/server/services/update-check/update-check-service.js +3 -3
  623. package/core/server/services/webhooks/serialize.js +1 -1
  624. package/core/server/web/api/app.js +0 -5
  625. package/core/server/web/api/endpoints/admin/routes.js +33 -34
  626. package/core/server/web/api/middleware/upload.js +29 -2
  627. package/core/server/web/parent/middleware/index.js +1 -1
  628. package/core/server/web/parent/middleware/log-request.js +5 -0
  629. package/core/server/web/parent/middleware/queue-request.js +104 -59
  630. package/core/server/web/shared/middleware/api/spam-prevention.js +2 -2
  631. package/core/server/web/well-known.js +12 -16
  632. package/core/shared/config/defaults.json +7 -3
  633. package/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js +1 -1
  634. package/core/shared/{flush-logs.js → flush.js} +7 -3
  635. package/core/shared/labs.js +5 -2
  636. package/core/shared/settings-cache/cache-manager.js +1 -1
  637. package/core/shared/timing-safe-string-equal.js +26 -0
  638. package/nodemon.json +1 -1
  639. package/package.json +47 -48
  640. package/patches/@elastic__elasticsearch@8.19.2.patch +67 -0
  641. package/patches/juice@11.1.1.patch +46 -0
  642. package/pnpm-lock.yaml +571 -2107
  643. package/pnpm-workspace.yaml +38 -28
  644. package/scripts/prune.mts +70 -3
  645. package/tsconfig.json +1 -1
  646. package/components/tryghost-adapter-base-scheduling-0.2.3.tgz +0 -0
  647. package/core/built/admin/assets/Combination-B0l4MKVh.js +0 -41
  648. package/core/built/admin/assets/RadialBarChart-JAKoS4KT.js +0 -1
  649. package/core/built/admin/assets/_baseAssignValue-C_vooEQc.js +0 -1
  650. package/core/built/admin/assets/about-C1C3s5-g.js +0 -1
  651. package/core/built/admin/assets/accordion-CxGsDKwa.js +0 -1
  652. package/core/built/admin/assets/account-migration-CbUhW6gk.js +0 -1
  653. package/core/built/admin/assets/action-list-C4v0-du8.js +0 -1
  654. package/core/built/admin/assets/activitypub/avatar-DVJF5bxP.js +0 -261
  655. package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +0 -1
  656. package/core/built/admin/assets/activitypub/routes-DdyY9uFF.js +0 -7181
  657. package/core/built/admin/assets/activitypub/settings-B6EEcVkW.js +0 -315
  658. package/core/built/admin/assets/activitypub/tabs-DLhZtVde.js +0 -1083
  659. package/core/built/admin/assets/activitypub/users-inweyKL5.js +0 -1499
  660. package/core/built/admin/assets/add-integration-modal-BT_onDJy.js +0 -1
  661. package/core/built/admin/assets/add-newsletter-modal-Cx1kQpiY.js +0 -1
  662. package/core/built/admin/assets/add-recommendation-modal-B5nvAhvr.js +0 -1
  663. package/core/built/admin/assets/analytics-DjoJWPI7.js +0 -1
  664. package/core/built/admin/assets/announcement-bar-modal-Dwd0EGFP.js +0 -1
  665. package/core/built/admin/assets/api-keys-BoeacM-s.js +0 -1
  666. package/core/built/admin/assets/automated-emails-BLesE41L.js +0 -1
  667. package/core/built/admin/assets/automations-BN4u3GR8.js +0 -1
  668. package/core/built/admin/assets/automations-C-ZTUwW3.js +0 -1
  669. package/core/built/admin/assets/avatar-flipboard-C6Kj3Awu.js +0 -1
  670. package/core/built/admin/assets/bluesky-sharing-vzh-oPXL.js +0 -1
  671. package/core/built/admin/assets/box-CdfQAP_F.js +0 -1
  672. package/core/built/admin/assets/brand-icon-CrIGOA3Z.js +0 -1
  673. package/core/built/admin/assets/breadcrumb-CaLk2b7D.js +0 -1
  674. package/core/built/admin/assets/build-CsiH26uS.js +0 -1
  675. package/core/built/admin/assets/button-Dvcv1QSR.js +0 -1
  676. package/core/built/admin/assets/calendar-Bl9RLcZX.js +0 -1
  677. package/core/built/admin/assets/card--VNbfgo3.js +0 -1
  678. package/core/built/admin/assets/chart-BrhA41Zi.js +0 -63
  679. package/core/built/admin/assets/chart-helpers-FHywU0pj.js +0 -1
  680. package/core/built/admin/assets/checkbox-BtayFtjg.js +0 -1
  681. package/core/built/admin/assets/chunk.524.e6975095fccdf22d90f8.js +0 -32
  682. package/core/built/admin/assets/chunk.582.98b485f9b2802f540897.js +0 -34
  683. package/core/built/admin/assets/code-editor-view-C3ZfoF1X.js +0 -1
  684. package/core/built/admin/assets/code-editor-view-CAyRWy1s.js +0 -1
  685. package/core/built/admin/assets/color-picker-G4kGR7rp.js +0 -3
  686. package/core/built/admin/assets/color-picker-field-DQFVTNnT.js +0 -1
  687. package/core/built/admin/assets/combobox-BnYzgEB4.js +0 -1
  688. package/core/built/admin/assets/command-C_vyTikI.js +0 -1
  689. package/core/built/admin/assets/comments-aBrxfnZf.js +0 -1
  690. package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +0 -1
  691. package/core/built/admin/assets/confirmation-context-DwXX_Y5h.js +0 -1
  692. package/core/built/admin/assets/container-BuQG1wuP.js +0 -1
  693. package/core/built/admin/assets/content-api-modal-D2G0nJP6.js +0 -1
  694. package/core/built/admin/assets/context-menu-DOVB6yaz.js +0 -1
  695. package/core/built/admin/assets/copy-field-DCJwh9qf.js +0 -1
  696. package/core/built/admin/assets/create-ghost-browse-value-source-5C53jJaX.js +0 -1
  697. package/core/built/admin/assets/custom-integration-modal-AbJGVyKc.js +0 -1
  698. package/core/built/admin/assets/data-list-CA2jYGPq.js +0 -1
  699. package/core/built/admin/assets/date-range-select-BY3K-ukj.js +0 -1
  700. package/core/built/admin/assets/design-and-theme-modal-BvEy4_pC.js +0 -2
  701. package/core/built/admin/assets/detail-page-Dnv-CdR1.js +0 -1
  702. package/core/built/admin/assets/dirty-confirm-dialog-DVPuGz3U.js +0 -1
  703. package/core/built/admin/assets/disabled-sources-indicator-Cy7Zp4c8.js +0 -1
  704. package/core/built/admin/assets/dist-4m6pHdc0.js +0 -23
  705. package/core/built/admin/assets/dist-8YJUlf3B.js +0 -1
  706. package/core/built/admin/assets/dist-CZgIBXQN.js +0 -1
  707. package/core/built/admin/assets/dist-CiHx7vA5.js +0 -6
  708. package/core/built/admin/assets/dist-DIC8yz5C.js +0 -1
  709. package/core/built/admin/assets/dist-Dcsslyo72.js +0 -1
  710. package/core/built/admin/assets/dist-Dgt2cr6a.js +0 -1
  711. package/core/built/admin/assets/dist-ECAUrdGc.js +0 -1
  712. package/core/built/admin/assets/dist-JLOy8o0Q.js +0 -1
  713. package/core/built/admin/assets/dist-Ndy-PuGN.js +0 -1
  714. package/core/built/admin/assets/dist-Z97pCNqS.js +0 -11
  715. package/core/built/admin/assets/domain-Dl61QGuk.js +0 -1
  716. package/core/built/admin/assets/dropzone-Dtz5Rmjt.js +0 -5
  717. package/core/built/admin/assets/edit-profile-DNJSMDwm.js +0 -1
  718. package/core/built/admin/assets/editor-DbAen9zf.js +0 -8
  719. package/core/built/admin/assets/editor-screen-BFWThIai.js +0 -26
  720. package/core/built/admin/assets/email-sending-status-context-CWDOD1FN.js +0 -1
  721. package/core/built/admin/assets/email-sending-status-provider-DCPkDICt.js +0 -1
  722. package/core/built/admin/assets/embed-signup-form-modal-DGqsORxS.js +0 -8
  723. package/core/built/admin/assets/empty-indicator-D9QdpuNX.js +0 -1
  724. package/core/built/admin/assets/en-B1jX3WMs.js +0 -1
  725. package/core/built/admin/assets/esm-CXo5SEPy.js +0 -2
  726. package/core/built/admin/assets/explore-nnRr1Fja.js +0 -1
  727. package/core/built/admin/assets/feature-flag-overrides-context-DQjdJFAk.js +0 -1
  728. package/core/built/admin/assets/feature-image-placeholder-BrIHmPs8.js +0 -1
  729. package/core/built/admin/assets/feed-BNUcNu-W.js +0 -1
  730. package/core/built/admin/assets/feedback-DJ4Zb9rZ.js +0 -1
  731. package/core/built/admin/assets/field-C93_Mg6j.js +0 -1
  732. package/core/built/admin/assets/filter-bar-Da1qxybu.js +0 -1
  733. package/core/built/admin/assets/filter-sources-CGJb4C5r.js +0 -1
  734. package/core/built/admin/assets/filters--kKP-EC8.js +0 -1
  735. package/core/built/admin/assets/filters-DxA_a4FP.js +0 -1
  736. package/core/built/admin/assets/first-promoter-modal-BYDtrz2S.js +0 -1
  737. package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-BbSnGOtK.js +0 -1
  738. package/core/built/admin/assets/framework-provider-DqI25epG.js +0 -4
  739. package/core/built/admin/assets/gift-link-modal-B7u5bD4e.js +0 -1
  740. package/core/built/admin/assets/global-data-context-gAMDH9u1.js +0 -1
  741. package/core/built/admin/assets/grid-Dj29PY05.js +0 -1
  742. package/core/built/admin/assets/growth-Cd1uO9d2.js +0 -1
  743. package/core/built/admin/assets/growth-aG32xfdE.js +0 -3
  744. package/core/built/admin/assets/heading-Dh5SFVjL.js +0 -1
  745. package/core/built/admin/assets/history-modal-Df8lW8h-.js +0 -1
  746. package/core/built/admin/assets/hooks-Cy_-oZ4o.js +0 -2
  747. package/core/built/admin/assets/html-field-DA4eU7eq.js +0 -1
  748. package/core/built/admin/assets/iframe-buffering-B2OKJzbz.js +0 -1
  749. package/core/built/admin/assets/images-KXmyO3Ss.js +0 -1
  750. package/core/built/admin/assets/index-BHHXtR5C.css +0 -2
  751. package/core/built/admin/assets/index-CgMCwsxN.js +0 -4
  752. package/core/built/admin/assets/index.es-CY6-yuw9.js +0 -1
  753. package/core/built/admin/assets/inline-BWSs_VzR.js +0 -1
  754. package/core/built/admin/assets/input-group-BE8rM2y1.js +0 -1
  755. package/core/built/admin/assets/input-surface-BsrIZeSF.js +0 -1
  756. package/core/built/admin/assets/integration-header-Bm6IDb1A.js +0 -1
  757. package/core/built/admin/assets/invite-user-modal-B4CuNcx4.js +0 -1
  758. package/core/built/admin/assets/koenig-loader-BeM5rFPX.js +0 -2
  759. package/core/built/admin/assets/kpi-card-B21aToe8.js +0 -1
  760. package/core/built/admin/assets/kpi-card-pz6Wv4Ae.js +0 -1
  761. package/core/built/admin/assets/kpi-helpers-Dq5jelmP.js +0 -1
  762. package/core/built/admin/assets/kpi-tabs-DEZHpKUt.js +0 -1
  763. package/core/built/admin/assets/label-OLCzze8N.js +0 -1
  764. package/core/built/admin/assets/label-picker-BigOvMPV.js +0 -1
  765. package/core/built/admin/assets/labels-Dr0SgUQD.js +0 -1
  766. package/core/built/admin/assets/layout-DUTL8SH5.js +0 -1
  767. package/core/built/admin/assets/lib-7QPTI0FS.js +0 -1
  768. package/core/built/admin/assets/limit-service-BhiEvqcP.js +0 -20
  769. package/core/built/admin/assets/link-helpers-BRAg9SCj.js +0 -1
  770. package/core/built/admin/assets/links-BDHPTlyj.js +0 -1
  771. package/core/built/admin/assets/list-page-BucXJ0hi.js +0 -1
  772. package/core/built/admin/assets/luxon-D1RVjjpq.js +0 -1
  773. package/core/built/admin/assets/member-custom-fields-TRTHCAz9.js +0 -1
  774. package/core/built/admin/assets/member-detail-b6dRwc3C.js +0 -1
  775. package/core/built/admin/assets/members-Czt5lJSc.js +0 -4
  776. package/core/built/admin/assets/modal-page-xCivTMvI.js +0 -1
  777. package/core/built/admin/assets/moderation-ZWefD9uH.js +0 -1
  778. package/core/built/admin/assets/multi-select-combobox-CT13MTo-.js +0 -1
  779. package/core/built/admin/assets/navigation-modal-C8FEhBK5.js +0 -1
  780. package/core/built/admin/assets/newsletter-5VYW4RyJ.js +0 -1
  781. package/core/built/admin/assets/newsletter-detail-modal-ChjC0ZqH.js +0 -1
  782. package/core/built/admin/assets/newsletter-emails-DZH6I-PY.js +0 -1
  783. package/core/built/admin/assets/newsletters-DOC9KBcX.js +0 -1
  784. package/core/built/admin/assets/note-DIV-Pojr.js +0 -1
  785. package/core/built/admin/assets/notifications-s20-H49V.js +0 -1
  786. package/core/built/admin/assets/nql-lang-CaWrLesS.js +0 -19
  787. package/core/built/admin/assets/offers-container-modal-BmG5M5Tv.js +0 -1
  788. package/core/built/admin/assets/onboarding-CUuy9unR.js +0 -1
  789. package/core/built/admin/assets/onboarding-pXyct0Jm.js +0 -1
  790. package/core/built/admin/assets/onboarding-route-CK4pcXoR.js +0 -1
  791. package/core/built/admin/assets/overview-CaPsciMs.js +0 -1
  792. package/core/built/admin/assets/overview-a8GfcsKX.js +0 -1
  793. package/core/built/admin/assets/page-header-DM_KyoFI.js +0 -1
  794. package/core/built/admin/assets/pagemenu-vgZVUVKR.js +0 -1
  795. package/core/built/admin/assets/pages-route-BzKZYdV5.js +0 -1
  796. package/core/built/admin/assets/papaparse.min-cQwnxGCG.js +0 -10
  797. package/core/built/admin/assets/pintura-modal-DExCF1ii.js +0 -1
  798. package/core/built/admin/assets/portal-frame-Cqanidq4.js +0 -1
  799. package/core/built/admin/assets/portal-modal-oinBgA27.js +0 -1
  800. package/core/built/admin/assets/post-analytics-C5oJ1dWV.js +0 -1
  801. package/core/built/admin/assets/post-analytics-context-D0Mw-Pmv.js +0 -1
  802. package/core/built/admin/assets/post-analytics-header-OATo3X_r.js +0 -1
  803. package/core/built/admin/assets/post-analytics-provider-tOpIVGT5.js +0 -1
  804. package/core/built/admin/assets/post-share-modal-DvhC1XgV.js +0 -1
  805. package/core/built/admin/assets/posts-list-screen-o4ZjbgS3.js +0 -2
  806. package/core/built/admin/assets/posts-route-9F--xdIb.js +0 -1
  807. package/core/built/admin/assets/preferences--vNubsqD.js +0 -5
  808. package/core/built/admin/assets/preview-chrome-BljUBlOk.js +0 -1
  809. package/core/built/admin/assets/preview-modal-YYbzlYdO.js +0 -1
  810. package/core/built/admin/assets/profile-BllKV3dR.js +0 -1
  811. package/core/built/admin/assets/prop-types-DeUPn3oD.js +0 -1
  812. package/core/built/admin/assets/radio-group-DL8GI8rt.js +0 -1
  813. package/core/built/admin/assets/react-Bb3IsNbi.js +0 -1
  814. package/core/built/admin/assets/rolldown-runtime-DAXXjFlN.js +0 -1
  815. package/core/built/admin/assets/router-provider-BSvTXgZY.js +0 -1
  816. package/core/built/admin/assets/select-v5YbA3Mw.js +0 -1
  817. package/core/built/admin/assets/settings-PEsZupw1.js +0 -4
  818. package/core/built/admin/assets/settings-breadcrumbs-NwPnCTC7.js +0 -1
  819. package/core/built/admin/assets/settings-u_s1CRkr.js +0 -1
  820. package/core/built/admin/assets/shade-app-CcS3f8MZ-vwURazk8.js +0 -3
  821. package/core/built/admin/assets/share-modal-SskCmVGL.js +0 -1
  822. package/core/built/admin/assets/skeleton-Ce9GgUpf.js +0 -1
  823. package/core/built/admin/assets/slack-modal-XxSJiYgo.js +0 -1
  824. package/core/built/admin/assets/sort-button-Cx1KtINE.js +0 -1
  825. package/core/built/admin/assets/source-icon-Bdp9Im_5.js +0 -1
  826. package/core/built/admin/assets/stack-B2eszIiq.js +0 -1
  827. package/core/built/admin/assets/stats-view-W2g6Jsd-.js +0 -1
  828. package/core/built/admin/assets/step-1-BQYzvBzr.js +0 -1
  829. package/core/built/admin/assets/step-2-xES32xJV.js +0 -1
  830. package/core/built/admin/assets/step-3-DA_XK5kW.js +0 -2
  831. package/core/built/admin/assets/stripe-button-CVsLHelt.js +0 -1
  832. package/core/built/admin/assets/stripe-connect-modal-ClmLOMGS.js +0 -1
  833. package/core/built/admin/assets/switch-CI4gLWqb.js +0 -1
  834. package/core/built/admin/assets/table-BenqVupI.js +0 -1
  835. package/core/built/admin/assets/tabs-eBBlxPp8.js +0 -1
  836. package/core/built/admin/assets/tag-detail-Ce8Se2qd.js +0 -2
  837. package/core/built/admin/assets/tag-picker-C3UR-uJ-.js +0 -1
  838. package/core/built/admin/assets/tags-B-kJxCs7.js +0 -1
  839. package/core/built/admin/assets/testimonials-modal-9Q6fT06V.js +0 -1
  840. package/core/built/admin/assets/text-BQDSDsKs.js +0 -1
  841. package/core/built/admin/assets/textarea-DJ1Q5V39.js +0 -1
  842. package/core/built/admin/assets/tier-detail-modal-CDyYdqK7.js +0 -1
  843. package/core/built/admin/assets/toggle-group-CviIkyok.js +0 -1
  844. package/core/built/admin/assets/topic-filter-I2jCBGxm.js +0 -1
  845. package/core/built/admin/assets/transistor-modal-p53u3W8y.js +0 -1
  846. package/core/built/admin/assets/trend-badge-CideVzQd.js +0 -1
  847. package/core/built/admin/assets/types-uYQ1HgqL.js +0 -1
  848. package/core/built/admin/assets/unsplash-modal-DY8UcKcE.js +0 -1
  849. package/core/built/admin/assets/use-analytics-data-DAIGcr2f.js +0 -1
  850. package/core/built/admin/assets/use-filter-params-JkZhIS8L.js +0 -1
  851. package/core/built/admin/assets/use-filterable-api-BVEVMrhZ.js +0 -1
  852. package/core/built/admin/assets/use-form-vRjI0Kwk.js +0 -1
  853. package/core/built/admin/assets/use-growth-stats-937CUj6j.js +0 -1
  854. package/core/built/admin/assets/use-host-limits-D0Dv3tKA.js +0 -1
  855. package/core/built/admin/assets/use-limiter-CohWfzvK.js +0 -2
  856. package/core/built/admin/assets/use-navigate-with-base-path-BkxcPj5l.js +0 -1
  857. package/core/built/admin/assets/use-pintura-config-xgytjU35.js +0 -1
  858. package/core/built/admin/assets/use-pintura-editor-CaV1mbfO.js +0 -1
  859. package/core/built/admin/assets/use-post-referrers-BCQI7fDg.js +0 -1
  860. package/core/built/admin/assets/use-query-params-BfzuqbcD.js +0 -1
  861. package/core/built/admin/assets/use-reply-chain-data-CYRhoaxY.js +0 -1
  862. package/core/built/admin/assets/use-router-history-entry-NOKcd--l.js +0 -1
  863. package/core/built/admin/assets/use-setting-group-bLKMwoBT.js +0 -1
  864. package/core/built/admin/assets/use-settings-navigation-B-qrriKD.js +0 -1
  865. package/core/built/admin/assets/use-simple-pagination-CNPd6Rf6.js +0 -1
  866. package/core/built/admin/assets/use-staff-users-pRIMIyiW.js +0 -1
  867. package/core/built/admin/assets/use-tinybird-query-CmdbCS9X.js +0 -1
  868. package/core/built/admin/assets/use-tinybird-token-KLne235s.js +0 -1
  869. package/core/built/admin/assets/use-unsaved-changes-guard-7-ug0JdH.js +0 -1
  870. package/core/built/admin/assets/use-upgrade-route-Dm_qqKr0.js +0 -1
  871. package/core/built/admin/assets/user-detail-modal-D3KlGYv-.js +0 -1
  872. package/core/built/admin/assets/virtual-list-CZ3RK2Yf.js +0 -1
  873. package/core/built/admin/assets/web-ClEJsCAj.js +0 -2
  874. package/core/built/admin/assets/web-X9rdnrtq.js +0 -1
  875. package/core/built/admin/assets/zapier-modal-DfVhV17j.js +0 -1
  876. package/core/frontend/services/sitemap/utils.js +0 -17
  877. package/core/server/services/automations/get-scheduler-idempotency-key.js +0 -13
  878. package/core/server/web/api/testmode/index.js +0 -1
  879. package/core/server/web/api/testmode/jobs/cpu-hog.js +0 -15
  880. package/core/server/web/api/testmode/jobs/graceful-job.js +0 -50
  881. package/core/server/web/api/testmode/jobs/say-hello.js +0 -17
  882. package/core/server/web/api/testmode/routes.js +0 -120
  883. /package/core/built/admin/assets/{chunk.901.4ccc639821020230bcca.js.LICENSE.txt → chunk.972.4b8c97f93d66db15e751.js.LICENSE.txt} +0 -0
@@ -1,3 +1,5 @@
1
+ const { performance } = require('node:perf_hooks');
2
+ const { setImmediate: yieldToEventLoop } = require('node:timers/promises');
1
3
  const errors = require('@tryghost/errors');
2
4
  const urlUtils = require('../../../shared/url-utils').default;
3
5
  const IndexMapGenerator = require('./site-map-index-generator');
@@ -22,11 +24,22 @@ const SITEMAP_COLUMNS = [
22
24
  'canonical_url',
23
25
  ];
24
26
 
27
+ const RESOURCE_TYPES = ['posts', 'pages', 'tags', 'authors'];
28
+
29
+ // Longest stretch a build runs before yielding to the event loop.
30
+ const DEFAULT_BUILD_SLICE_MS = 10;
31
+
32
+ // Builds a reader will start before giving up on a site that keeps changing.
33
+ const MAX_BUILD_ATTEMPTS = 3;
34
+
25
35
  class SiteMapManager {
26
36
  constructor(options) {
27
37
  options = options || {};
28
38
 
29
39
  options.maxPerPage = options.maxPerPage || 50000;
40
+ // Every build creates fresh generators from these.
41
+ this._options = options;
42
+ this._buildSliceMs = options.buildSliceMs ?? DEFAULT_BUILD_SLICE_MS;
30
43
 
31
44
  this.pages = options.pages || this.createPagesGenerator(options);
32
45
  this.posts = options.posts || this.createPostsGenerator(options);
@@ -54,7 +67,7 @@ class SiteMapManager {
54
67
  this._indexEpoch = 0;
55
68
  // Static/collection route entries only arrive via RouteRegistered,
56
69
  // which fires at boot and routes reload. They are recorded here so
57
- // every rebuild can replay them after resetting the generators.
70
+ // every rebuild can replay them into its fresh generators.
58
71
  this._routerEntries = [];
59
72
 
60
73
  routingEvents.on('RouteRegistered', ({ path, type, id }) => {
@@ -66,7 +79,6 @@ class SiteMapManager {
66
79
  datum: { id, staticRoute: type === 'StaticRoutesRouter' },
67
80
  };
68
81
  this._routerEntries.push(entry);
69
- this.pages.addUrl(entry.url, entry.datum);
70
82
  // A router registering after a build must not leave a
71
83
  // zero-router index marked built — the CDN would pin it.
72
84
  this._invalidateIndex();
@@ -90,13 +102,13 @@ class SiteMapManager {
90
102
  });
91
103
  }
92
104
 
93
- createIndexGenerator(options) {
105
+ createIndexGenerator(options, types = this) {
94
106
  return new IndexMapGenerator({
95
107
  types: {
96
- pages: this.pages,
97
- posts: this.posts,
98
- authors: this.authors,
99
- tags: this.tags,
108
+ pages: types.pages,
109
+ posts: types.posts,
110
+ authors: types.authors,
111
+ tags: types.tags,
100
112
  },
101
113
  maxPerPage: options.maxPerPage,
102
114
  });
@@ -133,81 +145,108 @@ class SiteMapManager {
133
145
  * no caller can render from an unbuilt index. The index is built on first
134
146
  * read; the invalidation signals empty it and the next read rebuilds.
135
147
  *
136
- * Concurrent readers share one build. A build whose result was
137
- * invalidated while it ran is discarded and the read fails — the index
138
- * must never serve pre-invalidation data (the CDN would pin it for the
139
- * full cache maxAge), and a 503 is retried by crawlers and stored by
140
- * nobody. Deliberately no retry; if SITEMAP_BUILD_SUPERSEDED shows up in
141
- * the logs at any rate worth caring about, add one then.
148
+ * Reads wait for the rebuild rather than being served the previous index.
149
+ * site.changed is emitted by the same response that purges the CDN, so the
150
+ * first read after an invalidation is the one the CDN stores for the full
151
+ * cache maxAge: serving the previous index there would pin a sitemap
152
+ * missing the change on every publish.
153
+ *
154
+ * Concurrent readers share one build. A build invalidated while it runs is
155
+ * abandoned and a fresh one started; a site changing faster than the index
156
+ * can be built fails the read with a 503, which crawlers retry and nobody
157
+ * stores.
142
158
  */
143
159
  async _ensureIndexReady() {
144
- if (this._indexBuilt) {
145
- return;
146
- }
147
- if (!this._buildInFlight) {
148
- this._buildInFlight = this._buildIndex().finally(() => {
149
- this._buildInFlight = null;
150
- });
160
+ for (let attempt = 0; attempt < MAX_BUILD_ATTEMPTS && !this._indexBuilt; attempt++) {
161
+ if (!this._buildInFlight) {
162
+ this._buildInFlight = this._buildIndex().finally(() => {
163
+ this._buildInFlight = null;
164
+ });
165
+ }
166
+ await this._buildInFlight;
151
167
  }
152
- await this._buildInFlight;
153
168
 
154
169
  if (!this._indexBuilt) {
155
170
  throw new errors.MaintenanceError({
156
- message: 'Sitemap index build was invalidated by a concurrent site change',
171
+ message: 'Sitemap index build was repeatedly invalidated by concurrent site changes',
157
172
  code: 'SITEMAP_BUILD_SUPERSEDED',
158
173
  });
159
174
  }
160
175
  }
161
176
 
177
+ /**
178
+ * Builds into fresh generators and swaps them in once complete, so the
179
+ * build can yield to the event loop without any reader seeing a partial
180
+ * index. The epoch is checked after every yield: an invalidation (including
181
+ * a RouteRegistered mid-build) abandons the build without swapping.
182
+ */
162
183
  async _buildIndex() {
163
184
  const epoch = this._indexEpoch;
164
185
  const urlService = this._getUrlService();
165
186
  const fetch = (type) => urlService.getRoutableResources(type, { columns: SITEMAP_COLUMNS });
166
187
 
167
- const [posts, pages, tags, authors] = await Promise.all([
168
- fetch('posts'),
169
- fetch('pages'),
170
- fetch('tags'),
171
- fetch('authors'),
172
- ]);
188
+ const [posts, pages, tags, authors] = await Promise.all(RESOURCE_TYPES.map(fetch));
173
189
  const resources = { posts, pages, tags, authors };
174
190
 
175
191
  if (epoch !== this._indexEpoch) {
176
- // Invalidated while fetching: leave the generators alone and let
177
- // _ensureIndexReady start over.
178
192
  return;
179
193
  }
180
- // Everything from here on is synchronous, so no request can observe
181
- // a half-applied index.
182
- this.posts.reset();
183
- this.pages.reset();
184
- this.tags.reset();
185
- this.users.reset();
194
+
195
+ const next = {
196
+ posts: this.createPostsGenerator(this._options),
197
+ pages: this.createPagesGenerator(this._options),
198
+ tags: this.createTagsGenerator(this._options),
199
+ authors: this.createUsersGenerator(this._options),
200
+ };
186
201
  for (const entry of this._routerEntries) {
187
- this.pages.addUrl(entry.url, entry.datum);
202
+ next.pages.addUrl(entry.url, entry.datum);
188
203
  }
189
- for (const type of ['posts', 'pages', 'tags', 'authors']) {
190
- for (const datum of resources[type]) {
191
- this._applyResource(type, datum);
204
+
205
+ let sliceStart = performance.now();
206
+ for (const type of RESOURCE_TYPES) {
207
+ const rows = resources[type];
208
+ for (let i = 0; i < rows.length; i++) {
209
+ this._applyResource(next, type, rows[i]);
210
+ // Release each row once applied, so rows and records are not both
211
+ // fully resident.
212
+ rows[i] = undefined;
213
+
214
+ if (performance.now() - sliceStart >= this._buildSliceMs) {
215
+ await yieldToEventLoop();
216
+ if (epoch !== this._indexEpoch) {
217
+ return;
218
+ }
219
+ sliceStart = performance.now();
220
+ }
192
221
  }
193
222
  }
223
+
224
+ this.posts = next.posts;
225
+ this.pages = next.pages;
226
+ this.tags = next.tags;
227
+ this.users = this.authors = next.authors;
228
+ // The index generator holds references to the generators it counts.
229
+ this.index = this.createIndexGenerator(this._options, next);
194
230
  this._indexBuilt = true;
195
231
  }
196
232
 
197
233
  _invalidateIndex() {
198
234
  this._indexBuilt = false;
199
235
  this._indexEpoch += 1;
236
+ // The index generator's cached xml is valid exactly while _indexBuilt
237
+ // is, so the two are dropped together.
238
+ this.index.reset();
200
239
  }
201
240
 
202
241
  /**
203
- * Add a single resource to the index.
242
+ * Add a single resource to a set of generators being built.
204
243
  */
205
- _applyResource(type, datum) {
244
+ _applyResource(generators, type, datum) {
206
245
  const url = this._getUrlService().getUrlForResource({ ...datum, type }, { absolute: true });
207
246
  // Exact match on the not-found sentinel: a real resource can carry
208
247
  // a slug like "404" (/tag/404/) and must stay in the sitemap.
209
248
  if (url && url !== this._notFoundUrl()) {
210
- this[type].addUrl(url, datum);
249
+ generators[type].addUrl(url, datum);
211
250
  }
212
251
  }
213
252
 
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.escapeXml = escapeXml;
7
+ exports.getDeclarations = getDeclarations;
8
+ exports.renderUrlSet = renderUrlSet;
9
+ exports.renderSiteMapIndex = renderSiteMapIndex;
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const url_utils_1 = __importDefault(require("../../../shared/url-utils"));
12
+ // Ghost renders exactly two sitemap documents, both with a shape the
13
+ // sitemaps.org schema fixes: a <urlset> per resource type, and the
14
+ // <sitemapindex> that lists them. They are emitted here directly rather than
15
+ // through a generic xml library — for a shape this fixed a library spends
16
+ // several times as long walking an object tree as writing the tags costs, and
17
+ // keeping both documents in one module keeps escaping in one auditable place.
18
+ const URLSET_OPEN = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"' +
19
+ ' xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">';
20
+ const URLSET_CLOSE = '</urlset>';
21
+ const SITEMAPINDEX_OPEN = '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
22
+ const SITEMAPINDEX_CLOSE = '</sitemapindex>';
23
+ // The characters the xml package escaped in text content, kept character for
24
+ // character so the rendered sitemaps do not change.
25
+ const XML_ESCAPES = {
26
+ '&': '&amp;',
27
+ '"': '&quot;',
28
+ "'": '&apos;',
29
+ '<': '&lt;',
30
+ '>': '&gt;',
31
+ };
32
+ function escapeXml(value) {
33
+ return value.replace(/[&"'<>]/g, (char) => XML_ESCAPES[char]);
34
+ }
35
+ function getDeclarations() {
36
+ const baseUrl = url_utils_1.default.urlFor('sitemap_xsl', true).replace(/^(http:|https:)/, '');
37
+ return ('<?xml version="1.0" encoding="UTF-8"?>' +
38
+ '<?xml-stylesheet type="text/xsl" href="' +
39
+ baseUrl +
40
+ '"?>');
41
+ }
42
+ /**
43
+ * The <urlset> document for one page of one resource type.
44
+ *
45
+ * @param entries in the order they should appear
46
+ */
47
+ function renderUrlSet(entries) {
48
+ // Joined rather than concatenated: join returns a flat string, where
49
+ // repeated concatenation leaves a rope whose fragments are held for as long
50
+ // as the cached sitemap is.
51
+ const parts = [getDeclarations(), URLSET_OPEN];
52
+ for (const entry of entries) {
53
+ parts.push('<url><loc>', escapeXml(entry.loc), '</loc><lastmod>', new Date(entry.ts).toISOString(), '</lastmod>');
54
+ if (entry.imageLoc) {
55
+ parts.push('<image:image><image:loc>', escapeXml(entry.imageLoc), '</image:loc><image:caption>', escapeXml(node_path_1.default.basename(entry.imageLoc)), '</image:caption></image:image>');
56
+ }
57
+ parts.push('</url>');
58
+ }
59
+ parts.push(URLSET_CLOSE);
60
+ return parts.join('');
61
+ }
62
+ /**
63
+ * The <sitemapindex> document listing every page of every resource type.
64
+ */
65
+ function renderSiteMapIndex(entries) {
66
+ const parts = [getDeclarations(), SITEMAPINDEX_OPEN];
67
+ for (const entry of entries) {
68
+ parts.push('<sitemap><loc>', escapeXml(entry.loc), '</loc><lastmod>', new Date(entry.ts).toISOString(), '</lastmod></sitemap>');
69
+ }
70
+ parts.push(SITEMAPINDEX_CLOSE);
71
+ return parts.join('');
72
+ }
@@ -16,7 +16,6 @@ const join = require('path').join;
16
16
 
17
17
  const _ = require('lodash');
18
18
  const themeConfig = require('./config');
19
- const config = require('../../../shared/config');
20
19
  const engine = require('./engine');
21
20
  const themeI18n = require('./i18n');
22
21
  const themeI18next = require('./i18next');
@@ -120,9 +119,8 @@ class ActiveTheme {
120
119
  }
121
120
 
122
121
  mount(siteApp) {
123
- // Reset the global asset hash (used as fallback for non-theme assets)
124
- config.set('assetHash', null);
125
- // Clear the file-based asset hash cache (for theme assets)
122
+ // Clear the asset hash caches: the file-based cache for theme assets, and
123
+ // the global hash used as a fallback for everything else
126
124
  assetHash.clearCache();
127
125
  // clear the view cache
128
126
  siteApp.cache = {};
@@ -1,7 +1,7 @@
1
1
  const _ = require('lodash');
2
2
 
3
3
  module.exports.findKey = function findKey(key /* ...objects... */) {
4
- let objects = Array.prototype.slice.call(arguments, 1);
4
+ const objects = Array.prototype.slice.call(arguments, 1);
5
5
 
6
6
  return _.reduceRight(
7
7
  objects,
@@ -40,8 +40,8 @@ function _urlParentMatch(href, location) {
40
40
  }
41
41
 
42
42
  let parent = false;
43
- let locParts = _urlClean(location).split('/');
44
- let hrefParts = _urlClean(href).split('/');
43
+ const locParts = _urlClean(location).split('/');
44
+ const hrefParts = _urlClean(href).split('/');
45
45
 
46
46
  if (locParts.length <= hrefParts.length) {
47
47
  return false;
@@ -55,11 +55,11 @@ function _urlParentMatch(href, location) {
55
55
  }
56
56
 
57
57
  module.exports.buildLinkClasses = function buildLinkClasses(siteUrl, href, options) {
58
- let relativeHref = href.replace(siteUrl, '');
59
- let location = options.data.root.relativeUrl;
60
- let classes = options.hash.class ? options.hash.class.toString().split(' ') : [];
61
- let activeClass = _.has(options.hash, 'activeClass') ? options.hash.activeClass : 'nav-current';
62
- let parentActiveClass = _.has(options.hash, 'parentActiveClass')
58
+ const relativeHref = href.replace(siteUrl, '');
59
+ const location = options.data.root.relativeUrl;
60
+ const classes = options.hash.class ? options.hash.class.toString().split(' ') : [];
61
+ const activeClass = _.has(options.hash, 'activeClass') ? options.hash.activeClass : 'nav-current';
62
+ const parentActiveClass = _.has(options.hash, 'parentActiveClass')
63
63
  ? options.hash.parentActiveClass
64
64
  : `${activeClass || 'nav-current'}-parent`;
65
65
 
@@ -62,10 +62,9 @@ class I18n {
62
62
  * @returns {string}
63
63
  */
64
64
  t(translationPath, bindings) {
65
- let string;
66
65
  let msg;
67
66
 
68
- string = this._findString(translationPath);
67
+ const string = this._findString(translationPath);
69
68
 
70
69
  // If the path returns an array (as in the case with anything that has multiple paragraphs such as emails), then
71
70
  // loop through them and return an array of translated/formatted strings. Otherwise, just return the normal
@@ -153,7 +152,7 @@ class I18n {
153
152
  */
154
153
  _findString(msgPath, opts) {
155
154
  const options = merge({ log: true }, opts || {});
156
- let candidateString;
155
+
157
156
  let matchingString;
158
157
 
159
158
  // no path? no string
@@ -167,7 +166,7 @@ class I18n {
167
166
  this._handleUninitialisedError(msgPath);
168
167
  }
169
168
 
170
- candidateString = this._getCandidateString(msgPath);
169
+ const candidateString = this._getCandidateString(msgPath);
171
170
 
172
171
  matchingString = candidateString || {};
173
172
 
@@ -198,7 +197,17 @@ class I18n {
198
197
  * @param {string} locale
199
198
  */
200
199
  _readTranslationsFile(locale) {
201
- const filePath = path.join(...this._translationFileDirs(), this._translationFileName(locale));
200
+ const directory = path.resolve(path.join(...this._translationFileDirs()));
201
+ const filePath = path.resolve(directory, this._translationFileName(locale));
202
+
203
+ // A locale names one file directly inside the translations directory.
204
+ if (path.dirname(filePath) !== directory) {
205
+ throw new errors.NotFoundError({
206
+ message: `i18n was unable to find ${locale}.json.`,
207
+ code: 'ENOENT',
208
+ });
209
+ }
210
+
202
211
  const content = fs.readFileSync(filePath, 'utf8');
203
212
  return JSON.parse(content);
204
213
  }
@@ -209,7 +218,7 @@ class I18n {
209
218
  * @param {Object} bindings
210
219
  */
211
220
  _formatMessage(string, bindings) {
212
- let currentLocale = this.locale();
221
+ const currentLocale = this.locale();
213
222
  let msg = new MessageFormat(string, currentLocale);
214
223
 
215
224
  try {
@@ -1,5 +1,5 @@
1
1
  const errors = require('@tryghost/errors');
2
- const i18nLib = require('@tryghost/i18n');
2
+ const i18nLib = require('@tryghost/i18n').default;
3
3
  const path = require('path');
4
4
  const fs = require('fs-extra');
5
5
 
@@ -6,7 +6,7 @@ const labs = require('../../../../shared/labs');
6
6
  const activeTheme = require('../active');
7
7
 
8
8
  function getSiteData() {
9
- let siteData = settingsCache.getPublic();
9
+ const siteData = settingsCache.getPublic();
10
10
 
11
11
  // theme-only computed property added to @site
12
12
  if (settingsCache.get('members_signup_access') === 'none') {
@@ -27,7 +27,7 @@ function getPreviewData(previewHeader, customThemeSettingKeys = []) {
27
27
  hf: 'heading_font',
28
28
  };
29
29
 
30
- let opts = new URLSearchParams(previewHeader);
30
+ const opts = new URLSearchParams(previewHeader);
31
31
 
32
32
  const previewData = {};
33
33
 
@@ -11,9 +11,9 @@ const { api } = require('../services/proxy');
11
11
  * }>}
12
12
  */
13
13
  async function getMemberStats() {
14
- let memberStats = this.data || (await api.stats.memberCountHistory.query());
14
+ const memberStats = this.data || (await api.stats.memberCountHistory.query());
15
15
  const { free, paid, comped, gift } = memberStats.meta.totals;
16
- let total = free + paid + comped + gift;
16
+ const total = free + paid + comped + gift;
17
17
  return { free, paid, comped, gift, total };
18
18
  }
19
19
 
@@ -1,48 +1,39 @@
1
- const onHeaders = require('on-headers');
2
-
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createLlmsDiscovery = createLlmsDiscovery;
7
+ const on_headers_1 = __importDefault(require("on-headers"));
3
8
  function appendHeaderValue(existingValue, newValue) {
4
- if (!existingValue) {
5
- return newValue;
6
- }
7
-
8
- const raw = Array.isArray(existingValue) ? existingValue : [existingValue];
9
- const values = raw.flatMap((v) => v.split(',').map((s) => s.trim()));
10
-
11
- if (values.includes(newValue)) {
12
- return raw.join(', ');
13
- }
14
-
15
- return raw.concat(newValue).join(', ');
9
+ if (!existingValue) {
10
+ return newValue;
11
+ }
12
+ const raw = Array.isArray(existingValue) ? existingValue : [String(existingValue)];
13
+ const values = raw.flatMap((value) => value.split(',').map((part) => part.trim()));
14
+ if (values.includes(newValue)) {
15
+ return raw.join(', ');
16
+ }
17
+ return raw.concat(newValue).join(', ');
16
18
  }
17
-
18
19
  function createLlmsDiscovery({ settingsCache }) {
19
- function isDiscoveryEnabled() {
20
- return !settingsCache.get('is_private') && settingsCache.get('llms_enabled') !== false;
21
- }
22
-
23
- return function llmsDiscovery(req, res, next) {
24
- if (!isDiscoveryEnabled()) {
25
- return next();
20
+ function isDiscoveryEnabled() {
21
+ return !settingsCache.get('is_private') && settingsCache.get('llms_enabled') !== false;
26
22
  }
27
-
28
- onHeaders(res, function addLlmsDiscoveryHeaders() {
29
- if (!isDiscoveryEnabled()) {
30
- return;
31
- }
32
-
33
- const linkHeader = appendHeaderValue(this.getHeader('Link'), '</llms.txt>; rel="llms-txt"');
34
- this.setHeader(
35
- 'Link',
36
- appendHeaderValue(linkHeader, '</llms-full.txt>; rel="llms-full-txt"'),
37
- );
38
-
39
- if (!this.getHeader('X-Llms-Txt')) {
40
- this.setHeader('X-Llms-Txt', '/llms.txt');
41
- }
42
- });
43
-
44
- next();
45
- };
23
+ return function llmsDiscovery(req, res, next) {
24
+ if (!isDiscoveryEnabled()) {
25
+ return next();
26
+ }
27
+ (0, on_headers_1.default)(res, function addLlmsDiscoveryHeaders() {
28
+ if (!isDiscoveryEnabled()) {
29
+ return;
30
+ }
31
+ const linkHeader = appendHeaderValue(this.getHeader('Link'), '</llms.txt>; rel="llms-txt"');
32
+ this.setHeader('Link', appendHeaderValue(linkHeader, '</llms-full.txt>; rel="llms-full-txt"'));
33
+ if (!this.getHeader('X-Llms-Txt')) {
34
+ this.setHeader('X-Llms-Txt', '/llms.txt');
35
+ }
36
+ });
37
+ next();
38
+ };
46
39
  }
47
-
48
- module.exports = { createLlmsDiscovery };
@@ -36,7 +36,7 @@ function createPublicFileMiddleware(location, file, mime, maxAge, options = {})
36
36
  // These files are built on the fly, and must be saved in the content folder
37
37
  const builtFilePath = config.getContentPath('public');
38
38
 
39
- let locationPath = location === 'static' ? staticFilePath : builtFilePath;
39
+ const locationPath = location === 'static' ? staticFilePath : builtFilePath;
40
40
 
41
41
  const filePath = file.match(/^public/)
42
42
  ? path.join(locationPath, file.replace(/^public/, ''))
@@ -87,7 +87,7 @@ const configSchema = zod_1.z
87
87
  return !((hasAccessKey || hasSecretKey || hasSessionToken) && !hasCredentialPair);
88
88
  }, { error: (0, tpl_1.default)(messages.partialCredentials) });
89
89
  /**
90
- * Remote store for route settings backed by an S3-compatible bucket (MinIO in
90
+ * Remote store for route settings backed by an S3-compatible bucket (VersityGW in
91
91
  * tests, GCS in production). Reads and writes the operator's original
92
92
  * `routes.yaml` verbatim.
93
93
  */
@@ -19,6 +19,10 @@ and `unschedule`, and inherit a registry of reschedulers from
19
19
  a job's fire time.
20
20
  - `build-signed-job.ts` — builds an adapter job whose callback URL carries
21
21
  that signed token, from an Admin API path and fire time.
22
+ - `get-scheduler-idempotency-key.ts` — `getSchedulerIdempotencyKey`, which
23
+ derives the idempotency key a job carries from its consumer namespace, fire
24
+ time, and final callback URL, so a persistent queue can recognise a
25
+ re-registration of a job it already holds.
22
26
  - `signed-flush-scheduler.ts` — `SignedFlushScheduler`, a flush-queue
23
27
  primitive on top of the two above: arms one job per fire time (deduplicated
24
28
  in memory), skips already-due times in favour of the caller's own recovery
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getSchedulerIdempotencyKey = getSchedulerIdempotencyKey;
7
+ const node_crypto_1 = __importDefault(require("node:crypto"));
8
+ /**
9
+ * Builds the idempotency key a scheduling adapter sends alongside a job, so a
10
+ * queue with persistent storage can recognise a re-registration of a job it
11
+ * already holds instead of creating a duplicate.
12
+ *
13
+ * The key is a hash rather than the raw inputs so it stays well inside the
14
+ * scheduler's 255-character printable-ASCII limit whatever the URL length.
15
+ */
16
+ function getSchedulerIdempotencyKey({ namespace, date, url, }) {
17
+ const hash = node_crypto_1.default.createHash('sha256');
18
+ hash.update(date.toISOString());
19
+ hash.update(url.href);
20
+ return `ghost-${namespace}-${hash.digest('hex')}`;
21
+ }
@@ -3,10 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- // # Local File System Storage module
7
- // The (default) module for storing media, using the local file system
8
6
  const config_1 = __importDefault(require("../../../shared/config"));
9
7
  const url_utils_1 = __importDefault(require("../../../shared/url-utils"));
8
+ const file_type_utils_1 = require("../../services/files/file-type-utils");
10
9
  const LocalStorageBase_1 = __importDefault(require("./LocalStorageBase"));
11
10
  const messages = {
12
11
  notFound: 'File not found',
@@ -22,5 +21,16 @@ class LocalFilesStorage extends LocalStorageBase_1.default {
22
21
  errorMessages: messages,
23
22
  });
24
23
  }
24
+ /**
25
+ * The files upload endpoint resolves an inert content type for each file
26
+ * (e.g. .html -> text/plain, .svg -> application/octet-stream), which S3
27
+ * stores alongside the object. Local storage has nowhere to keep it, so
28
+ * resolve it again here instead of letting express.static derive a
29
+ * browser-executable type from the extension.
30
+ */
31
+ setServeHeaders(res, filePath) {
32
+ super.setServeHeaders(res, filePath);
33
+ res.setHeader('Content-Type', (0, file_type_utils_1.getStorageContentType)(filePath));
34
+ }
25
35
  }
26
36
  exports.default = LocalFilesStorage;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  // # Local File Base Storage module
7
7
  // The (default) module for storing files using the local file system
8
8
  const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const os_1 = __importDefault(require("os"));
9
10
  const path_1 = __importDefault(require("path"));
10
11
  const tpl_1 = __importDefault(require("@tryghost/tpl"));
11
12
  const errors_1 = __importDefault(require("@tryghost/errors"));
@@ -27,7 +28,7 @@ class LocalStorageBase extends ghost_storage_base_1.StorageBase {
27
28
  errorMessages;
28
29
  constructor({ storagePath, staticFileURLPrefix, siteUrl, errorMessages, }) {
29
30
  super();
30
- this.storagePath = storagePath;
31
+ this.storagePath = storagePath ?? os_1.default.tmpdir();
31
32
  this.staticFileURLPrefix = staticFileURLPrefix;
32
33
  this.siteUrl = siteUrl;
33
34
  this.staticFileUrl = `${siteUrl}${staticFileURLPrefix}`;
@@ -197,6 +198,17 @@ class LocalStorageBase extends ghost_storage_base_1.StorageBase {
197
198
  return false;
198
199
  }
199
200
  }
201
+ /**
202
+ * Sets response headers for a file about to be served from local storage.
203
+ * `send` only derives Content-Type from the extension when it hasn't been
204
+ * set yet, so subclasses can override this to enforce their own type.
205
+ *
206
+ * `nosniff` stops browsers from second-guessing the declared Content-Type
207
+ * based on the file's contents.
208
+ */
209
+ setServeHeaders(res, _filePath) {
210
+ res.setHeader('X-Content-Type-Options', 'nosniff');
211
+ }
200
212
  /**
201
213
  * For some reason send divides the max age number by 1000
202
214
  * Fallthrough: false ensures that if an image isn't found, it automatically 404s
@@ -204,10 +216,12 @@ class LocalStorageBase extends ghost_storage_base_1.StorageBase {
204
216
  */
205
217
  serve() {
206
218
  const { storagePath, errorMessages } = this;
219
+ const setHeaders = (res, filePath) => this.setServeHeaders(res, filePath);
207
220
  return function serveStaticContent(req, res, next) {
208
221
  return serveStatic(storagePath, {
209
222
  maxAge: 365 * 24 * 60 * 60 * 1000, // 1 year in ms
210
223
  fallthrough: false,
224
+ setHeaders,
211
225
  })(req, res, (err) => {
212
226
  if (err) {
213
227
  if (err.statusCode === 404) {