ghost 6.56.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 (385) 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-html-to-lexical-1.3.3.tgz +0 -0
  6. package/components/tryghost-kg-lexical-html-renderer-1.4.3.tgz +0 -0
  7. package/components/tryghost-parse-email-address-0.0.0.tgz +0 -0
  8. package/core/app.js +1 -1
  9. package/core/boot.js +21 -25
  10. package/core/bridge.js +10 -12
  11. package/core/built/admin/assets/Combination-BDvCdg1t.js +41 -0
  12. package/core/built/admin/assets/about-C7O-AgRZ.js +1 -0
  13. package/core/built/admin/assets/{account-migration-D3O_yVck.js → account-migration-Cv_ol1ko.js} +1 -1
  14. package/core/built/admin/assets/action-list-lGzZLHc8.js +1 -0
  15. package/core/built/admin/assets/activitypub/{account-migration-D8FbP-Z-.js → account-migration-DHFbePl6.js} +7 -7
  16. package/core/built/admin/assets/activitypub/activitypub.js +3 -3
  17. package/core/built/admin/assets/activitypub/{avatar-11EA1VSs.js → avatar-CT4tS2_S.js} +2 -2
  18. package/core/built/admin/assets/activitypub/{avatar-flipboard-jfbLG-xe.js → avatar-flipboard-ByYWKipo.js} +2 -2
  19. package/core/built/admin/assets/activitypub/{bluesky-sharing-f1jTQe2P.js → bluesky-sharing-srVnSHDz.js} +8 -8
  20. package/core/built/admin/assets/activitypub/{content-formatters-nmTOPY9M.js → content-formatters-C2sos5Ht.js} +3 -3
  21. package/core/built/admin/assets/activitypub/{copy-BCwo9ep3.js → copy-B1UBTOoZ.js} +2 -2
  22. package/core/built/admin/assets/activitypub/{dist-BEfX-0aW.js → dist-MPsb2WZ1.js} +4 -4
  23. package/core/built/admin/assets/activitypub/{domain-AaDlZlrA.js → domain-DzcM9Dzo.js} +9 -9
  24. package/core/built/admin/assets/activitypub/{edit-profile-DPi8Tl5M.js → edit-profile-CsQ_4xAk.js} +5 -5
  25. package/core/built/admin/assets/activitypub/{explore-CxTzjILQ.js → explore-CJe0DZBK.js} +8 -8
  26. package/core/built/admin/assets/activitypub/{feed-DPv5x2MX.js → feed-CKV3qWON.js} +9 -9
  27. package/core/built/admin/assets/activitypub/{field-DbgA8lat.js → field-DckHfDJf.js} +3 -3
  28. package/core/built/admin/assets/activitypub/{hash-BWuZoYkA.js → hash-Dlp8RM55.js} +2 -2
  29. package/core/built/admin/assets/activitypub/{inbox-35VDQ2K2.js → inbox-CsPy4R0M.js} +2 -2
  30. package/core/built/admin/assets/activitypub/{inbox-DSrF_i1O.js → inbox-DAsjzUUe.js} +10 -10
  31. package/core/built/admin/assets/activitypub/{label-CPjFBbo7.js → label-DWyo9E5T.js} +3 -3
  32. package/core/built/admin/assets/activitypub/layout-DM_3pqsU.js +1 -0
  33. package/core/built/admin/assets/activitypub/{moderation-BkDC1XVZ.js → moderation-B0Inc03M.js} +7 -7
  34. package/core/built/admin/assets/activitypub/{note-xEyH4xT-.js → note-CSE54lER.js} +7 -7
  35. package/core/built/admin/assets/activitypub/{notifications-DClaL3ui.js → notifications-RSwbKqdh.js} +9 -9
  36. package/core/built/admin/assets/activitypub/{preferences-DpnOa-4Z.js → preferences-CE231n2_.js} +11 -11
  37. package/core/built/admin/assets/activitypub/{profile-Dvi9mz-6.js → profile-aaQ1j1Eo.js} +13 -13
  38. package/core/built/admin/assets/activitypub/{reply-Cs9ySd6Z.js → reply-Cjb0Vs3m.js} +2 -2
  39. package/core/built/admin/assets/activitypub/{routes-DFBeTnfn.js → routes-Djb0mc9k.js} +26 -26
  40. package/core/built/admin/assets/activitypub/{separator-C5u_VjzY.js → separator-D8pROI5n.js} +3 -3
  41. package/core/built/admin/assets/activitypub/{settings-CV2fFu6D.js → settings-DMc32IQl.js} +5 -5
  42. package/core/built/admin/assets/activitypub/{site-_TgDd_EM.js → site-DVIcsohX.js} +4 -4
  43. package/core/built/admin/assets/activitypub/{step-1-BfnNL2oF.js → step-1-9Yey9usF.js} +5 -5
  44. package/core/built/admin/assets/activitypub/{step-2-DLndZkO-.js → step-2-DdYmKRXV.js} +6 -6
  45. package/core/built/admin/assets/activitypub/{step-3-A-PZTtRE.js → step-3-hdSkcjZU.js} +10 -10
  46. package/core/built/admin/assets/activitypub/{tabs-BUbz7tea.js → tabs-CUqseYzQ.js} +6 -6
  47. package/core/built/admin/assets/activitypub/{topic-filter-BdX_xYYT.js → topic-filter-Coni6OXM.js} +3 -3
  48. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-EwuRemHh.js → use-activity-pub-queries-MeHTPMQv.js} +2 -2
  49. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-cy4ACBc4.js → use-navigate-with-base-path-B046AM38.js} +24 -7
  50. package/core/built/admin/assets/activitypub/{use-reply-chain-data-CyFcGfan.js → use-reply-chain-data-1AO-Xob6.js} +5 -5
  51. package/core/built/admin/assets/activitypub/{x-7zk8mV2p.js → x-BRfRYd16.js} +2 -2
  52. package/core/built/admin/assets/add-integration-modal-m9Dv6f77.js +1 -0
  53. package/core/built/admin/assets/add-newsletter-modal-CPSVZL2H.js +1 -0
  54. package/core/built/admin/assets/add-recommendation-modal-Ci9Z5yat.js +1 -0
  55. package/core/built/admin/assets/analytics-DqSCVV8U.js +1 -0
  56. package/core/built/admin/assets/announcement-bar-modal-DU3avV7d.js +1 -0
  57. package/core/built/admin/assets/api-keys-BK0LylyK.js +1 -0
  58. package/core/built/admin/assets/api-keys-_iCT4dxr.js +1 -0
  59. package/core/built/admin/assets/{audience-CkBb2LlO.js → audience-DTJtXXWY.js} +1 -1
  60. package/core/built/admin/assets/automated-emails-PayPCT8L.js +1 -0
  61. package/core/built/admin/assets/{automations-DhKeS_U5.js → automations-162q5HjL.js} +1 -1
  62. package/core/built/admin/assets/{automations-cMllU545.js → automations-dtQ_MRZ7.js} +1 -1
  63. package/core/built/admin/assets/{bluesky-sharing-DPGpyD-G.js → bluesky-sharing-B8Es3AuV.js} +1 -1
  64. package/core/built/admin/assets/brand-icon-09YqFZjV.js +1 -0
  65. package/core/built/admin/assets/{breadcrumb-DIfcF5ow.js → breadcrumb-tg5zL--z.js} +1 -1
  66. package/core/built/admin/assets/{chart-helpers-DV0FkdcD.js → chart-helpers-CZElTGYL.js} +1 -1
  67. package/core/built/admin/assets/checkbox-Cyo-x7mC.js +1 -0
  68. package/core/built/admin/assets/{chunk.524.87b52f4fada529df2c4c.js → chunk.524.cd5498dd4e195f679266.js} +4 -4
  69. package/core/built/admin/assets/{chunk.582.340bcca873e806cbd4bb.js → chunk.582.6f92ec1f03734bf2ea3f.js} +6 -6
  70. package/core/built/admin/assets/{chunk.332.05991a101d67f732dec3.js → chunk.873.b8fc05a8ab877fb819ed.js} +28 -27
  71. package/core/built/admin/assets/code-editor-view-Dq1rQ4tS.js +1 -0
  72. package/core/built/admin/assets/color-picker-field-BonBgxhU.js +1 -0
  73. package/core/built/admin/assets/color-utils-BsrwXuDz.js +1 -0
  74. package/core/built/admin/assets/combobox-uX5r_paI.js +1 -0
  75. package/core/built/admin/assets/command-DxwBO2pF.js +1 -0
  76. package/core/built/admin/assets/comments-Dn-RO-nU.js +1 -0
  77. package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +1 -0
  78. package/core/built/admin/assets/confirmation-modal-B6D6mk6R.js +1 -0
  79. package/core/built/admin/assets/content-api-modal-BxQ-7T6u.js +1 -0
  80. package/core/built/admin/assets/copy-field-BAxL4Zqn.js +1 -0
  81. package/core/built/admin/assets/currency-Dy4Tc2R2.js +1 -0
  82. package/core/built/admin/assets/custom-integration-modal---d_l7lc.js +1 -0
  83. package/core/built/admin/assets/{date-range-select-dXc-GsVe.js → date-range-select-PB2n1HZf.js} +1 -1
  84. package/core/built/admin/assets/debounce-Dg2fW5Rg.js +3 -0
  85. package/core/built/admin/assets/design-and-theme-modal-DYRT207a.js +23 -0
  86. package/core/built/admin/assets/dirty-confirm-dialog-BnDJ39ao.js +1 -0
  87. package/core/built/admin/assets/disabled-sources-indicator-iMHrkyV3.js +1 -0
  88. package/core/built/admin/assets/dist-B2PvRwLn.js +1 -0
  89. package/core/built/admin/assets/{dist-pHiOxyxa.js → dist-D5vhMdXf.js} +1 -1
  90. package/core/built/admin/assets/dist-DlCyLrOC.js +1 -0
  91. package/core/built/admin/assets/dist-WeOIvSYM.js +23 -0
  92. package/core/built/admin/assets/{dist-DyViJwIy.js → dist-cFzKLG7y.js} +3 -3
  93. package/core/built/admin/assets/dist-j1xxxnY8.js +1 -0
  94. package/core/built/admin/assets/dist-myQaY0ka.js +1 -0
  95. package/core/built/admin/assets/{domain-B5ogXUBa.js → domain-BR8FIdjD.js} +1 -1
  96. package/core/built/admin/assets/{dropzone-BnFG7dDP.js → dropzone-hNxmUvwD.js} +1 -1
  97. package/core/built/admin/assets/{edit-profile-B07jCZy9.js → edit-profile-CENrkY0l.js} +1 -1
  98. package/core/built/admin/assets/editor-B18D0lm8.js +8 -0
  99. package/core/built/admin/assets/embed-signup-form-modal-BsCYUMvQ.js +9 -0
  100. package/core/built/admin/assets/{explore-Ca1y8HW_.js → explore-BmrnljWw.js} +1 -1
  101. package/core/built/admin/assets/{feed-x4iFMBP4.js → feed-Dy4li6i8.js} +1 -1
  102. package/core/built/admin/assets/{field-ChCAabZg.js → field-Dh_lwk13.js} +1 -1
  103. package/core/built/admin/assets/{filter-sources-LdtH1e-T.js → filter-sources-D2zDuJH5.js} +1 -1
  104. package/core/built/admin/assets/filters-3JBQcNtJ.js +1 -0
  105. package/core/built/admin/assets/{filters-CjVKRP8U.js → filters-CFt_BDe4.js} +1 -1
  106. package/core/built/admin/assets/first-promoter-modal-D6Rjxugw.js +1 -0
  107. package/core/built/admin/assets/format-url-C-t8G6Qd.js +1 -0
  108. package/core/built/admin/assets/{ghost-7f01131115186d1af84ead76e79646dd.js → ghost-d683fbeb945b13155ea669caa5d8db41.js} +300 -298
  109. package/core/built/admin/assets/{gift-link-modal-Buqh2vXh.js → gift-link-modal-zMtlJhLQ.js} +1 -1
  110. package/core/built/admin/assets/{gift-links-CsUhefWG.js → gift-links-CVuqLhsZ.js} +1 -1
  111. package/core/built/admin/assets/global-data-provider-B949LDXJ.js +1 -0
  112. package/core/built/admin/assets/grid-CUciBfjf.js +1 -0
  113. package/core/built/admin/assets/{growth-Dy2UOSay.js → growth-C38Xtp8D.js} +2 -2
  114. package/core/built/admin/assets/{growth-DajOBdN0.js → growth-CFws67_i.js} +1 -1
  115. package/core/built/admin/assets/history-modal-ILAOkbxH.js +1 -0
  116. package/core/built/admin/assets/{hooks-CixO01lL.js → hooks-D6EE7BIt.js} +2 -2
  117. package/core/built/admin/assets/html-field-9a9Id_2q.js +1 -0
  118. package/core/built/admin/assets/iframe-buffering-e8vH4-Qn.js +1 -0
  119. package/core/built/admin/assets/images-CrQKVc9Q.js +1 -0
  120. package/core/built/admin/assets/{inbox-BUOLDoji.js → inbox-BrSRzyvz.js} +13 -13
  121. package/core/built/admin/assets/index-BHy2DZX-.js +67 -0
  122. package/core/built/admin/assets/index-Ds2iUoF6.css +1 -0
  123. package/core/built/admin/assets/index.es-B9tvf-t4.js +1 -0
  124. package/core/built/admin/assets/{input-group-uSK3XT7b.js → input-group-6vEPvX9S.js} +1 -1
  125. package/core/built/admin/assets/integration-header-B4DyXV06.js +1 -0
  126. package/core/built/admin/assets/integrations-BT6_iJvu.js +1 -0
  127. package/core/built/admin/assets/invite-user-modal-5xDCEw90.js +1 -0
  128. package/core/built/admin/assets/isEmail-BOfC647y.js +1 -0
  129. package/core/built/admin/assets/koenig-editor-base-BWLEB9Vf.js +1 -0
  130. package/core/built/admin/assets/{koenig-lexical-BFc4yFed.js → koenig-lexical-Cj62r_y9.js} +1 -1
  131. package/core/built/admin/assets/{kpi-card-BN-E6WYX.js → kpi-card-DOUnkZcN.js} +1 -1
  132. package/core/built/admin/assets/{kpi-card-CCt-qeWD.js → kpi-card-IHDo8Q56.js} +1 -1
  133. package/core/built/admin/assets/{kpi-helpers-DlxTbTs4.js → kpi-helpers-CjUdECAK.js} +1 -1
  134. package/core/built/admin/assets/{kpi-tabs-BlcUttpn.js → kpi-tabs-X3DkOYbI.js} +1 -1
  135. package/core/built/admin/assets/{label-AVrxwmsz.js → label-Dq6QaOuS.js} +1 -1
  136. package/core/built/admin/assets/label-picker-8YlhS2U3.js +1 -0
  137. package/core/built/admin/assets/{labels-DAIqKed7.js → labels-DAPjKPy2.js} +1 -1
  138. package/core/built/admin/assets/layout-TMj4P-vv.js +1 -0
  139. package/core/built/admin/assets/limit-modal-BRPsit_B.js +1 -0
  140. package/core/built/admin/assets/{link-helpers-D9LsDOkG.js → link-helpers-Bzkk68GD.js} +1 -1
  141. package/core/built/admin/assets/member-custom-fields-CmvsuuV_.js +1 -0
  142. package/core/built/admin/assets/member-detail-DCvRrkmJ.js +1 -0
  143. package/core/built/admin/assets/members-DxbSKngD.js +11 -0
  144. package/core/built/admin/assets/modal-page-BMTzFHVO.js +1 -0
  145. package/core/built/admin/assets/{moderation-CQ3urTFE.js → moderation-Da5lhhWh.js} +1 -1
  146. package/core/built/admin/assets/multi-select-combobox-CYdkH7KQ.js +1 -0
  147. package/core/built/admin/assets/navigation-modal-BIoTwtMy.js +1 -0
  148. package/core/built/admin/assets/newsletter-BptlVoJm.js +1 -0
  149. package/core/built/admin/assets/newsletter-detail-modal-BIvxqE0N.js +1 -0
  150. package/core/built/admin/assets/newsletter-emails-Bf8IZLsP.js +1 -0
  151. package/core/built/admin/assets/{newsletters-vt3Ni1Ov.js → newsletters-BgrIZk0V.js} +1 -1
  152. package/core/built/admin/assets/{newsletters-BXJbJgA-.js → newsletters-Du0lzskS.js} +1 -1
  153. package/core/built/admin/assets/{note-Dk877BTv.js → note-DYcLOmDb.js} +1 -1
  154. package/core/built/admin/assets/{notifications-CPlLjPxO.js → notifications-B2SPFIV9.js} +1 -1
  155. package/core/built/admin/assets/{offers-DEniVRD5.js → offers-Um6ab71O.js} +1 -1
  156. package/core/built/admin/assets/offers-container-modal-BZnZITMw.js +1 -0
  157. package/core/built/admin/assets/{onboarding-route-DdStOtjy.js → onboarding-route-DgdfxkQh.js} +1 -1
  158. package/core/built/admin/assets/overview-BYQJXSog.js +1 -0
  159. package/core/built/admin/assets/overview-Dt2_mR6U.js +1 -0
  160. package/core/built/admin/assets/{page-header-pp4dWmOS.js → page-header-CpmxJj5B.js} +1 -1
  161. package/core/built/admin/assets/{pages-B4goRPUn.js → pages-BVMnpI2O.js} +1 -1
  162. package/core/built/admin/assets/pintura-modal-B4MuBuuO.js +1 -0
  163. package/core/built/admin/assets/portal-frame-BF0NBIji.js +1 -0
  164. package/core/built/admin/assets/portal-modal-DMVbm0oy.js +1 -0
  165. package/core/built/admin/assets/{post-analytics-BMJrI81R.js → post-analytics-CXWBOGyP.js} +1 -1
  166. package/core/built/admin/assets/post-analytics-header-ChzjXVPt.js +1 -0
  167. package/core/built/admin/assets/{post-analytics-provider-Btml5vJI.js → post-analytics-provider-Cgw4U_fw.js} +1 -1
  168. package/core/built/admin/assets/{post-share-modal-AcUZkbfL.js → post-share-modal-B9Vmk_XM.js} +1 -1
  169. package/core/built/admin/assets/{posts-DhXE7b6r.js → posts-CxG7v0-M.js} +1 -1
  170. package/core/built/admin/assets/preferences-BfzJmnsd.js +5 -0
  171. package/core/built/admin/assets/preview-chrome-BOVO6_PE.js +1 -0
  172. package/core/built/admin/assets/preview-modal-Dw_HtD6S.js +1 -0
  173. package/core/built/admin/assets/profile-BT5vtv9b.js +1 -0
  174. package/core/built/admin/assets/radio-group-I7ou7PoJ.js +1 -0
  175. package/core/built/admin/assets/{referrers-pmJT4k3-.js → referrers-B9QDAfYm.js} +1 -1
  176. package/core/built/admin/assets/{router-provider-BmEZf6c6.js → router-provider-DSQfprxH.js} +1 -1
  177. package/core/built/admin/assets/select-D9oU1IoM.js +1 -0
  178. package/core/built/admin/assets/settings-CfZFbyu_.js +4 -0
  179. package/core/built/admin/assets/{settings-BGgk7oCI.js → settings-CpvHWix7.js} +1 -1
  180. package/core/built/admin/assets/settings-breadcrumbs-K0USP2nw.js +1 -0
  181. package/core/built/admin/assets/{share-modal-BeuydaBf.js → share-modal-ClIyPzc5.js} +1 -1
  182. package/core/built/admin/assets/slack-modal-1XXqOfiw.js +1 -0
  183. package/core/built/admin/assets/social-urls-CHQ9cTAK.js +1 -0
  184. package/core/built/admin/assets/{sort-button-Df4t2AL8.js → sort-button-CdBsm40v.js} +1 -1
  185. package/core/built/admin/assets/{source-icon-ajoaKb41.js → source-icon-CEYmVLXR.js} +1 -1
  186. package/core/built/admin/assets/{stats-C_lfxZAw.js → stats-D8nZCTy5.js} +1 -1
  187. package/core/built/admin/assets/{stats-view-Cxot1iD8.js → stats-view-CugFVf0g.js} +1 -1
  188. package/core/built/admin/assets/{step-1-ogAA4lDr.js → step-1-DOYjrORn.js} +1 -1
  189. package/core/built/admin/assets/{step-2-C5Xini-7.js → step-2-vA6RsarH.js} +1 -1
  190. package/core/built/admin/assets/{step-3-CZv1FV81.js → step-3-BtIBxMId.js} +2 -2
  191. package/core/built/admin/assets/stripe-button-UFP4QRXd.js +1 -0
  192. package/core/built/admin/assets/stripe-connect-modal-C_L3uM6n.js +1 -0
  193. package/core/built/admin/assets/switch-CE2NuMn-.js +1 -0
  194. package/core/built/admin/assets/{table-DFj1wiYv.js → table-TMCgCQK7.js} +1 -1
  195. package/core/built/admin/assets/tabs-Dd6oOKbv.js +1 -0
  196. package/core/built/admin/assets/tag-detail-D3l-UJPR.js +1 -0
  197. package/core/built/admin/assets/tags-BwCgmr5v.js +1 -0
  198. package/core/built/admin/assets/tags-WdKQGWR8.js +1 -0
  199. package/core/built/admin/assets/testimonials-modal-CqWp-xXJ.js +1 -0
  200. package/core/built/admin/assets/tier-detail-modal-BkcR2u0A.js +1 -0
  201. package/core/built/admin/assets/{tiers-DYsa4DCo.js → tiers-Da6kxHQP.js} +1 -1
  202. package/core/built/admin/assets/toggle-group-Guorw93z.js +1 -0
  203. package/core/built/admin/assets/{topic-filter-DGDxDalo.js → topic-filter-CbgoWIHn.js} +1 -1
  204. package/core/built/admin/assets/transistor-modal-DuNnnpal.js +1 -0
  205. package/core/built/admin/assets/unsplash-modal-y2bVwTHH.js +1 -0
  206. package/core/built/admin/assets/{use-analytics-data-C76v4LIp.js → use-analytics-data-B-b4wNSC.js} +1 -1
  207. package/core/built/admin/assets/use-check-theme-limit-error-m09J38Mq.js +2 -0
  208. package/core/built/admin/assets/use-feature-flag-ud0Qz8vt.js +1 -0
  209. package/core/built/admin/assets/use-filter-params-BnbBDc7T.js +1 -0
  210. package/core/built/admin/assets/use-filterable-api-iMpDZBxD.js +1 -0
  211. package/core/built/admin/assets/use-form-vRjI0Kwk.js +1 -0
  212. package/core/built/admin/assets/{use-growth-stats-aNXJOmQr.js → use-growth-stats-DPU5rt3W.js} +1 -1
  213. package/core/built/admin/assets/use-hash-link-navigation-guard-B9j6HIrV.js +1 -0
  214. package/core/built/admin/assets/use-limiter-BkN3E4gw.js +2 -0
  215. package/core/built/admin/assets/use-pintura-config-C_z8HTG2.js +1 -0
  216. package/core/built/admin/assets/use-pintura-editor-DNgbkhGp.js +1 -0
  217. package/core/built/admin/assets/{use-post-referrers-CG0SZioj.js → use-post-referrers-C2mXyrp-.js} +1 -1
  218. package/core/built/admin/assets/use-query-params-DHhhu8wi.js +1 -0
  219. package/core/built/admin/assets/{use-reply-chain-data-RLdPKRmS.js → use-reply-chain-data-DaK8q2qQ.js} +1 -1
  220. package/core/built/admin/assets/use-setting-group-YlYcoNyP.js +1 -0
  221. package/core/built/admin/assets/use-settings-navigation-Bf1g1rEh.js +1 -0
  222. package/core/built/admin/assets/{use-simple-pagination-DgcF69KI.js → use-simple-pagination-D9ckKo5-.js} +1 -1
  223. package/core/built/admin/assets/{use-tinybird-query-C1R_Kbmy.js → use-tinybird-query-GSa32hVw.js} +1 -1
  224. package/core/built/admin/assets/{use-tinybird-token-C9fPjVM_.js → use-tinybird-token-CKLOZFsw.js} +1 -1
  225. package/core/built/admin/assets/use-url-input-z-p0Kewm.js +5 -0
  226. package/core/built/admin/assets/user-detail-modal-BMxOA4Sv.js +1 -0
  227. package/core/built/admin/assets/{users-Dkv8NQZe.js → users-B6hIds6n.js} +1 -1
  228. package/core/built/admin/assets/validator-Cr0sMKuW.js +7 -0
  229. package/core/built/admin/assets/{virtual-list-BmTUzeoF.js → virtual-list-RHeEL05L.js} +1 -1
  230. package/core/built/admin/assets/web-Bw2QMO5u.js +2 -0
  231. package/core/built/admin/assets/web-xJtcwMy4.js +1 -0
  232. package/core/built/admin/assets/zapier-modal-BP2f4-vY.js +1 -0
  233. package/core/built/admin/index.html +15 -13
  234. package/core/frontend/helpers/authors.js +1 -1
  235. package/core/frontend/helpers/link.js +3 -8
  236. package/core/frontend/helpers/tags.js +1 -1
  237. package/core/frontend/meta/author-url.js +2 -2
  238. package/core/frontend/meta/url.js +4 -4
  239. package/core/frontend/services/proxy.js +1 -1
  240. package/core/frontend/services/routing/events.js +20 -6
  241. package/core/frontend/services/routing/permalink-adapter.js +0 -13
  242. package/core/frontend/services/routing/permalink-adapter.ts +0 -13
  243. package/core/frontend/services/routing/router-manager.js +15 -9
  244. package/core/frontend/services/sitemap/base-site-map-generator.js +1 -28
  245. package/core/frontend/services/sitemap/site-map-manager.js +22 -57
  246. package/core/server/adapters/route-settings/utils.js +10 -2
  247. package/core/server/adapters/route-settings/utils.ts +12 -2
  248. package/core/server/api/endpoints/email-post.js +1 -1
  249. package/core/server/api/endpoints/previews.js +1 -1
  250. package/core/server/api/endpoints/search-index-public.js +3 -3
  251. package/core/server/api/endpoints/search-index.js +4 -4
  252. package/core/server/api/endpoints/utils/serializers/input/authors.js +2 -2
  253. package/core/server/api/endpoints/utils/serializers/input/comments.js +1 -1
  254. package/core/server/api/endpoints/utils/serializers/input/pages.js +3 -3
  255. package/core/server/api/endpoints/utils/serializers/input/posts.js +3 -3
  256. package/core/server/api/endpoints/utils/serializers/input/tags.js +1 -1
  257. package/core/server/api/endpoints/utils/serializers/input/users.js +2 -2
  258. package/core/server/api/endpoints/utils/serializers/input/utils/url.js +31 -13
  259. package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +2 -2
  260. package/core/server/api/endpoints/utils/serializers/output/mappers/tags.js +2 -2
  261. package/core/server/api/endpoints/utils/serializers/output/mappers/users.js +8 -0
  262. package/core/server/api/endpoints/utils/serializers/output/utils/url.js +18 -11
  263. package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +74 -0
  264. package/core/server/data/migrations/versions/6.57/2026-08-04-18-54-14-reset-automation-email-analytics.js +25 -0
  265. package/core/server/data/schema/commands.js +21 -5
  266. package/core/server/data/schema/schema.js +24 -5
  267. package/core/server/lib/common/to-plain.ts +1 -1
  268. package/core/server/models/post.js +2 -2
  269. package/core/server/services/adapter-manager/adapter-manager.js +1 -45
  270. package/core/server/services/adapter-manager/adapter-manager.ts +2 -48
  271. package/core/server/services/adapter-manager/adapter-paths.js +24 -0
  272. package/core/server/services/adapter-manager/adapter-paths.ts +21 -0
  273. package/core/server/services/adapter-manager/base-classes.js +22 -0
  274. package/core/server/services/adapter-manager/base-classes.ts +22 -0
  275. package/core/server/services/adapter-manager/index.js +4 -27
  276. package/core/server/services/adapter-manager/index.ts +4 -31
  277. package/core/server/services/adapter-manager/utils.js +50 -0
  278. package/core/server/services/adapter-manager/utils.ts +57 -0
  279. package/core/server/services/audience-feedback/audience-feedback-controller.js +1 -1
  280. package/core/server/services/audience-feedback/audience-feedback-service.js +2 -2
  281. package/core/server/services/automations/service.js +2 -2
  282. package/core/server/services/automations/service.ts +2 -2
  283. package/core/server/services/comments/comments-service-emails.js +1 -1
  284. package/core/server/services/comments/comments-service.js +1 -1
  285. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +11 -2
  286. package/core/server/services/email-analytics/email-analytics-service.js +1 -1
  287. package/core/server/services/email-service/email-service-wrapper.js +2 -1
  288. package/core/server/services/email-service/mailgun-email-provider.js +15 -0
  289. package/core/server/services/indexnow-ping/indexnow-ping-service.js +1 -1
  290. package/core/server/services/indexnow-ping/indexnow-ping-service.ts +2 -4
  291. package/core/server/services/lib/mailgun-client.js +3 -3
  292. package/core/server/services/media-inliner/external-media-inliner.js +12 -8
  293. package/core/server/services/member-attribution/url-translator.js +5 -7
  294. package/core/server/services/member-welcome-emails/service.js +72 -12
  295. package/core/server/services/members/api.js +1 -1
  296. package/core/server/services/members/import-export/import/completion-email.js +8 -4
  297. package/core/server/services/members/import-export/import/completion-email.ts +9 -4
  298. package/core/server/services/members/import-export/import/importer.js +25 -4
  299. package/core/server/services/members/import-export/import/importer.ts +26 -6
  300. package/core/server/services/members/import-export/import/row.ts +5 -1
  301. package/core/server/services/members/import-export/index.js +1 -5
  302. package/core/server/services/members/import-export/index.ts +2 -6
  303. package/core/server/services/members-custom-fields/queries.js +4 -13
  304. package/core/server/services/members-custom-fields/queries.ts +4 -13
  305. package/core/server/services/members-custom-fields/schema.js +18 -27
  306. package/core/server/services/members-custom-fields/schema.ts +17 -27
  307. package/core/server/services/members-custom-fields/storage.js +94 -27
  308. package/core/server/services/members-custom-fields/storage.ts +114 -39
  309. package/core/server/services/members-custom-fields/values-service.js +98 -219
  310. package/core/server/services/members-custom-fields/values-service.ts +110 -238
  311. package/core/server/services/mentions/resource-service.js +1 -1
  312. package/core/server/services/mentions/service.js +2 -2
  313. package/core/server/services/route-settings/dynamic-routing-service.js +9 -59
  314. package/core/server/services/slack-ping/slack-ping-service.js +2 -2
  315. package/core/server/services/slack-ping/slack-ping-service.ts +3 -5
  316. package/core/server/services/stats/content-stats-service.js +3 -3
  317. package/core/server/services/stats/posts-stats-service.js +2 -2
  318. package/core/server/services/url/config.js +90 -135
  319. package/core/server/services/url/index.js +6 -49
  320. package/core/server/services/url/lazy-find-resource.js +14 -11
  321. package/core/server/services/url/lazy-find-resource.ts +14 -11
  322. package/core/server/services/url/lazy-url-service.js +174 -94
  323. package/core/server/services/url/lazy-url-service.ts +233 -97
  324. package/core/server/services/url/routable-resources.js +62 -71
  325. package/core/server/services/url/router-filter.js +12 -4
  326. package/core/server/services/url/router-filter.ts +12 -4
  327. package/core/server/services/webhooks/index.js +1 -1
  328. package/core/server/services/webhooks/serialize.js +2 -1
  329. package/core/shared/config/env/config.testing-mysql.json +1 -2
  330. package/core/shared/config/env/config.testing.json +1 -2
  331. package/core/shared/events/index.js +1 -2
  332. package/core/shared/labs.js +3 -3
  333. package/package.json +5 -6
  334. package/pnpm-lock.yaml +6 -9
  335. package/pnpm-workspace.yaml +2 -2
  336. package/tsconfig.json +1 -0
  337. package/core/built/admin/assets/Combination-BCm9FL4o.js +0 -41
  338. package/core/built/admin/assets/activitypub/layout-CTgrezN7.js +0 -1
  339. package/core/built/admin/assets/automated-emails-6t2bIRWf.js +0 -7
  340. package/core/built/admin/assets/checkbox-BIl077a0.js +0 -1
  341. package/core/built/admin/assets/code-editor-view-C0aWNwdl.js +0 -1
  342. package/core/built/admin/assets/comments-qwhIjH3c.js +0 -1
  343. package/core/built/admin/assets/disabled-sources-indicator-DYAXW-6V.js +0 -1
  344. package/core/built/admin/assets/dist-BUKmD51u.js +0 -1
  345. package/core/built/admin/assets/dist-CNlMj7ML.js +0 -1
  346. package/core/built/admin/assets/dist-DDY6GRVz.js +0 -1
  347. package/core/built/admin/assets/dist-DG78yroX.js +0 -23
  348. package/core/built/admin/assets/editor-DDYSOXGN.js +0 -8
  349. package/core/built/admin/assets/esm-CFX93H5M.js +0 -2
  350. package/core/built/admin/assets/filters-CLehPo_D.js +0 -1
  351. package/core/built/admin/assets/index-08n05-rc.js +0 -67
  352. package/core/built/admin/assets/index-DgUzgFvS.css +0 -1
  353. package/core/built/admin/assets/label-picker-DVnpu_IF.js +0 -1
  354. package/core/built/admin/assets/layout-B0YLh7R9.js +0 -1
  355. package/core/built/admin/assets/member-custom-fields-C8NpZYza.js +0 -1
  356. package/core/built/admin/assets/member-detail-CIVAdKXf.js +0 -1
  357. package/core/built/admin/assets/members-oLPiSkXD.js +0 -10
  358. package/core/built/admin/assets/modals-CB7v-k3T.js +0 -31
  359. package/core/built/admin/assets/newsletter-rbeDX9Wk.js +0 -1
  360. package/core/built/admin/assets/overview--4V-kx9c.js +0 -1
  361. package/core/built/admin/assets/overview-DSLv30oz.js +0 -1
  362. package/core/built/admin/assets/post-analytics-header-pU2m9ZuV.js +0 -1
  363. package/core/built/admin/assets/preferences-Ru4CRPHC.js +0 -5
  364. package/core/built/admin/assets/profile-BNb1oj7D.js +0 -1
  365. package/core/built/admin/assets/select-B0HteHrp.js +0 -1
  366. package/core/built/admin/assets/settings-B1C9Q3wo.js +0 -4
  367. package/core/built/admin/assets/social-urls-DA2lXrhW.js +0 -8
  368. package/core/built/admin/assets/switch-CyQcwMAv.js +0 -1
  369. package/core/built/admin/assets/tabs-D4y1gqUd.js +0 -1
  370. package/core/built/admin/assets/tags-Dmft-Y4O.js +0 -1
  371. package/core/built/admin/assets/toggle-group-R2QMFvXW.js +0 -1
  372. package/core/built/admin/assets/use-filter-params-WrdhAISv.js +0 -1
  373. package/core/built/admin/assets/web-BqW0b0_C.js +0 -1
  374. package/core/built/admin/assets/web-Cy5GKMWM.js +0 -2
  375. package/core/server/services/url/local-file-cache.js +0 -75
  376. package/core/server/services/url/queue.js +0 -260
  377. package/core/server/services/url/resource.js +0 -102
  378. package/core/server/services/url/resources.js +0 -480
  379. package/core/server/services/url/url-generator.js +0 -276
  380. package/core/server/services/url/url-service-facade.js +0 -366
  381. package/core/server/services/url/url-service-facade.ts +0 -519
  382. package/core/server/services/url/url-service.js +0 -387
  383. package/core/server/services/url/urls.js +0 -140
  384. package/core/shared/events/url-resource-updated-event.js +0 -33
  385. /package/core/built/admin/assets/{dist-CqO2lWS0.js → dist-CqO2lWS02.js} +0 -0
