ghost 6.55.0 → 6.57.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 (483) hide show
  1. package/bin/validate-adapters.js +74 -0
  2. package/bin/validate-adapters.ts +87 -0
  3. package/bin/warm-compile-cache.sh +60 -0
  4. package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
  5. package/components/tryghost-kg-default-cards-10.3.3.tgz +0 -0
  6. package/components/tryghost-kg-default-nodes-2.1.4.tgz +0 -0
  7. package/components/tryghost-kg-default-transforms-1.3.3.tgz +0 -0
  8. package/components/tryghost-kg-html-to-lexical-1.3.3.tgz +0 -0
  9. package/components/tryghost-kg-lexical-html-renderer-1.4.3.tgz +0 -0
  10. package/components/tryghost-nql-string-0.0.0.tgz +0 -0
  11. package/components/tryghost-parse-email-address-0.0.0.tgz +0 -0
  12. package/core/app.js +1 -1
  13. package/core/boot.js +21 -25
  14. package/core/bridge.js +10 -12
  15. package/core/built/admin/assets/Combination-BDvCdg1t.js +41 -0
  16. package/core/built/admin/assets/{PolarAngleAxis-BGjf7sBu.js → PolarAngleAxis-C4qtHy1B.js} +1 -1
  17. package/core/built/admin/assets/{RadialBarChart-zeFf9mBz.js → RadialBarChart-Bh09Stsj.js} +1 -1
  18. package/core/built/admin/assets/about-C7O-AgRZ.js +1 -0
  19. package/core/built/admin/assets/{account-migration-sjHLx5dy.js → account-migration-Cv_ol1ko.js} +1 -1
  20. package/core/built/admin/assets/action-list-lGzZLHc8.js +1 -0
  21. package/core/built/admin/assets/activitypub/{account-migration-DoYXtnZ8.js → account-migration-DHFbePl6.js} +7 -7
  22. package/core/built/admin/assets/activitypub/activitypub.js +6 -6
  23. package/core/built/admin/assets/activitypub/{avatar-B3DEDB1l.js → avatar-CT4tS2_S.js} +2 -2
  24. package/core/built/admin/assets/activitypub/{avatar-flipboard-Cqrg0XMx.js → avatar-flipboard-ByYWKipo.js} +2 -2
  25. package/core/built/admin/assets/activitypub/{bluesky-sharing-Bxeh6MKW.js → bluesky-sharing-srVnSHDz.js} +16 -16
  26. package/core/built/admin/assets/activitypub/{content-formatters-BpQARh28.js → content-formatters-C2sos5Ht.js} +3 -3
  27. package/core/built/admin/assets/activitypub/{copy-D9UWIAan.js → copy-B1UBTOoZ.js} +2 -2
  28. package/core/built/admin/assets/activitypub/{dist-D8sFfdpC.js → dist-MPsb2WZ1.js} +12 -12
  29. package/core/built/admin/assets/activitypub/{domain-CWueFW6q.js → domain-DzcM9Dzo.js} +9 -9
  30. package/core/built/admin/assets/activitypub/{edit-profile-BGxPU7N5.js → edit-profile-CsQ_4xAk.js} +945 -945
  31. package/core/built/admin/assets/activitypub/{explore-DBK-u0Ch.js → explore-CJe0DZBK.js} +8 -8
  32. package/core/built/admin/assets/activitypub/{feed-Bcir5RQZ.js → feed-CKV3qWON.js} +33 -33
  33. package/core/built/admin/assets/activitypub/{field-BV-CIT3d.js → field-DckHfDJf.js} +3 -3
  34. package/core/built/admin/assets/activitypub/{hash-BC9Q0N4c.js → hash-Dlp8RM55.js} +2 -2
  35. package/core/built/admin/assets/activitypub/{inbox-DQ4ZnC1m.js → inbox-CsPy4R0M.js} +2 -2
  36. package/core/built/admin/assets/activitypub/{inbox-yC0nfvzl.js → inbox-DAsjzUUe.js} +85 -85
  37. package/core/built/admin/assets/activitypub/{label-DTRS9TDk.js → label-DWyo9E5T.js} +3 -3
  38. package/core/built/admin/assets/activitypub/layout-DM_3pqsU.js +1 -0
  39. package/core/built/admin/assets/activitypub/{moderation-Dwl9t0pb.js → moderation-B0Inc03M.js} +11 -11
  40. package/core/built/admin/assets/activitypub/{note-B-zKsZ7r.js → note-CSE54lER.js} +7 -7
  41. package/core/built/admin/assets/activitypub/{notifications-DjJZD54t.js → notifications-RSwbKqdh.js} +9 -9
  42. package/core/built/admin/assets/activitypub/{preferences-CoU8vs6d.js → preferences-CE231n2_.js} +20 -20
  43. package/core/built/admin/assets/activitypub/{profile-BAsaJekx.js → profile-aaQ1j1Eo.js} +237 -237
  44. package/core/built/admin/assets/activitypub/{reply-CpdMeAO5.js → reply-Cjb0Vs3m.js} +2 -2
  45. package/core/built/admin/assets/activitypub/{routes-CLH3OVTP.js → routes-Djb0mc9k.js} +1139 -1150
  46. package/core/built/admin/assets/activitypub/{separator-BI1FLsYM.js → separator-D8pROI5n.js} +3 -3
  47. package/core/built/admin/assets/activitypub/{settings-DA6pNJ-Q.js → settings-DMc32IQl.js} +13 -13
  48. package/core/built/admin/assets/activitypub/{site-CQD42Pw5.js → site-DVIcsohX.js} +81 -81
  49. package/core/built/admin/assets/activitypub/{step-1-DIDg4aHb.js → step-1-9Yey9usF.js} +5 -5
  50. package/core/built/admin/assets/activitypub/{step-2-BfGe8BYt.js → step-2-DdYmKRXV.js} +6 -6
  51. package/core/built/admin/assets/activitypub/{step-3-mE9spAqw.js → step-3-hdSkcjZU.js} +10 -10
  52. package/core/built/admin/assets/activitypub/{tabs-Cg0saow1.js → tabs-CUqseYzQ.js} +317 -315
  53. package/core/built/admin/assets/activitypub/{topic-filter-DLHBZT93.js → topic-filter-Coni6OXM.js} +3 -3
  54. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-VzbN99u_.js → use-activity-pub-queries-MeHTPMQv.js} +2 -2
  55. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-CAwXTmqH.js → use-navigate-with-base-path-B046AM38.js} +115 -96
  56. package/core/built/admin/assets/activitypub/{use-reply-chain-data-Br4aOWOh.js → use-reply-chain-data-1AO-Xob6.js} +5 -5
  57. package/core/built/admin/assets/activitypub/{x-C8tAnXly.js → x-BRfRYd16.js} +2 -2
  58. package/core/built/admin/assets/add-integration-modal-m9Dv6f77.js +1 -0
  59. package/core/built/admin/assets/add-newsletter-modal-CPSVZL2H.js +1 -0
  60. package/core/built/admin/assets/add-recommendation-modal-Ci9Z5yat.js +1 -0
  61. package/core/built/admin/assets/analytics-DqSCVV8U.js +1 -0
  62. package/core/built/admin/assets/announcement-bar-modal-DU3avV7d.js +1 -0
  63. package/core/built/admin/assets/api-keys-BK0LylyK.js +1 -0
  64. package/core/built/admin/assets/api-keys-_iCT4dxr.js +1 -0
  65. package/core/built/admin/assets/{audience-DjEWNhp3.js → audience-DTJtXXWY.js} +1 -1
  66. package/core/built/admin/assets/automated-emails-PayPCT8L.js +1 -0
  67. package/core/built/admin/assets/{automations-DhKeS_U5.js → automations-162q5HjL.js} +1 -1
  68. package/core/built/admin/assets/{automations-Bx3VcFIL.js → automations-dtQ_MRZ7.js} +1 -1
  69. package/core/built/admin/assets/{bluesky-sharing-ClMd0-Ft.js → bluesky-sharing-B8Es3AuV.js} +1 -1
  70. package/core/built/admin/assets/{box-BWbhXh21.js → box-By_EgGtm.js} +1 -1
  71. package/core/built/admin/assets/brand-icon-09YqFZjV.js +1 -0
  72. package/core/built/admin/assets/{breadcrumb-BD0U2ygg.js → breadcrumb-tg5zL--z.js} +1 -1
  73. package/core/built/admin/assets/build-CsiH26uS.js +1 -0
  74. package/core/built/admin/assets/{card-DGoDJzrn.js → card-aUHX0hyR.js} +1 -1
  75. package/core/built/admin/assets/{chart-BuRT2Y6p.js → chart-BnXyfH11.js} +1 -1
  76. package/core/built/admin/assets/{chart-helpers-fjQKRVyY.js → chart-helpers-CZElTGYL.js} +1 -1
  77. package/core/built/admin/assets/checkbox-Cyo-x7mC.js +1 -0
  78. package/core/built/admin/assets/chunk.524.cd5498dd4e195f679266.js +25 -0
  79. package/core/built/admin/assets/chunk.582.6f92ec1f03734bf2ea3f.js +27 -0
  80. package/core/built/admin/assets/{chunk.481.6c7395a49484bb4583aa.js → chunk.873.b8fc05a8ab877fb819ed.js} +62 -60
  81. package/core/built/admin/assets/code-editor-view-Dq1rQ4tS.js +1 -0
  82. package/core/built/admin/assets/color-picker-field-BonBgxhU.js +1 -0
  83. package/core/built/admin/assets/color-utils-BsrwXuDz.js +1 -0
  84. package/core/built/admin/assets/combobox-uX5r_paI.js +1 -0
  85. package/core/built/admin/assets/command-DxwBO2pF.js +1 -0
  86. package/core/built/admin/assets/comments-Dn-RO-nU.js +1 -0
  87. package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +1 -0
  88. package/core/built/admin/assets/confirmation-modal-B6D6mk6R.js +1 -0
  89. package/core/built/admin/assets/{container-BYz2Ed39.js → container-LiZf3XdY.js} +1 -1
  90. package/core/built/admin/assets/content-api-modal-BxQ-7T6u.js +1 -0
  91. package/core/built/admin/assets/copy-field-BAxL4Zqn.js +1 -0
  92. package/core/built/admin/assets/currency-Dy4Tc2R2.js +1 -0
  93. package/core/built/admin/assets/custom-integration-modal---d_l7lc.js +1 -0
  94. package/core/built/admin/assets/{data-list-16rkJYYi.js → data-list-CupF7bjM.js} +1 -1
  95. package/core/built/admin/assets/{date-range-select-BFp58EMk.js → date-range-select-PB2n1HZf.js} +1 -1
  96. package/core/built/admin/assets/debounce-Dg2fW5Rg.js +3 -0
  97. package/core/built/admin/assets/design-and-theme-modal-DYRT207a.js +23 -0
  98. package/core/built/admin/assets/dirty-confirm-dialog-BnDJ39ao.js +1 -0
  99. package/core/built/admin/assets/disabled-sources-indicator-iMHrkyV3.js +1 -0
  100. package/core/built/admin/assets/dist-B2PvRwLn.js +1 -0
  101. package/core/built/admin/assets/{dist-DGzPJ_bO.js → dist-Cb5RSHSg.js} +1 -1
  102. package/core/built/admin/assets/{dist-P_ohUlTi.js → dist-CqO2lWS02.js} +1 -1
  103. package/core/built/admin/assets/{dist-pHiOxyxa.js → dist-D5vhMdXf.js} +1 -1
  104. package/core/built/admin/assets/dist-DlCyLrOC.js +1 -0
  105. package/core/built/admin/assets/dist-WeOIvSYM.js +23 -0
  106. package/core/built/admin/assets/{dist-DyViJwIy.js → dist-cFzKLG7y.js} +3 -3
  107. package/core/built/admin/assets/dist-j1xxxnY8.js +1 -0
  108. package/core/built/admin/assets/dist-myQaY0ka.js +1 -0
  109. package/core/built/admin/assets/domain-BR8FIdjD.js +1 -0
  110. package/core/built/admin/assets/{dropzone-DlK-K2DQ.js → dropzone-hNxmUvwD.js} +1 -1
  111. package/core/built/admin/assets/{edit-profile-BKT-REJw.js → edit-profile-CENrkY0l.js} +1 -1
  112. package/core/built/admin/assets/editor-B18D0lm8.js +8 -0
  113. package/core/built/admin/assets/embed-signup-form-modal-BsCYUMvQ.js +9 -0
  114. package/core/built/admin/assets/{empty-indicator-oX1u1Pkn.js → empty-indicator-WB1WgT9h.js} +1 -1
  115. package/core/built/admin/assets/{explore-ClUpJZOp.js → explore-BmrnljWw.js} +1 -1
  116. package/core/built/admin/assets/{feed-DF92dUMP.js → feed-Dy4li6i8.js} +1 -1
  117. package/core/built/admin/assets/{field-Do7lieBA.js → field-Dh_lwk13.js} +1 -1
  118. package/core/built/admin/assets/filter-sources-D2zDuJH5.js +1 -0
  119. package/core/built/admin/assets/filters-3JBQcNtJ.js +1 -0
  120. package/core/built/admin/assets/filters-CFt_BDe4.js +1 -0
  121. package/core/built/admin/assets/first-promoter-modal-D6Rjxugw.js +1 -0
  122. package/core/built/admin/assets/format-url-C-t8G6Qd.js +1 -0
  123. package/core/built/admin/assets/{ghost-a9c788f6f0b1ea6cf0f14ca4b13f4496.css → ghost-d38c30b866e59f2e06a357b5eb844fe5.css} +1 -1
  124. package/core/built/admin/assets/{ghost-c4057474943effc568c5659ccc4909d7.js → ghost-d683fbeb945b13155ea669caa5d8db41.js} +420 -398
  125. package/core/built/admin/assets/{ghost-dark-db36d795d21c61426837df40af270966.css → ghost-dark-1bffd5099ba7a749303133efacf8480b.css} +1 -1
  126. package/core/built/admin/assets/{gift-link-modal-f9VIMNDv.js → gift-link-modal-zMtlJhLQ.js} +1 -1
  127. package/core/built/admin/assets/{gift-links-CsUhefWG.js → gift-links-CVuqLhsZ.js} +1 -1
  128. package/core/built/admin/assets/global-data-provider-B949LDXJ.js +1 -0
  129. package/core/built/admin/assets/grid-CUciBfjf.js +1 -0
  130. package/core/built/admin/assets/{growth-CVw1My4S.js → growth-C38Xtp8D.js} +2 -2
  131. package/core/built/admin/assets/{growth-B3I6gNLm.js → growth-CFws67_i.js} +1 -1
  132. package/core/built/admin/assets/history-modal-ILAOkbxH.js +1 -0
  133. package/core/built/admin/assets/{hooks-CixO01lL.js → hooks-D6EE7BIt.js} +2 -2
  134. package/core/built/admin/assets/html-field-9a9Id_2q.js +1 -0
  135. package/core/built/admin/assets/iframe-buffering-e8vH4-Qn.js +1 -0
  136. package/core/built/admin/assets/images-CrQKVc9Q.js +1 -0
  137. package/core/built/admin/assets/{inbox-CFBSu4Ed.js → inbox-BrSRzyvz.js} +6 -6
  138. package/core/built/admin/assets/index-BHy2DZX-.js +67 -0
  139. package/core/built/admin/assets/index-Ds2iUoF6.css +1 -0
  140. package/core/built/admin/assets/index.es-B9tvf-t4.js +1 -0
  141. package/core/built/admin/assets/{inline-EMAm3okk.js → inline-Cw-gigDW.js} +1 -1
  142. package/core/built/admin/assets/input-group-6vEPvX9S.js +1 -0
  143. package/core/built/admin/assets/{input-surface-BpAjZXY5.js → input-surface-BdOe4KzO.js} +1 -1
  144. package/core/built/admin/assets/integration-header-B4DyXV06.js +1 -0
  145. package/core/built/admin/assets/integrations-BT6_iJvu.js +1 -0
  146. package/core/built/admin/assets/invite-user-modal-5xDCEw90.js +1 -0
  147. package/core/built/admin/assets/isEmail-BOfC647y.js +1 -0
  148. package/core/built/admin/assets/koenig-editor-base-BWLEB9Vf.js +1 -0
  149. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +9535 -9527
  150. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +124 -124
  151. package/core/built/admin/assets/{koenig-lexical-f8vHRYvz.js → koenig-lexical-Cj62r_y9.js} +86 -86
  152. package/core/built/admin/assets/{kpi-card-DSap9rAy.js → kpi-card-DOUnkZcN.js} +1 -1
  153. package/core/built/admin/assets/{kpi-card-DU0rn9Cj.js → kpi-card-IHDo8Q56.js} +1 -1
  154. package/core/built/admin/assets/{kpi-helpers-Dz33AV6h.js → kpi-helpers-CjUdECAK.js} +1 -1
  155. package/core/built/admin/assets/{kpi-tabs-BtTTrKvJ.js → kpi-tabs-X3DkOYbI.js} +1 -1
  156. package/core/built/admin/assets/{label-DS8Mi6G5.js → label-Dq6QaOuS.js} +1 -1
  157. package/core/built/admin/assets/label-picker-8YlhS2U3.js +1 -0
  158. package/core/built/admin/assets/labels-DAPjKPy2.js +1 -0
  159. package/core/built/admin/assets/layout-TMj4P-vv.js +1 -0
  160. package/core/built/admin/assets/limit-modal-BRPsit_B.js +1 -0
  161. package/core/built/admin/assets/link-helpers-Bzkk68GD.js +1 -0
  162. package/core/built/admin/assets/{list-page-B6ANtzkd.js → list-page-CdsnQR9N.js} +1 -1
  163. package/core/built/admin/assets/member-custom-fields-CmvsuuV_.js +1 -0
  164. package/core/built/admin/assets/member-detail-DCvRrkmJ.js +1 -0
  165. package/core/built/admin/assets/members-DxbSKngD.js +11 -0
  166. package/core/built/admin/assets/modal-page-BMTzFHVO.js +1 -0
  167. package/core/built/admin/assets/{moderation-DySbgyUS.js → moderation-Da5lhhWh.js} +1 -1
  168. package/core/built/admin/assets/multi-select-combobox-CYdkH7KQ.js +1 -0
  169. package/core/built/admin/assets/navigation-modal-BIoTwtMy.js +1 -0
  170. package/core/built/admin/assets/newsletter-BptlVoJm.js +1 -0
  171. package/core/built/admin/assets/newsletter-detail-modal-BIvxqE0N.js +1 -0
  172. package/core/built/admin/assets/newsletter-emails-Bf8IZLsP.js +1 -0
  173. package/core/built/admin/assets/newsletters-BgrIZk0V.js +1 -0
  174. package/core/built/admin/assets/{newsletters-BXJbJgA-.js → newsletters-Du0lzskS.js} +1 -1
  175. package/core/built/admin/assets/{note-C8kxrz6w.js → note-DYcLOmDb.js} +1 -1
  176. package/core/built/admin/assets/{notifications-CgtSfX7t.js → notifications-B2SPFIV9.js} +1 -1
  177. package/core/built/admin/assets/{offers-DEniVRD5.js → offers-Um6ab71O.js} +1 -1
  178. package/core/built/admin/assets/offers-container-modal-BZnZITMw.js +1 -0
  179. package/core/built/admin/assets/{onboarding-route-4qtziA9d.js → onboarding-route-DgdfxkQh.js} +1 -1
  180. package/core/built/admin/assets/overview-BYQJXSog.js +1 -0
  181. package/core/built/admin/assets/overview-Dt2_mR6U.js +1 -0
  182. package/core/built/admin/assets/{page-header-B3Wb9Jqv.js → page-header-CpmxJj5B.js} +1 -1
  183. package/core/built/admin/assets/{pages-B4goRPUn.js → pages-BVMnpI2O.js} +1 -1
  184. package/core/built/admin/assets/pintura-modal-B4MuBuuO.js +1 -0
  185. package/core/built/admin/assets/portal-frame-BF0NBIji.js +1 -0
  186. package/core/built/admin/assets/portal-modal-DMVbm0oy.js +1 -0
  187. package/core/built/admin/assets/{post-analytics-We-ko5Cb.js → post-analytics-CXWBOGyP.js} +1 -1
  188. package/core/built/admin/assets/post-analytics-header-ChzjXVPt.js +1 -0
  189. package/core/built/admin/assets/{post-analytics-provider-B6UynTGb.js → post-analytics-provider-Cgw4U_fw.js} +1 -1
  190. package/core/built/admin/assets/{post-share-modal-DFfO93_0.js → post-share-modal-B9Vmk_XM.js} +1 -1
  191. package/core/built/admin/assets/{posts-DhXE7b6r.js → posts-CxG7v0-M.js} +1 -1
  192. package/core/built/admin/assets/preferences-BfzJmnsd.js +5 -0
  193. package/core/built/admin/assets/preview-chrome-BOVO6_PE.js +1 -0
  194. package/core/built/admin/assets/preview-modal-Dw_HtD6S.js +1 -0
  195. package/core/built/admin/assets/profile-BT5vtv9b.js +1 -0
  196. package/core/built/admin/assets/radio-group-I7ou7PoJ.js +1 -0
  197. package/core/built/admin/assets/{referrers-pmJT4k3-.js → referrers-B9QDAfYm.js} +1 -1
  198. package/core/built/admin/assets/{router-provider-C1R4AZ2o.js → router-provider-DSQfprxH.js} +1 -1
  199. package/core/built/admin/assets/select-D9oU1IoM.js +1 -0
  200. package/core/built/admin/assets/settings-CfZFbyu_.js +4 -0
  201. package/core/built/admin/assets/{settings-WXNeWyU1.js → settings-CpvHWix7.js} +1 -1
  202. package/core/built/admin/assets/settings-breadcrumbs-K0USP2nw.js +1 -0
  203. package/core/built/admin/assets/{shade-app-B3heOAfz-CGXQwWeO.js → shade-app-B3heOAfz-BhQXxNkT.js} +1 -1
  204. package/core/built/admin/assets/{share-modal-DsgW3wbg.js → share-modal-ClIyPzc5.js} +1 -1
  205. package/core/built/admin/assets/slack-modal-1XXqOfiw.js +1 -0
  206. package/core/built/admin/assets/social-urls-CHQ9cTAK.js +1 -0
  207. package/core/built/admin/assets/{sort-button-Bb_FCl7e.js → sort-button-CdBsm40v.js} +1 -1
  208. package/core/built/admin/assets/{source-icon-BeaRxUn9.js → source-icon-CEYmVLXR.js} +1 -1
  209. package/core/built/admin/assets/{stack-xiN0eQ6Z.js → stack-CIfOAAVf.js} +1 -1
  210. package/core/built/admin/assets/{stats-Bjj_kmJ1.js → stats-D8nZCTy5.js} +1 -1
  211. package/core/built/admin/assets/{stats-view-BxPbW6K1.js → stats-view-CugFVf0g.js} +1 -1
  212. package/core/built/admin/assets/{step-1-B1e3-1F8.js → step-1-DOYjrORn.js} +1 -1
  213. package/core/built/admin/assets/{step-2-C5WaeBJo.js → step-2-vA6RsarH.js} +1 -1
  214. package/core/built/admin/assets/{step-3-B46iVPwu.js → step-3-BtIBxMId.js} +2 -2
  215. package/core/built/admin/assets/stripe-button-UFP4QRXd.js +1 -0
  216. package/core/built/admin/assets/stripe-connect-modal-C_L3uM6n.js +1 -0
  217. package/core/built/admin/assets/switch-CE2NuMn-.js +1 -0
  218. package/core/built/admin/assets/{table-CB-4_HBJ.js → table-TMCgCQK7.js} +1 -1
  219. package/core/built/admin/assets/tabs-Dd6oOKbv.js +1 -0
  220. package/core/built/admin/assets/tag-detail-D3l-UJPR.js +1 -0
  221. package/core/built/admin/assets/tags-BwCgmr5v.js +1 -0
  222. package/core/built/admin/assets/tags-WdKQGWR8.js +1 -0
  223. package/core/built/admin/assets/testimonials-modal-CqWp-xXJ.js +1 -0
  224. package/core/built/admin/assets/{text-DwtjwGkh.js → text-DU9Hv33_.js} +1 -1
  225. package/core/built/admin/assets/textarea-d9qEkMOP.js +1 -0
  226. package/core/built/admin/assets/tier-detail-modal-BkcR2u0A.js +1 -0
  227. package/core/built/admin/assets/{tiers-DYsa4DCo.js → tiers-Da6kxHQP.js} +1 -1
  228. package/core/built/admin/assets/toggle-group-Guorw93z.js +1 -0
  229. package/core/built/admin/assets/{topic-filter-DAFT87tQ.js → topic-filter-CbgoWIHn.js} +1 -1
  230. package/core/built/admin/assets/transistor-modal-DuNnnpal.js +1 -0
  231. package/core/built/admin/assets/unsplash-modal-y2bVwTHH.js +1 -0
  232. package/core/built/admin/assets/{use-analytics-data-S0FTd43s.js → use-analytics-data-B-b4wNSC.js} +1 -1
  233. package/core/built/admin/assets/use-check-theme-limit-error-m09J38Mq.js +2 -0
  234. package/core/built/admin/assets/use-feature-flag-ud0Qz8vt.js +1 -0
  235. package/core/built/admin/assets/{use-filter-params-Gpoq2E1L.js → use-filter-params-BnbBDc7T.js} +1 -1
  236. package/core/built/admin/assets/use-filterable-api-iMpDZBxD.js +1 -0
  237. package/core/built/admin/assets/use-form-vRjI0Kwk.js +1 -0
  238. package/core/built/admin/assets/{use-growth-stats-CIaiHOVb.js → use-growth-stats-DPU5rt3W.js} +1 -1
  239. package/core/built/admin/assets/use-hash-link-navigation-guard-B9j6HIrV.js +1 -0
  240. package/core/built/admin/assets/use-limiter-BkN3E4gw.js +2 -0
  241. package/core/built/admin/assets/use-pintura-config-C_z8HTG2.js +1 -0
  242. package/core/built/admin/assets/use-pintura-editor-DNgbkhGp.js +1 -0
  243. package/core/built/admin/assets/{use-post-referrers-Cq2vBPrA.js → use-post-referrers-C2mXyrp-.js} +1 -1
  244. package/core/built/admin/assets/use-query-params-DHhhu8wi.js +1 -0
  245. package/core/built/admin/assets/{use-reply-chain-data-DBDRtGu-.js → use-reply-chain-data-DaK8q2qQ.js} +1 -1
  246. package/core/built/admin/assets/use-setting-group-YlYcoNyP.js +1 -0
  247. package/core/built/admin/assets/use-settings-navigation-Bf1g1rEh.js +1 -0
  248. package/core/built/admin/assets/{use-simple-pagination-CjYNxdwe.js → use-simple-pagination-D9ckKo5-.js} +1 -1
  249. package/core/built/admin/assets/{use-tinybird-query-falHAtuK.js → use-tinybird-query-GSa32hVw.js} +1 -1
  250. package/core/built/admin/assets/{use-tinybird-token-D7-8ND1y.js → use-tinybird-token-CKLOZFsw.js} +1 -1
  251. package/core/built/admin/assets/use-url-input-z-p0Kewm.js +5 -0
  252. package/core/built/admin/assets/user-detail-modal-BMxOA4Sv.js +1 -0
  253. package/core/built/admin/assets/{users-Dkv8NQZe.js → users-B6hIds6n.js} +1 -1
  254. package/core/built/admin/assets/validator-Cr0sMKuW.js +7 -0
  255. package/core/built/admin/assets/{virtual-list-CvnC9zF2.js → virtual-list-RHeEL05L.js} +1 -1
  256. package/core/built/admin/assets/{web-jFYWCKDn.js → web-Bw2QMO5u.js} +2 -2
  257. package/core/built/admin/assets/web-xJtcwMy4.js +1 -0
  258. package/core/built/admin/assets/zapier-modal-BP2f4-vY.js +1 -0
  259. package/core/built/admin/index.html +20 -18
  260. package/core/frontend/helpers/authors.js +1 -1
  261. package/core/frontend/helpers/link.js +3 -8
  262. package/core/frontend/helpers/tags.js +1 -1
  263. package/core/frontend/meta/author-url.js +2 -2
  264. package/core/frontend/meta/url.js +4 -4
  265. package/core/frontend/services/data/fetch-data.js +10 -5
  266. package/core/frontend/services/proxy.js +1 -1
  267. package/core/frontend/services/routing/api-adapter.js +115 -0
  268. package/core/frontend/services/routing/api-adapter.ts +157 -0
  269. package/core/frontend/services/routing/collection-router.js +5 -3
  270. package/core/frontend/services/routing/controllers/index.js +1 -1
  271. package/core/frontend/services/routing/controllers/rss.js +26 -31
  272. package/core/frontend/services/routing/controllers/rss.ts +66 -0
  273. package/core/frontend/services/routing/controllers/static.js +8 -7
  274. package/core/frontend/services/routing/events.js +20 -6
  275. package/core/frontend/services/routing/parent-router.js +17 -4
  276. package/core/frontend/services/routing/permalink-adapter.js +13 -0
  277. package/core/frontend/services/routing/permalink-adapter.ts +10 -0
  278. package/core/frontend/services/routing/registry.js +59 -33
  279. package/core/frontend/services/routing/router-manager.js +24 -22
  280. package/core/frontend/services/routing/static-routes-router.js +4 -4
  281. package/core/frontend/services/routing/taxonomy-router.js +6 -2
  282. package/core/frontend/services/sitemap/base-site-map-generator.js +1 -28
  283. package/core/frontend/services/sitemap/site-map-manager.js +22 -57
  284. package/core/server/adapters/route-settings/utils.js +10 -2
  285. package/core/server/adapters/route-settings/utils.ts +12 -2
  286. package/core/server/api/endpoints/email-post.js +1 -1
  287. package/core/server/api/endpoints/previews.js +1 -1
  288. package/core/server/api/endpoints/search-index-public.js +3 -3
  289. package/core/server/api/endpoints/search-index.js +4 -4
  290. package/core/server/api/endpoints/utils/serializers/input/authors.js +2 -2
  291. package/core/server/api/endpoints/utils/serializers/input/comments.js +1 -1
  292. package/core/server/api/endpoints/utils/serializers/input/pages.js +3 -3
  293. package/core/server/api/endpoints/utils/serializers/input/posts.js +3 -3
  294. package/core/server/api/endpoints/utils/serializers/input/tags.js +1 -1
  295. package/core/server/api/endpoints/utils/serializers/input/users.js +2 -2
  296. package/core/server/api/endpoints/utils/serializers/input/utils/url.js +31 -13
  297. package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +2 -2
  298. package/core/server/api/endpoints/utils/serializers/output/mappers/tags.js +2 -2
  299. package/core/server/api/endpoints/utils/serializers/output/mappers/users.js +8 -0
  300. package/core/server/api/endpoints/utils/serializers/output/utils/url.js +18 -11
  301. package/core/server/data/migrations/versions/6.56/2026-08-03-19-27-51-add-automation-run-step-id-to-automated-email-recipients.js +8 -0
  302. package/core/server/data/migrations/versions/6.56/2026-08-04-14-42-39-restrict-notification-add-permission-to-administrators.js +12 -0
  303. package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +74 -0
  304. package/core/server/data/migrations/versions/6.57/2026-08-04-18-54-14-reset-automation-email-analytics.js +25 -0
  305. package/core/server/data/schema/commands.js +21 -5
  306. package/core/server/data/schema/fixtures/fixtures.json +2 -2
  307. package/core/server/data/schema/schema.js +25 -5
  308. package/core/server/lib/common/to-plain.ts +1 -1
  309. package/core/server/models/post.js +12 -3
  310. package/core/server/services/adapter-manager/adapter-manager.js +1 -45
  311. package/core/server/services/adapter-manager/adapter-manager.ts +2 -48
  312. package/core/server/services/adapter-manager/adapter-paths.js +24 -0
  313. package/core/server/services/adapter-manager/adapter-paths.ts +21 -0
  314. package/core/server/services/adapter-manager/base-classes.js +22 -0
  315. package/core/server/services/adapter-manager/base-classes.ts +22 -0
  316. package/core/server/services/adapter-manager/index.js +4 -27
  317. package/core/server/services/adapter-manager/index.ts +4 -31
  318. package/core/server/services/adapter-manager/utils.js +50 -0
  319. package/core/server/services/adapter-manager/utils.ts +57 -0
  320. package/core/server/services/audience-feedback/audience-feedback-controller.js +1 -1
  321. package/core/server/services/audience-feedback/audience-feedback-service.js +2 -2
  322. package/core/server/services/automations/automations-repository.ts +3 -1
  323. package/core/server/services/automations/database-automations-repository.js +33 -14
  324. package/core/server/services/automations/database-automations-repository.ts +41 -15
  325. package/core/server/services/automations/get-scheduler-idempotency-key.js +13 -0
  326. package/core/server/services/automations/get-scheduler-idempotency-key.ts +8 -0
  327. package/core/server/services/automations/poll.js +3 -1
  328. package/core/server/services/automations/poll.ts +4 -1
  329. package/core/server/services/automations/service.js +7 -3
  330. package/core/server/services/automations/service.ts +7 -3
  331. package/core/server/services/comments/comments-service-emails.js +1 -1
  332. package/core/server/services/comments/comments-service.js +1 -1
  333. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +11 -2
  334. package/core/server/services/email-analytics/email-analytics-service.js +1 -1
  335. package/core/server/services/email-service/email-service-wrapper.js +2 -1
  336. package/core/server/services/email-service/mailgun-email-provider.js +15 -0
  337. package/core/server/services/gift-links/CONTEXT.md +9 -0
  338. package/core/server/services/gifts/CONTEXT.md +55 -0
  339. package/core/server/services/gifts/README.md +28 -0
  340. package/core/server/services/gifts/gift-bookshelf-repository.js +65 -45
  341. package/core/server/services/gifts/gift-bookshelf-repository.ts +203 -74
  342. package/core/server/services/gifts/gift-checkout-adapter.js +59 -0
  343. package/core/server/services/gifts/gift-checkout-offer.js +74 -0
  344. package/core/server/services/gifts/gift-checkout-offer.ts +127 -0
  345. package/core/server/services/gifts/gift-codec.js +63 -0
  346. package/core/server/services/gifts/gift-codec.ts +62 -0
  347. package/core/server/services/gifts/gift-controller.js +6 -31
  348. package/core/server/services/gifts/gift-controller.ts +6 -69
  349. package/core/server/services/gifts/gift-email-service.ts +3 -2
  350. package/core/server/services/gifts/gift-schema.js +34 -0
  351. package/core/server/services/gifts/gift-schema.ts +39 -0
  352. package/core/server/services/gifts/gift-service-wrapper.js +13 -11
  353. package/core/server/services/gifts/gift-service.js +265 -52
  354. package/core/server/services/gifts/gift-service.ts +431 -97
  355. package/core/server/services/gifts/gift.ts +16 -39
  356. package/core/server/services/indexnow-ping/indexnow-ping-service.js +1 -1
  357. package/core/server/services/indexnow-ping/indexnow-ping-service.ts +2 -4
  358. package/core/server/services/lib/mailgun-client.js +3 -3
  359. package/core/server/services/link-tracking/link-click-repository.js +6 -1
  360. package/core/server/services/link-tracking/link-click-tracking-service.js +12 -3
  361. package/core/server/services/media-inliner/external-media-inliner.js +12 -8
  362. package/core/server/services/member-attribution/url-translator.js +5 -7
  363. package/core/server/services/member-welcome-emails/member-welcome-email-renderer.js +4 -3
  364. package/core/server/services/member-welcome-emails/service.js +79 -15
  365. package/core/server/services/members/api.js +2 -3
  366. package/core/server/services/members/import-export/import/completion-email.js +8 -4
  367. package/core/server/services/members/import-export/import/completion-email.ts +9 -4
  368. package/core/server/services/members/import-export/import/importer.js +25 -4
  369. package/core/server/services/members/import-export/import/importer.ts +27 -6
  370. package/core/server/services/members/import-export/import/row.ts +5 -1
  371. package/core/server/services/members/import-export/index.js +6 -2
  372. package/core/server/services/members/import-export/index.ts +10 -4
  373. package/core/server/services/members/members-api/controllers/router-controller.js +38 -36
  374. package/core/server/services/members/members-api/members-api.js +13 -7
  375. package/core/server/services/members/members-api/repositories/event-repository.js +4 -94
  376. package/core/server/services/members/members-api/services/member-bread-service.js +3 -3
  377. package/core/server/services/members/members-api/services/payments-service.js +6 -68
  378. package/core/server/services/members-custom-fields/queries.js +4 -13
  379. package/core/server/services/members-custom-fields/queries.ts +4 -13
  380. package/core/server/services/members-custom-fields/schema.js +19 -21
  381. package/core/server/services/members-custom-fields/schema.ts +18 -20
  382. package/core/server/services/members-custom-fields/storage.js +94 -27
  383. package/core/server/services/members-custom-fields/storage.ts +114 -39
  384. package/core/server/services/members-custom-fields/values-service.js +98 -103
  385. package/core/server/services/members-custom-fields/values-service.ts +116 -114
  386. package/core/server/services/mentions/resource-service.js +1 -1
  387. package/core/server/services/mentions/service.js +2 -2
  388. package/core/server/services/oembed/oembed-service.js +44 -3
  389. package/core/server/services/posts/posts-service.js +11 -0
  390. package/core/server/services/route-settings/dynamic-routing-service.js +10 -62
  391. package/core/server/services/route-settings/route-settings-parser.js +25 -25
  392. package/core/server/services/route-settings/route-settings-parser.ts +27 -27
  393. package/core/server/services/route-settings/validation-errors.js +68 -4
  394. package/core/server/services/route-settings/validation-errors.ts +79 -4
  395. package/core/server/services/slack-ping/slack-ping-service.js +2 -2
  396. package/core/server/services/slack-ping/slack-ping-service.ts +3 -5
  397. package/core/server/services/stats/content-stats-service.js +3 -3
  398. package/core/server/services/stats/posts-stats-service.js +29 -25
  399. package/core/server/services/stripe/services/webhook/charge-refunded-event-service.js +1 -1
  400. package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +16 -4
  401. package/core/server/services/stripe/stripe-api.js +10 -0
  402. package/core/server/services/url/config.js +90 -135
  403. package/core/server/services/url/index.js +6 -49
  404. package/core/server/services/url/lazy-find-resource.js +14 -11
  405. package/core/server/services/url/lazy-find-resource.ts +14 -11
  406. package/core/server/services/url/lazy-url-service.js +174 -94
  407. package/core/server/services/url/lazy-url-service.ts +233 -97
  408. package/core/server/services/url/routable-resources.js +62 -71
  409. package/core/server/services/url/router-filter.js +12 -4
  410. package/core/server/services/url/router-filter.ts +12 -4
  411. package/core/server/services/webhooks/index.js +1 -1
  412. package/core/server/services/webhooks/serialize.js +2 -1
  413. package/core/server/web/gift-preview/controller.js +10 -25
  414. package/core/shared/config/env/config.testing-mysql.json +1 -2
  415. package/core/shared/config/env/config.testing.json +1 -2
  416. package/core/shared/events/index.js +1 -2
  417. package/core/shared/labs.js +4 -4
  418. package/package.json +10 -10
  419. package/pnpm-lock.yaml +27 -20
  420. package/pnpm-workspace.yaml +3 -2
  421. package/tsconfig.json +1 -0
  422. package/components/tryghost-kg-default-nodes-2.1.3.tgz +0 -0
  423. package/core/built/admin/assets/Combination-CJG7Flp-.js +0 -41
  424. package/core/built/admin/assets/activitypub/layout-qx-bUL1k.js +0 -1
  425. package/core/built/admin/assets/automated-emails-DRy7qY-J.js +0 -7
  426. package/core/built/admin/assets/checkbox-CWa28lgO.js +0 -1
  427. package/core/built/admin/assets/chunk.524.cffd399783a519e404a9.js +0 -25
  428. package/core/built/admin/assets/chunk.582.eebf0d0b2d202bb746a5.js +0 -27
  429. package/core/built/admin/assets/code-editor-view-CCr0rBWS.js +0 -1
  430. package/core/built/admin/assets/comments-DyUSMUdj.js +0 -1
  431. package/core/built/admin/assets/disabled-sources-indicator-CUxMfiPa.js +0 -1
  432. package/core/built/admin/assets/dist-2Tnz2Yfq.js +0 -1
  433. package/core/built/admin/assets/dist-CjY-f5Z1.js +0 -1
  434. package/core/built/admin/assets/dist-DDY6GRVz.js +0 -1
  435. package/core/built/admin/assets/dist-DG78yroX.js +0 -23
  436. package/core/built/admin/assets/domain-C0bV2UV8.js +0 -1
  437. package/core/built/admin/assets/editor-Dp865O-4.js +0 -8
  438. package/core/built/admin/assets/esm-CFX93H5M.js +0 -2
  439. package/core/built/admin/assets/filter-sources-BV2rnpfA.js +0 -1
  440. package/core/built/admin/assets/filters-CUXJ2Nm9.js +0 -1
  441. package/core/built/admin/assets/filters-DfbIWc_l.js +0 -1
  442. package/core/built/admin/assets/index-9Cw8z3rA.css +0 -1
  443. package/core/built/admin/assets/index-BGG7NckO.js +0 -67
  444. package/core/built/admin/assets/input-group-BSgG_lVw.js +0 -1
  445. package/core/built/admin/assets/label-picker-1DvSuLA1.js +0 -1
  446. package/core/built/admin/assets/labels-CDSUt4J_.js +0 -1
  447. package/core/built/admin/assets/layout-yQEi2qDM.js +0 -1
  448. package/core/built/admin/assets/link-helpers-7EYqvvHs.js +0 -1
  449. package/core/built/admin/assets/member-custom-fields-yOMHyAg9.js +0 -1
  450. package/core/built/admin/assets/member-detail-BAq7gDaa.js +0 -1
  451. package/core/built/admin/assets/members-CQpVFJu4.js +0 -10
  452. package/core/built/admin/assets/modals-ReORvWnu.js +0 -31
  453. package/core/built/admin/assets/newsletter-CJQvtHqN.js +0 -1
  454. package/core/built/admin/assets/newsletters-B3QQXfGT.js +0 -1
  455. package/core/built/admin/assets/nql-BsgFMd93.js +0 -1
  456. package/core/built/admin/assets/overview-Bf2sbznq.js +0 -1
  457. package/core/built/admin/assets/overview-CBfePxcr.js +0 -1
  458. package/core/built/admin/assets/post-analytics-header-Bmc9su6q.js +0 -1
  459. package/core/built/admin/assets/preferences-DJPfHEGu.js +0 -5
  460. package/core/built/admin/assets/profile-DqBQp-gT.js +0 -1
  461. package/core/built/admin/assets/select-C5_xEt5b.js +0 -1
  462. package/core/built/admin/assets/settings-BwiVIXau.js +0 -4
  463. package/core/built/admin/assets/social-urls-BQPFEk1_.js +0 -8
  464. package/core/built/admin/assets/switch-z5Y6Uzt6.js +0 -1
  465. package/core/built/admin/assets/tabs-CCEgKYzq.js +0 -1
  466. package/core/built/admin/assets/tags-Cg2VJGmG.js +0 -1
  467. package/core/built/admin/assets/textarea-Bjccvh_E.js +0 -1
  468. package/core/built/admin/assets/toggle-group-b3IlxvhV.js +0 -1
  469. package/core/built/admin/assets/web-B_5GZRvH.js +0 -1
  470. package/core/server/services/gifts/gift-repository.js +0 -2
  471. package/core/server/services/gifts/gift-repository.ts +0 -29
  472. package/core/server/services/route-settings/activation-bridge.js +0 -174
  473. package/core/server/services/route-settings/activation-bridge.ts +0 -250
  474. package/core/server/services/url/local-file-cache.js +0 -75
  475. package/core/server/services/url/queue.js +0 -260
  476. package/core/server/services/url/resource.js +0 -102
  477. package/core/server/services/url/resources.js +0 -480
  478. package/core/server/services/url/url-generator.js +0 -276
  479. package/core/server/services/url/url-service-facade.js +0 -366
  480. package/core/server/services/url/url-service-facade.ts +0 -519
  481. package/core/server/services/url/url-service.js +0 -387
  482. package/core/server/services/url/urls.js +0 -140
  483. package/core/shared/events/url-resource-updated-event.js +0 -33
