ghost 6.56.0 → 6.57.1
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-adapter-base-scheduling-0.2.1.tgz +0 -0
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-kg-converters-1.2.4.tgz +0 -0
- package/components/tryghost-kg-default-cards-10.3.4.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.1.5.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-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-BNojRaxf.js +1 -0
- package/core/built/admin/assets/{account-migration-D3O_yVck.js → account-migration-DMS8JsM-.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-DU9ghGLS.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-DFxuQrYu.js +1 -0
- package/core/built/admin/assets/add-recommendation-modal-D-3LOrdd.js +1 -0
- package/core/built/admin/assets/analytics-DTIMRhWw.js +1 -0
- package/core/built/admin/assets/announcement-bar-modal-DGCcezB6.js +1 -0
- package/core/built/admin/assets/api-keys-Dx4NeNpK.js +1 -0
- package/core/built/admin/assets/api-keys-_iCT4dxr.js +1 -0
- package/core/built/admin/assets/{audience-CkBb2LlO.js → audience-DkknNqhZ.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-DvSU7QhW.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-DPGpyD-G.js → bluesky-sharing-yZ9A_jL8.js} +1 -1
- package/core/built/admin/assets/brand-icon-09YqFZjV.js +1 -0
- package/core/built/admin/assets/{breadcrumb-DIfcF5ow.js → breadcrumb-CjOH7LCU.js} +1 -1
- package/core/built/admin/assets/{chart-helpers-DV0FkdcD.js → chart-helpers-DGxvWnBT.js} +1 -1
- package/core/built/admin/assets/checkbox-BSUcnNq_.js +1 -0
- package/core/built/admin/assets/{chunk.332.05991a101d67f732dec3.js → chunk.424.4a27628efdade15c2dab.js} +28 -27
- package/core/built/admin/assets/chunk.524.dce1c51e0bc30fb2718e.js +25 -0
- package/core/built/admin/assets/{chunk.211.6f7328d63c41536451b3.js → chunk.571.40f093ed6d883993714e.js} +5 -5
- package/core/built/admin/assets/chunk.582.3a430d5c6a744fd475b6.js +27 -0
- package/core/built/admin/assets/code-editor-view-BcyKABrG.js +1 -0
- package/core/built/admin/assets/color-picker-field-8NoSnhNI.js +1 -0
- package/core/built/admin/assets/color-utils-Dzeeuj1F.js +1 -0
- package/core/built/admin/assets/combobox-5rdgDrDV.js +1 -0
- package/core/built/admin/assets/command-BOYMbZa_.js +1 -0
- package/core/built/admin/assets/comments-BhNM5CYl.js +1 -0
- package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +1 -0
- package/core/built/admin/assets/confirmation-modal-CYD7x3UQ.js +1 -0
- package/core/built/admin/assets/content-api-modal-BtW4Z1-1.js +1 -0
- package/core/built/admin/assets/copy-field-CEp_XieW.js +1 -0
- package/core/built/admin/assets/currency-Dy4Tc2R2.js +1 -0
- package/core/built/admin/assets/custom-integration-modal-bk3lNEuQ.js +1 -0
- package/core/built/admin/assets/{date-range-select-dXc-GsVe.js → date-range-select-B3Ij1Rqg.js} +1 -1
- package/core/built/admin/assets/debounce-Cx5B_9OI.js +3 -0
- package/core/built/admin/assets/design-and-theme-modal-B2xYKS1I.js +23 -0
- package/core/built/admin/assets/dirty-confirm-dialog-YE9L21gY.js +1 -0
- package/core/built/admin/assets/disabled-sources-indicator-uIzbWL7K.js +1 -0
- package/core/built/admin/assets/{dist-pHiOxyxa.js → dist-ARN6XTcR.js} +1 -1
- package/core/built/admin/assets/dist-B2PvRwLn.js +1 -0
- package/core/built/admin/assets/{dist-DyViJwIy.js → dist-Bg8bSvLA.js} +3 -3
- package/core/built/admin/assets/dist-CsvXCJSe.js +23 -0
- package/core/built/admin/assets/dist-DlCyLrOC.js +1 -0
- 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-DzrOAPY8.js} +1 -1
- package/core/built/admin/assets/{dropzone-BnFG7dDP.js → dropzone-CzhP33wa.js} +1 -1
- package/core/built/admin/assets/{edit-profile-B07jCZy9.js → edit-profile-oufs4R4n.js} +1 -1
- package/core/built/admin/assets/editor-BBKrunMK.js +8 -0
- package/core/built/admin/assets/embed-signup-form-modal-Ch3s6lqA.js +9 -0
- package/core/built/admin/assets/{explore-Ca1y8HW_.js → explore-CA-R01Br.js} +1 -1
- package/core/built/admin/assets/{feed-x4iFMBP4.js → feed-ClC8_Gld.js} +1 -1
- package/core/built/admin/assets/{field-ChCAabZg.js → field-B3OPenbP.js} +1 -1
- package/core/built/admin/assets/{filter-sources-LdtH1e-T.js → filter-sources-CiPLnG9A.js} +1 -1
- package/core/built/admin/assets/filters-Bz0HsRie.js +1 -0
- package/core/built/admin/assets/{filters-CjVKRP8U.js → filters-yFvybRMe.js} +1 -1
- package/core/built/admin/assets/first-promoter-modal-BC0UpYCD.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-BKRuqo-k.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-RzW6Bnlf.js +1 -0
- package/core/built/admin/assets/grid-CUciBfjf.js +1 -0
- package/core/built/admin/assets/{growth-DajOBdN0.js → growth-ClNAldfL.js} +1 -1
- package/core/built/admin/assets/{growth-Dy2UOSay.js → growth-Dz8OSG06.js} +2 -2
- package/core/built/admin/assets/history-modal-DIVuQ5Ct.js +1 -0
- package/core/built/admin/assets/{hooks-CixO01lL.js → hooks-D6EE7BIt.js} +2 -2
- package/core/built/admin/assets/html-field-CVZ2sMxw.js +1 -0
- package/core/built/admin/assets/iframe-buffering-e8vH4-Qn.js +1 -0
- package/core/built/admin/assets/images-Ok8FFJ3A.js +1 -0
- package/core/built/admin/assets/{inbox-BUOLDoji.js → inbox-CMUVI6qb.js} +13 -13
- package/core/built/admin/assets/index-DUXM0NlS.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-2XU-iuh_.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-DrZ7xxrZ.js +1 -0
- package/core/built/admin/assets/isEmail-BOfC647y.js +1 -0
- package/core/built/admin/assets/koenig-editor-base-BPj4S760.js +1 -0
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +9254 -9251
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +124 -124
- package/core/built/admin/assets/{koenig-lexical-BFc4yFed.js → koenig-lexical-Cdjv-m3_.js} +98 -98
- package/core/built/admin/assets/{kpi-card-CCt-qeWD.js → kpi-card-J8Mj1sDX.js} +1 -1
- package/core/built/admin/assets/{kpi-card-BN-E6WYX.js → kpi-card-awos0BMH.js} +1 -1
- package/core/built/admin/assets/{kpi-helpers-DlxTbTs4.js → kpi-helpers-SEhvH-8E.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-BlcUttpn.js → kpi-tabs-R6BjsKhd.js} +1 -1
- package/core/built/admin/assets/{label-AVrxwmsz.js → label-BMC3dzLI.js} +1 -1
- package/core/built/admin/assets/label-picker-Bnlru5tO.js +1 -0
- package/core/built/admin/assets/{labels-DAIqKed7.js → labels-DAPjKPy2.js} +1 -1
- package/core/built/admin/assets/layout-yR9rlvEw.js +1 -0
- package/core/built/admin/assets/limit-modal-COmLevuY.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-BvFKEpxJ.js +1 -0
- package/core/built/admin/assets/member-detail-CWdPAe3p.js +1 -0
- package/core/built/admin/assets/members-Bnt0ih2R.js +11 -0
- package/core/built/admin/assets/modal-page-BMTzFHVO.js +1 -0
- package/core/built/admin/assets/{moderation-CQ3urTFE.js → moderation-mPjYHgZW.js} +1 -1
- package/core/built/admin/assets/multi-select-combobox-CsoyHAiX.js +1 -0
- package/core/built/admin/assets/navigation-modal-D_c0badj.js +1 -0
- package/core/built/admin/assets/newsletter-DR49NyGS.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-B45pL1pb.js +1 -0
- package/core/built/admin/assets/newsletter-emails-B-OLfrvr.js +1 -0
- package/core/built/admin/assets/{newsletters-vt3Ni1Ov.js → newsletters-DGs5BaKH.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-CSVsUKBm.js} +1 -1
- package/core/built/admin/assets/{notifications-CPlLjPxO.js → notifications-DV9FRtDw.js} +1 -1
- package/core/built/admin/assets/{offers-DEniVRD5.js → offers-Um6ab71O.js} +1 -1
- package/core/built/admin/assets/offers-container-modal-B0hFS8nk.js +1 -0
- package/core/built/admin/assets/{onboarding-route-DdStOtjy.js → onboarding-route--jL5KLPD.js} +1 -1
- package/core/built/admin/assets/overview-B-ZPNqMo.js +1 -0
- package/core/built/admin/assets/overview-D96iwoJi.js +1 -0
- package/core/built/admin/assets/{page-header-pp4dWmOS.js → page-header-DAvDYKO9.js} +1 -1
- package/core/built/admin/assets/{pages-B4goRPUn.js → pages-BVMnpI2O.js} +1 -1
- package/core/built/admin/assets/pintura-modal-jiUCxX0Q.js +1 -0
- package/core/built/admin/assets/portal-frame-D4D4nEO6.js +1 -0
- package/core/built/admin/assets/portal-modal-BLFdYeDH.js +1 -0
- package/core/built/admin/assets/{post-analytics-BMJrI81R.js → post-analytics-BhAtiFJp.js} +1 -1
- package/core/built/admin/assets/post-analytics-header-DK27VjJm.js +1 -0
- package/core/built/admin/assets/{post-analytics-provider-Btml5vJI.js → post-analytics-provider-DGg0FUqs.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-AcUZkbfL.js → post-share-modal-DtFAC132.js} +1 -1
- package/core/built/admin/assets/{posts-DhXE7b6r.js → posts-CxG7v0-M.js} +1 -1
- package/core/built/admin/assets/preferences-CuWLISHa.js +5 -0
- package/core/built/admin/assets/preview-chrome-BOVO6_PE.js +1 -0
- package/core/built/admin/assets/preview-modal-DctYx20m.js +1 -0
- package/core/built/admin/assets/profile-BsKYYtuL.js +1 -0
- package/core/built/admin/assets/radio-group-CI5_Kf_d.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-CkXqNJDJ.js +1 -0
- package/core/built/admin/assets/settings-B4vM-rgV.js +4 -0
- package/core/built/admin/assets/{settings-BGgk7oCI.js → settings-ZCj-W56o.js} +1 -1
- package/core/built/admin/assets/settings-breadcrumbs-DIq31FwA.js +1 -0
- package/core/built/admin/assets/{share-modal-BeuydaBf.js → share-modal-BNj14g79.js} +1 -1
- package/core/built/admin/assets/slack-modal-C6SpMQ-q.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-B-k54ow2.js} +1 -1
- package/core/built/admin/assets/{source-icon-ajoaKb41.js → source-icon-Cej3sZM6.js} +1 -1
- package/core/built/admin/assets/{stats-C_lfxZAw.js → stats-B2KW8E2y.js} +1 -1
- package/core/built/admin/assets/{stats-view-Cxot1iD8.js → stats-view-CVzU2-p5.js} +1 -1
- package/core/built/admin/assets/{step-1-ogAA4lDr.js → step-1-Dbn1iIMU.js} +1 -1
- package/core/built/admin/assets/{step-2-C5Xini-7.js → step-2-BahnSuN6.js} +1 -1
- package/core/built/admin/assets/{step-3-CZv1FV81.js → step-3-CW04e2ZJ.js} +2 -2
- package/core/built/admin/assets/stripe-button-BkBZqaGG.js +1 -0
- package/core/built/admin/assets/stripe-connect-modal-CYDDrSJm.js +1 -0
- package/core/built/admin/assets/switch-CE2NuMn-.js +1 -0
- package/core/built/admin/assets/{table-DFj1wiYv.js → table-BtLcEi1M.js} +1 -1
- package/core/built/admin/assets/tabs-BaWRfg8j.js +1 -0
- package/core/built/admin/assets/tag-detail-CmqiC32L.js +1 -0
- package/core/built/admin/assets/tags-BbygUvNB.js +1 -0
- package/core/built/admin/assets/tags-BwCgmr5v.js +1 -0
- package/core/built/admin/assets/testimonials-modal--bdzppyh.js +1 -0
- package/core/built/admin/assets/tier-detail-modal-BZmAsIy4.js +1 -0
- package/core/built/admin/assets/{tiers-DYsa4DCo.js → tiers-Da6kxHQP.js} +1 -1
- package/core/built/admin/assets/toggle-group-CVl-Xigr.js +1 -0
- package/core/built/admin/assets/{topic-filter-DGDxDalo.js → topic-filter-BoRHRbL1.js} +1 -1
- package/core/built/admin/assets/transistor-modal-CBPDqEGy.js +1 -0
- package/core/built/admin/assets/unsplash-modal-CixoRAO2.js +1 -0
- package/core/built/admin/assets/{use-analytics-data-C76v4LIp.js → use-analytics-data-BiWvcf1u.js} +1 -1
- package/core/built/admin/assets/use-check-theme-limit-error-B14lZukR.js +2 -0
- package/core/built/admin/assets/use-feature-flag-BmJoc5WN.js +1 -0
- package/core/built/admin/assets/use-filter-params-ChoV72Hw.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-Dom8xVzo.js} +1 -1
- package/core/built/admin/assets/use-hash-link-navigation-guard-B9j6HIrV.js +1 -0
- package/core/built/admin/assets/use-limiter-Dwg8ivgQ.js +2 -0
- package/core/built/admin/assets/use-pintura-config-Bj4QmiVk.js +1 -0
- package/core/built/admin/assets/use-pintura-editor-DvrslmPE.js +1 -0
- package/core/built/admin/assets/{use-post-referrers-CG0SZioj.js → use-post-referrers-pxIHTXFs.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-CmFe0N6F.js} +1 -1
- package/core/built/admin/assets/use-setting-group-Cmp_sy-d.js +1 -0
- package/core/built/admin/assets/use-settings-navigation-BmROPrls.js +1 -0
- package/core/built/admin/assets/{use-simple-pagination-DgcF69KI.js → use-simple-pagination-D5rL3YwO.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-query-C1R_Kbmy.js → use-tinybird-query-DP2dMaq7.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-C9fPjVM_.js → use-tinybird-token-DrK_skPQ.js} +1 -1
- package/core/built/admin/assets/use-url-input-ChrUZBFf.js +5 -0
- package/core/built/admin/assets/user-detail-modal-XODpOqNC.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-Dnoafqbk.js} +1 -1
- package/core/built/admin/assets/web-D71mjB2r.js +1 -0
- package/core/built/admin/assets/web-z71lA1Y3.js +2 -0
- package/core/built/admin/assets/zapier-modal-Bp507Um7.js +1 -0
- package/core/built/admin/index.html +16 -14
- 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/frontend/web/middleware/admin-toolbar.js +1 -1
- package/core/frontend/web/middleware/serve-indexnow-key.js +1 -7
- 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/index.js +2 -2
- 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/themes.js +6 -1
- 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/base/plugins/overrides.js +7 -5
- 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 +28 -0
- package/core/server/services/adapter-manager/adapter-paths.ts +26 -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 +11 -2
- package/core/server/services/audience-feedback/audience-feedback-service.js +2 -2
- package/core/server/services/audience-feedback/feedback-repository.js +4 -1
- package/core/server/services/auth/session/session-service.js +18 -3
- package/core/server/services/automations/database-automations-repository.js +5 -5
- package/core/server/services/automations/database-automations-repository.ts +12 -12
- package/core/server/services/automations/database-date.js +52 -3
- package/core/server/services/automations/database-date.ts +23 -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 +12 -3
- package/core/server/services/email-analytics/email-analytics-service.js +4 -3
- package/core/server/services/email-analytics/index.js +2 -3
- package/core/server/services/email-analytics/index.ts +1 -2
- package/core/server/services/email-analytics/lib/queries.js +91 -124
- package/core/server/services/email-analytics/lib/queries.ts +341 -0
- 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/index.js +0 -2
- package/core/server/services/indexnow-ping/index.ts +0 -2
- package/core/server/services/indexnow-ping/indexnow-ping-service.js +6 -8
- package/core/server/services/indexnow-ping/indexnow-ping-service.ts +9 -17
- 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/members-api/repositories/member-repository.js +51 -0
- 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-notifications/slack-notifications.js +2 -2
- package/core/server/services/slack-ping/index.js +1 -1
- package/core/server/services/slack-ping/index.ts +1 -1
- package/core/server/services/slack-ping/slack-ping-service.js +3 -2
- package/core/server/services/slack-ping/slack-ping-service.ts +4 -5
- package/core/server/services/stats/content-stats-service.js +3 -3
- package/core/server/services/stats/members-stats-service.js +0 -7
- package/core/server/services/stats/posts-stats-service.js +2 -2
- package/core/server/services/themes/storage.js +19 -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 +12 -2
- package/core/server/web/api/endpoints/admin/routes.js +2 -2
- package/core/shared/config/env/config.testing-mysql.json +1 -2
- package/core/shared/config/env/config.testing.json +1 -2
- package/core/shared/custom-theme-settings-cache/custom-theme-settings-bread-service.js +4 -0
- package/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js +39 -0
- package/core/shared/events/index.js +1 -2
- package/core/shared/labs.js +4 -4
- package/package.json +10 -11
- package/pnpm-lock.yaml +44 -47
- package/pnpm-workspace.yaml +19 -19
- package/tsconfig.json +1 -0
- package/components/tryghost-adapter-base-scheduling-0.2.0.tgz +0 -0
- package/components/tryghost-kg-converters-1.2.3.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/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/chunk.524.87b52f4fada529df2c4c.js +0 -25
- package/core/built/admin/assets/chunk.582.340bcca873e806cbd4bb.js +0 -27
- 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/email-analytics/jobs/update-member-email-analytics/index.js +0 -14
- 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/{chunk.211.6f7328d63c41536451b3.js.LICENSE.txt → chunk.571.40f093ed6d883993714e.js.LICENSE.txt} +0 -0
- /package/core/built/admin/assets/{dist-CqO2lWS0.js → dist-CqO2lWS02.js} +0 -0
- /package/core/server/api/endpoints/{gift-reminders.js → gifts.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as e,r as t}from"./rolldown-runtime-DAXXjFlN.js";import{t as n}from"./react-Bb3IsNbi.js";import{t as r}from"./jsx-runtime-DX3WBWVO.js";import{m as i,p as a}from"./hooks-D6EE7BIt.js";import{n as o,o as s,s as c,t as l}from"./use-settings-navigation-BmROPrls.js";import{i as u,n as d,r as f,t as ee}from"./action-list-lGzZLHc8.js";import{Pr as p,ws as m}from"./index-DUXM0NlS.js";import{n as te}from"./confirmation-modal-CYD7x3UQ.js";import{n as ne,t as h}from"./global-data-provider-RzW6Bnlf.js";import{n as re}from"./integrations-BT6_iJvu.js";import{t as ie}from"./api-keys-Dx4NeNpK.js";import{t as g}from"./integration-header-B4DyXV06.js";import{t as _}from"./api-keys-_iCT4dxr.js";import{t as v}from"./brand-icon-09YqFZjV.js";var y=``+new URL(`zapier-logo-D8a11oW_.svg`,import.meta.url).href,b=e(n(),1),x=r(),S=(e,t)=>`${e}-${t}`,C=()=>{let[e,t]=(0,b.useState)(``),[n,r]=(0,b.useState)(!1),i=(0,b.useRef)(new Map),[a,o]=(0,b.useState)(new Set),s=t=>t.length?t.some(t=>t.toLowerCase().includes(e.toLowerCase())):!0,c=(0,b.useCallback)((t,n)=>{i.current.set(t,n),(!e||n.some(t=>t.toLowerCase().includes(e.toLowerCase())))&&o(e=>new Set(e).add(t))},[e]),l=(0,b.useCallback)(e=>{i.current.delete(e),o(t=>{let n=new Set(t);return n.delete(e),n})},[]);(0,b.useEffect)(()=>{let t=new Set;i.current.forEach((n,r)=>{(!e||n.some(t=>t.toLowerCase().includes(e.toLowerCase())))&&t.add(r)}),o(t)},[e]);let u=(0,b.useCallback)(e=>a.size===1&&a.has(e),[a]),d=(0,b.useCallback)(()=>a,[a]),f=t=>{if(!e)return t;if(typeof t==`string`){let n=e.split(/\s+/).map(e=>e.toLowerCase()),r=n.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`),i=t.split(RegExp(`(${r})`,`gi`)),a=new Map;return i.map(e=>{if(!n.includes(e.toLowerCase()))return e;let t=(a.get(e)??0)+1;return a.set(e,t),(0,x.jsx)(`span`,{className:`bg-yellow-500/40`,children:e},`${e}-${t}`)})}else if(Array.isArray(t))return t.map(e=>f(e));else if(t&&typeof t==`object`&&t)return b.Children.map(t,e=>e&&typeof e==`object`&&`props`in e?f(e.props.children):e);else return t};return{filter:e,setFilter:t,checkVisible:s,highlightKeywords:f,noResult:n,setNoResult:r,registerComponent:c,unregisterComponent:l,getVisibleComponents:d,isOnlyVisibleComponent:u}},w=``+new URL(`Alto-DoS3yH_j.png`,import.meta.url).href,T=``+new URL(`Bulletin-BUpcurG5.png`,import.meta.url).href,E=``+new URL(`Casper-ASA9Ix4v.png`,import.meta.url).href,D=``+new URL(`Dawn-aeEVEPie.png`,import.meta.url).href,O=``+new URL(`Digest-DJl0U_FG.png`,import.meta.url).href,k=``+new URL(`Dope-D_CgP0p0.png`,import.meta.url).href,A=``+new URL(`Ease-B4NuA7sj.png`,import.meta.url).href,j=``+new URL(`Edge-BPZxvKka.png`,import.meta.url).href,M=``+new URL(`Edition-cIDLjlhj.png`,import.meta.url).href,N=``+new URL(`Episode-D7bgV2bY.png`,import.meta.url).href,P=``+new URL(`Headline-BFXOunIb.png`,import.meta.url).href,F=``+new URL(`Journal-D3UW9T2b.png`,import.meta.url).href,I=``+new URL(`London-CSCVHwS0.png`,import.meta.url).href,L=``+new URL(`Ruby-DVEXVMTx.png`,import.meta.url).href,R=``+new URL(`Solo-c-yPo0gw.png`,import.meta.url).href,z=``+new URL(`Source-V-WXZXnS.png`,import.meta.url).href,B=``+new URL(`Source-Magazine-Czq1p0a_.png`,import.meta.url).href,V=``+new URL(`Source-Newsletter-CwTcfhJ-.png`,import.meta.url).href,H=``+new URL(`Taste-U2cRR2yO.png`,import.meta.url).href,U=``+new URL(`Wave-DE2aI-FM.png`,import.meta.url).href,W=[{name:`Source`,category:`News`,previewUrl:`https://source.ghost.io/`,ref:`default`,image:z,variants:[{category:`Magazine`,previewUrl:`https://source-magazine.ghost.io/`,image:B},{category:`Newsletter`,previewUrl:`https://source-newsletter.ghost.io/`,image:V}]},{name:`Casper`,category:`Blog`,previewUrl:`https://demo.ghost.io/`,ref:`TryGhost/Casper`,image:E},{name:`Edition`,category:`Newsletter`,url:`https://github.com/TryGhost/Edition`,previewUrl:`https://edition.ghost.io/`,ref:`TryGhost/Edition`,image:M},{name:`Solo`,category:`Blog`,url:`https://github.com/TryGhost/Solo`,previewUrl:`https://solo.ghost.io`,ref:`TryGhost/Solo`,image:R},{name:`Taste`,category:`Blog`,url:`https://github.com/TryGhost/Taste`,previewUrl:`https://taste.ghost.io`,ref:`TryGhost/Taste`,image:H},{name:`Episode`,category:`Podcast`,url:`https://github.com/TryGhost/Episode`,previewUrl:`https://episode.ghost.io`,ref:`TryGhost/Episode`,image:N},{name:`Digest`,category:`Newsletter`,url:`https://github.com/TryGhost/Digest`,previewUrl:`https://digest.ghost.io/`,ref:`TryGhost/Digest`,image:O},{name:`Bulletin`,category:`Newsletter`,url:`https://github.com/TryGhost/Bulletin`,previewUrl:`https://bulletin.ghost.io/`,ref:`TryGhost/Bulletin`,image:T},{name:`Alto`,category:`Blog`,url:`https://github.com/TryGhost/Alto`,previewUrl:`https://alto.ghost.io`,ref:`TryGhost/Alto`,image:w},{name:`Dope`,category:`Magazine`,url:`https://github.com/TryGhost/Dope`,previewUrl:`https://dope.ghost.io`,ref:`TryGhost/Dope`,image:k},{name:`Wave`,category:`Podcast`,url:`https://github.com/TryGhost/Wave`,previewUrl:`https://wave.ghost.io`,ref:`TryGhost/Wave`,image:U},{name:`Edge`,category:`Photography`,url:`https://github.com/TryGhost/Edge`,previewUrl:`https://edge.ghost.io`,ref:`TryGhost/Edge`,image:j},{name:`Dawn`,category:`Newsletter`,url:`https://github.com/TryGhost/Dawn`,previewUrl:`https://dawn.ghost.io/`,ref:`TryGhost/Dawn`,image:D},{name:`Ease`,category:`Documentation`,url:`https://github.com/TryGhost/Ease`,previewUrl:`https://ease.ghost.io`,ref:`TryGhost/Ease`,image:A},{name:`Headline`,category:`News`,url:`https://github.com/TryGhost/Headline`,previewUrl:`https://headline.ghost.io`,ref:`TryGhost/Headline`,image:P},{name:`Ruby`,category:`Magazine`,url:`https://github.com/TryGhost/Ruby`,previewUrl:`https://ruby.ghost.io`,ref:`TryGhost/Ruby`,image:L},{name:`London`,category:`Photography`,url:`https://github.com/TryGhost/London`,previewUrl:`https://london.ghost.io`,ref:`TryGhost/London`,image:I},{name:`Journal`,category:`Newsletter`,url:`https://github.com/TryGhost/Journal`,previewUrl:`https://journal.ghost.io/`,ref:`TryGhost/Journal`,image:F}],G=``+new URL(`orb-black-1-bYPPSSAp.png`,import.meta.url).href,ae=``+new URL(`orb-black-2-C-rcujeh.png`,import.meta.url).href,K=``+new URL(`orb-black-3-DTkwRv_1.png`,import.meta.url).href,q=``+new URL(`orb-black-4-BXF3fMuE.png`,import.meta.url).href,J=``+new URL(`orb-black-5-94Eda1ek.png`,import.meta.url).href,oe=`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201818.2%202500'%20style='enable-background:new%200%200%201818.2%202500'%20xml:space='preserve'%3e%3ctitle%3egoogle-docs%3c/title%3e%3cpath%20d='M1136.4%200h-966C79.6%200%200%2079.5%200%20170.5v2159.1c0%2090.9%2079.5%20170.5%20170.5%20170.5h1477.3c90.9%200%20170.5-79.5%20170.5-170.5V681.8l-397.7-284.1L1136.4%200z'%20style='fill:%234285f4'/%3e%3cpath%20d='M454.5%201818.2h909.1v-113.6h-909l-.1%20113.6zm0%20227.3h681.8v-113.6H454.5v113.6zm0-795.5v113.6h909.1V1250H454.5zm0%20340.9h909.1v-113.6h-909l-.1%20113.6z'%20style='fill:%23f1f1f1'/%3e%3cpath%20d='M1136.4%200v511.4c0%2090.9%2079.5%20170.4%20170.4%20170.4h511.4L1136.4%200z'%20style='fill:%23a1c2fa'/%3e%3c/svg%3e`,se=``+new URL(`mailchimp-DwTEN-tS.svg`,import.meta.url).href,ce=`data:image/svg+xml,%3csvg%20height='546'%20viewBox='0%200%20569%20546'%20width='569'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3epatreon%3c/title%3e%3cg%20fill='%23FF424D'%3e%3ccircle%20cx='362.59'%20cy='204.59'%20data-fill='1'%20r='204.59'/%3e%3cpath%20data-fill='1'%20d='M0%200h100v545.8H0z'/%3e%3c/g%3e%3c/svg%3e`,Y=`data:image/svg+xml,%3csvg%20width='152'%20height='179'%20viewBox='0%200%20152%20179'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3epaypal%3c/title%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cpath%20d='M136.492%2045.453c2.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27l-2.365%2015a4.168%204.168%200%200%200%204.118%204.818H69.76a6.948%206.948%200%200%200%206.863-5.865l.283-1.468%205.442-34.507.351-1.907a6.947%206.947%200%200%201%206.862-5.865h4.322c27.984%200%2049.896-11.37%2056.299-44.25%202.675-13.74%201.292-25.208-5.783-33.27-2.14-2.439-4.802-4.455-7.907-6.1'%20fill='%23238EC2'/%3e%3cpath%20d='M136.492%2045.453c2.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27l8.609-54.588-.267%201.711c.609-3.86%203.909-6.704%207.817-6.704h16.288c31.989%200%2057.037-12.996%2064.356-50.582.217-1.113.402-2.191.568-3.251'%20fill='%2320274F'/%3e%3cpath%20d='M56.978%2045.638a6.945%206.945%200%200%201%206.863-5.866h43.514c5.155%200%209.961.337%2014.356%201.045%201.256.202%202.478.435%203.665.698a53.92%2053.92%200%200%201%203.455.885c.558.162%201.106.333%201.646.512%202.157.717%204.166%201.562%206.015%202.541%202.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27L56.978%2045.638'%20fill='%23253667'/%3e%3c/g%3e%3c/svg%3e`,le=``+new URL(`slackicon-37ETtpm7.png`,import.meta.url).href,ue=`data:image/svg+xml,%3csvg%20width='86'%20height='89'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3etypeform%3c/title%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cpath%20d='M40.28%2087.561c12.464.154%2021.16-3.994%2030.135-12.175%208.975-8.18%2014.306-16.867%2014.741-28.73.436-11.862-3.412-21.43-12.564-30.581C63.441%206.923%2051.64.9%2039.4.899%2027.158.898%2018.967%206.252%2011.385%2016.07c-7.581%209.818-9.237%2022.212-9.894%2033.921-.657%2011.71-1.15%2017.111%206.608%2024.625%207.758%207.514%2019.718%2012.791%2032.182%2012.945z'%20stroke='%23262627'/%3e%3cpath%20d='M29.136%2037.976v-4.885h25.918v4.885H44.679v27.998H39.51V37.976z'%20fill='%23262627'%20fill-rule='nonzero'/%3e%3c/g%3e%3c/svg%3e`,de=``+new URL(`zero-bounce-lzY95s9E.png`,import.meta.url).href,X=[{ghostImage:ae,appImage:le,title:`Share scheduled posts with your team in Slack`,url:`https://zapier.com/webintent/create-zap?template=359499`},{ghostImage:K,appImage:ce,title:`Connect Patreon to your Ghost membership site`,url:`https://zapier.com/webintent/create-zap?template=75801`},{ghostImage:q,appImage:de,title:`Protect email delivery with email verification`,url:`https://zapier.com/webintent/create-zap?template=359415`},{ghostImage:J,appImage:Y,title:`Add members for successful sales in PayPal`,url:`https://zapier.com/webintent/create-zap?template=184423`},{ghostImage:K,appImage:Y,title:`Unsubscribe members who cancel a subscription in PayPal`,url:`https://zapier.com/webintent/create-zap?template=359348`},{ghostImage:G,appImage:oe,title:`Send new post drafts from Google Docs to Ghost`,url:`https://zapier.com/webintent/create-zap?template=50924`},{ghostImage:q,appImage:ue,title:`Survey new members using Typeform`,url:`https://zapier.com/webintent/create-zap?template=359407`},{ghostImage:G,appImage:se,title:`Sync email subscribers in Ghost + Mailchimp`,url:`https://zapier.com/webintent/create-zap?template=359342`}],Z=(0,b.createContext)({officialThemes:W,zapierTemplates:X,search:{filter:``,setFilter:()=>{},checkVisible:()=>!0,highlightKeywords:()=>``,noResult:!1,setNoResult:()=>{},registerComponent:()=>{},unregisterComponent:()=>{},getVisibleComponents:()=>new Set,isOnlyVisibleComponent:()=>!1},sortingState:[],offersShowArchived:!1,setOffersShowArchived:()=>{}}),fe=({children:e,...t})=>{let n=C(),[r,i]=(0,b.useState)([{type:`offers`,option:`date-added`,direction:`desc`}]),[a,s]=(0,b.useState)(!1);return(0,x.jsx)(Z.Provider,{value:{officialThemes:W,zapierTemplates:X,...t,search:n,sortingState:r,setSortingState:i,offersShowArchived:a,setOffersShowArchived:s},children:(0,x.jsx)(h,{children:(0,x.jsx)(o,{children:e})})})},Q=()=>(0,b.useContext)(Z),pe=()=>Q().officialThemes,me=()=>Q().search,he=()=>Q().upgradeStatus,ge=()=>{let{sortingState:e,setSortingState:t}=Q();return{sortingState:e,setSortingState:t}},$=()=>{let{offersShowArchived:e,setOffersShowArchived:t}=Q();return{offersShowArchived:e,setOffersShowArchived:t}},_e=t({default:()=>ve});function ve(){let{updateRoute:e}=l(),{zapierTemplates:t}=Q(),{data:{integrations:n}={integrations:[]}}=re(),{config:r}=ne(),{mutateAsync:o}=_(),h=i(),[S,C]=(0,b.useState)(!1),w=r.hostSettings?.limits?.customIntegrations?.disabled,T=n.find(({slug:e})=>e===`zapier`),E=T?.api_keys?.find(e=>e.type===`admin`);return(0,b.useEffect)(()=>{w&&e(`integrations`)},[w,e]),(0,x.jsxs)(s,{cancelLabel:``,footer:(0,x.jsxs)(`div`,{className:`mx-8 flex w-full items-center justify-between`,children:[(0,x.jsxs)(`a`,{className:`mt-1 self-baseline font-bold`,href:`https://zapier.com/apps/ghost/integrations?utm_medium=partner_api&utm_source=widget&utm_campaign=Widget`,rel:`noopener noreferrer`,target:`_blank`,children:[`View more Ghost integrations powered by `,(0,x.jsx)(`span`,{children:(0,x.jsx)(`img`,{alt:`Zapier`,className:`relative top-[-2px] inline-block`,src:y})})]}),(0,x.jsx)(p,{type:`button`,onClick:()=>{e(`integrations`)},children:`Close`})]}),okLabel:`Close`,okVariant:`default`,testId:`zapier-modal`,title:``,stickyFooter:!0,onClose:()=>{e(`integrations`)},onOk:()=>{e(`integrations`)},children:[(0,x.jsx)(g,{detail:`Automation for your favorite apps`,extra:(0,x.jsx)(`div`,{className:`mt-1 -mb-4`,children:(0,x.jsx)(ie,{keys:[{id:`admin-api-key`,label:`Admin API key`,text:E?.secret,hint:S?(0,x.jsx)(`div`,{className:`text-green`,children:`Admin API Key was successfully regenerated`}):void 0,onRegenerate:()=>{!T||!E||(C(!1),c.show(te,{title:`Regenerate Admin API Key`,prompt:`You will need to locate the Ghost App within your Zapier account and click on "Reconnect" to enter the new Admin API Key.`,okLabel:`Regenerate Admin API Key`,onOk:async e=>{try{await o({integrationId:T.id,apiKeyId:E.id}),C(!0),e?.remove()}catch(e){h(e)}}}))}},{id:`api-url`,label:`API URL`,text:window.location.origin+a().subdir}]})}),icon:(0,x.jsx)(v,{name:`zapier`,size:56}),title:`Zapier`}),(0,x.jsx)(ee,{children:t.map(e=>(0,x.jsxs)(d,{hover:!1,children:[(0,x.jsx)(u,{className:`flex items-center gap-3 py-2 pl-3`,children:(0,x.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center`,children:[(0,x.jsxs)(`div`,{className:`flex shrink-0 flex-nowrap items-center gap-2`,children:[(0,x.jsx)(`img`,{className:`size-8 object-contain dark:invert`,role:`presentation`,src:e.ghostImage}),(0,x.jsx)(m,{className:`size-3`}),(0,x.jsx)(`img`,{className:`size-8 object-contain`,role:`presentation`,src:e.appImage})]}),(0,x.jsx)(`span`,{children:e.title})]})}),(0,x.jsx)(f,{visibility:`hover`,children:(0,x.jsx)(p,{className:`h-auto p-0 font-semibold whitespace-nowrap text-[#FF4A00] hover:text-[#FF4A00]`,variant:`link`,asChild:!0,children:(0,x.jsx)(`a`,{href:e.url,rel:`noopener noreferrer`,target:`_blank`,children:`Use this Zap`})})})]},e.url))})]})}export{me as a,S as c,pe as i,fe as n,ge as o,$ as r,he as s,_e as t};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<link rel="stylesheet" href="./assets/vendor-3bf602dfa6463c3400ffd81697767274.css">
|
|
5
5
|
<link rel="stylesheet" href="./assets/ghost-d38c30b866e59f2e06a357b5eb844fe5.css">
|
|
6
|
-
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.
|
|
6
|
+
<meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.57%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%224b6e329268%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%223ebde9a6a0%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D">
|
|
7
7
|
|
|
8
8
|
<meta charset="UTF-8" />
|
|
9
9
|
|
|
@@ -20,28 +20,30 @@
|
|
|
20
20
|
|
|
21
21
|
<link rel="shortcut icon" href="./assets/favicon-C_q1KHzv.ico" />
|
|
22
22
|
<link rel="apple-touch-icon" href="./assets/apple-touch-icon-DhO18_4B.png" />
|
|
23
|
-
<script type="module" crossorigin src="./assets/index-
|
|
23
|
+
<script type="module" crossorigin src="./assets/index-DUXM0NlS.js"></script>
|
|
24
24
|
<link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-DAXXjFlN.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="./assets/react-Bb3IsNbi.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="./assets/jsx-runtime-DX3WBWVO.js">
|
|
27
27
|
<link rel="modulepreload" crossorigin href="./assets/framework-provider-CmtnPXIT.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="./assets/dist-Ndy-PuGN.js">
|
|
29
|
-
<link rel="modulepreload" crossorigin href="./assets/hooks-
|
|
29
|
+
<link rel="modulepreload" crossorigin href="./assets/hooks-D6EE7BIt.js">
|
|
30
30
|
<link rel="modulepreload" crossorigin href="./assets/dist-Cb5RSHSg.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="./assets/dist-CQJY6SVY.js">
|
|
32
|
-
<link rel="modulepreload" crossorigin href="./assets/dist-
|
|
33
|
-
<link rel="modulepreload" crossorigin href="./assets/Combination-
|
|
32
|
+
<link rel="modulepreload" crossorigin href="./assets/dist-CqO2lWS02.js">
|
|
33
|
+
<link rel="modulepreload" crossorigin href="./assets/Combination-BDvCdg1t.js">
|
|
34
34
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-DYl5dUZ5.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="./assets/chunk-KS7C4IRE-DG9HTHQ3.js">
|
|
36
|
-
<link rel="modulepreload" crossorigin href="./assets/router-provider-
|
|
36
|
+
<link rel="modulepreload" crossorigin href="./assets/router-provider-DSQfprxH.js">
|
|
37
37
|
<link rel="modulepreload" crossorigin href="./assets/text-DU9Hv33_.js">
|
|
38
38
|
<link rel="modulepreload" crossorigin href="./assets/shade-app-B3heOAfz-BhQXxNkT.js">
|
|
39
|
-
<link rel="modulepreload" crossorigin href="./assets/dist-
|
|
40
|
-
<link rel="modulepreload" crossorigin href="./assets/dist-
|
|
39
|
+
<link rel="modulepreload" crossorigin href="./assets/dist-myQaY0ka.js">
|
|
40
|
+
<link rel="modulepreload" crossorigin href="./assets/dist-j1xxxnY8.js">
|
|
41
|
+
<link rel="modulepreload" crossorigin href="./assets/dist-B2PvRwLn.js">
|
|
42
|
+
<link rel="modulepreload" crossorigin href="./assets/dist-DlCyLrOC.js">
|
|
41
43
|
<link rel="modulepreload" crossorigin href="./assets/input-surface-BdOe4KzO.js">
|
|
42
44
|
<link rel="modulepreload" crossorigin href="./assets/update-queries-C4CnvJaW.js">
|
|
43
|
-
<link rel="modulepreload" crossorigin href="./assets/users-
|
|
44
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
45
|
+
<link rel="modulepreload" crossorigin href="./assets/users-B6hIds6n.js">
|
|
46
|
+
<link rel="stylesheet" crossorigin href="./assets/index-Ds2iUoF6.css">
|
|
45
47
|
</head>
|
|
46
48
|
<body class="react-admin">
|
|
47
49
|
<div id="ember-alerts-wormhole"></div>
|
|
@@ -61,9 +63,9 @@
|
|
|
61
63
|
<div id="ember-liquid-wormhole"></div>
|
|
62
64
|
<div id="ember-notifications-wormhole"></div>
|
|
63
65
|
<script src="./assets/vendor-25f0bb2b2de85265afdf33da79f14a44.js"></script>
|
|
64
|
-
<script src="./assets/chunk.
|
|
65
|
-
<script src="./assets/chunk.
|
|
66
|
-
<script src="./assets/chunk.524.
|
|
67
|
-
<script src="./assets/ghost-
|
|
66
|
+
<script src="./assets/chunk.571.40f093ed6d883993714e.js"></script>
|
|
67
|
+
<script src="./assets/chunk.424.4a27628efdade15c2dab.js"></script>
|
|
68
|
+
<script src="./assets/chunk.524.dce1c51e0bc30fb2718e.js"></script>
|
|
69
|
+
<script src="./assets/ghost-d683fbeb945b13155ea669caa5d8db41.js"></script>
|
|
68
70
|
</body>
|
|
69
71
|
</html>
|
|
@@ -34,7 +34,7 @@ module.exports = function authors(options = {}) {
|
|
|
34
34
|
function createAuthorsList(authorsList) {
|
|
35
35
|
function processAuthor(author) {
|
|
36
36
|
return autolink ? templates.link({
|
|
37
|
-
url: urlService.
|
|
37
|
+
url: urlService.getUrlForResource({...author, type: 'authors'}, {withSubdirectory: true}),
|
|
38
38
|
text: escapeExpression(author.name)
|
|
39
39
|
}) : escapeExpression(author.name);
|
|
40
40
|
}
|
|
@@ -15,15 +15,10 @@ const messages = {
|
|
|
15
15
|
const managedAttributes = ['href', 'class', 'activeClass', 'parentActiveClass'];
|
|
16
16
|
|
|
17
17
|
function _formatAttrs(attributes) {
|
|
18
|
-
|
|
19
|
-
Object.keys(attributes).forEach((key) => {
|
|
20
|
-
let value = attributes[key];
|
|
21
|
-
|
|
18
|
+
return Object.keys(attributes)
|
|
22
19
|
// @TODO handle non-string attributes?
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return attributeString;
|
|
20
|
+
.map(key => `${key}="${attributes[key]}"`)
|
|
21
|
+
.join(' ');
|
|
27
22
|
}
|
|
28
23
|
|
|
29
24
|
module.exports = function link(options) {
|
|
@@ -27,7 +27,7 @@ module.exports = function tags(options) {
|
|
|
27
27
|
function createTagList(tagsList) {
|
|
28
28
|
function processTag(tag) {
|
|
29
29
|
return autolink ? templates.link({
|
|
30
|
-
url: urlService.
|
|
30
|
+
url: urlService.getUrlForResource({...tag, type: 'tags'}, {withSubdirectory: true}),
|
|
31
31
|
text: escapeExpression(tag.name)
|
|
32
32
|
}) : escapeExpression(tag.name);
|
|
33
33
|
}
|
|
@@ -7,11 +7,11 @@ function getAuthorUrl(data, absolute) {
|
|
|
7
7
|
const contextObject = getContextObject(data, context);
|
|
8
8
|
|
|
9
9
|
if (data.author) {
|
|
10
|
-
return urlService.
|
|
10
|
+
return urlService.getUrlForResource({...data.author, type: 'authors'}, {absolute: absolute, withSubdirectory: true});
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
if (contextObject && contextObject.primary_author) {
|
|
14
|
-
return urlService.
|
|
14
|
+
return urlService.getUrlForResource({...contextObject.primary_author, type: 'authors'}, {absolute: absolute, withSubdirectory: true});
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
return null;
|
|
@@ -57,19 +57,19 @@ function getUrl(data, absolute) {
|
|
|
57
57
|
// preview probe stays keyed on the raw `data.status` so an unrouted
|
|
58
58
|
// status-stripped post falls back to /p/:uuid.
|
|
59
59
|
const postResource = {status: 'published', ...data, type: checks.isPage(data) ? 'pages' : 'posts'};
|
|
60
|
-
if (data.status !== 'published' && urlService.
|
|
60
|
+
if (data.status !== 'published' && urlService.getUrlForResource(postResource) === '/404/') {
|
|
61
61
|
return urlUtils.urlFor({relativeUrl: urlUtils.urlJoin('/p', data.uuid, '/')}, null, absolute);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
return urlService.
|
|
64
|
+
return urlService.getUrlForResource(postResource, {absolute: absolute, withSubdirectory: true});
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
if (checks.isTag(data)) {
|
|
68
|
-
return urlService.
|
|
68
|
+
return urlService.getUrlForResource({...data, type: 'tags'}, {absolute: absolute, withSubdirectory: true});
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
if (checks.isUser(data)) {
|
|
72
|
-
return urlService.
|
|
72
|
+
return urlService.getUrlForResource({...data, type: 'authors'}, {absolute: absolute, withSubdirectory: true});
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
if (checks.isNav(data)) {
|
|
@@ -11,7 +11,7 @@ const logging = require('@tryghost/logging');
|
|
|
11
11
|
// The only server events the frontend may subscribe to. A narrow surface on
|
|
12
12
|
// purpose: the shared bus's own header discourages widening cross-layer
|
|
13
13
|
// coupling, so new event names here need the same scrutiny as new exports.
|
|
14
|
-
const FRONTEND_SUBSCRIBABLE_EVENTS = ['site.changed'
|
|
14
|
+
const FRONTEND_SUBSCRIBABLE_EVENTS = ['site.changed'];
|
|
15
15
|
|
|
16
16
|
// Require from the handlebars framework
|
|
17
17
|
const {SafeString} = require('./handlebars');
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
const EventEmitter = require('events').EventEmitter;
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Raised for each router mounted during activation.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* @typedef {Object} RouteRegistered
|
|
7
|
+
* @property {string|null} path - route in domain notation, e.g. `/about/`.
|
|
8
|
+
* Null for routers with no route of their own: the static pages router,
|
|
9
|
+
* and taxonomies, which have no index route (`/tag/` does not exist).
|
|
10
|
+
* @property {string} type - the kind of router, e.g. `CollectionRouter`
|
|
11
|
+
* @property {string} id - the router's identifier
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Frontend-internal routing domain events.
|
|
16
|
+
*
|
|
17
|
+
* Carries `RouteRegistered` and `RoutesReset` — the latter has no payload and
|
|
18
|
+
* is raised before a reload clears the routers. Both are emitted by the router
|
|
19
|
+
* manager and consumed only inside the frontend (the sitemap keeps its route
|
|
20
|
+
* entries in sync from them). They used to ride the server's shared event bus
|
|
21
|
+
* purely for historical reasons — nothing server-side listens to them.
|
|
22
|
+
*
|
|
23
|
+
* The payloads are plain data, so a consumer never depends on the internals
|
|
24
|
+
* of the Express-backed router that happened to raise the event.
|
|
11
25
|
*/
|
|
12
26
|
module.exports = new EventEmitter();
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.toExpressNotation = toExpressNotation;
|
|
4
|
-
exports.toDomainNotation = toDomainNotation;
|
|
5
4
|
/**
|
|
6
5
|
* Convert a domain-model permalink into Express / URL-service notation.
|
|
7
6
|
*
|
|
@@ -12,15 +11,3 @@ exports.toDomainNotation = toDomainNotation;
|
|
|
12
11
|
function toExpressNotation(permalink) {
|
|
13
12
|
return permalink.replace(/{(\w+)}/g, ':$1');
|
|
14
13
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Convert an Express / URL-service permalink back into domain-model notation.
|
|
17
|
-
* Will be used on the download path when serialising the canonical shape back
|
|
18
|
-
* to YAML — no production caller yet.
|
|
19
|
-
*
|
|
20
|
-
* @example toDomainNotation('/:slug/') // => '/{slug}/'
|
|
21
|
-
* @example toDomainNotation('/:primary_tag/:slug/') // => '/{primary_tag}/{slug}/'
|
|
22
|
-
* @example toDomainNotation('/{slug}/') // => '/{slug}/' (idempotent)
|
|
23
|
-
*/
|
|
24
|
-
function toDomainNotation(permalink) {
|
|
25
|
-
return permalink.replace(/:(\w+)/g, '{$1}');
|
|
26
|
-
}
|
|
@@ -8,16 +8,3 @@
|
|
|
8
8
|
export function toExpressNotation(permalink: string): string {
|
|
9
9
|
return permalink.replace(/{(\w+)}/g, ':$1');
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Convert an Express / URL-service permalink back into domain-model notation.
|
|
14
|
-
* Will be used on the download path when serialising the canonical shape back
|
|
15
|
-
* to YAML — no production caller yet.
|
|
16
|
-
*
|
|
17
|
-
* @example toDomainNotation('/:slug/') // => '/{slug}/'
|
|
18
|
-
* @example toDomainNotation('/:primary_tag/:slug/') // => '/{primary_tag}/{slug}/'
|
|
19
|
-
* @example toDomainNotation('/{slug}/') // => '/{slug}/' (idempotent)
|
|
20
|
-
*/
|
|
21
|
-
export function toDomainNotation(permalink: string): string {
|
|
22
|
-
return permalink.replace(/:(\w+)/g, '{$1}');
|
|
23
|
-
}
|
|
@@ -8,7 +8,7 @@ const ParentRouter = require('./parent-router');
|
|
|
8
8
|
const EmailRouter = require('./email-router');
|
|
9
9
|
const UnsubscribeRouter = require('./unsubscribe-router');
|
|
10
10
|
|
|
11
|
-
// Frontend-internal routing events (
|
|
11
|
+
// Frontend-internal routing domain events (RouteRegistered / RoutesReset)
|
|
12
12
|
const routingEvents = require('./events');
|
|
13
13
|
|
|
14
14
|
class RouterManager {
|
|
@@ -16,7 +16,7 @@ class RouterManager {
|
|
|
16
16
|
this.registry = registry;
|
|
17
17
|
this.siteRouter = null;
|
|
18
18
|
/**
|
|
19
|
-
* @type {
|
|
19
|
+
* @type {UrlService}
|
|
20
20
|
*/
|
|
21
21
|
this.urlService = null;
|
|
22
22
|
}
|
|
@@ -30,11 +30,17 @@ class RouterManager {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
routerCreated(router) {
|
|
33
|
-
routingEvents.emit('
|
|
33
|
+
routingEvents.emit('RouteRegistered', {
|
|
34
|
+
// Not every router owns a route: the static pages router has none,
|
|
35
|
+
// and taxonomies have no index route (`/tag/` does not exist).
|
|
36
|
+
path: router.route ? router.route.value : null,
|
|
37
|
+
type: router.name,
|
|
38
|
+
id: router.identifier
|
|
39
|
+
});
|
|
34
40
|
|
|
35
41
|
// CASE: there are router types which do not generate resource urls
|
|
36
|
-
// e.g. static route router, in this case we don't want
|
|
37
|
-
if (!router
|
|
42
|
+
// e.g. static route router, in this case we don't want to notify the URL service
|
|
43
|
+
if (!router.getPermalinks()) {
|
|
38
44
|
return;
|
|
39
45
|
}
|
|
40
46
|
|
|
@@ -65,7 +71,7 @@ class RouterManager {
|
|
|
65
71
|
this.registry.resetAllRouters();
|
|
66
72
|
this.registry.resetAllRoutes();
|
|
67
73
|
|
|
68
|
-
routingEvents.emit('
|
|
74
|
+
routingEvents.emit('RoutesReset');
|
|
69
75
|
|
|
70
76
|
this.siteRouter = new ParentRouter('SiteRouter');
|
|
71
77
|
this.registry.setRouter('siteRouter', this.siteRouter);
|
|
@@ -171,7 +177,7 @@ class RouterManager {
|
|
|
171
177
|
if (collectionRouter && collectionRouter.getPermalinks().getValue().match(/:year|:month|:day/)) {
|
|
172
178
|
debug('handleTimezoneEdit: trigger regeneration');
|
|
173
179
|
|
|
174
|
-
this.urlService.onRouterUpdated(
|
|
180
|
+
this.urlService.onRouterUpdated();
|
|
175
181
|
}
|
|
176
182
|
}
|
|
177
183
|
}
|
|
@@ -181,7 +187,7 @@ module.exports = RouterManager;
|
|
|
181
187
|
/**
|
|
182
188
|
* @typedef {Object} RouterConfig
|
|
183
189
|
* @property {RouteSettings} [routeSettings] - parsed route settings domain model
|
|
184
|
-
* @property {
|
|
190
|
+
* @property {UrlService} urlService - resource-based URL service
|
|
185
191
|
*/
|
|
186
192
|
|
|
187
193
|
/**
|
|
@@ -189,7 +195,7 @@ module.exports = RouterManager;
|
|
|
189
195
|
*/
|
|
190
196
|
|
|
191
197
|
/**
|
|
192
|
-
* @typedef {Object}
|
|
198
|
+
* @typedef {Object} UrlService
|
|
193
199
|
* @property {Function} getUrlForResource
|
|
194
200
|
* @property {Function} ownsResource
|
|
195
201
|
* @property {Function} resolveUrl
|
|
@@ -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
|
}
|
|
@@ -135,7 +135,7 @@ function getCleanRedirectUrl(req) {
|
|
|
135
135
|
currentUrl.searchParams.delete(QUERY_PARAM);
|
|
136
136
|
currentUrl.searchParams.delete(HIDE_QUERY_PARAM);
|
|
137
137
|
|
|
138
|
-
return `${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}`;
|
|
138
|
+
return `${urlUtils.createUrl(currentUrl.pathname)}${currentUrl.search}${currentUrl.hash}`;
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
function getQueryValue(value) {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Security considerations:
|
|
11
11
|
* - Only serves keys that exactly match the configured key
|
|
12
12
|
* - Only responds to 32-character hex patterns (valid IndexNow key format)
|
|
13
|
-
* - Returns 404 (via next()) if
|
|
13
|
+
* - Returns 404 (via next()) if no key is configured
|
|
14
14
|
*
|
|
15
15
|
* Route collision note:
|
|
16
16
|
* The pattern /[a-f0-9]{32}.txt is unlikely to collide with user content
|
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
const settingsCache = require('../../../shared/settings-cache');
|
|
26
|
-
const labs = require('../../../shared/labs');
|
|
27
26
|
|
|
28
27
|
/**
|
|
29
28
|
* Middleware to serve the IndexNow API key verification file
|
|
@@ -34,11 +33,6 @@ function serveIndexNowKey(req, res, next) {
|
|
|
34
33
|
return next();
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
// Check if IndexNow is enabled
|
|
38
|
-
if (!labs.isSet('indexnow')) {
|
|
39
|
-
return next();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
36
|
const apiKey = settingsCache.get('indexnow_api_key');
|
|
43
37
|
|
|
44
38
|
// No key configured
|
|
@@ -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;
|