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.
- package/bin/validate-adapters.js +74 -0
- package/bin/validate-adapters.ts +87 -0
- package/bin/warm-compile-cache.sh +60 -0
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-kg-html-to-lexical-1.3.3.tgz +0 -0
- package/components/tryghost-kg-lexical-html-renderer-1.4.3.tgz +0 -0
- package/components/tryghost-parse-email-address-0.0.0.tgz +0 -0
- package/core/app.js +1 -1
- package/core/boot.js +21 -25
- package/core/bridge.js +10 -12
- package/core/built/admin/assets/Combination-BDvCdg1t.js +41 -0
- package/core/built/admin/assets/about-C7O-AgRZ.js +1 -0
- package/core/built/admin/assets/{account-migration-D3O_yVck.js → account-migration-Cv_ol1ko.js} +1 -1
- package/core/built/admin/assets/action-list-lGzZLHc8.js +1 -0
- package/core/built/admin/assets/activitypub/{account-migration-D8FbP-Z-.js → account-migration-DHFbePl6.js} +7 -7
- package/core/built/admin/assets/activitypub/activitypub.js +3 -3
- package/core/built/admin/assets/activitypub/{avatar-11EA1VSs.js → avatar-CT4tS2_S.js} +2 -2
- package/core/built/admin/assets/activitypub/{avatar-flipboard-jfbLG-xe.js → avatar-flipboard-ByYWKipo.js} +2 -2
- package/core/built/admin/assets/activitypub/{bluesky-sharing-f1jTQe2P.js → bluesky-sharing-srVnSHDz.js} +8 -8
- package/core/built/admin/assets/activitypub/{content-formatters-nmTOPY9M.js → content-formatters-C2sos5Ht.js} +3 -3
- package/core/built/admin/assets/activitypub/{copy-BCwo9ep3.js → copy-B1UBTOoZ.js} +2 -2
- package/core/built/admin/assets/activitypub/{dist-BEfX-0aW.js → dist-MPsb2WZ1.js} +4 -4
- package/core/built/admin/assets/activitypub/{domain-AaDlZlrA.js → domain-DzcM9Dzo.js} +9 -9
- package/core/built/admin/assets/activitypub/{edit-profile-DPi8Tl5M.js → edit-profile-CsQ_4xAk.js} +5 -5
- package/core/built/admin/assets/activitypub/{explore-CxTzjILQ.js → explore-CJe0DZBK.js} +8 -8
- package/core/built/admin/assets/activitypub/{feed-DPv5x2MX.js → feed-CKV3qWON.js} +9 -9
- package/core/built/admin/assets/activitypub/{field-DbgA8lat.js → field-DckHfDJf.js} +3 -3
- package/core/built/admin/assets/activitypub/{hash-BWuZoYkA.js → hash-Dlp8RM55.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-35VDQ2K2.js → inbox-CsPy4R0M.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-DSrF_i1O.js → inbox-DAsjzUUe.js} +10 -10
- package/core/built/admin/assets/activitypub/{label-CPjFBbo7.js → label-DWyo9E5T.js} +3 -3
- package/core/built/admin/assets/activitypub/layout-DM_3pqsU.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-BkDC1XVZ.js → moderation-B0Inc03M.js} +7 -7
- package/core/built/admin/assets/activitypub/{note-xEyH4xT-.js → note-CSE54lER.js} +7 -7
- package/core/built/admin/assets/activitypub/{notifications-DClaL3ui.js → notifications-RSwbKqdh.js} +9 -9
- package/core/built/admin/assets/activitypub/{preferences-DpnOa-4Z.js → preferences-CE231n2_.js} +11 -11
- package/core/built/admin/assets/activitypub/{profile-Dvi9mz-6.js → profile-aaQ1j1Eo.js} +13 -13
- package/core/built/admin/assets/activitypub/{reply-Cs9ySd6Z.js → reply-Cjb0Vs3m.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-DFBeTnfn.js → routes-Djb0mc9k.js} +26 -26
- package/core/built/admin/assets/activitypub/{separator-C5u_VjzY.js → separator-D8pROI5n.js} +3 -3
- package/core/built/admin/assets/activitypub/{settings-CV2fFu6D.js → settings-DMc32IQl.js} +5 -5
- package/core/built/admin/assets/activitypub/{site-_TgDd_EM.js → site-DVIcsohX.js} +4 -4
- package/core/built/admin/assets/activitypub/{step-1-BfnNL2oF.js → step-1-9Yey9usF.js} +5 -5
- package/core/built/admin/assets/activitypub/{step-2-DLndZkO-.js → step-2-DdYmKRXV.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-3-A-PZTtRE.js → step-3-hdSkcjZU.js} +10 -10
- package/core/built/admin/assets/activitypub/{tabs-BUbz7tea.js → tabs-CUqseYzQ.js} +6 -6
- package/core/built/admin/assets/activitypub/{topic-filter-BdX_xYYT.js → topic-filter-Coni6OXM.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-EwuRemHh.js → use-activity-pub-queries-MeHTPMQv.js} +2 -2
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-cy4ACBc4.js → use-navigate-with-base-path-B046AM38.js} +24 -7
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-CyFcGfan.js → use-reply-chain-data-1AO-Xob6.js} +5 -5
- package/core/built/admin/assets/activitypub/{x-7zk8mV2p.js → x-BRfRYd16.js} +2 -2
- package/core/built/admin/assets/add-integration-modal-m9Dv6f77.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-CPSVZL2H.js +1 -0
- package/core/built/admin/assets/add-recommendation-modal-Ci9Z5yat.js +1 -0
- package/core/built/admin/assets/analytics-DqSCVV8U.js +1 -0
- package/core/built/admin/assets/announcement-bar-modal-DU3avV7d.js +1 -0
- package/core/built/admin/assets/api-keys-BK0LylyK.js +1 -0
- package/core/built/admin/assets/api-keys-_iCT4dxr.js +1 -0
- package/core/built/admin/assets/{audience-CkBb2LlO.js → audience-DTJtXXWY.js} +1 -1
- package/core/built/admin/assets/automated-emails-PayPCT8L.js +1 -0
- package/core/built/admin/assets/{automations-DhKeS_U5.js → automations-162q5HjL.js} +1 -1
- package/core/built/admin/assets/{automations-cMllU545.js → automations-dtQ_MRZ7.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-DPGpyD-G.js → bluesky-sharing-B8Es3AuV.js} +1 -1
- package/core/built/admin/assets/brand-icon-09YqFZjV.js +1 -0
- package/core/built/admin/assets/{breadcrumb-DIfcF5ow.js → breadcrumb-tg5zL--z.js} +1 -1
- package/core/built/admin/assets/{chart-helpers-DV0FkdcD.js → chart-helpers-CZElTGYL.js} +1 -1
- package/core/built/admin/assets/checkbox-Cyo-x7mC.js +1 -0
- package/core/built/admin/assets/{chunk.524.87b52f4fada529df2c4c.js → chunk.524.cd5498dd4e195f679266.js} +4 -4
- package/core/built/admin/assets/{chunk.582.340bcca873e806cbd4bb.js → chunk.582.6f92ec1f03734bf2ea3f.js} +6 -6
- package/core/built/admin/assets/{chunk.332.05991a101d67f732dec3.js → chunk.873.b8fc05a8ab877fb819ed.js} +28 -27
- package/core/built/admin/assets/code-editor-view-Dq1rQ4tS.js +1 -0
- package/core/built/admin/assets/color-picker-field-BonBgxhU.js +1 -0
- package/core/built/admin/assets/color-utils-BsrwXuDz.js +1 -0
- package/core/built/admin/assets/combobox-uX5r_paI.js +1 -0
- package/core/built/admin/assets/command-DxwBO2pF.js +1 -0
- package/core/built/admin/assets/comments-Dn-RO-nU.js +1 -0
- package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +1 -0
- package/core/built/admin/assets/confirmation-modal-B6D6mk6R.js +1 -0
- package/core/built/admin/assets/content-api-modal-BxQ-7T6u.js +1 -0
- package/core/built/admin/assets/copy-field-BAxL4Zqn.js +1 -0
- package/core/built/admin/assets/currency-Dy4Tc2R2.js +1 -0
- package/core/built/admin/assets/custom-integration-modal---d_l7lc.js +1 -0
- package/core/built/admin/assets/{date-range-select-dXc-GsVe.js → date-range-select-PB2n1HZf.js} +1 -1
- package/core/built/admin/assets/debounce-Dg2fW5Rg.js +3 -0
- package/core/built/admin/assets/design-and-theme-modal-DYRT207a.js +23 -0
- package/core/built/admin/assets/dirty-confirm-dialog-BnDJ39ao.js +1 -0
- package/core/built/admin/assets/disabled-sources-indicator-iMHrkyV3.js +1 -0
- package/core/built/admin/assets/dist-B2PvRwLn.js +1 -0
- package/core/built/admin/assets/{dist-pHiOxyxa.js → dist-D5vhMdXf.js} +1 -1
- package/core/built/admin/assets/dist-DlCyLrOC.js +1 -0
- package/core/built/admin/assets/dist-WeOIvSYM.js +23 -0
- package/core/built/admin/assets/{dist-DyViJwIy.js → dist-cFzKLG7y.js} +3 -3
- package/core/built/admin/assets/dist-j1xxxnY8.js +1 -0
- package/core/built/admin/assets/dist-myQaY0ka.js +1 -0
- package/core/built/admin/assets/{domain-B5ogXUBa.js → domain-BR8FIdjD.js} +1 -1
- package/core/built/admin/assets/{dropzone-BnFG7dDP.js → dropzone-hNxmUvwD.js} +1 -1
- package/core/built/admin/assets/{edit-profile-B07jCZy9.js → edit-profile-CENrkY0l.js} +1 -1
- package/core/built/admin/assets/editor-B18D0lm8.js +8 -0
- package/core/built/admin/assets/embed-signup-form-modal-BsCYUMvQ.js +9 -0
- package/core/built/admin/assets/{explore-Ca1y8HW_.js → explore-BmrnljWw.js} +1 -1
- package/core/built/admin/assets/{feed-x4iFMBP4.js → feed-Dy4li6i8.js} +1 -1
- package/core/built/admin/assets/{field-ChCAabZg.js → field-Dh_lwk13.js} +1 -1
- package/core/built/admin/assets/{filter-sources-LdtH1e-T.js → filter-sources-D2zDuJH5.js} +1 -1
- package/core/built/admin/assets/filters-3JBQcNtJ.js +1 -0
- package/core/built/admin/assets/{filters-CjVKRP8U.js → filters-CFt_BDe4.js} +1 -1
- package/core/built/admin/assets/first-promoter-modal-D6Rjxugw.js +1 -0
- package/core/built/admin/assets/format-url-C-t8G6Qd.js +1 -0
- package/core/built/admin/assets/{ghost-7f01131115186d1af84ead76e79646dd.js → ghost-d683fbeb945b13155ea669caa5d8db41.js} +300 -298
- package/core/built/admin/assets/{gift-link-modal-Buqh2vXh.js → gift-link-modal-zMtlJhLQ.js} +1 -1
- package/core/built/admin/assets/{gift-links-CsUhefWG.js → gift-links-CVuqLhsZ.js} +1 -1
- package/core/built/admin/assets/global-data-provider-B949LDXJ.js +1 -0
- package/core/built/admin/assets/grid-CUciBfjf.js +1 -0
- package/core/built/admin/assets/{growth-Dy2UOSay.js → growth-C38Xtp8D.js} +2 -2
- package/core/built/admin/assets/{growth-DajOBdN0.js → growth-CFws67_i.js} +1 -1
- package/core/built/admin/assets/history-modal-ILAOkbxH.js +1 -0
- package/core/built/admin/assets/{hooks-CixO01lL.js → hooks-D6EE7BIt.js} +2 -2
- package/core/built/admin/assets/html-field-9a9Id_2q.js +1 -0
- package/core/built/admin/assets/iframe-buffering-e8vH4-Qn.js +1 -0
- package/core/built/admin/assets/images-CrQKVc9Q.js +1 -0
- package/core/built/admin/assets/{inbox-BUOLDoji.js → inbox-BrSRzyvz.js} +13 -13
- package/core/built/admin/assets/index-BHy2DZX-.js +67 -0
- package/core/built/admin/assets/index-Ds2iUoF6.css +1 -0
- package/core/built/admin/assets/index.es-B9tvf-t4.js +1 -0
- package/core/built/admin/assets/{input-group-uSK3XT7b.js → input-group-6vEPvX9S.js} +1 -1
- package/core/built/admin/assets/integration-header-B4DyXV06.js +1 -0
- package/core/built/admin/assets/integrations-BT6_iJvu.js +1 -0
- package/core/built/admin/assets/invite-user-modal-5xDCEw90.js +1 -0
- package/core/built/admin/assets/isEmail-BOfC647y.js +1 -0
- package/core/built/admin/assets/koenig-editor-base-BWLEB9Vf.js +1 -0
- package/core/built/admin/assets/{koenig-lexical-BFc4yFed.js → koenig-lexical-Cj62r_y9.js} +1 -1
- package/core/built/admin/assets/{kpi-card-BN-E6WYX.js → kpi-card-DOUnkZcN.js} +1 -1
- package/core/built/admin/assets/{kpi-card-CCt-qeWD.js → kpi-card-IHDo8Q56.js} +1 -1
- package/core/built/admin/assets/{kpi-helpers-DlxTbTs4.js → kpi-helpers-CjUdECAK.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-BlcUttpn.js → kpi-tabs-X3DkOYbI.js} +1 -1
- package/core/built/admin/assets/{label-AVrxwmsz.js → label-Dq6QaOuS.js} +1 -1
- package/core/built/admin/assets/label-picker-8YlhS2U3.js +1 -0
- package/core/built/admin/assets/{labels-DAIqKed7.js → labels-DAPjKPy2.js} +1 -1
- package/core/built/admin/assets/layout-TMj4P-vv.js +1 -0
- package/core/built/admin/assets/limit-modal-BRPsit_B.js +1 -0
- package/core/built/admin/assets/{link-helpers-D9LsDOkG.js → link-helpers-Bzkk68GD.js} +1 -1
- package/core/built/admin/assets/member-custom-fields-CmvsuuV_.js +1 -0
- package/core/built/admin/assets/member-detail-DCvRrkmJ.js +1 -0
- package/core/built/admin/assets/members-DxbSKngD.js +11 -0
- package/core/built/admin/assets/modal-page-BMTzFHVO.js +1 -0
- package/core/built/admin/assets/{moderation-CQ3urTFE.js → moderation-Da5lhhWh.js} +1 -1
- package/core/built/admin/assets/multi-select-combobox-CYdkH7KQ.js +1 -0
- package/core/built/admin/assets/navigation-modal-BIoTwtMy.js +1 -0
- package/core/built/admin/assets/newsletter-BptlVoJm.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-BIvxqE0N.js +1 -0
- package/core/built/admin/assets/newsletter-emails-Bf8IZLsP.js +1 -0
- package/core/built/admin/assets/{newsletters-vt3Ni1Ov.js → newsletters-BgrIZk0V.js} +1 -1
- package/core/built/admin/assets/{newsletters-BXJbJgA-.js → newsletters-Du0lzskS.js} +1 -1
- package/core/built/admin/assets/{note-Dk877BTv.js → note-DYcLOmDb.js} +1 -1
- package/core/built/admin/assets/{notifications-CPlLjPxO.js → notifications-B2SPFIV9.js} +1 -1
- package/core/built/admin/assets/{offers-DEniVRD5.js → offers-Um6ab71O.js} +1 -1
- package/core/built/admin/assets/offers-container-modal-BZnZITMw.js +1 -0
- package/core/built/admin/assets/{onboarding-route-DdStOtjy.js → onboarding-route-DgdfxkQh.js} +1 -1
- package/core/built/admin/assets/overview-BYQJXSog.js +1 -0
- package/core/built/admin/assets/overview-Dt2_mR6U.js +1 -0
- package/core/built/admin/assets/{page-header-pp4dWmOS.js → page-header-CpmxJj5B.js} +1 -1
- package/core/built/admin/assets/{pages-B4goRPUn.js → pages-BVMnpI2O.js} +1 -1
- package/core/built/admin/assets/pintura-modal-B4MuBuuO.js +1 -0
- package/core/built/admin/assets/portal-frame-BF0NBIji.js +1 -0
- package/core/built/admin/assets/portal-modal-DMVbm0oy.js +1 -0
- package/core/built/admin/assets/{post-analytics-BMJrI81R.js → post-analytics-CXWBOGyP.js} +1 -1
- package/core/built/admin/assets/post-analytics-header-ChzjXVPt.js +1 -0
- package/core/built/admin/assets/{post-analytics-provider-Btml5vJI.js → post-analytics-provider-Cgw4U_fw.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-AcUZkbfL.js → post-share-modal-B9Vmk_XM.js} +1 -1
- package/core/built/admin/assets/{posts-DhXE7b6r.js → posts-CxG7v0-M.js} +1 -1
- package/core/built/admin/assets/preferences-BfzJmnsd.js +5 -0
- package/core/built/admin/assets/preview-chrome-BOVO6_PE.js +1 -0
- package/core/built/admin/assets/preview-modal-Dw_HtD6S.js +1 -0
- package/core/built/admin/assets/profile-BT5vtv9b.js +1 -0
- package/core/built/admin/assets/radio-group-I7ou7PoJ.js +1 -0
- package/core/built/admin/assets/{referrers-pmJT4k3-.js → referrers-B9QDAfYm.js} +1 -1
- package/core/built/admin/assets/{router-provider-BmEZf6c6.js → router-provider-DSQfprxH.js} +1 -1
- package/core/built/admin/assets/select-D9oU1IoM.js +1 -0
- package/core/built/admin/assets/settings-CfZFbyu_.js +4 -0
- package/core/built/admin/assets/{settings-BGgk7oCI.js → settings-CpvHWix7.js} +1 -1
- package/core/built/admin/assets/settings-breadcrumbs-K0USP2nw.js +1 -0
- package/core/built/admin/assets/{share-modal-BeuydaBf.js → share-modal-ClIyPzc5.js} +1 -1
- package/core/built/admin/assets/slack-modal-1XXqOfiw.js +1 -0
- package/core/built/admin/assets/social-urls-CHQ9cTAK.js +1 -0
- package/core/built/admin/assets/{sort-button-Df4t2AL8.js → sort-button-CdBsm40v.js} +1 -1
- package/core/built/admin/assets/{source-icon-ajoaKb41.js → source-icon-CEYmVLXR.js} +1 -1
- package/core/built/admin/assets/{stats-C_lfxZAw.js → stats-D8nZCTy5.js} +1 -1
- package/core/built/admin/assets/{stats-view-Cxot1iD8.js → stats-view-CugFVf0g.js} +1 -1
- package/core/built/admin/assets/{step-1-ogAA4lDr.js → step-1-DOYjrORn.js} +1 -1
- package/core/built/admin/assets/{step-2-C5Xini-7.js → step-2-vA6RsarH.js} +1 -1
- package/core/built/admin/assets/{step-3-CZv1FV81.js → step-3-BtIBxMId.js} +2 -2
- package/core/built/admin/assets/stripe-button-UFP4QRXd.js +1 -0
- package/core/built/admin/assets/stripe-connect-modal-C_L3uM6n.js +1 -0
- package/core/built/admin/assets/switch-CE2NuMn-.js +1 -0
- package/core/built/admin/assets/{table-DFj1wiYv.js → table-TMCgCQK7.js} +1 -1
- package/core/built/admin/assets/tabs-Dd6oOKbv.js +1 -0
- package/core/built/admin/assets/tag-detail-D3l-UJPR.js +1 -0
- package/core/built/admin/assets/tags-BwCgmr5v.js +1 -0
- package/core/built/admin/assets/tags-WdKQGWR8.js +1 -0
- package/core/built/admin/assets/testimonials-modal-CqWp-xXJ.js +1 -0
- package/core/built/admin/assets/tier-detail-modal-BkcR2u0A.js +1 -0
- package/core/built/admin/assets/{tiers-DYsa4DCo.js → tiers-Da6kxHQP.js} +1 -1
- package/core/built/admin/assets/toggle-group-Guorw93z.js +1 -0
- package/core/built/admin/assets/{topic-filter-DGDxDalo.js → topic-filter-CbgoWIHn.js} +1 -1
- package/core/built/admin/assets/transistor-modal-DuNnnpal.js +1 -0
- package/core/built/admin/assets/unsplash-modal-y2bVwTHH.js +1 -0
- package/core/built/admin/assets/{use-analytics-data-C76v4LIp.js → use-analytics-data-B-b4wNSC.js} +1 -1
- package/core/built/admin/assets/use-check-theme-limit-error-m09J38Mq.js +2 -0
- package/core/built/admin/assets/use-feature-flag-ud0Qz8vt.js +1 -0
- package/core/built/admin/assets/use-filter-params-BnbBDc7T.js +1 -0
- package/core/built/admin/assets/use-filterable-api-iMpDZBxD.js +1 -0
- package/core/built/admin/assets/use-form-vRjI0Kwk.js +1 -0
- package/core/built/admin/assets/{use-growth-stats-aNXJOmQr.js → use-growth-stats-DPU5rt3W.js} +1 -1
- package/core/built/admin/assets/use-hash-link-navigation-guard-B9j6HIrV.js +1 -0
- package/core/built/admin/assets/use-limiter-BkN3E4gw.js +2 -0
- package/core/built/admin/assets/use-pintura-config-C_z8HTG2.js +1 -0
- package/core/built/admin/assets/use-pintura-editor-DNgbkhGp.js +1 -0
- package/core/built/admin/assets/{use-post-referrers-CG0SZioj.js → use-post-referrers-C2mXyrp-.js} +1 -1
- package/core/built/admin/assets/use-query-params-DHhhu8wi.js +1 -0
- package/core/built/admin/assets/{use-reply-chain-data-RLdPKRmS.js → use-reply-chain-data-DaK8q2qQ.js} +1 -1
- package/core/built/admin/assets/use-setting-group-YlYcoNyP.js +1 -0
- package/core/built/admin/assets/use-settings-navigation-Bf1g1rEh.js +1 -0
- package/core/built/admin/assets/{use-simple-pagination-DgcF69KI.js → use-simple-pagination-D9ckKo5-.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-query-C1R_Kbmy.js → use-tinybird-query-GSa32hVw.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-C9fPjVM_.js → use-tinybird-token-CKLOZFsw.js} +1 -1
- package/core/built/admin/assets/use-url-input-z-p0Kewm.js +5 -0
- package/core/built/admin/assets/user-detail-modal-BMxOA4Sv.js +1 -0
- package/core/built/admin/assets/{users-Dkv8NQZe.js → users-B6hIds6n.js} +1 -1
- package/core/built/admin/assets/validator-Cr0sMKuW.js +7 -0
- package/core/built/admin/assets/{virtual-list-BmTUzeoF.js → virtual-list-RHeEL05L.js} +1 -1
- package/core/built/admin/assets/web-Bw2QMO5u.js +2 -0
- package/core/built/admin/assets/web-xJtcwMy4.js +1 -0
- package/core/built/admin/assets/zapier-modal-BP2f4-vY.js +1 -0
- package/core/built/admin/index.html +15 -13
- package/core/frontend/helpers/authors.js +1 -1
- package/core/frontend/helpers/link.js +3 -8
- package/core/frontend/helpers/tags.js +1 -1
- package/core/frontend/meta/author-url.js +2 -2
- package/core/frontend/meta/url.js +4 -4
- package/core/frontend/services/proxy.js +1 -1
- package/core/frontend/services/routing/events.js +20 -6
- package/core/frontend/services/routing/permalink-adapter.js +0 -13
- package/core/frontend/services/routing/permalink-adapter.ts +0 -13
- package/core/frontend/services/routing/router-manager.js +15 -9
- package/core/frontend/services/sitemap/base-site-map-generator.js +1 -28
- package/core/frontend/services/sitemap/site-map-manager.js +22 -57
- package/core/server/adapters/route-settings/utils.js +10 -2
- package/core/server/adapters/route-settings/utils.ts +12 -2
- package/core/server/api/endpoints/email-post.js +1 -1
- package/core/server/api/endpoints/previews.js +1 -1
- package/core/server/api/endpoints/search-index-public.js +3 -3
- package/core/server/api/endpoints/search-index.js +4 -4
- package/core/server/api/endpoints/utils/serializers/input/authors.js +2 -2
- package/core/server/api/endpoints/utils/serializers/input/comments.js +1 -1
- package/core/server/api/endpoints/utils/serializers/input/pages.js +3 -3
- package/core/server/api/endpoints/utils/serializers/input/posts.js +3 -3
- package/core/server/api/endpoints/utils/serializers/input/tags.js +1 -1
- package/core/server/api/endpoints/utils/serializers/input/users.js +2 -2
- package/core/server/api/endpoints/utils/serializers/input/utils/url.js +31 -13
- package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +2 -2
- package/core/server/api/endpoints/utils/serializers/output/mappers/tags.js +2 -2
- package/core/server/api/endpoints/utils/serializers/output/mappers/users.js +8 -0
- package/core/server/api/endpoints/utils/serializers/output/utils/url.js +18 -11
- package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +74 -0
- package/core/server/data/migrations/versions/6.57/2026-08-04-18-54-14-reset-automation-email-analytics.js +25 -0
- package/core/server/data/schema/commands.js +21 -5
- package/core/server/data/schema/schema.js +24 -5
- package/core/server/lib/common/to-plain.ts +1 -1
- package/core/server/models/post.js +2 -2
- package/core/server/services/adapter-manager/adapter-manager.js +1 -45
- package/core/server/services/adapter-manager/adapter-manager.ts +2 -48
- package/core/server/services/adapter-manager/adapter-paths.js +24 -0
- package/core/server/services/adapter-manager/adapter-paths.ts +21 -0
- package/core/server/services/adapter-manager/base-classes.js +22 -0
- package/core/server/services/adapter-manager/base-classes.ts +22 -0
- package/core/server/services/adapter-manager/index.js +4 -27
- package/core/server/services/adapter-manager/index.ts +4 -31
- package/core/server/services/adapter-manager/utils.js +50 -0
- package/core/server/services/adapter-manager/utils.ts +57 -0
- package/core/server/services/audience-feedback/audience-feedback-controller.js +1 -1
- package/core/server/services/audience-feedback/audience-feedback-service.js +2 -2
- package/core/server/services/automations/service.js +2 -2
- package/core/server/services/automations/service.ts +2 -2
- package/core/server/services/comments/comments-service-emails.js +1 -1
- package/core/server/services/comments/comments-service.js +1 -1
- package/core/server/services/email-analytics/email-analytics-service-wrapper.js +11 -2
- package/core/server/services/email-analytics/email-analytics-service.js +1 -1
- package/core/server/services/email-service/email-service-wrapper.js +2 -1
- package/core/server/services/email-service/mailgun-email-provider.js +15 -0
- package/core/server/services/indexnow-ping/indexnow-ping-service.js +1 -1
- package/core/server/services/indexnow-ping/indexnow-ping-service.ts +2 -4
- package/core/server/services/lib/mailgun-client.js +3 -3
- package/core/server/services/media-inliner/external-media-inliner.js +12 -8
- package/core/server/services/member-attribution/url-translator.js +5 -7
- package/core/server/services/member-welcome-emails/service.js +72 -12
- package/core/server/services/members/api.js +1 -1
- package/core/server/services/members/import-export/import/completion-email.js +8 -4
- package/core/server/services/members/import-export/import/completion-email.ts +9 -4
- package/core/server/services/members/import-export/import/importer.js +25 -4
- package/core/server/services/members/import-export/import/importer.ts +26 -6
- package/core/server/services/members/import-export/import/row.ts +5 -1
- package/core/server/services/members/import-export/index.js +1 -5
- package/core/server/services/members/import-export/index.ts +2 -6
- package/core/server/services/members-custom-fields/queries.js +4 -13
- package/core/server/services/members-custom-fields/queries.ts +4 -13
- package/core/server/services/members-custom-fields/schema.js +18 -27
- package/core/server/services/members-custom-fields/schema.ts +17 -27
- package/core/server/services/members-custom-fields/storage.js +94 -27
- package/core/server/services/members-custom-fields/storage.ts +114 -39
- package/core/server/services/members-custom-fields/values-service.js +98 -219
- package/core/server/services/members-custom-fields/values-service.ts +110 -238
- package/core/server/services/mentions/resource-service.js +1 -1
- package/core/server/services/mentions/service.js +2 -2
- package/core/server/services/route-settings/dynamic-routing-service.js +9 -59
- package/core/server/services/slack-ping/slack-ping-service.js +2 -2
- package/core/server/services/slack-ping/slack-ping-service.ts +3 -5
- package/core/server/services/stats/content-stats-service.js +3 -3
- package/core/server/services/stats/posts-stats-service.js +2 -2
- package/core/server/services/url/config.js +90 -135
- package/core/server/services/url/index.js +6 -49
- package/core/server/services/url/lazy-find-resource.js +14 -11
- package/core/server/services/url/lazy-find-resource.ts +14 -11
- package/core/server/services/url/lazy-url-service.js +174 -94
- package/core/server/services/url/lazy-url-service.ts +233 -97
- package/core/server/services/url/routable-resources.js +62 -71
- package/core/server/services/url/router-filter.js +12 -4
- package/core/server/services/url/router-filter.ts +12 -4
- package/core/server/services/webhooks/index.js +1 -1
- package/core/server/services/webhooks/serialize.js +2 -1
- package/core/shared/config/env/config.testing-mysql.json +1 -2
- package/core/shared/config/env/config.testing.json +1 -2
- package/core/shared/events/index.js +1 -2
- package/core/shared/labs.js +3 -3
- package/package.json +5 -6
- package/pnpm-lock.yaml +6 -9
- package/pnpm-workspace.yaml +2 -2
- package/tsconfig.json +1 -0
- package/core/built/admin/assets/Combination-BCm9FL4o.js +0 -41
- package/core/built/admin/assets/activitypub/layout-CTgrezN7.js +0 -1
- package/core/built/admin/assets/automated-emails-6t2bIRWf.js +0 -7
- package/core/built/admin/assets/checkbox-BIl077a0.js +0 -1
- package/core/built/admin/assets/code-editor-view-C0aWNwdl.js +0 -1
- package/core/built/admin/assets/comments-qwhIjH3c.js +0 -1
- package/core/built/admin/assets/disabled-sources-indicator-DYAXW-6V.js +0 -1
- package/core/built/admin/assets/dist-BUKmD51u.js +0 -1
- package/core/built/admin/assets/dist-CNlMj7ML.js +0 -1
- package/core/built/admin/assets/dist-DDY6GRVz.js +0 -1
- package/core/built/admin/assets/dist-DG78yroX.js +0 -23
- package/core/built/admin/assets/editor-DDYSOXGN.js +0 -8
- package/core/built/admin/assets/esm-CFX93H5M.js +0 -2
- package/core/built/admin/assets/filters-CLehPo_D.js +0 -1
- package/core/built/admin/assets/index-08n05-rc.js +0 -67
- package/core/built/admin/assets/index-DgUzgFvS.css +0 -1
- package/core/built/admin/assets/label-picker-DVnpu_IF.js +0 -1
- package/core/built/admin/assets/layout-B0YLh7R9.js +0 -1
- package/core/built/admin/assets/member-custom-fields-C8NpZYza.js +0 -1
- package/core/built/admin/assets/member-detail-CIVAdKXf.js +0 -1
- package/core/built/admin/assets/members-oLPiSkXD.js +0 -10
- package/core/built/admin/assets/modals-CB7v-k3T.js +0 -31
- package/core/built/admin/assets/newsletter-rbeDX9Wk.js +0 -1
- package/core/built/admin/assets/overview--4V-kx9c.js +0 -1
- package/core/built/admin/assets/overview-DSLv30oz.js +0 -1
- package/core/built/admin/assets/post-analytics-header-pU2m9ZuV.js +0 -1
- package/core/built/admin/assets/preferences-Ru4CRPHC.js +0 -5
- package/core/built/admin/assets/profile-BNb1oj7D.js +0 -1
- package/core/built/admin/assets/select-B0HteHrp.js +0 -1
- package/core/built/admin/assets/settings-B1C9Q3wo.js +0 -4
- package/core/built/admin/assets/social-urls-DA2lXrhW.js +0 -8
- package/core/built/admin/assets/switch-CyQcwMAv.js +0 -1
- package/core/built/admin/assets/tabs-D4y1gqUd.js +0 -1
- package/core/built/admin/assets/tags-Dmft-Y4O.js +0 -1
- package/core/built/admin/assets/toggle-group-R2QMFvXW.js +0 -1
- package/core/built/admin/assets/use-filter-params-WrdhAISv.js +0 -1
- package/core/built/admin/assets/web-BqW0b0_C.js +0 -1
- package/core/built/admin/assets/web-Cy5GKMWM.js +0 -2
- package/core/server/services/url/local-file-cache.js +0 -75
- package/core/server/services/url/queue.js +0 -260
- package/core/server/services/url/resource.js +0 -102
- package/core/server/services/url/resources.js +0 -480
- package/core/server/services/url/url-generator.js +0 -276
- package/core/server/services/url/url-service-facade.js +0 -366
- package/core/server/services/url/url-service-facade.ts +0 -519
- package/core/server/services/url/url-service.js +0 -387
- package/core/server/services/url/urls.js +0 -140
- package/core/shared/events/url-resource-updated-event.js +0 -33
- /package/core/built/admin/assets/{dist-CqO2lWS0.js → dist-CqO2lWS02.js} +0 -0
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
const fs = require('fs-extra');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
class LocalFileCache {
|
|
5
|
-
/**
|
|
6
|
-
* @param {Object} options
|
|
7
|
-
* @param {string} options.storagePath - cached storage path
|
|
8
|
-
* @param {boolean} options.writeDisabled - controls if cache can write
|
|
9
|
-
*/
|
|
10
|
-
constructor({storagePath, writeDisabled}) {
|
|
11
|
-
const urlsStoragePath = path.join(storagePath, 'urls.json');
|
|
12
|
-
const resourcesCachePath = path.join(storagePath, 'resources.json');
|
|
13
|
-
|
|
14
|
-
this.storagePaths = {
|
|
15
|
-
urls: urlsStoragePath,
|
|
16
|
-
resources: resourcesCachePath
|
|
17
|
-
};
|
|
18
|
-
this.writeDisabled = writeDisabled;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Handles reading and parsing JSON from the filesystem.
|
|
23
|
-
* In case the file is corrupted or does not exist, returns null.
|
|
24
|
-
* @param {string} filePath path to read from
|
|
25
|
-
* @returns {Promise<Object>}
|
|
26
|
-
* @private
|
|
27
|
-
*/
|
|
28
|
-
async readCacheFile(filePath) {
|
|
29
|
-
let cacheExists = false;
|
|
30
|
-
let cacheData = null;
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
await fs.stat(filePath);
|
|
34
|
-
cacheExists = true;
|
|
35
|
-
} catch (e) {
|
|
36
|
-
cacheExists = false;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (cacheExists) {
|
|
40
|
-
try {
|
|
41
|
-
const cacheFile = await fs.readFile(filePath, 'utf8');
|
|
42
|
-
cacheData = JSON.parse(cacheFile);
|
|
43
|
-
} catch (e) {
|
|
44
|
-
//noop as we'd start a long boot process if there are any errors in the file
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return cacheData;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
* @param {'urls'|'resources'} type
|
|
54
|
-
* @returns {Promise<Object>}
|
|
55
|
-
*/
|
|
56
|
-
async read(type) {
|
|
57
|
-
return await this.readCacheFile(this.storagePaths[type]);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
*
|
|
62
|
-
* @param {'urls'|'resources'} type of data to persist
|
|
63
|
-
* @param {Object} data - data to be persisted
|
|
64
|
-
* @returns {Promise<Object>}
|
|
65
|
-
*/
|
|
66
|
-
async write(type, data) {
|
|
67
|
-
if (this.writeDisabled) {
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return fs.writeFile(this.storagePaths[type], JSON.stringify(data, null, 4));
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
module.exports = LocalFileCache;
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
const debug = require('@tryghost/debug')('services:url:queue');
|
|
2
|
-
const EventEmitter = require('events').EventEmitter;
|
|
3
|
-
const _ = require('lodash');
|
|
4
|
-
const logging = require('@tryghost/logging');
|
|
5
|
-
const errors = require('@tryghost/errors');
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* ### Purpose of this queue
|
|
9
|
-
*
|
|
10
|
-
* Ghost fetches the resources as early as possible from the database. The simple reason is: we
|
|
11
|
-
* want to know all URLs as soon as possible.
|
|
12
|
-
*
|
|
13
|
-
* Parallel to this, the routes are read/prepared and registered in express. So the challenge is
|
|
14
|
-
* to handle both resource availability and route registration. If you start an event, all subscribers
|
|
15
|
-
* of it are executed in a sequence. The queue will wait until the current subscriber has finished its work.
|
|
16
|
-
*
|
|
17
|
-
* The URL service must ensure that each URL in the system exists only once. The order of
|
|
18
|
-
* subscribers defines who will possibly own an URL first.
|
|
19
|
-
*
|
|
20
|
-
* If an event has finished, the subscribers of this event still remain in the queue. That means:
|
|
21
|
-
* - you can re-run an event
|
|
22
|
-
* - you can add more subscribers to an existing queue
|
|
23
|
-
* - you can order subscribers (helpful if you want to order routers)
|
|
24
|
-
*
|
|
25
|
-
* Each subscriber represents one instance of the URL generator. One URL generator represents one router.
|
|
26
|
-
*
|
|
27
|
-
* ### Tolerance option
|
|
28
|
-
*
|
|
29
|
-
* You can define a `tolerance` value per event. This allows you to wait an amount of time until you think
|
|
30
|
-
* all subscribers have registered.
|
|
31
|
-
*
|
|
32
|
-
* ### Some examples to understand cases
|
|
33
|
-
*
|
|
34
|
-
* e.g.
|
|
35
|
-
* - resources have been loaded, event has started
|
|
36
|
-
* - no subscribers yet, we need to wait, express still initialises
|
|
37
|
-
* - okay, routes are coming in
|
|
38
|
-
* - we notify the subscribers
|
|
39
|
-
*
|
|
40
|
-
* e.g.
|
|
41
|
-
* - resources are in the progress of fetching from the database
|
|
42
|
-
* - routes are already waiting for the resources
|
|
43
|
-
*
|
|
44
|
-
* e.g.
|
|
45
|
-
* - resources are in the progress of fetching from the database
|
|
46
|
-
* - 2 subscribers are already registered
|
|
47
|
-
* - resources finished, event starts
|
|
48
|
-
* - 2 more subscribers are coming in
|
|
49
|
-
|
|
50
|
-
* ### Events
|
|
51
|
-
* - unique events e.g. added, updated, init, all
|
|
52
|
-
* - has subscribers
|
|
53
|
-
* - we remember the subscriber
|
|
54
|
-
*
|
|
55
|
-
* ### Actions
|
|
56
|
-
* - one event can have multiple actions
|
|
57
|
-
* - unique actions e.g. add post 1, add post 2
|
|
58
|
-
* - one event might only allow a single action to avoid collisions e.g. you initialise data twice
|
|
59
|
-
* - if an event has no action, the name of the action is the name of the event
|
|
60
|
-
* - in this case the event can only run once at a time
|
|
61
|
-
* - makes use of `toNotify` to remember who was notified already
|
|
62
|
-
*/
|
|
63
|
-
class Queue extends EventEmitter {
|
|
64
|
-
/** @type {Record<string, {tolerance: number, requiredSubscriberCount: number, subscribers: Array<Function>}>} */
|
|
65
|
-
queue = {};
|
|
66
|
-
|
|
67
|
-
/** @type {Record<string, {event: string, timeoutInMS: number, notified: Array<Function>, timeout?: NodeJS.Timeout | null}>} */
|
|
68
|
-
toNotify = {};
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* @description Register a subscriber for this queue.
|
|
72
|
-
*
|
|
73
|
-
* Also initializes the queue for this event if it hasn't already.
|
|
74
|
-
*
|
|
75
|
-
* The tolerance is for the event on the queue (milliseconds):
|
|
76
|
-
* - 0: don't wait for more subscribers [default]
|
|
77
|
-
* - 100: wait long enough till all subscribers have registered (e.g. bootstrap)
|
|
78
|
-
*
|
|
79
|
-
* @param {Object} options
|
|
80
|
-
* @param {string} options.event
|
|
81
|
-
* @param {number} [options.tolerance]
|
|
82
|
-
* @param {number} [options.requiredSubscriberCount]
|
|
83
|
-
* @param {Function} fn
|
|
84
|
-
*/
|
|
85
|
-
register(options, fn) {
|
|
86
|
-
if (!Object.prototype.hasOwnProperty.call(options, 'tolerance')) {
|
|
87
|
-
options.tolerance = 0;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// CASE: nobody has initialised the queue event yet
|
|
91
|
-
if (!Object.prototype.hasOwnProperty.call(this.queue, options.event)) {
|
|
92
|
-
this.queue[options.event] = {
|
|
93
|
-
tolerance: options.tolerance,
|
|
94
|
-
requiredSubscriberCount: options.requiredSubscriberCount || 0,
|
|
95
|
-
subscribers: []
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
debug('register', options.event, options.tolerance);
|
|
100
|
-
|
|
101
|
-
this.queue[options.event].subscribers.push(fn);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* @description The queue runs & executes subscribers one by one (sequentially)
|
|
106
|
-
* @param {Object} options
|
|
107
|
-
* @param {string} options.event
|
|
108
|
-
* @param {string} options.action
|
|
109
|
-
* @param {Object} [options.eventData]
|
|
110
|
-
*/
|
|
111
|
-
run(options) {
|
|
112
|
-
const {event, action, eventData} = options;
|
|
113
|
-
|
|
114
|
-
clearTimeout(this.toNotify[action].timeout);
|
|
115
|
-
this.toNotify[action].timeout = null;
|
|
116
|
-
|
|
117
|
-
const subscribers = this.queue[event].subscribers;
|
|
118
|
-
const notified = this.toNotify[action].notified;
|
|
119
|
-
|
|
120
|
-
debug('run', action, event, subscribers.length, notified.length);
|
|
121
|
-
|
|
122
|
-
if (subscribers.length && subscribers.length !== notified.length) {
|
|
123
|
-
const fn = subscribers[notified.length];
|
|
124
|
-
|
|
125
|
-
debug('run.execute', action, event, notified.length);
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* @NOTE: Currently no async operations happen in the subscribers functions.
|
|
129
|
-
* We can trigger the functions sync.
|
|
130
|
-
*/
|
|
131
|
-
try {
|
|
132
|
-
fn(eventData);
|
|
133
|
-
|
|
134
|
-
debug('run.executed', action, event, notified.length);
|
|
135
|
-
this.toNotify[action].notified.push(fn);
|
|
136
|
-
this.run(options);
|
|
137
|
-
} catch (err) {
|
|
138
|
-
debug('error', err.message);
|
|
139
|
-
|
|
140
|
-
logging.error(new errors.InternalServerError({
|
|
141
|
-
message: 'Something bad happened.',
|
|
142
|
-
code: 'SERVICES_URL_QUEUE',
|
|
143
|
-
err: err
|
|
144
|
-
}));
|
|
145
|
-
|
|
146
|
-
// @NOTE: The url service stays in maintenance mode. There is nothing we can do if an url generator fails.
|
|
147
|
-
}
|
|
148
|
-
} else {
|
|
149
|
-
// CASE 1: zero tolerance, kill run fn
|
|
150
|
-
// CASE 2: okay, i was tolerant enough, kill me
|
|
151
|
-
// CASE 3: wait for more subscribers, i am still tolerant
|
|
152
|
-
if (this.queue[event].tolerance === 0) {
|
|
153
|
-
delete this.toNotify[action];
|
|
154
|
-
debug('run.ended (zero tolerance)', event, action);
|
|
155
|
-
this.emit('ended', event);
|
|
156
|
-
} else if (subscribers.length >= this.queue[event].requiredSubscriberCount &&
|
|
157
|
-
this.toNotify[action].timeoutInMS > this.queue[event].tolerance) {
|
|
158
|
-
delete this.toNotify[action];
|
|
159
|
-
debug('run.ended (tolerance and subscribers)', event, action);
|
|
160
|
-
this.emit('ended', event);
|
|
161
|
-
} else {
|
|
162
|
-
debug('run.retry', event, action, this.toNotify[action].timeoutInMS);
|
|
163
|
-
|
|
164
|
-
this.toNotify[action].timeoutInMS = this.toNotify[action].timeoutInMS * 1.1;
|
|
165
|
-
|
|
166
|
-
this.toNotify[action].timeout = setTimeout(() => {
|
|
167
|
-
this.run(options);
|
|
168
|
-
}, this.toNotify[action].timeoutInMS);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* @description Start the queue from outside.
|
|
175
|
-
*
|
|
176
|
-
* CASE:
|
|
177
|
-
* - resources were fetched from database on bootstrap
|
|
178
|
-
* - resource was added
|
|
179
|
-
*
|
|
180
|
-
* @param {Object} options
|
|
181
|
-
* @param {string} options.event
|
|
182
|
-
* @param {number} [options.tolerance]
|
|
183
|
-
* @param {number} [options.timeoutInMS]
|
|
184
|
-
* @param {number} [options.requiredSubscriberCount]
|
|
185
|
-
* @param {string} [options.action]
|
|
186
|
-
*/
|
|
187
|
-
start(options) {
|
|
188
|
-
debug('start');
|
|
189
|
-
|
|
190
|
-
// CASE: nobody is in the event queue waiting yet
|
|
191
|
-
// e.g. all resources are fetched already, but no subscribers (bootstrap)
|
|
192
|
-
// happens only for high tolerant events
|
|
193
|
-
if (!Object.prototype.hasOwnProperty.call(this.queue, options.event)) {
|
|
194
|
-
this.queue[options.event] = {
|
|
195
|
-
tolerance: options.tolerance || 0,
|
|
196
|
-
requiredSubscriberCount: options.requiredSubscriberCount || 0,
|
|
197
|
-
subscribers: []
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// an event doesn't need an action
|
|
202
|
-
if (!options.action) {
|
|
203
|
-
options.action = options.event;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// CASE 1: the queue supports killing an event e.g. resource edit is triggered twice very fast
|
|
207
|
-
// CASE 2: is the action already running, stop it, because e.g. configuration has changed
|
|
208
|
-
if (this.toNotify[options.action]) {
|
|
209
|
-
// CASE: timeout was registered, kill it, this will stop the run function of this action
|
|
210
|
-
if (this.toNotify[options.action].timeout) {
|
|
211
|
-
clearTimeout(this.toNotify[options.action].timeout);
|
|
212
|
-
this.toNotify[options.action].timeout = null;
|
|
213
|
-
} else {
|
|
214
|
-
debug('ignore. is already running', options.event, options.action);
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// @NOTE: reset who was already notified
|
|
220
|
-
this.toNotify[options.action] = {
|
|
221
|
-
event: options.event,
|
|
222
|
-
timeoutInMS: options.timeoutInMS || 50,
|
|
223
|
-
notified: []
|
|
224
|
-
};
|
|
225
|
-
|
|
226
|
-
this.emit('started', options.event);
|
|
227
|
-
this.run(options);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* @description Hard reset queue from outside.
|
|
232
|
-
*
|
|
233
|
-
* Reset usually only happens if you e.g. switch the api version.
|
|
234
|
-
*/
|
|
235
|
-
reset() {
|
|
236
|
-
this.queue = {};
|
|
237
|
-
|
|
238
|
-
_.each(this.toNotify, (obj) => {
|
|
239
|
-
clearTimeout(obj.timeout);
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
this.toNotify = {};
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* @description Soft reset queue from outside.
|
|
247
|
-
*
|
|
248
|
-
* A soft reset does NOT clear the subscribers!
|
|
249
|
-
* Only used for test env currently.
|
|
250
|
-
*/
|
|
251
|
-
softReset() {
|
|
252
|
-
_.each(this.toNotify, (obj) => {
|
|
253
|
-
clearTimeout(obj.timeout);
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
this.toNotify = {};
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
module.exports = Queue;
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
const EventEmitter = require('events').EventEmitter;
|
|
2
|
-
const logging = require('@tryghost/logging');
|
|
3
|
-
const errors = require('@tryghost/errors');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Resource cache.
|
|
7
|
-
*/
|
|
8
|
-
class Resource extends EventEmitter {
|
|
9
|
-
/**
|
|
10
|
-
* @param {('posts'|'pages'|'tags'|'authors')} type - of the resource
|
|
11
|
-
* @param {Object} obj - object data to store
|
|
12
|
-
*/
|
|
13
|
-
constructor(type, obj) {
|
|
14
|
-
super();
|
|
15
|
-
|
|
16
|
-
this.config = {
|
|
17
|
-
type: type,
|
|
18
|
-
reserved: false
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
this.data = obj;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* @description Get the type of the resource e.g. posts, users ...
|
|
26
|
-
* @returns {string} type
|
|
27
|
-
*/
|
|
28
|
-
getType() {
|
|
29
|
-
return this.config.type;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* @description Reserve a resource.
|
|
34
|
-
*
|
|
35
|
-
* This happens if a url generator's conditions matches a resource.
|
|
36
|
-
* We have to reserve resources, because otherwise resources can appear in multiple url structures.
|
|
37
|
-
*/
|
|
38
|
-
reserve() {
|
|
39
|
-
if (!this.config.reserved) {
|
|
40
|
-
this.config.reserved = true;
|
|
41
|
-
} else {
|
|
42
|
-
logging.error(new errors.InternalServerError({
|
|
43
|
-
message: 'Resource is already taken. This should not happen.',
|
|
44
|
-
code: 'URLSERVICE_RESERVE_RESOURCE'
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* @description Release a resource.
|
|
51
|
-
*
|
|
52
|
-
* This happens if conditions of a url generator no longer matches a resource.
|
|
53
|
-
* e.g. change a post to a page.
|
|
54
|
-
*/
|
|
55
|
-
release() {
|
|
56
|
-
this.config.reserved = false;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* @description Check whether a resource is reserved.
|
|
61
|
-
* @returns {boolean}
|
|
62
|
-
*/
|
|
63
|
-
isReserved() {
|
|
64
|
-
return this.config.reserved === true;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* @description Update the resource cache.
|
|
69
|
-
*
|
|
70
|
-
* Emit update to subscribers - observer pattern.
|
|
71
|
-
* e.g. url generator will listen on it's own resource's.
|
|
72
|
-
*
|
|
73
|
-
* @param {Object} obj - raw resource data
|
|
74
|
-
*/
|
|
75
|
-
update(obj) {
|
|
76
|
-
Object.assign(this.data, obj);
|
|
77
|
-
|
|
78
|
-
if (!this.isReserved()) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
this.emit('updated', this);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* @description Remove a resource.
|
|
87
|
-
*
|
|
88
|
-
* The fn is only useful to emit the action/event right now.
|
|
89
|
-
*
|
|
90
|
-
* CASE: url generator needs to know if one of it's resources/url should be removed.
|
|
91
|
-
*/
|
|
92
|
-
remove() {
|
|
93
|
-
// CASE: do not emit, if it is not reserved, because nobody will listen on events.
|
|
94
|
-
if (!this.isReserved()) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
this.emit('removed', this);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
module.exports = Resource;
|