@@ -86,15 +86,6 @@ class BaseSiteMapGenerator {
86
86
  return sitemapXml;
87
87
  }
88
88
 
89
- updateURL(datum) {
90
- const url = this.nodeLookup[datum.id]?.url[0].loc;
91
-
92
- if (url) {
93
- this.removeUrl(url, datum);
94
- this.addUrl(url, datum);
95
- }
96
- }
97
-
98
89
  addUrl(url, datum) {
99
90
  // Computed once and threaded through: the three consumers below each
100
91
  // used to construct their own moment() from the same datum, which
@@ -110,14 +101,6 @@ class BaseSiteMapGenerator {
110
101
  }
111
102
  }
112
103
 
113
- removeUrl(url, datum) {
114
- this.removeFromLookups(datum);
115
-
116
- // force regeneration of xml
117
- this.siteMapContent.clear();
118
- this.lastModified = Date.now();
119
- }
120
-
121
104
  /**
122
105
  * @returns {moment.Moment}
123
106
  */
@@ -208,26 +191,16 @@ class BaseSiteMapGenerator {
208
191
  return content;
209
192
  }
210
193
 
211
- /**
212
- * @NOTE
213
- * The url service currently has no url update event.
214
- * It removes and adds the url. If the url service extends it's
215
- * feature set, we can detect if a node has changed.
216
- */
217
194
  updateLookups(datum, node, lastModified = this.getLastModifiedForDatum(datum)) {
218
195
  this.nodeLookup[datum.id] = node;
219
196
  this.nodeTimeLookup[datum.id] = lastModified;
220
197
  }