@@ -1,387 +0,0 @@
1
- const debug = require('@tryghost/debug')('services:url:service');
2
- const _ = require('lodash');
3
- const errors = require('@tryghost/errors');
4
- const logging = require('@tryghost/logging');
5
- const metrics = require('@tryghost/metrics');
6
- const labs = require('../../../shared/labs');
7
- const UrlGenerator = require('./url-generator');
8
- const Queue = require('./queue');
9
- const Urls = require('./urls');
10
- const Resources = require('./resources');
11
- const urlUtils = require('../../../shared/url-utils').default;
12
- const resourcesConfig = require('./config');
13
-
14
- /**
15
- * The url service class holds all instances in a centralized place.
16
- * It's the public API you can talk to.
17
- * It will tell you if the url generation is in progress or not.
18
- */
19
- class UrlService {
20
- lastInitStartTime = null;
21
-
22
- /**
23
- *
24
- * @param {Object} [options]
25
- * @param {Object} [options.cache] - cache handler instance
26
- * @param {Function} [options.cache.read] - read cache by type
27
- * @param {Function} [options.cache.write] - write into cache by type
28
- */
29
- constructor({cache} = {}) {
30
- this.utils = urlUtils;
31
- this.cache = cache;
32
- this.finished = false;
33
- this.urlGenerators = [];
34
-
35
- // Get urls
36
- this.queue = new Queue();
37
- // NOTE: Urls and Resources should not be initialized here but only in the init method.
38
- // Way too many tests fail if the initialization is removed so leaving it as is for time being
39
- this.urls = new Urls();
40
- this.resources = new Resources({
41
- resourcesConfig: resourcesConfig,
42
- queue: this.queue
43
- });
44
-
45
- this._listeners();
46
- }
47
-
48
- /**
49
- * @description Helper function to register the listeners for this instance.
50
- * @private
51
- */
52
- _listeners() {
53
- this._onQueueStartedListener = this._onQueueStarted.bind(this);
54
- this.queue.addListener('started', this._onQueueStartedListener);
55
-
56
- this._onQueueEndedListener = this._onQueueEnded.bind(this);
57
- this.queue.addListener('ended', this._onQueueEndedListener);
58
- }
59
-
60
- /**
61
- * @description The queue will notify us if the queue has started with an event.
62
- *
63
- * The "init" event is basically the bootstrap event, which is the siganliser if url generation
64
- * is in progress or not.
65
- *
66
- * @param {string} event
67
- * @private
68
- */
69
- _onQueueStarted(event) {
70
- if (event === 'init') {
71
- this.lastInitStartTime = Date.now();
72
- this.finished = false;
73
- }
74
- }
75
-
76
- /**
77
- * @description The queue will notify us if the queue has ended with an event.
78
- * @param {string} event
79
- * @private
80
- */
81
- _onQueueEnded(event) {
82
- if (event === 'init') {
83
- this.finished = true;
84
-
85
- const now = Date.now();
86
- logging.info(`URL Service ready in ${now - this.lastInitStartTime}ms`);
87
- metrics.metric('url-service', now - this.lastInitStartTime);
88
- }
89
- }
90
-
91
- /**
92
- * @description Router was created, connect it with a url generator.
93
- * @param {string} identifier frontend router ID reference
94
- * @param {string} filter NQL filter
95
- * @param {string} resourceType
96
- * @param {string} permalink
97
- */
98
- onRouterAddedType(identifier, filter, resourceType, permalink) {
99
- debug('Registering route:', filter, resourceType, permalink);
100
-
101
- let urlGenerator = new UrlGenerator({
102
- identifier,
103
- filter,
104
- resourceType,
105
- permalink,
106
- queue: this.queue,
107
- resources: this.resources,
108
- urls: this.urls,
109
- position: this.urlGenerators.length
110
- });
111
- this.urlGenerators.push(urlGenerator);
112
- }
113
-
114
- /**
115
- * @description Router update handler - regenerates it's resources
116
- * @param {string} identifier router ID linked to the UrlGenerator
117
- */
118
- onRouterUpdated(identifier) {
119
- const generator = this.urlGenerators.find(g => g.identifier === identifier);
120
- generator.regenerateResources();
121
- }
122
-
123
- /**
124
- * @description Get Resource by url.
125
- *
126
- * You have a url and want to know which the url belongs to.
127
- *
128
- * It's in theory possible that multiple resources generate the same url,
129
- * but they both would serve different content.
130
- *
131
- * e.g. if we remove the slug uniqueness and you create a static
132
- * page and a post with the same slug. And both are served under `/` with the permalink `/:slug/`.
133
- *
134
- *
135
- * Each url is unique and it depends on the hierarchy of router registration is configured.
136
- * There is no url collision, everything depends on registration order.
137
- *
138
- * e.g. posts which live in a collection are stronger than a static page.
139
- *
140
- * We only return the resource, which would be served.
141
- *
142
- * @NOTE: only accepts relative urls at the moment.
143
- *
144
- * @param {string} url
145
- * @param {Object} options
146
- * @returns {Object}
147
- */
148
- getResource(url, options) {
149
- options = options || {};
150
-
151
- let objects = this.urls.getByUrl(url);
152
-
153
- if (!objects.length) {
154
- if (!this.hasFinished()) {
155
- throw new errors.InternalServerError({
156
- message: 'UrlService is processing.',
157
- code: 'URLSERVICE_NOT_READY'
158
- });
159
- } else {
160
- return null;
161
- }
162
- }
163
-
164
- if (objects.length > 1) {
165
- objects = _.reduce(objects, (toReturn, object) => {
166
- if (!toReturn.length) {
167
- toReturn.push(object);
168
- } else {
169
- const i1 = _.findIndex(this.urlGenerators, {uid: toReturn[0].generatorId});
170
- const i2 = _.findIndex(this.urlGenerators, {uid: object.generatorId});
171
-
172
- if (i2 < i1) {
173
- toReturn = [];
174
- toReturn.push(object);
175
- }
176
- }
177
-
178
- return toReturn;
179
- }, []);
180
- }
181
-
182
- if (options.returnEverything) {
183
- return objects[0];
184
- }
185
-
186
- return objects[0].resource;
187
- }
188
-
189
- /**
190
- * @description Get resource by id.
191
- * @param {string} resourceId
192
- * @returns {Object}
193
- */
194
- getResourceById(resourceId) {
195
- const object = this.urls.getByResourceId(resourceId);
196
-
197
- if (!object) {
198
- throw new errors.NotFoundError({
199
- message: 'Resource not found.',
200
- code: 'URLSERVICE_RESOURCE_NOT_FOUND'
201
- });
202
- }
203
-
204
- return object.resource;
205
- }
206
-
207
- /**
208
- * @description Figure out if url generation is in progress or not.
209
- * @returns {boolean}
210
- */
211
- hasFinished() {
212
- return this.finished;
213
- }
214
-
215
- /**
216
- * @description Get url by resource id.
217
- *
218
- * If we can't find a url for an id, we have to return a url.
219
- * There are many components in Ghost which call `getUrlByResourceId` and
220
- * based on the return value, they set the resource url somewhere e.g. meta data.
221
- * Or if you define no collections in your yaml file and serve a page.
222
- * You will see a suggestion of posts, but they all don't belong to a collection.
223
- * They would show localhost:2368/null/.
224
- *
225
- * @param {string} id
226
- * @param {Object} [options]
227
- * @param {Object} [options.absolute]
228
- * @param {Object} [options.withSubdirectory]
229
- * @returns {string}
230
- */
231
- getUrlByResourceId(id, options = {}) {
232
- const obj = this.urls.getByResourceId(id);
233
-
234
- if (obj) {
235
- if (options.absolute) {
236
- return this.utils.createUrl(obj.url, options.absolute);
237
- }
238
-
239
- if (options.withSubdirectory) {
240
- return this.utils.createUrl(obj.url, false, true);
241
- }
242
-
243
- return obj.url;
244
- }
245
-
246
- if (options.absolute) {
247
- return this.utils.createUrl('/404/', options.absolute);
248
- }
249
-
250
- if (options.withSubdirectory) {
251
- return this.utils.createUrl('/404/', false);
252
- }
253
-
254
- return '/404/';
255
- }
256
-
257
- /**
258
- * @description Check whether a router owns a resource id.
259
- * @param {string} routerId
260
- * @param {string} id
261
- * @returns {boolean}
262
- */
263
- owns(routerId, id) {
264
- debug('owns', routerId, id);
265
-
266
- const urlGenerator = this.urlGenerators.find(g => g.identifier === routerId);
267
- if (!urlGenerator) {
268
- return false;
269
- }
270
-
271
- return urlGenerator.hasId(id);
272
- }
273
-
274
- /**
275
- * @description Get permlink structure for url.
276
- * @param {string} url
277
- * @param {object} options
278
- * @returns {*}
279
- */
280
- getPermalinkByUrl(url, options) {
281
- options = options || {};
282
-
283
- const object = this.getResource(url, {returnEverything: true});
284
-
285
- if (!object) {
286
- return null;
287
- }
288
-
289
- const permalink = _.find(this.urlGenerators, {uid: object.generatorId}).permalink;
290
-
291
- if (options.withUrlOptions) {
292
- return urlUtils.urlJoin(permalink, '/:options(edit)?/');
293
- }
294
-
295
- return permalink;
296
- }
297
-
298
- /**
299
- * @description Initializes components needed for the URL Service to function
300
- * @param {Object} options
301
- * @param {boolean} [options.urlCache] - whether to init using url cache or not
302
- */
303
- async init({urlCache} = {}) {
304
- let persistedUrls;
305
- let persistedResources;
306
-
307
- if (this.cache && (labs.isSet('urlCache') || urlCache)) {
308
- persistedUrls = await this.cache.read('urls');
309
- persistedResources = await this.cache.read('resources');
310
- }
311
-
312
- if (persistedUrls && persistedResources) {
313
- this.urls.urls = persistedUrls;
314
- this.resources.data = persistedResources;
315
- this.resources.initEventListeners();
316
-
317
- this._onQueueEnded('init');
318
- } else {
319
- this.resources.initEventListeners();
320
- await this.resources.fetchResources();
321
- // CASE: all resources are fetched, start the queue
322
- this.queue.start({
323
- event: 'init',
324
- tolerance: 100,
325
- requiredSubscriberCount: 1
326
- });
327
- }
328
- }
329
-
330
- async shutdown() {
331
- if (!labs.isSet('urlCache')) {
332
- return null;
333
- }
334
-
335
- await this.cache.write('urls', this.urls.urls);
336
- await this.cache.write('resources', this.resources.getAll());
337
- }
338
-
339
- /**
340
- * @description Reset this service.
341
- * @param {Object} options
342
- */
343
- reset(options = {}) {
344
- debug('reset');
345
- this.urlGenerators = [];
346
-
347
- this.urls.reset();
348
- this.queue.reset();
349
- this.resources.reset();
350
-
351
- if (!options.keepListeners) {
352
- this._onQueueStartedListener && this.queue.removeListener('started', this._onQueueStartedListener);
353
- this._onQueueEndedListener && this.queue.removeListener('ended', this._onQueueEndedListener);
354
- }
355
- }
356
-
357
- /**
358
- * @description Reset the generators.
359
- * @param {Object} options
360
- */
361
- resetGenerators(options = {}) {
362
- debug('resetGenerators');
363
- this.finished = false;
364
- this.urlGenerators = [];
365
- this.urls.reset();
366
- this.queue.reset();
367
-
368
- if (options.releaseResourcesOnly) {
369
- this.resources.releaseAll();
370
- } else {
371
- this.resources.softReset();
372
- }
373
- }
374
-
375
- /**
376
- * @description Soft reset this service. Only used in test env.
377
- */
378
- softReset() {
379
- debug('softReset');
380
- this.finished = false;
381
- this.urls.softReset();
382
- this.queue.softReset();
383
- this.resources.softReset();
384
- }
385
- }
386
-
387
- module.exports = UrlService;
@@ -1,140 +0,0 @@
1
- const debug = require('@tryghost/debug')('services:url:urls');
2
- const urlUtils = require('../../../shared/url-utils').default;
3
- const logging = require('@tryghost/logging');
4
- const errors = require('@tryghost/errors');
5
-
6
- // This emits its own url added/removed events
7
- const events = require('../../lib/common/events');
8
-
9
- /**
10
- * @typedef {{url: string, generatorId: string, resource: import('./resource')}} Url
11
- */
12
-
13
- /**
14
- * This class keeps track of all urls in the system.
15
- * Each resource has exactly one url. Each url is owned by exactly one url generator id.
16
- * This is a connector for url generator and resources.
17
- * Stores relative urls by default.
18
- *
19
- * We have to have a centralized place where we keep track of all urls, otherwise
20
- * we will never know if we generate the same url twice. Furthermore, it's easier
21
- * to ask a centralized class instance if you want a url for a resource than
22
- * iterating over all url generators and asking for it.
23
- * You can easily ask `this.urls[resourceId]`.
24
- */
25
- class Urls {
26
- /** @type {Object<string, Url>} */
27
- urls = {};
28
-
29
- /**
30
- * @description Add a url to the system.
31
- * @param {Url} options
32
- */
33
- add({url, generatorId, resource}) {
34
- debug('add', resource.data.id, url);
35
-
36
- if (this.urls[resource.data.id]) {
37
- const error = new errors.InternalServerError({
38
- message: 'This should not happen.',
39
- code: 'URLSERVICE_RESOURCE_DUPLICATE'
40
- });
41
- if (process.env.NODE_ENV.startsWith('test')) {
42
- logging.warn({
43
- message: 'Duplicate URL',
44
- err: error
45
- });
46
- } else {
47
- logging.error(error);
48
- }
49
-
50
- this.removeResourceId(resource.data.id);
51
- }
52
-
53
- this.urls[resource.data.id] = {
54
- url: url,
55
- generatorId: generatorId,
56
- resource: resource
57
- };
58
-
59
- // @NOTE: Notify the whole system. Currently used for sitemaps service.
60
- events.emit('url.added', {
61
- url: {
62
- relative: url,
63
- absolute: urlUtils.createUrl(url, true)
64
- },
65
- resource: resource
66
- });
67
- }
68
-
69
- /**
70
- * @description Get url by resource id.
71
- * @param {string} id
72
- * @returns {Url}
73
- */
74
- getByResourceId(id) {
75
- return this.urls[id];
76
- }
77
-
78
- /**
79
- * @description Get all urls by generator id.
80
- * @param {string} generatorId
81
- * @returns {Url[]}
82
- */
83
- getByGeneratorId(generatorId) {
84
- return Object.values(this.urls).filter(url => url.generatorId === generatorId);
85
- }
86
-
87
- /**
88
- * @description Get by url.
89
- *
90
- * @NOTE:
91
- * It's is in theory possible that:
92
- *
93
- * - resource1 -> /welcome/
94
- * - resource2 -> /welcome/
95
- *
96
- * But depending on the routing registration, you will always serve e.g. resource1,
97
- * because the router it belongs to was registered first.
98
- *
99
- * @param {string} urlToLookup
100
- * @returns {Url[]}
101
- */
102
- getByUrl(urlToLookup) {
103
- return Object.values(this.urls).filter(url => url.url === urlToLookup);
104
- }
105
-
106
- /**
107
- * @description Remove url.
108
- * @param {string} id
109
- */
110
- removeResourceId(id) {
111
- if (!this.urls[id]) {
112
- return;
113
- }
114
-
115
- debug('removeResourceId', this.urls[id].url, this.urls[id].generatorId);
116
-
117
- events.emit('url.removed', {
118
- url: this.urls[id].url,
119
- resource: this.urls[id].resource
120
- });
121
-
122
- delete this.urls[id];
123
- }
124
-
125
- /**
126
- * @description Reset instance.
127
- */
128
- reset() {
129
- this.urls = {};
130
- }
131
-
132
- /**
133
- * @description Soft reset instance.
134
- */
135
- softReset() {
136
- this.urls = {};
137
- }
138
- }
139
-
140
- module.exports = Urls;
@@ -1,33 +0,0 @@
1
- module.exports = class URLResourceUpdatedEvent {
2
- /**
3
- * @readonly
4
- * @type {Object}
5
- */
6
- data;
7
-
8
- /**
9
- * @readonly
10
- * @type {Date}
11
- */
12
- timestamp;
13
-
14
- /**
15
- * @private
16
- */
17
- constructor({timestamp, ...data}) {
18
- this.data = data;
19
- this.timestamp = timestamp;
20
- }
21
-
22
- /**
23
- *
24
- * @param {Object} data URL Resource
25
- * @returns
26
- */
27
- static create(data) {
28
- return new URLResourceUpdatedEvent({
29
- ...data,
30
- timestamp: data.timestamp || new Date
31
- });
32
- }
33
- };