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.
- 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-default-cards-10.3.3.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.1.4.tgz +0 -0
- package/components/tryghost-kg-default-transforms-1.3.3.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-nql-string-0.0.0.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/{PolarAngleAxis-BGjf7sBu.js → PolarAngleAxis-C4qtHy1B.js} +1 -1
- package/core/built/admin/assets/{RadialBarChart-zeFf9mBz.js → RadialBarChart-Bh09Stsj.js} +1 -1
- package/core/built/admin/assets/about-C7O-AgRZ.js +1 -0
- package/core/built/admin/assets/{account-migration-sjHLx5dy.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-DoYXtnZ8.js → account-migration-DHFbePl6.js} +7 -7
- package/core/built/admin/assets/activitypub/activitypub.js +6 -6
- package/core/built/admin/assets/activitypub/{avatar-B3DEDB1l.js → avatar-CT4tS2_S.js} +2 -2
- package/core/built/admin/assets/activitypub/{avatar-flipboard-Cqrg0XMx.js → avatar-flipboard-ByYWKipo.js} +2 -2
- package/core/built/admin/assets/activitypub/{bluesky-sharing-Bxeh6MKW.js → bluesky-sharing-srVnSHDz.js} +16 -16
- package/core/built/admin/assets/activitypub/{content-formatters-BpQARh28.js → content-formatters-C2sos5Ht.js} +3 -3
- package/core/built/admin/assets/activitypub/{copy-D9UWIAan.js → copy-B1UBTOoZ.js} +2 -2
- package/core/built/admin/assets/activitypub/{dist-D8sFfdpC.js → dist-MPsb2WZ1.js} +12 -12
- package/core/built/admin/assets/activitypub/{domain-CWueFW6q.js → domain-DzcM9Dzo.js} +9 -9
- package/core/built/admin/assets/activitypub/{edit-profile-BGxPU7N5.js → edit-profile-CsQ_4xAk.js} +945 -945
- package/core/built/admin/assets/activitypub/{explore-DBK-u0Ch.js → explore-CJe0DZBK.js} +8 -8
- package/core/built/admin/assets/activitypub/{feed-Bcir5RQZ.js → feed-CKV3qWON.js} +33 -33
- package/core/built/admin/assets/activitypub/{field-BV-CIT3d.js → field-DckHfDJf.js} +3 -3
- package/core/built/admin/assets/activitypub/{hash-BC9Q0N4c.js → hash-Dlp8RM55.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-DQ4ZnC1m.js → inbox-CsPy4R0M.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-yC0nfvzl.js → inbox-DAsjzUUe.js} +85 -85
- package/core/built/admin/assets/activitypub/{label-DTRS9TDk.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-Dwl9t0pb.js → moderation-B0Inc03M.js} +11 -11
- package/core/built/admin/assets/activitypub/{note-B-zKsZ7r.js → note-CSE54lER.js} +7 -7
- package/core/built/admin/assets/activitypub/{notifications-DjJZD54t.js → notifications-RSwbKqdh.js} +9 -9
- package/core/built/admin/assets/activitypub/{preferences-CoU8vs6d.js → preferences-CE231n2_.js} +20 -20
- package/core/built/admin/assets/activitypub/{profile-BAsaJekx.js → profile-aaQ1j1Eo.js} +237 -237
- package/core/built/admin/assets/activitypub/{reply-CpdMeAO5.js → reply-Cjb0Vs3m.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-CLH3OVTP.js → routes-Djb0mc9k.js} +1139 -1150
- package/core/built/admin/assets/activitypub/{separator-BI1FLsYM.js → separator-D8pROI5n.js} +3 -3
- package/core/built/admin/assets/activitypub/{settings-DA6pNJ-Q.js → settings-DMc32IQl.js} +13 -13
- package/core/built/admin/assets/activitypub/{site-CQD42Pw5.js → site-DVIcsohX.js} +81 -81
- package/core/built/admin/assets/activitypub/{step-1-DIDg4aHb.js → step-1-9Yey9usF.js} +5 -5
- package/core/built/admin/assets/activitypub/{step-2-BfGe8BYt.js → step-2-DdYmKRXV.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-3-mE9spAqw.js → step-3-hdSkcjZU.js} +10 -10
- package/core/built/admin/assets/activitypub/{tabs-Cg0saow1.js → tabs-CUqseYzQ.js} +317 -315
- package/core/built/admin/assets/activitypub/{topic-filter-DLHBZT93.js → topic-filter-Coni6OXM.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-VzbN99u_.js → use-activity-pub-queries-MeHTPMQv.js} +2 -2
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-CAwXTmqH.js → use-navigate-with-base-path-B046AM38.js} +115 -96
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-Br4aOWOh.js → use-reply-chain-data-1AO-Xob6.js} +5 -5
- package/core/built/admin/assets/activitypub/{x-C8tAnXly.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-DjEWNhp3.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-Bx3VcFIL.js → automations-dtQ_MRZ7.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-ClMd0-Ft.js → bluesky-sharing-B8Es3AuV.js} +1 -1
- package/core/built/admin/assets/{box-BWbhXh21.js → box-By_EgGtm.js} +1 -1
- package/core/built/admin/assets/brand-icon-09YqFZjV.js +1 -0
- package/core/built/admin/assets/{breadcrumb-BD0U2ygg.js → breadcrumb-tg5zL--z.js} +1 -1
- package/core/built/admin/assets/build-CsiH26uS.js +1 -0
- package/core/built/admin/assets/{card-DGoDJzrn.js → card-aUHX0hyR.js} +1 -1
- package/core/built/admin/assets/{chart-BuRT2Y6p.js → chart-BnXyfH11.js} +1 -1
- package/core/built/admin/assets/{chart-helpers-fjQKRVyY.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.cd5498dd4e195f679266.js +25 -0
- package/core/built/admin/assets/chunk.582.6f92ec1f03734bf2ea3f.js +27 -0
- package/core/built/admin/assets/{chunk.481.6c7395a49484bb4583aa.js → chunk.873.b8fc05a8ab877fb819ed.js} +62 -60
- 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/{container-BYz2Ed39.js → container-LiZf3XdY.js} +1 -1
- 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/{data-list-16rkJYYi.js → data-list-CupF7bjM.js} +1 -1
- package/core/built/admin/assets/{date-range-select-BFp58EMk.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-DGzPJ_bO.js → dist-Cb5RSHSg.js} +1 -1
- package/core/built/admin/assets/{dist-P_ohUlTi.js → dist-CqO2lWS02.js} +1 -1
- 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-BR8FIdjD.js +1 -0
- package/core/built/admin/assets/{dropzone-DlK-K2DQ.js → dropzone-hNxmUvwD.js} +1 -1
- package/core/built/admin/assets/{edit-profile-BKT-REJw.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/{empty-indicator-oX1u1Pkn.js → empty-indicator-WB1WgT9h.js} +1 -1
- package/core/built/admin/assets/{explore-ClUpJZOp.js → explore-BmrnljWw.js} +1 -1
- package/core/built/admin/assets/{feed-DF92dUMP.js → feed-Dy4li6i8.js} +1 -1
- package/core/built/admin/assets/{field-Do7lieBA.js → field-Dh_lwk13.js} +1 -1
- package/core/built/admin/assets/filter-sources-D2zDuJH5.js +1 -0
- package/core/built/admin/assets/filters-3JBQcNtJ.js +1 -0
- package/core/built/admin/assets/filters-CFt_BDe4.js +1 -0
- 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-a9c788f6f0b1ea6cf0f14ca4b13f4496.css → ghost-d38c30b866e59f2e06a357b5eb844fe5.css} +1 -1
- package/core/built/admin/assets/{ghost-c4057474943effc568c5659ccc4909d7.js → ghost-d683fbeb945b13155ea669caa5d8db41.js} +420 -398
- package/core/built/admin/assets/{ghost-dark-db36d795d21c61426837df40af270966.css → ghost-dark-1bffd5099ba7a749303133efacf8480b.css} +1 -1
- package/core/built/admin/assets/{gift-link-modal-f9VIMNDv.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-CVw1My4S.js → growth-C38Xtp8D.js} +2 -2
- package/core/built/admin/assets/{growth-B3I6gNLm.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-CFBSu4Ed.js → inbox-BrSRzyvz.js} +6 -6
- 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/{inline-EMAm3okk.js → inline-Cw-gigDW.js} +1 -1
- package/core/built/admin/assets/input-group-6vEPvX9S.js +1 -0
- package/core/built/admin/assets/{input-surface-BpAjZXY5.js → input-surface-BdOe4KzO.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/koenig-lexical.js +9535 -9527
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +124 -124
- package/core/built/admin/assets/{koenig-lexical-f8vHRYvz.js → koenig-lexical-Cj62r_y9.js} +86 -86
- package/core/built/admin/assets/{kpi-card-DSap9rAy.js → kpi-card-DOUnkZcN.js} +1 -1
- package/core/built/admin/assets/{kpi-card-DU0rn9Cj.js → kpi-card-IHDo8Q56.js} +1 -1
- package/core/built/admin/assets/{kpi-helpers-Dz33AV6h.js → kpi-helpers-CjUdECAK.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-BtTTrKvJ.js → kpi-tabs-X3DkOYbI.js} +1 -1
- package/core/built/admin/assets/{label-DS8Mi6G5.js → label-Dq6QaOuS.js} +1 -1
- package/core/built/admin/assets/label-picker-8YlhS2U3.js +1 -0
- package/core/built/admin/assets/labels-DAPjKPy2.js +1 -0
- 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-Bzkk68GD.js +1 -0
- package/core/built/admin/assets/{list-page-B6ANtzkd.js → list-page-CdsnQR9N.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-DySbgyUS.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-BgrIZk0V.js +1 -0
- package/core/built/admin/assets/{newsletters-BXJbJgA-.js → newsletters-Du0lzskS.js} +1 -1
- package/core/built/admin/assets/{note-C8kxrz6w.js → note-DYcLOmDb.js} +1 -1
- package/core/built/admin/assets/{notifications-CgtSfX7t.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-4qtziA9d.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-B3Wb9Jqv.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-We-ko5Cb.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-B6UynTGb.js → post-analytics-provider-Cgw4U_fw.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-DFfO93_0.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-C1R4AZ2o.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-WXNeWyU1.js → settings-CpvHWix7.js} +1 -1
- package/core/built/admin/assets/settings-breadcrumbs-K0USP2nw.js +1 -0
- package/core/built/admin/assets/{shade-app-B3heOAfz-CGXQwWeO.js → shade-app-B3heOAfz-BhQXxNkT.js} +1 -1
- package/core/built/admin/assets/{share-modal-DsgW3wbg.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-Bb_FCl7e.js → sort-button-CdBsm40v.js} +1 -1
- package/core/built/admin/assets/{source-icon-BeaRxUn9.js → source-icon-CEYmVLXR.js} +1 -1
- package/core/built/admin/assets/{stack-xiN0eQ6Z.js → stack-CIfOAAVf.js} +1 -1
- package/core/built/admin/assets/{stats-Bjj_kmJ1.js → stats-D8nZCTy5.js} +1 -1
- package/core/built/admin/assets/{stats-view-BxPbW6K1.js → stats-view-CugFVf0g.js} +1 -1
- package/core/built/admin/assets/{step-1-B1e3-1F8.js → step-1-DOYjrORn.js} +1 -1
- package/core/built/admin/assets/{step-2-C5WaeBJo.js → step-2-vA6RsarH.js} +1 -1
- package/core/built/admin/assets/{step-3-B46iVPwu.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-CB-4_HBJ.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/{text-DwtjwGkh.js → text-DU9Hv33_.js} +1 -1
- package/core/built/admin/assets/textarea-d9qEkMOP.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-DAFT87tQ.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-S0FTd43s.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-Gpoq2E1L.js → use-filter-params-BnbBDc7T.js} +1 -1
- 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-CIaiHOVb.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-Cq2vBPrA.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-DBDRtGu-.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-CjYNxdwe.js → use-simple-pagination-D9ckKo5-.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-query-falHAtuK.js → use-tinybird-query-GSa32hVw.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-D7-8ND1y.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-CvnC9zF2.js → virtual-list-RHeEL05L.js} +1 -1
- package/core/built/admin/assets/{web-jFYWCKDn.js → web-Bw2QMO5u.js} +2 -2
- 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 +20 -18
- 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/data/fetch-data.js +10 -5
- package/core/frontend/services/proxy.js +1 -1
- package/core/frontend/services/routing/api-adapter.js +115 -0
- package/core/frontend/services/routing/api-adapter.ts +157 -0
- package/core/frontend/services/routing/collection-router.js +5 -3
- package/core/frontend/services/routing/controllers/index.js +1 -1
- package/core/frontend/services/routing/controllers/rss.js +26 -31
- package/core/frontend/services/routing/controllers/rss.ts +66 -0
- package/core/frontend/services/routing/controllers/static.js +8 -7
- package/core/frontend/services/routing/events.js +20 -6
- package/core/frontend/services/routing/parent-router.js +17 -4
- package/core/frontend/services/routing/permalink-adapter.js +13 -0
- package/core/frontend/services/routing/permalink-adapter.ts +10 -0
- package/core/frontend/services/routing/registry.js +59 -33
- package/core/frontend/services/routing/router-manager.js +24 -22
- package/core/frontend/services/routing/static-routes-router.js +4 -4
- package/core/frontend/services/routing/taxonomy-router.js +6 -2
- 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.56/2026-08-03-19-27-51-add-automation-run-step-id-to-automated-email-recipients.js +8 -0
- package/core/server/data/migrations/versions/6.56/2026-08-04-14-42-39-restrict-notification-add-permission-to-administrators.js +12 -0
- 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/fixtures/fixtures.json +2 -2
- package/core/server/data/schema/schema.js +25 -5
- package/core/server/lib/common/to-plain.ts +1 -1
- package/core/server/models/post.js +12 -3
- 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/automations-repository.ts +3 -1
- package/core/server/services/automations/database-automations-repository.js +33 -14
- package/core/server/services/automations/database-automations-repository.ts +41 -15
- package/core/server/services/automations/get-scheduler-idempotency-key.js +13 -0
- package/core/server/services/automations/get-scheduler-idempotency-key.ts +8 -0
- package/core/server/services/automations/poll.js +3 -1
- package/core/server/services/automations/poll.ts +4 -1
- package/core/server/services/automations/service.js +7 -3
- package/core/server/services/automations/service.ts +7 -3
- 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/gift-links/CONTEXT.md +9 -0
- package/core/server/services/gifts/CONTEXT.md +55 -0
- package/core/server/services/gifts/README.md +28 -0
- package/core/server/services/gifts/gift-bookshelf-repository.js +65 -45
- package/core/server/services/gifts/gift-bookshelf-repository.ts +203 -74
- package/core/server/services/gifts/gift-checkout-adapter.js +59 -0
- package/core/server/services/gifts/gift-checkout-offer.js +74 -0
- package/core/server/services/gifts/gift-checkout-offer.ts +127 -0
- package/core/server/services/gifts/gift-codec.js +63 -0
- package/core/server/services/gifts/gift-codec.ts +62 -0
- package/core/server/services/gifts/gift-controller.js +6 -31
- package/core/server/services/gifts/gift-controller.ts +6 -69
- package/core/server/services/gifts/gift-email-service.ts +3 -2
- package/core/server/services/gifts/gift-schema.js +34 -0
- package/core/server/services/gifts/gift-schema.ts +39 -0
- package/core/server/services/gifts/gift-service-wrapper.js +13 -11
- package/core/server/services/gifts/gift-service.js +265 -52
- package/core/server/services/gifts/gift-service.ts +431 -97
- package/core/server/services/gifts/gift.ts +16 -39
- 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/link-tracking/link-click-repository.js +6 -1
- package/core/server/services/link-tracking/link-click-tracking-service.js +12 -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/member-welcome-email-renderer.js +4 -3
- package/core/server/services/member-welcome-emails/service.js +79 -15
- package/core/server/services/members/api.js +2 -3
- 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 +27 -6
- package/core/server/services/members/import-export/import/row.ts +5 -1
- package/core/server/services/members/import-export/index.js +6 -2
- package/core/server/services/members/import-export/index.ts +10 -4
- package/core/server/services/members/members-api/controllers/router-controller.js +38 -36
- package/core/server/services/members/members-api/members-api.js +13 -7
- package/core/server/services/members/members-api/repositories/event-repository.js +4 -94
- package/core/server/services/members/members-api/services/member-bread-service.js +3 -3
- package/core/server/services/members/members-api/services/payments-service.js +6 -68
- 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 +19 -21
- package/core/server/services/members-custom-fields/schema.ts +18 -20
- 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 -103
- package/core/server/services/members-custom-fields/values-service.ts +116 -114
- package/core/server/services/mentions/resource-service.js +1 -1
- package/core/server/services/mentions/service.js +2 -2
- package/core/server/services/oembed/oembed-service.js +44 -3
- package/core/server/services/posts/posts-service.js +11 -0
- package/core/server/services/route-settings/dynamic-routing-service.js +10 -62
- package/core/server/services/route-settings/route-settings-parser.js +25 -25
- package/core/server/services/route-settings/route-settings-parser.ts +27 -27
- package/core/server/services/route-settings/validation-errors.js +68 -4
- package/core/server/services/route-settings/validation-errors.ts +79 -4
- 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 +29 -25
- package/core/server/services/stripe/services/webhook/charge-refunded-event-service.js +1 -1
- package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +16 -4
- package/core/server/services/stripe/stripe-api.js +10 -0
- 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/server/web/gift-preview/controller.js +10 -25
- 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 +4 -4
- package/package.json +10 -10
- package/pnpm-lock.yaml +27 -20
- package/pnpm-workspace.yaml +3 -2
- package/tsconfig.json +1 -0
- package/components/tryghost-kg-default-nodes-2.1.3.tgz +0 -0
- package/core/built/admin/assets/Combination-CJG7Flp-.js +0 -41
- package/core/built/admin/assets/activitypub/layout-qx-bUL1k.js +0 -1
- package/core/built/admin/assets/automated-emails-DRy7qY-J.js +0 -7
- package/core/built/admin/assets/checkbox-CWa28lgO.js +0 -1
- package/core/built/admin/assets/chunk.524.cffd399783a519e404a9.js +0 -25
- package/core/built/admin/assets/chunk.582.eebf0d0b2d202bb746a5.js +0 -27
- package/core/built/admin/assets/code-editor-view-CCr0rBWS.js +0 -1
- package/core/built/admin/assets/comments-DyUSMUdj.js +0 -1
- package/core/built/admin/assets/disabled-sources-indicator-CUxMfiPa.js +0 -1
- package/core/built/admin/assets/dist-2Tnz2Yfq.js +0 -1
- package/core/built/admin/assets/dist-CjY-f5Z1.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/domain-C0bV2UV8.js +0 -1
- package/core/built/admin/assets/editor-Dp865O-4.js +0 -8
- package/core/built/admin/assets/esm-CFX93H5M.js +0 -2
- package/core/built/admin/assets/filter-sources-BV2rnpfA.js +0 -1
- package/core/built/admin/assets/filters-CUXJ2Nm9.js +0 -1
- package/core/built/admin/assets/filters-DfbIWc_l.js +0 -1
- package/core/built/admin/assets/index-9Cw8z3rA.css +0 -1
- package/core/built/admin/assets/index-BGG7NckO.js +0 -67
- package/core/built/admin/assets/input-group-BSgG_lVw.js +0 -1
- package/core/built/admin/assets/label-picker-1DvSuLA1.js +0 -1
- package/core/built/admin/assets/labels-CDSUt4J_.js +0 -1
- package/core/built/admin/assets/layout-yQEi2qDM.js +0 -1
- package/core/built/admin/assets/link-helpers-7EYqvvHs.js +0 -1
- package/core/built/admin/assets/member-custom-fields-yOMHyAg9.js +0 -1
- package/core/built/admin/assets/member-detail-BAq7gDaa.js +0 -1
- package/core/built/admin/assets/members-CQpVFJu4.js +0 -10
- package/core/built/admin/assets/modals-ReORvWnu.js +0 -31
- package/core/built/admin/assets/newsletter-CJQvtHqN.js +0 -1
- package/core/built/admin/assets/newsletters-B3QQXfGT.js +0 -1
- package/core/built/admin/assets/nql-BsgFMd93.js +0 -1
- package/core/built/admin/assets/overview-Bf2sbznq.js +0 -1
- package/core/built/admin/assets/overview-CBfePxcr.js +0 -1
- package/core/built/admin/assets/post-analytics-header-Bmc9su6q.js +0 -1
- package/core/built/admin/assets/preferences-DJPfHEGu.js +0 -5
- package/core/built/admin/assets/profile-DqBQp-gT.js +0 -1
- package/core/built/admin/assets/select-C5_xEt5b.js +0 -1
- package/core/built/admin/assets/settings-BwiVIXau.js +0 -4
- package/core/built/admin/assets/social-urls-BQPFEk1_.js +0 -8
- package/core/built/admin/assets/switch-z5Y6Uzt6.js +0 -1
- package/core/built/admin/assets/tabs-CCEgKYzq.js +0 -1
- package/core/built/admin/assets/tags-Cg2VJGmG.js +0 -1
- package/core/built/admin/assets/textarea-Bjccvh_E.js +0 -1
- package/core/built/admin/assets/toggle-group-b3IlxvhV.js +0 -1
- package/core/built/admin/assets/web-B_5GZRvH.js +0 -1
- package/core/server/services/gifts/gift-repository.js +0 -2
- package/core/server/services/gifts/gift-repository.ts +0 -29
- package/core/server/services/route-settings/activation-bridge.js +0 -174
- package/core/server/services/route-settings/activation-bridge.ts +0 -250
- 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
|
@@ -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 (
|
|
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
|
|
47
|
-
//
|
|
48
|
-
//
|
|
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
|
|
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('
|
|
63
|
-
if (
|
|
60
|
+
routingEvents.on('RouteRegistered', ({path, type, id}) => {
|
|
61
|
+
if (type !== 'StaticRoutesRouter' && type !== 'CollectionRouter') {
|
|
64
62
|
return;
|
|
65
63
|
}
|
|
66
64
|
const entry = {
|
|
67
|
-
url:
|
|
68
|
-
datum: {id
|
|
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
|
|
71
|
+
// them one macrotask after RoutesReset) must not leave a
|
|
74
72
|
// zero-router index marked built — the CDN would pin it.
|
|
75
|
-
|
|
76
|
-
this._invalidateIndex();
|
|
77
|
-
}
|
|
73
|
+
this._invalidateIndex();
|
|
78
74
|
});
|
|
79
75
|
|
|
80
|
-
//
|
|
81
|
-
//
|
|
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
|
-
|
|
87
|
-
this._invalidateIndex();
|
|
88
|
-
}
|
|
79
|
+
this._invalidateIndex();
|
|
89
80
|
});
|
|
90
81
|
|
|
91
|
-
|
|
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
|
-
|
|
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
|
|
160
|
-
*
|
|
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.
|
|
171
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
|
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}-${(
|
|
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
|
-
|
|
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}-${
|
|
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.
|
|
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.
|
|
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
|
|
8
|
-
const withRelated = urlService.
|
|
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
|
-
...
|
|
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
|
|
8
|
-
const withRelated = urlService.
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
191
|
+
url.forceUrlRelations(frame, 'posts');
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
if (!localUtils.isContentAPI(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.
|
|
9
|
+
url.forceUrlColumns(frame, 'authors');
|
|
10
10
|
},
|
|
11
11
|
|
|
12
12
|
read(apiConfig, frame) {
|
|
13
13
|
debug('read');
|
|
14
14
|
|
|
15
|
-
url.
|
|
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
|
|
75
|
-
const
|
|
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
|
|
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
|
|
91
|
-
const
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
124
|
-
module.exports.
|
|
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:
|
|
14
|
-
//
|
|
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
|
-
//
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
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 = {
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
+
);
|