221
198
 
222
- removeFromLookups(datum) {
223
- delete this.nodeLookup[datum.id];
224
- delete this.nodeTimeLookup[datum.id];
225
- }
226
-
227
199
  reset() {
228
200
  this.nodeLookup = {};
229
201
  this.nodeTimeLookup = {};
230
202
  this.siteMapContent.clear();
203
+ this.lastModified = 0;
231
204
  }
232
205
  }
233
206
 
@@ -1,14 +1,12 @@
1
- const DomainEvents = require('@tryghost/domain-events');
2
1
  const errors = require('@tryghost/errors');
3
2
  const urlUtils = require('../../../shared/url-utils').default;
4
- const {URLResourceUpdatedEvent} = require('../../../shared/events');
5
3
  const IndexMapGenerator = require('./site-map-index-generator');
6
4
  const PagesMapGenerator = require('./page-map-generator');
7
5
  const PostsMapGenerator = require('./post-map-generator');
8
6
  const UsersMapGenerator = require('./user-map-generator');
9
7
  const TagsMapGenerator = require('./tags-map-generator');
10
8
 
11
- // Frontend-internal routing events (router.created / routers.reset)
9
+ // Frontend-internal routing domain events (RouteRegistered / RoutesReset)
12
10
  const routingEvents = require('../routing/events');
13
11
 
14
12
  // What the sitemap XML reads off each resource, beyond the columns URL
@@ -43,9 +41,9 @@ class SiteMapManager {
43
41
  this._urlService = options.urlService || null;
44
42
 
45
43
  // Server events arrive through the proxy's narrow subscription
46
- // surface (site.changed, url.added, url.removed). Injectable for
47
- // tests; resolved at construction (not module load) for the same
48
- // boot-order reason as the url service above.
44
+ // surface (site.changed). Injectable for tests; resolved at
45
+ // construction (not module load) for the same boot-order reason as
46
+ // the url service above.
49
47
  this._serverEvents = options.serverEvents || require('../proxy').serverEvents;
50
48
 
51
49
  // Index state for the build path. _indexEpoch increments on every
@@ -54,55 +52,34 @@ class SiteMapManager {
54
52
  this._indexBuilt = false;
55
53
  this._buildInFlight = null;
56
54
  this._indexEpoch = 0;
57
- // Static/collection route entries only arrive via router.created,
55
+ // Static/collection route entries only arrive via RouteRegistered,
58
56
  // which fires at boot and routes reload. They are recorded here so
59
57
  // every rebuild can replay them after resetting the generators.
60
58
  this._routerEntries = [];
61
59
 
62
- routingEvents.on('router.created', (router) => {
63
- if (router.name !== 'StaticRoutesRouter' && router.name !== 'CollectionRouter') {
60
+ routingEvents.on('RouteRegistered', ({path, type, id}) => {
61
+ if (type !== 'StaticRoutesRouter' && type !== 'CollectionRouter') {
64
62
  return;
65
63
  }
66
64
  const entry = {
67
- url: router.getRoute({absolute: true}),
68
- datum: {id: router.identifier, staticRoute: router.name === 'StaticRoutesRouter'}
65
+ url: urlUtils.createUrl(path, true),
66
+ datum: {id, staticRoute: type === 'StaticRoutesRouter'}
69
67
  };
70
68
  this._routerEntries.push(entry);
71
69
  this.pages.addUrl(entry.url, entry.datum);
72
70
  // A router registering after a build (routes reload re-registers
73
- // them one macrotask after routers.reset) must not leave a
71
+ // them one macrotask after RoutesReset) must not leave a
74
72
  // zero-router index marked built — the CDN would pin it.
75
- if (this._getUrlService().isLazy()) {
76
- this._invalidateIndex();
77
- }
73
+ this._invalidateIndex();
78
74
  });
79
75
 
80
- // Invalidation is lazy-mode only. Everywhere the eager service runs
81
- // (flag off AND compare mode) its per-URL feed below keeps the index
82
- // current after the initial build, exactly as before this change —
83
- // deploying is a no-op until the lazy flip. Pure lazy fires no
84
- // events, so there the index empties and the next read rebuilds.
76
+ // Nothing feeds the index per URL, so any change to the site's content
77
+ // empties it and the next read rebuilds.
85
78
  this._serverEvents.on('site.changed', () => {
86
- if (this._getUrlService().isLazy()) {
87
- this._invalidateIndex();
88
- }
79
+ this._invalidateIndex();
89
80
  });
90
81
 
91
- // The eager URL service's per-URL feed, active in both eager-only
92
- // and compare mode; under pure lazy these events never fire.
93
- DomainEvents.subscribe(URLResourceUpdatedEvent, (event) => {
94
- this[event.data.resourceType].updateURL(event.data);
95
- });
96
-
97
- this._serverEvents.on('url.added', (obj) => {
98
- this[obj.resource.config.type].addUrl(obj.url.absolute, obj.resource.data);
99
- });
100
-
101
- this._serverEvents.on('url.removed', (obj) => {
102
- this[obj.resource.config.type].removeUrl(obj.url.absolute, obj.resource.data);
103
- });
104
-
105
- routingEvents.on('routers.reset', () => {
82
+ routingEvents.on('RoutesReset', () => {
106
83
  this.pages && this.pages.reset();
107
84
  this.posts && this.posts.reset();
108
85
  this.users && this.users.reset();
@@ -110,9 +87,7 @@ class SiteMapManager {
110
87
  // The routers re-register right after a reset and refill the
111
88
  // list; keeping stale entries would resurrect deleted routes.
112
89
  this._routerEntries = [];
113
- if (this._getUrlService().isLazy()) {
114
- this._invalidateIndex();
115
- }
90
+ this._invalidateIndex();
116
91
  });
117
92
  }
118
93
 
@@ -156,20 +131,15 @@ class SiteMapManager {
156
131
 
157
132
  /**
158
133
  * Make sure the index is ready to serve; every XML read awaits this, so
159
- * no caller can render from an unbuilt index. The index is built once on
160
- * first read in every mode. Wherever the eager service runs (eager-only
161
- * and compare mode) the per-URL events keep it current from then on
162
- * (and heal any gap in the initial snapshot, since addUrl is id-keyed);
163
- * under pure lazy the invalidation signals empty it and the next read
164
- * rebuilds.
134
+ * no caller can render from an unbuilt index. The index is built on first
135
+ * read; the invalidation signals empty it and the next read rebuilds.
165
136
  *
166
137
  * Concurrent readers share one build. A build whose result was
167
138
  * invalidated while it ran is discarded and the read fails — the index
168
139
  * must never serve pre-invalidation data (the CDN would pin it for the
169
140
  * full cache maxAge), and a 503 is retried by crawlers and stored by
170
- * nobody. Unreachable with eager (nothing invalidates), and
171
- * deliberately no retry; if SITEMAP_BUILD_SUPERSEDED shows up in the
172
- * logs at any rate worth caring about, add one then.
141
+ * nobody. Deliberately no retry; if SITEMAP_BUILD_SUPERSEDED shows up in
142
+ * the logs at any rate worth caring about, add one then.
173
143
  */
174
144
  async _ensureIndexReady() {
175
145
  if (this._indexBuilt) {
@@ -231,12 +201,7 @@ class SiteMapManager {
231
201
  * Add a single resource to the index.
232
202
  */
233
203
  _applyResource(type, datum) {
234
- // skipComparison: teeing every bulk row through the compare machinery
235
- // would capture a stack and queue a background lazy computation per
236
- // resource, per build. Enumeration parity comes from the
237
- // getRoutableResources id-set comparison; per-URL parity from
238
- // organic request traffic.
239
- const url = this._getUrlService().getUrlForResource({...datum, type}, {absolute: true, skipComparison: true});
204
+ const url = this._getUrlService().getUrlForResource({...datum, type}, {absolute: true});
240
205
  // Exact match on the not-found sentinel: a real resource can carry
241
206
  // a slug like "404" (/tag/404/) and must stay in the sitemap.
242
207
  if (url && url !== this._notFoundUrl()) {
@@ -254,7 +219,7 @@ class SiteMapManager {
254
219
 
255
220
  _getUrlService() {
256
221
  if (!this._urlService) {
257
- this._urlService = require('../proxy').urlService.facade;
222
+ this._urlService = require('../proxy').urlService;
258
223
  }
259
224
  return this._urlService;
260
225
  }
@@ -5,9 +5,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getBackupRouteSettingsFilePath = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
- const date_fns_1 = require("date-fns");
8
+ const pad = (value, length = 2) => String(value).padStart(length, '0');
9
+ const timestamp = (date) => [
10
+ pad(date.getFullYear(), 4),
11
+ pad(date.getMonth() + 1),
12
+ pad(date.getDate()),
13
+ pad(date.getHours()),
14
+ pad(date.getMinutes()),
15
+ pad(date.getSeconds())
16
+ ].join('-');
9
17
  const getBackupRouteSettingsFilePath = (filePath) => {
10
18
  const { dir, name, ext } = path_1.default.parse(filePath);
11
- return path_1.default.join(dir, `${name}-${(0, date_fns_1.format)(new Date(), 'yyyy-MM-dd-HH-mm-ss')}${ext}`);
19
+ return path_1.default.join(dir, `${name}-${timestamp(new Date())}${ext}`);
12
20
  };
13
21
  exports.getBackupRouteSettingsFilePath = getBackupRouteSettingsFilePath;
@@ -1,7 +1,17 @@
1
1
  import path from 'path';
2
- import {format} from 'date-fns';
2
+
3
+ const pad = (value: number, length = 2): string => String(value).padStart(length, '0');
4
+
5
+ const timestamp = (date: Date): string => [
6
+ pad(date.getFullYear(), 4),
7
+ pad(date.getMonth() + 1),
8
+ pad(date.getDate()),
9
+ pad(date.getHours()),
10
+ pad(date.getMinutes()),
11
+ pad(date.getSeconds())
12
+ ].join('-');
3
13
 
4
14
  export const getBackupRouteSettingsFilePath = (filePath: string): string => {
5
15
  const {dir, name, ext} = path.parse(filePath);
6
- return path.join(dir, `${name}-${format(new Date(), 'yyyy-MM-dd-HH-mm-ss')}${ext}`);
16
+ return path.join(dir, `${name}-${timestamp(new Date())}${ext}`);
7
17
  };
@@ -36,7 +36,7 @@ const controller = {
36
36
  }
37
37
  },
38
38
  async query(frame) {
39
- urlSerializerUtils.forceUrlRelationsWhenLazy(frame, 'posts');
39
+ urlSerializerUtils.forceUrlRelations(frame, 'posts');
40
40
 
41
41
  const model = await models.Post.findOne(Object.assign(frame.data, {status: 'sent'}), frame.options);
42
42
 
@@ -82,7 +82,7 @@ const controller = {
82
82
  await _addMemberContextToFrame(frame);
83
83
 
84
84
  // previews has no input serializer, so the URL force-load happens here
85
- urlSerializerUtils.forceUrlRelationsWhenLazy(frame, 'posts');
85
+ urlSerializerUtils.forceUrlRelations(frame, 'posts');
86
86
 
87
87
  const model = await models.Post.findOne(Object.assign({status: 'all'}, frame.data), frame.options);
88
88
  if (!model) {
@@ -4,8 +4,8 @@ const {requiredUrlColumns} = require('./utils/serializers/input/utils/url');
4
4
  const getPostServiceInstance = require('../../services/posts/posts-service-instance');
5
5
  const postsService = getPostServiceInstance();
6
6
 
7
- const urlRelationsWhenLazyRouting = () => {
8
- const withRelated = urlService.facade.getRequiredRelations();
7
+ const urlRelationsForRouting = () => {
8
+ const withRelated = urlService.getRequiredRelations();
9
9
  return withRelated.length ? {withRelated} : {};
10
10
  };
11
11
 
@@ -23,7 +23,7 @@ const controller = {
23
23
  limit: '10000',
24
24
  order: 'updated_at DESC',
25
25
  columns: requiredUrlColumns('posts', ['id', 'slug', 'title', 'excerpt', 'url', 'updated_at', 'visibility']),
26
- ...urlRelationsWhenLazyRouting()
26
+ ...urlRelationsForRouting()
27
27
  };
28
28
 
29
29
  return postsService.browsePosts(options);
@@ -4,8 +4,8 @@ const {requiredUrlColumns} = require('./utils/serializers/input/utils/url');
4
4
  const getPostServiceInstance = require('../../services/posts/posts-service-instance');
5
5
  const postsService = getPostServiceInstance();
6
6
 
7
- const urlRelationsWhenLazyRouting = () => {
8
- const withRelated = urlService.facade.getRequiredRelations();
7
+ const urlRelationsForRouting = () => {
8
+ const withRelated = urlService.getRequiredRelations();
9
9
  return withRelated.length ? {withRelated} : {};
10
10
  };
11
11
 
@@ -26,7 +26,7 @@ const controller = {
26
26
  limit: '10000',
27
27
  order: 'updated_at DESC',
28
28
  columns: requiredUrlColumns('posts', ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility']),
29
- ...urlRelationsWhenLazyRouting()
29
+ ...urlRelationsForRouting()
30
30
  };
31
31
 
32
32
  return postsService.browsePosts(options);
@@ -46,7 +46,7 @@ const controller = {
46
46
  limit: '10000',
47
47
  order: 'updated_at DESC',
48
48
  columns: requiredUrlColumns('pages', ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility']),
49
- ...urlRelationsWhenLazyRouting()
49
+ ...urlRelationsForRouting()
50
50
  };
51
51
 
52
52
  return postsService.browsePosts(options);
@@ -17,7 +17,7 @@ module.exports = {
17
17
  browse(apiConfig, frame) {
18
18
  debug('browse');
19
19
 
20
- url.forceUrlColumnsWhenLazy(frame, 'authors');
20
+ url.forceUrlColumns(frame, 'authors');
21
21
 
22
22
  if (utils.isContentAPI(frame)) {
23
23
  setDefaultOrder(frame);
@@ -27,7 +27,7 @@ module.exports = {
27
27
  read(apiConfig, frame) {
28
28
  debug('read');
29
29
 
30
- url.forceUrlColumnsWhenLazy(frame, 'authors');
30
+ url.forceUrlColumns(frame, 'authors');
31
31
 
32
32
  if (utils.isContentAPI(frame)) {
33
33
  setDefaultOrder(frame);
@@ -24,7 +24,7 @@ module.exports = {
24
24
  });
25
25
 
26
26
  if (frame.options.withRelated.includes('post')) {
27
- for (const relation of urlService.facade.getRequiredRelations()) {
27
+ for (const relation of urlService.getRequiredRelations()) {
28
28
  const prefixed = `post.${relation}`;
29
29
  if (!frame.options.withRelated.includes(prefixed)) {
30
30
  frame.options.withRelated.push(prefixed);
@@ -56,7 +56,7 @@ function defaultRelations(frame) {
56
56
  frame.options.withRelated = ['tags', 'authors', 'authors.roles', 'tiers', 'count.signups', 'count.paid_conversions'];
57
57
  }
58
58
 
59
- url.forceUrlRelationsWhenLazy(frame, 'pages');
59
+ url.forceUrlRelations(frame, 'pages');
60
60
  }
61
61
 
62
62
  function setDefaultOrder(frame) {
@@ -126,7 +126,7 @@ module.exports = {
126
126
 
127
127
  setDefaultOrder(frame);
128
128
  forceVisibilityColumn(frame);
129
- url.forceUrlRelationsWhenLazy(frame, 'pages');
129
+ url.forceUrlRelations(frame, 'pages');
130
130
  }
131
131
 
132
132
  if (!localUtils.isContentAPI(frame)) {
@@ -145,7 +145,7 @@ module.exports = {
145
145
  removeSourceFormats(frame);
146
146
  setDefaultOrder(frame);
147
147
  forceVisibilityColumn(frame);
148
- url.forceUrlRelationsWhenLazy(frame, 'pages');
148
+ url.forceUrlRelations(frame, 'pages');
149
149
  }
150
150
 
151
151
  if (!localUtils.isContentAPI(frame)) {
@@ -82,7 +82,7 @@ function defaultRelations(frame) {
82
82
  frame.options.withRelated = ['tags', 'authors', 'authors.roles', 'email', 'tiers', 'newsletter', 'count.clicks'];
83
83
  }
84
84
 
85
- url.forceUrlRelationsWhenLazy(frame, 'posts');
85
+ url.forceUrlRelations(frame, 'posts');
86
86
  }
87
87
 
88
88
  function setDefaultOrder(frame) {
@@ -161,7 +161,7 @@ module.exports = {
161
161
  setDefaultOrder(frame);
162
162
  forceVisibilityColumn(frame);
163
163
  mapWithRelated(frame);
164
- url.forceUrlRelationsWhenLazy(frame, 'posts');
164
+ url.forceUrlRelations(frame, 'posts');
165
165
  }
166
166
 
167
167
  if (!localUtils.isContentAPI(frame)) {
@@ -188,7 +188,7 @@ module.exports = {
188
188
 
189
189
  setDefaultOrder(frame);
190
190
  forceVisibilityColumn(frame);
191
- url.forceUrlRelationsWhenLazy(frame, 'posts');
191
+ url.forceUrlRelations(frame, 'posts');
192
192
  }
193
193
 
194
194
  if (!localUtils.isContentAPI(frame)) {
@@ -19,7 +19,7 @@ module.exports = {
19
19
  browse(apiConfig, frame) {
20
20
  debug('browse');
21
21
 
22
- url.forceUrlColumnsWhenLazy(frame, 'tags');
22
+ url.forceUrlColumns(frame, 'tags');
23
23
 
24
24
  if (utils.isContentAPI(frame)) {
25
25
  setDefaultOrder(frame);
@@ -6,13 +6,13 @@ module.exports = {
6
6
  debug('browse');
7
7
 
8
8
  // Staff users route through the authors router types.
9
- url.forceUrlColumnsWhenLazy(frame, 'authors');
9
+ url.forceUrlColumns(frame, 'authors');
10
10
  },
11
11
 
12
12
  read(apiConfig, frame) {
13
13
  debug('read');
14
14
 
15
- url.forceUrlColumnsWhenLazy(frame, 'authors');
15
+ url.forceUrlColumns(frame, 'authors');
16
16
 
17
17
  if (frame.data.id === 'me' && frame.options.context && frame.options.context.user) {
18
18
  frame.data.id = frame.options.context.user;
@@ -71,28 +71,41 @@ const forSetting = (attrs) => {
71
71
  // build a URL (e.g. status/visibility/slug), so the service would reject the
72
72
  // resource as thin. Force them back into the fetch and record them on the
73
73
  // frame — the output mapper strips them from the response after the URL is
74
- // built. No-op under the eager service (getRequiredFields []).
75
- const forceUrlColumnsWhenLazy = (frame, routerType) => {
74
+ // built. No-op when the routing config needs no extra columns.
75
+ const forceUrlColumns = (frame, routerType, extraColumns = []) => {
76
76
  if (!Array.isArray(frame.options.columns) || !frame.options.columns.includes('url')) {
77
77
  return;
78
78
  }
79
- const forced = urlService.facade.getRequiredFields(routerType).filter(field => !frame.options.columns.includes(field));
79
+ const required = new Set([...urlService.getRequiredFields(routerType), ...extraColumns]);
80
+ const missing = [...required].filter(field => !frame.options.columns.includes(field));
81
+ if (!missing.length) {
82
+ return;
83
+ }
84
+ // A read already carries the fields it was looked up by: `findOne` forges
85
+ // the model with them before the fetch, so they survive a narrowed
86
+ // `?fields=` list and the caller is served them today. Stripping those back
87
+ // out would take a field away — `posts/slug/:slug/?fields=url` still
88
+ // answers with its slug. They are still selected, because the lookup
89
+ // matches case-insensitively: the forged value can differ in case from the
90
+ // stored one, and the URL is built from whichever the model carries.
91
+ const carried = Object.keys(frame.data || {});
92
+ const forced = missing.filter(field => !carried.includes(field));
80
93
  if (forced.length) {
81
- frame.forcedUrlColumns = forced;
82
- frame.options.columns.push(...forced);
94
+ frame.forcedUrlColumns = {routerType, columns: forced};
83
95
  }
96
+ frame.options.columns.push(...missing);
84
97
  };
85
98
 
86
99
  // `url` is serialized for every post/page unless `?fields` narrows it away,
87
100
  // so the relations the lazy URL service reads (e.g. tags for a tag-filtered
88
101
  // collection) must be loaded whenever the URL will be built — not only for
89
102
  // the `?fields=url` case. Forced relations are recorded on the frame for the
90
- // output mapper to strip. No-op under the eager service.
91
- const forceUrlRelationsWhenLazy = (frame, routerType) => {
103
+ // output mapper to strip. No-op when the routing config reads no relations.
104
+ const forceUrlRelations = (frame, routerType) => {
92
105
  if (!localUtils.willSerializeUrl(frame)) {
93
106
  return;
94
107
  }
95
- const relations = urlService.facade.getRequiredRelations();
108
+ const relations = urlService.getRequiredRelations();
96
109
  if (relations.length) {
97
110
  const requested = frame.options.withRelated || [];
98
111
  // a nested include covers its parent: `authors.roles` loads authors
@@ -105,13 +118,18 @@ const forceUrlRelationsWhenLazy = (frame, routerType) => {
105
118
  frame.options.withRelated = [...requested, ...forced];
106
119
  }
107
120
  }
108
- forceUrlColumnsWhenLazy(frame, routerType);
121
+ // The URL is looked up by `model.id`, and Bookshelf matches eager-loaded
122
+ // rows back to their parent by the same key — so a `?fields=` list that
123
+ // omits it serializes /404/ and leaves the relations above unattached,
124
+ // silently and without a key on the model at all. A read looked up by id
125
+ // is covered by the carried-fields rule above.
126
+ forceUrlColumns(frame, routerType, ['id']);
109
127
  };
110
128
 
111
- // Options-object variant of forceUrlColumnsWhenLazy for endpoints that build
129
+ // Options-object variant of forceUrlColumns for endpoints that build
112
130
  // their query options directly (search index).
113
131
  const requiredUrlColumns = (routerType, columns) => {
114
- const required = urlService.facade.getRequiredFields(routerType).filter(field => !columns.includes(field));
132
+ const required = urlService.getRequiredFields(routerType).filter(field => !columns.includes(field));
115
133
  return required.length ? [...columns, ...required] : columns;
116
134
  };
117
135
 
@@ -120,5 +138,5 @@ module.exports.requiredUrlColumns = requiredUrlColumns;
120
138
  module.exports.forUser = forUser;
121
139
  module.exports.forTag = forTag;
122
140
  module.exports.forSetting = forSetting;
123
- module.exports.forceUrlColumnsWhenLazy = forceUrlColumnsWhenLazy;
124
- module.exports.forceUrlRelationsWhenLazy = forceUrlRelationsWhenLazy;
141
+ module.exports.forceUrlColumns = forceUrlColumns;
142
+ module.exports.forceUrlRelations = forceUrlRelations;
@@ -136,8 +136,8 @@ module.exports = async (model, frame, options = {}) => {
136
136
  clean.post(jsonModel, frame);
137
137
 
138
138
  // Columns force-loaded for the URL computation, not requested by the caller.
139
- if (frame.forcedUrlColumns) {
140
- frame.forcedUrlColumns.forEach((column) => {
139
+ if (frame.forcedUrlColumns && frame.forcedUrlColumns.routerType === routerType) {
140
+ frame.forcedUrlColumns.columns.forEach((column) => {
141
141
  delete jsonModel[column];
142
142
  });
143
143
  }
@@ -8,8 +8,8 @@ module.exports = (model, frame) => {
8
8
  clean.tag(jsonModel, frame);
9
9
 
10
10
  // Columns force-loaded for the URL computation, not requested by the caller.
11
- if (frame.forcedUrlColumns) {
12
- frame.forcedUrlColumns.forEach((column) => {
11
+ if (frame.forcedUrlColumns && frame.forcedUrlColumns.routerType === 'tags') {
12
+ frame.forcedUrlColumns.columns.forEach((column) => {
13
13
  delete jsonModel[column];
14
14
  });
15
15
  }
@@ -6,6 +6,14 @@ module.exports = (model, frame) => {
6
6
 
7
7
  url.forUser(model.id, jsonModel, frame.options);
8
8
 
9
+ // Force-loaded for the URL computation, not requested by the caller (the
10
+ // author permalink substitutes :slug, so `?fields=url` pulls it in).
11
+ if (frame.forcedUrlColumns && frame.forcedUrlColumns.routerType === 'authors') {
12
+ frame.forcedUrlColumns.columns.forEach((column) => {
13
+ delete jsonModel[column];
14
+ });
15
+ }
16
+
9
17
  clean.author(jsonModel, frame);
10
18
 
11
19
  return jsonModel;
@@ -10,8 +10,9 @@ const forPost = (id, attrs, frame, type = 'posts') => {
10
10
  // type from `attrs` would silently fall back to 'posts' for pages.
11
11
  // The mapper that owns the resource always knows which it is.
12
12
  //
13
- // `id` is passed separately for the same reason: without it, the eager
14
- // facade's id-based fallback hits /404/ for every record.
13
+ // `id` is passed separately for the same reason: `?fields=url` strips it
14
+ // from `attrs`, and the URL service needs it for `:id` permalinks and to
15
+ // name the resource when it reports a problem.
15
16
  //
16
17
  // When `url` was not requested (`?fields=id,title`), don't compute it at
17
18
  // all — attrs is stripped to the requested columns, so the resource would
@@ -24,17 +25,23 @@ const forPost = (id, attrs, frame, type = 'posts') => {
24
25
  return attrs;
25
26
  }
26
27
 
27
- // Diagnostic only: hand the compare-mode URL service the producing api
28
- // endpoint. The parity/thin-resource logs capture a caller stack, but it
29
- // truncates at the async api-framework boundary and never names the
30
- // endpoint; the api-framework Frame carries it, so pass it through. Omitted
31
- // for non-api callers (mentions, email) whose frame has no endpoint fields.
28
+ // Names the fetch that produced this resource. It matters on the degrade
29
+ // path: a thin resource is answered with a silent /404/, and the report is
30
+ // the only way back to the endpoint that under-fetched it. Ignored by URL
31
+ // generation itself; read only into that report.
32
32
  const options = {absolute: true};
33
33
  if (frame && (frame.docName || frame.method)) {
34
- options.serializerContext = {apiType: frame.apiType, docName: frame.docName, method: frame.method};
34
+ options.serializerContext = {
35
+ apiType: frame.apiType,
36
+ docName: frame.docName,
37
+ method: frame.method,
38
+ withRelated: frame.options && frame.options.withRelated,
39
+ columns: frame.options && frame.options.columns,
40
+ forcedUrlRelations: frame.forcedUrlRelations
41
+ };
35
42
  }
36
43
 
37
- attrs.url = urlService.facade.getUrlForResource({...attrs, id, type}, options);
44
+ attrs.url = urlService.getUrlForResource({...attrs, id, type}, options);
38
45
 
39
46
  /**
40
47
  * CASE: admin api should serve preview urls
@@ -71,7 +78,7 @@ const forPost = (id, attrs, frame, type = 'posts') => {
71
78
 
72
79
  const forUser = (id, attrs, options) => {
73
80
  if (!options.columns || (options.columns && options.columns.includes('url'))) {
74
- attrs.url = urlService.facade.getUrlForResource({...attrs, id, type: 'authors'}, {absolute: true});
81
+ attrs.url = urlService.getUrlForResource({...attrs, id, type: 'authors'}, {absolute: true});
75
82
  }
76
83
 
77
84
  return attrs;
@@ -79,7 +86,7 @@ const forUser = (id, attrs, options) => {
79
86
 
80
87
  const forTag = (id, attrs, options) => {
81
88
  if (!options.columns || (options.columns && options.columns.includes('url'))) {
82
- attrs.url = urlService.facade.getUrlForResource({...attrs, id, type: 'tags'}, {absolute: true});
89
+ attrs.url = urlService.getUrlForResource({...attrs, id, type: 'tags'}, {absolute: true});
83
90
  }
84
91
 
85
92
  return attrs;
@@ -0,0 +1,8 @@
1
+ const {createAddColumnMigration} = require('../../utils');
2
+
3
+ module.exports = createAddColumnMigration('automated_email_recipients', 'automation_run_step_id', {
4
+ type: 'string',
5
+ maxlength: 24,
6
+ nullable: true,
7
+ references: 'automation_run_steps.id'
8
+ }, {algorithm: 'auto'});
@@ -0,0 +1,12 @@
1
+ const {combineTransactionalMigrations, removePermissionFromRole} = require('../../utils');
2
+
3
+ module.exports = combineTransactionalMigrations(
4
+ removePermissionFromRole({
5
+ permission: 'Add notifications',
6
+ role: 'Editor'
7
+ }),
8
+ removePermissionFromRole({
9
+ permission: 'Add notifications',
10
+ role: 'Super Editor'
11
+ })
12
+ );