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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as e}from"./rolldown-runtime-DAXXjFlN.js";import{t}from"./react-Bb3IsNbi.js";import{t as n}from"./jsx-runtime-DX3WBWVO.js";import{t as r}from"./use-tinybird-query-GSa32hVw.js";import{g as i}from"./stats-D8nZCTy5.js";import{g as a,m as o}from"./chunk-KS7C4IRE-DG9HTHQ3.js";import{a as s,t as c}from"./router-provider-DSQfprxH.js";import{f as l,h as ee,p as u}from"./dist-Cb5RSHSg.js";import{a as d}from"./shade-app-B3heOAfz-BhQXxNkT.js";import{a as f,i as p,n as te,t as m}from"./chart-helpers-CZElTGYL.js";import{r as h,t as g}from"./tabs-Dd6oOKbv.js";import{r as ne}from"./filters-3JBQcNtJ.js";import{a as _,i as v,n as y,o as b,r as x,t as S}from"./card-aUHX0hyR.js";import{a as C,c as w,i as T,l as E,n as D,o as O,r as k,s as A,t as j,u as M}from"./data-list-CupF7bjM.js";import{t as re}from"./empty-indicator-WB1WgT9h.js";import{a as N,i as ie,n as ae,o as P,r as oe,s as F}from"./use-filter-params-BnbBDc7T.js";import{$r as I,Bn as L,Hn as R,Kr as z,Ln as B,Pr as V,Ps as H,Rn as U,So as se,Vn as W,Vs as ce,Wr as G,Xn as K,Yr as le,Zr as ue,aa as de,ai as fe,f as pe,ir as me,l as he,qr as ge,u as _e,zn as ve}from"./index-BHy2DZX-.js";import{t as q}from"./date-range-select-PB2n1HZf.js";import{n as J,r as Y,t as ye}from"./kpi-tabs-X3DkOYbI.js";import{t as be}from"./use-analytics-data-B-b4wNSC.js";import{n as xe,t as Se}from"./audience-DTJtXXWY.js";import{r as Ce,t as we}from"./post-analytics-header-ChzjXVPt.js";import{n as Te}from"./post-analytics-context-D0Mw-Pmv.js";import{n as X,r as Ee,t as De}from"./kpi-helpers-CjUdECAK.js";var Z=e(t(),1),Q=n(),Oe=({data:e,range:t})=>{let[n]=a(),[r,i]=(0,Z.useState)(n.get(`tab`)||`visits`),o=X[r],s=p(e||[],t,o.dataKey,`sum`)?.map(e=>{let t=Number(e[o.dataKey]);return{date:String(e.date),value:t,formattedValue:o.formatter(t),label:o.label}}),c=De(e),l=m(t,e||[],{fieldName:o.dataKey});return(0,Q.jsx)(S,{children:(0,Q.jsx)(y,{children:(0,Q.jsxs)(g,{defaultValue:r,variant:`kpis`,children:[(0,Q.jsxs)(h,{className:`-mx-6 hidden grid-cols-2 md:visible! md:grid!`,children:[(0,Q.jsx)(J,{value:`visits`,onClick:()=>{i(`visits`)},children:(0,Q.jsx)(Y,{color:X.visits.color,label:`Unique visitors`,value:c.visits})}),(0,Q.jsx)(J,{value:`views`,onClick:()=>{i(`views`)},children:(0,Q.jsx)(Y,{color:X.views.color,label:`Total views`,value:c.views})})]}),(0,Q.jsxs)(le,{children:[(0,Q.jsx)(fe,{className:`md:hidden`,asChild:!0,children:(0,Q.jsxs)(ye,{children:[r===`visits`&&(0,Q.jsx)(Y,{color:`var(--chart-blue)`,label:`Unique visitors`,value:c.visits}),r===`views`&&(0,Q.jsx)(Y,{color:`var(--chart-teal)`,label:`Total views`,value:c.views})]})}),(0,Q.jsxs)(ue,{align:`end`,className:`w-56`,children:[(0,Q.jsx)(I,{onClick:()=>i(`visits`),children:`Unique visitors`}),(0,Q.jsx)(I,{onClick:()=>i(`views`),children:`Total views`})]})]}),(0,Q.jsx)(`div`,{className:`my-4 [&_.recharts-cartesian-axis-tick-value]:fill-gray-500`,children:(0,Q.jsx)(f,{className:`-mb-3 aspect-auto h-[16vw] max-h-[320px] min-h-[180px] w-full`,color:o.color,data:s,id:o.dataKey,range:l,showHours:!0,syncId:`overview-charts`})})]})})})},ke=e(P(),1);ke.registerLocale(N);var Ae=e=>he[e]||ke.getName(e,`en`,{select:`alias`})||`Unknown`,je=e=>({"UNITED STATES":`US`,"UNITED STATES OF AMERICA":`US`,USA:`US`,"UNITED KINGDOM":`GB`,UK:`GB`,"GREAT BRITAIN":`GB`,NETHERLANDS:`NL`})[e.toUpperCase()]||(e.length>2?e.substring(0,2):e),$=({tableHeader:e,data:t,onLocationClick:n})=>(0,Q.jsxs)(j,{children:[e&&(0,Q.jsxs)(C,{children:[(0,Q.jsx)(T,{children:`Country`}),(0,Q.jsx)(T,{children:`Visitors`})]}),(0,Q.jsx)(k,{children:t.map(e=>{let t=Ae(`${e.location}`)||`Unknown`,r=n&&e.location!==`Unknown`,i=e.location?e.location.toLowerCase():`unknown`;return(0,Q.jsxs)(M,{className:r?`cursor-pointer`:``,"data-testid":`location-row-${i}`,onClick:r?()=>n(e.location):void 0,children:[(0,Q.jsx)(D,{style:{width:`${e.percentage?Math.round(e.percentage*100):0}%`}}),(0,Q.jsx)(O,{className:`group-hover/data:max-w-[calc(100%-140px)]`,children:(0,Q.jsxs)(`div`,{className:`flex items-center space-x-3 overflow-hidden`,title:t||`Unknown`,children:[(0,Q.jsx)(F,{countryCode:`${je(e.location)}`,fallback:(0,Q.jsx)(`span`,{className:`flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white`,children:(0,Q.jsx)(d.SkullAndBones,{className:`size-3`})})}),(0,Q.jsx)(`div`,{className:`truncate font-medium`,children:t})]})}),(0,Q.jsxs)(A,{children:[(0,Q.jsx)(w,{children:l(Number(e.visits))}),(0,Q.jsx)(E,{children:u(e.percentage)})]})]},e.location||`unknown`)})})]}),Me=({data:e,isLoading:t,onLocationClick:n})=>{let r=e.slice(0,10);return(0,Q.jsx)(Q.Fragment,{children:t?``:(0,Q.jsx)(Q.Fragment,{children:e&&e.length>0&&(0,Q.jsxs)(S,{className:`group/datalist`,"data-testid":`locations-card`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between p-6`,children:[(0,Q.jsxs)(_,{className:`p-0`,children:[(0,Q.jsx)(b,{children:`Locations`}),(0,Q.jsx)(x,{children:`Where are the readers of this post`})]}),(0,Q.jsx)(H,{className:`mr-2`,children:`Visitors`})]}),(0,Q.jsxs)(y,{className:`overflow-hidden`,children:[(0,Q.jsx)(K,{}),(0,Q.jsx)($,{data:r,tableHeader:!1,onLocationClick:n})]}),e.length>10&&(0,Q.jsx)(v,{children:(0,Q.jsxs)(B,{children:[(0,Q.jsx)(R,{asChild:!0,children:(0,Q.jsxs)(V,{variant:`outline`,children:[`View all `,(0,Q.jsx)(de,{})]})}),(0,Q.jsxs)(U,{className:`overflow-y-auto pt-0 sm:max-w-[420px]`,children:[(0,Q.jsxs)(L,{className:`sticky top-0 z-40 -mx-6 bg-surface-elevated/60 p-6 backdrop-blur`,children:[(0,Q.jsx)(W,{children:`Top locations`}),(0,Q.jsx)(ve,{children:`Where are the readers of this post`})]}),(0,Q.jsx)(`div`,{className:`group/datalist`,children:(0,Q.jsx)($,{data:e,tableHeader:!0,onLocationClick:n})})]})]})})]})})})},Ne=()=>{let e=s(),{postId:t}=o(),{statsConfig:n,isLoading:a,site:l}=be(),{range:u,setRange:d,post:f,isPostLoading:p}=Te(),{appSettings:m}=ce(),h=(0,Z.useRef)(null),{filters:g,setFilters:_}=oe({supportedFields:ae,trackingSource:`post-analytics`}),v=(0,Z.useMemo)(()=>Se(g.find(e=>e.field===`audience`)?.values),[g]);(0,Z.useEffect)(()=>{!p&&f?.email_only&&e(`/posts/analytics/${t}`)},[p,f?.email_only,e,t]);let b=(0,Z.useMemo)(()=>{if(!f?.published_at)return _e.allTime.value;let e=ge(f.published_at),{startDate:t,endDate:n}=z(u);return n.diff(t,`days`)+1>e?e:u},[f?.published_at,u]),{startDate:x,endDate:C,timezone:w}=z(b),T=(0,Z.useCallback)(()=>{let e=ee(h.current);e&&e.scrollTo({top:0,behavior:`smooth`})},[]),E=(0,Z.useMemo)(()=>{let e={};return g.forEach(t=>{let n=t.field,r=t.values;if(n===`audience`)return;let i=r&&r.length>0&&r[0]!==null&&r[0]!==void 0,a=n===`source`&&r?.[0]===``;if(i&&(r[0]!==``||a)){let t=String(r[0]);e[n]=t}}),e},[g]),D=(0,Z.useCallback)((e,t)=>{_(n=>n.find(t=>t.field===e)?n.map(n=>n.field===e?{...n,values:[t]}:n):[...n,ne(e,`is`,[t])]),T()},[_,T]),O=(0,Z.useCallback)(e=>D(`location`,e),[D]),k=(0,Z.useCallback)(e=>D(`source`,e),[D]),A=(0,Z.useMemo)(()=>{let e={site_uuid:n?.id||``,date_from:G(x),date_to:G(C),timezone:w,member_status:xe(v),post_uuid:``,...E};return!p&&f?.uuid?{...e,post_uuid:f.uuid}:e},[p,f,n?.id,x,C,w,v,E]),{data:j,loading:M}=r({endpoint:`api_kpis`,statsConfig:n,params:A}),{data:N,loading:P}=r({endpoint:`api_top_locations`,statsConfig:n,params:A}),{data:F,loading:I}=r({endpoint:`api_top_sources`,statsConfig:n,params:A}),L=(0,Z.useMemo)(()=>N?.reduce((e,t)=>e+Number(t.visits),0)||0,[N]),R=(0,Z.useMemo)(()=>F?F.reduce((e,t)=>e+Number(t.visits||0),0):0,[F]),B=l.url,V=l.icon,H=(0,Z.useMemo)(()=>{let e=N?.map(e=>({location:String(e.location),visits:Number(e.visits),percentage:L>0?Number(e.visits)/L:0,isUnknown:pe.includes(String(e.location))}))||[],t=e.filter(e=>!e.isUnknown),n=e.filter(e=>e.isUnknown),r=n.length>0?[{location:`Unknown`,visits:n.reduce((e,t)=>e+t.visits,0),percentage:n.reduce((e,t)=>e+t.percentage,0)}]:[];return[...t,...r]},[N,L]),U=a||p||M||P||I,W=De(j),K=g.length>0;return m&&!m.analytics?.webAnalytics?(0,Q.jsx)(c,{to:`/posts/analytics/${t}`,replace:!0}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(we,{currentTab:`Web`,children:[K&&(0,Q.jsx)(i,{children:(0,Q.jsx)(q,{range:u,onRangeChange:d})}),(0,Q.jsxs)(i,{className:`${K?`mt-0! [grid-area:subactions] lg:mt-[25px]!`:`[grid-area:actions]`}`,children:[(0,Q.jsx)(ie,{filters:g,postUuid:f?.uuid,range:u,onChange:_}),!K&&(0,Q.jsx)(q,{range:u,onRangeChange:d})]})]}),(0,Q.jsx)(Ce,{ref:h,children:U?(0,Q.jsx)(S,{className:`size-full`,variant:`plain`,children:(0,Q.jsx)(y,{className:`size-full items-center justify-center`,children:(0,Q.jsx)(me,{})})}):j&&j.length!==0&&W.visits!==`0`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Oe,{data:j,range:b}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-6 lg:grid lg:grid-cols-2`,children:[(0,Q.jsx)(Me,{data:H,isLoading:P,onLocationClick:O}),(0,Q.jsx)(Ee,{data:F,range:b,siteIcon:V,siteUrl:B,totalVisitors:R,onSourceClick:k})]})]}):(0,Q.jsx)(`div`,{className:`grow`,children:(0,Q.jsx)(re,{className:`h-full`,description:`Try adjusting filters to see more data.`,title:`No visitors ${te(u)}`,children:(0,Q.jsx)(se,{strokeWidth:1.5})})})})]})};export{Ne as default};
|
|
@@ -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-Bf1g1rEh.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-BHy2DZX-.js";import{n as te}from"./confirmation-modal-B6D6mk6R.js";import{n as ne,t as h}from"./global-data-provider-B949LDXJ.js";import{n as re}from"./integrations-BT6_iJvu.js";import{t as ie}from"./api-keys-BK0LylyK.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};
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<link rel="stylesheet" href="./assets/vendor-3bf602dfa6463c3400ffd81697767274.css">
|
|
5
|
-
<link rel="stylesheet" href="./assets/ghost-
|
|
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.
|
|
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.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%22571a1e1dc6%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-BHy2DZX-.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-
|
|
30
|
-
<link rel="modulepreload" crossorigin href="./assets/dist-
|
|
29
|
+
<link rel="modulepreload" crossorigin href="./assets/hooks-D6EE7BIt.js">
|
|
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-
|
|
37
|
-
<link rel="modulepreload" crossorigin href="./assets/text-
|
|
38
|
-
<link rel="modulepreload" crossorigin href="./assets/shade-app-B3heOAfz-
|
|
39
|
-
<link rel="modulepreload" crossorigin href="./assets/dist-
|
|
40
|
-
<link rel="modulepreload" crossorigin href="./assets/dist-
|
|
41
|
-
<link rel="modulepreload" crossorigin href="./assets/
|
|
36
|
+
<link rel="modulepreload" crossorigin href="./assets/router-provider-DSQfprxH.js">
|
|
37
|
+
<link rel="modulepreload" crossorigin href="./assets/text-DU9Hv33_.js">
|
|
38
|
+
<link rel="modulepreload" crossorigin href="./assets/shade-app-B3heOAfz-BhQXxNkT.js">
|
|
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">
|
|
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>
|
|
@@ -62,8 +64,8 @@
|
|
|
62
64
|
<div id="ember-notifications-wormhole"></div>
|
|
63
65
|
<script src="./assets/vendor-25f0bb2b2de85265afdf33da79f14a44.js"></script>
|
|
64
66
|
<script src="./assets/chunk.211.6f7328d63c41536451b3.js"></script>
|
|
65
|
-
<script src="./assets/chunk.
|
|
66
|
-
<script src="./assets/chunk.524.
|
|
67
|
-
<script src="./assets/ghost-
|
|
67
|
+
<script src="./assets/chunk.873.b8fc05a8ab877fb819ed.js"></script>
|
|
68
|
+
<script src="./assets/chunk.524.cd5498dd4e195f679266.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)) {
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Dynamically build and execute queries on the API
|
|
4
4
|
*/
|
|
5
5
|
const _ = require('lodash');
|
|
6
|
+
const {resolveRouteData} = require('../routing/api-adapter');
|
|
6
7
|
|
|
7
8
|
// The default settings for a default post query
|
|
8
9
|
const queryDefaults = {
|
|
@@ -93,9 +94,13 @@ async function fetchData(pathOptions, routerOptions, locals) {
|
|
|
93
94
|
// The filter can in theory contain a "%s" e.g. filter="primary_tag:%s"
|
|
94
95
|
promises.push(processQuery(postQuery, pathOptions.slug, locals));
|
|
95
96
|
|
|
97
|
+
const apiCalls = resolveRouteData(routerOptions.data);
|
|
98
|
+
|
|
96
99
|
// CASE: fetch more data defined by the router e.g. tags, authors - see TaxonomyRouter
|
|
97
|
-
_.each(
|
|
98
|
-
|
|
100
|
+
_.each(apiCalls, function (apiCall, name) {
|
|
101
|
+
// Merge into a fresh object: the resolved spec is read again below to
|
|
102
|
+
// shape the response, so it must stay as the adapter resolved it.
|
|
103
|
+
const dataQueryOptions = _.merge({}, apiCall, defaultDataQueryOptions[name]);
|
|
99
104
|
promises.push(processQuery(dataQueryOptions, pathOptions.slug, locals));
|
|
100
105
|
});
|
|
101
106
|
|
|
@@ -107,11 +112,11 @@ async function fetchData(pathOptions, routerOptions, locals) {
|
|
|
107
112
|
|
|
108
113
|
let resultIndex = 1;
|
|
109
114
|
|
|
110
|
-
_.each(
|
|
115
|
+
_.each(apiCalls, function (apiCall, name) {
|
|
111
116
|
if (results[resultIndex]) {
|
|
112
|
-
response.data[name] = results[resultIndex][
|
|
117
|
+
response.data[name] = results[resultIndex][apiCall.resource];
|
|
113
118
|
|
|
114
|
-
if (
|
|
119
|
+
if (apiCall.type === 'browse') {
|
|
115
120
|
response.data[name].meta = results[resultIndex].meta;
|
|
116
121
|
}
|
|
117
122
|
|
|
@@ -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');
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveApiCall = resolveApiCall;
|
|
7
|
+
exports.resolveRouteData = resolveRouteData;
|
|
8
|
+
exports.resolveResourceRead = resolveResourceRead;
|
|
9
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
10
|
+
const errors_1 = __importDefault(require("@tryghost/errors"));
|
|
11
|
+
const config_1 = require("./config");
|
|
12
|
+
/**
|
|
13
|
+
* Not every entry in QUERY is reachable from route data — `previews` and `email`
|
|
14
|
+
* are internal routers with no `type`, so they resolve to no API call.
|
|
15
|
+
*/
|
|
16
|
+
const RESOURCE_CONFIGS = config_1.QUERY;
|
|
17
|
+
/**
|
|
18
|
+
* The entry fields the Content API accepts as query options. Everything else on
|
|
19
|
+
* a data entry is routing metadata (`redirect`) or unsupported (`fields`), and
|
|
20
|
+
* is deliberately not forwarded.
|
|
21
|
+
*/
|
|
22
|
+
const ALLOWED_QUERY_OPTIONS = ['limit', 'order', 'filter', 'include', 'slug', 'visibility', 'status', 'page'];
|
|
23
|
+
function unknownResource(resource) {
|
|
24
|
+
return new errors_1.default.IncorrectUsageError({ message: `Unknown route data resource: ${resource}` });
|
|
25
|
+
}
|
|
26
|
+
// Shorthand names a resource the short way (`tag`), long form the way the API
|
|
27
|
+
// does (`tags`). Both land on the same config.
|
|
28
|
+
function splitShortForm(shortForm) {
|
|
29
|
+
const [key, slug] = shortForm.split('.');
|
|
30
|
+
return [key, slug];
|
|
31
|
+
}
|
|
32
|
+
function shortFormConfig(key) {
|
|
33
|
+
return RESOURCE_CONFIGS[key];
|
|
34
|
+
}
|
|
35
|
+
function longFormConfig(resource) {
|
|
36
|
+
return Object.values(RESOURCE_CONFIGS).find(config => config?.resource === resource);
|
|
37
|
+
}
|
|
38
|
+
function resolveShortForm(shortForm) {
|
|
39
|
+
const [key, slug] = splitShortForm(shortForm);
|
|
40
|
+
const config = shortFormConfig(key);
|
|
41
|
+
if (!config?.type) {
|
|
42
|
+
throw unknownResource(key);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
controller: config.controller,
|
|
46
|
+
type: config.type,
|
|
47
|
+
resource: config.resource,
|
|
48
|
+
options: { ...config.options, slug }
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function resolveLongForm(entry) {
|
|
52
|
+
const config = longFormConfig(entry.resource);
|
|
53
|
+
if (!config) {
|
|
54
|
+
throw unknownResource(entry.resource);
|
|
55
|
+
}
|
|
56
|
+
const options = lodash_1.default.pick(entry, ALLOWED_QUERY_OPTIONS);
|
|
57
|
+
return {
|
|
58
|
+
controller: config.controller,
|
|
59
|
+
type: entry.type,
|
|
60
|
+
resource: config.resource,
|
|
61
|
+
// A `read` targets one known resource, so the resource defaults (e.g.
|
|
62
|
+
// `visibility: public` for tags) apply. A `browse` is author-driven and
|
|
63
|
+
// takes only what the entry asked for.
|
|
64
|
+
options: entry.type === 'read' ? lodash_1.default.defaults(options, config.options) : options
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Resolve a single route data entry into a Content API call.
|
|
69
|
+
*
|
|
70
|
+
* This is the one place that knows how a domain `resource` maps onto a Ghost API
|
|
71
|
+
* controller — routes.yaml talks about `tags`, the API is reached via
|
|
72
|
+
* `tagsPublic`. Callers work with the domain model and never name a controller.
|
|
73
|
+
*
|
|
74
|
+
* @example resolveApiCall('tag.food')
|
|
75
|
+
* // => {controller: 'tagsPublic', type: 'read', resource: 'tags', options: {slug: 'food', visibility: 'public'}}
|
|
76
|
+
*/
|
|
77
|
+
function resolveApiCall(entry) {
|
|
78
|
+
return typeof entry === 'string' ? resolveShortForm(entry) : resolveLongForm(entry);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Resolve a route's whole `data` block, keyed the way the theme sees it.
|
|
82
|
+
*
|
|
83
|
+
* Top-level shorthand (`data: tag.food`) has no author-given name, so it is
|
|
84
|
+
* keyed by its resource shorthand — `tag` — matching what themes already expect.
|
|
85
|
+
*/
|
|
86
|
+
function resolveRouteData(routeData) {
|
|
87
|
+
if (!routeData) {
|
|
88
|
+
return {};
|
|
89
|
+
}
|
|
90
|
+
if (typeof routeData === 'string') {
|
|
91
|
+
const [key] = splitShortForm(routeData);
|
|
92
|
+
return { [key]: resolveApiCall(routeData) };
|
|
93
|
+
}
|
|
94
|
+
return lodash_1.default.mapValues(routeData, entry => resolveApiCall(entry));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The resource read a data entry claims, or `null` if it claims none.
|
|
98
|
+
*
|
|
99
|
+
* Only a `read` names a single resource; a `browse` pulls a set and claims
|
|
100
|
+
* nothing. Unlike {@link resolveApiCall} this answers a routing question, so an
|
|
101
|
+
* entry it cannot make sense of is simply not a claim rather than an error.
|
|
102
|
+
*
|
|
103
|
+
* @example resolveResourceRead('tag.food') // => {resource: 'tags', slug: 'food'}
|
|
104
|
+
*/
|
|
105
|
+
function resolveResourceRead(entry) {
|
|
106
|
+
if (typeof entry === 'string') {
|
|
107
|
+
const [key, slug] = splitShortForm(entry);
|
|
108
|
+
const config = shortFormConfig(key);
|
|
109
|
+
return config?.type === 'read' ? { resource: config.resource, slug } : null;
|
|
110
|
+
}
|
|
111
|
+
if (entry.type !== 'read') {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
return longFormConfig(entry.resource) ? { resource: entry.resource, slug: entry.slug } : null;
|
|
115
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import errors from '@tryghost/errors';
|
|
3
|
+
import {QUERY} from './config';
|
|
4
|
+
import type {RouteData, DataEntry, DataShortForm, DataLongFormEntry} from '@tryghost/adapter-base-route-settings';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A resolved Content API call: which controller to reach for, which method to
|
|
8
|
+
* call on it, and the options to call it with.
|
|
9
|
+
*/
|
|
10
|
+
export interface ApiCallSpec {
|
|
11
|
+
controller: string;
|
|
12
|
+
type: 'read' | 'browse';
|
|
13
|
+
resource: string;
|
|
14
|
+
options: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The resource read that a data entry claims — the router that declares it owns
|
|
19
|
+
* that slug, and other routers redirect to it.
|
|
20
|
+
*/
|
|
21
|
+
export interface ResourceRead {
|
|
22
|
+
resource: string;
|
|
23
|
+
slug: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface ResourceConfig {
|
|
27
|
+
controller: string;
|
|
28
|
+
type?: 'read' | 'browse';
|
|
29
|
+
resource: string;
|
|
30
|
+
options?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Not every entry in QUERY is reachable from route data — `previews` and `email`
|
|
35
|
+
* are internal routers with no `type`, so they resolve to no API call.
|
|
36
|
+
*/
|
|
37
|
+
const RESOURCE_CONFIGS: Record<string, ResourceConfig | undefined> = QUERY;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The entry fields the Content API accepts as query options. Everything else on
|
|
41
|
+
* a data entry is routing metadata (`redirect`) or unsupported (`fields`), and
|
|
42
|
+
* is deliberately not forwarded.
|
|
43
|
+
*/
|
|
44
|
+
const ALLOWED_QUERY_OPTIONS = ['limit', 'order', 'filter', 'include', 'slug', 'visibility', 'status', 'page'];
|
|
45
|
+
|
|
46
|
+
function unknownResource(resource: string) {
|
|
47
|
+
return new errors.IncorrectUsageError({message: `Unknown route data resource: ${resource}`});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Shorthand names a resource the short way (`tag`), long form the way the API
|
|
51
|
+
// does (`tags`). Both land on the same config.
|
|
52
|
+
function splitShortForm(shortForm: DataShortForm): [string, string] {
|
|
53
|
+
const [key, slug] = shortForm.split('.');
|
|
54
|
+
return [key, slug];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function shortFormConfig(key: string): ResourceConfig | undefined {
|
|
58
|
+
return RESOURCE_CONFIGS[key];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function longFormConfig(resource: string): ResourceConfig | undefined {
|
|
62
|
+
return Object.values(RESOURCE_CONFIGS).find(config => config?.resource === resource);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function resolveShortForm(shortForm: DataShortForm): ApiCallSpec {
|
|
66
|
+
const [key, slug] = splitShortForm(shortForm);
|
|
67
|
+
const config = shortFormConfig(key);
|
|
68
|
+
|
|
69
|
+
if (!config?.type) {
|
|
70
|
+
throw unknownResource(key);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
controller: config.controller,
|
|
75
|
+
type: config.type,
|
|
76
|
+
resource: config.resource,
|
|
77
|
+
options: {...config.options, slug}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function resolveLongForm(entry: DataLongFormEntry): ApiCallSpec {
|
|
82
|
+
const config = longFormConfig(entry.resource);
|
|
83
|
+
|
|
84
|
+
if (!config) {
|
|
85
|
+
throw unknownResource(entry.resource);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const options: Record<string, unknown> = _.pick(entry, ALLOWED_QUERY_OPTIONS);
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
controller: config.controller,
|
|
92
|
+
type: entry.type,
|
|
93
|
+
resource: config.resource,
|
|
94
|
+
// A `read` targets one known resource, so the resource defaults (e.g.
|
|
95
|
+
// `visibility: public` for tags) apply. A `browse` is author-driven and
|
|
96
|
+
// takes only what the entry asked for.
|
|
97
|
+
options: entry.type === 'read' ? _.defaults(options, config.options) : options
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Resolve a single route data entry into a Content API call.
|
|
103
|
+
*
|
|
104
|
+
* This is the one place that knows how a domain `resource` maps onto a Ghost API
|
|
105
|
+
* controller — routes.yaml talks about `tags`, the API is reached via
|
|
106
|
+
* `tagsPublic`. Callers work with the domain model and never name a controller.
|
|
107
|
+
*
|
|
108
|
+
* @example resolveApiCall('tag.food')
|
|
109
|
+
* // => {controller: 'tagsPublic', type: 'read', resource: 'tags', options: {slug: 'food', visibility: 'public'}}
|
|
110
|
+
*/
|
|
111
|
+
export function resolveApiCall(entry: DataEntry): ApiCallSpec {
|
|
112
|
+
return typeof entry === 'string' ? resolveShortForm(entry) : resolveLongForm(entry);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Resolve a route's whole `data` block, keyed the way the theme sees it.
|
|
117
|
+
*
|
|
118
|
+
* Top-level shorthand (`data: tag.food`) has no author-given name, so it is
|
|
119
|
+
* keyed by its resource shorthand — `tag` — matching what themes already expect.
|
|
120
|
+
*/
|
|
121
|
+
export function resolveRouteData(routeData?: RouteData): Record<string, ApiCallSpec> {
|
|
122
|
+
if (!routeData) {
|
|
123
|
+
return {};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (typeof routeData === 'string') {
|
|
127
|
+
const [key] = splitShortForm(routeData);
|
|
128
|
+
|
|
129
|
+
return {[key]: resolveApiCall(routeData)};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return _.mapValues(routeData, entry => resolveApiCall(entry));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The resource read a data entry claims, or `null` if it claims none.
|
|
137
|
+
*
|
|
138
|
+
* Only a `read` names a single resource; a `browse` pulls a set and claims
|
|
139
|
+
* nothing. Unlike {@link resolveApiCall} this answers a routing question, so an
|
|
140
|
+
* entry it cannot make sense of is simply not a claim rather than an error.
|
|
141
|
+
*
|
|
142
|
+
* @example resolveResourceRead('tag.food') // => {resource: 'tags', slug: 'food'}
|
|
143
|
+
*/
|
|
144
|
+
export function resolveResourceRead(entry: DataEntry): ResourceRead | null {
|
|
145
|
+
if (typeof entry === 'string') {
|
|
146
|
+
const [key, slug] = splitShortForm(entry);
|
|
147
|
+
const config = shortFormConfig(key);
|
|
148
|
+
|
|
149
|
+
return config?.type === 'read' ? {resource: config.resource, slug} : null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (entry.type !== 'read') {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return longFormConfig(entry.resource) ? {resource: entry.resource, slug: entry.slug} : null;
|
|
157
|
+
}
|
|
@@ -5,6 +5,7 @@ const ParentRouter = require('./parent-router');
|
|
|
5
5
|
const controllers = require('./controllers');
|
|
6
6
|
const middleware = require('./middleware');
|
|
7
7
|
const RSSRouter = require('./rss-router');
|
|
8
|
+
const {toExpressNotation} = require('./permalink-adapter');
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* @description Collection Router for post resource.
|
|
@@ -26,15 +27,16 @@ class CollectionRouter extends ParentRouter {
|
|
|
26
27
|
|
|
27
28
|
this.rss = object.rss !== false;
|
|
28
29
|
|
|
30
|
+
// convert domain `{slug}` -> Express/URL-service `:slug` at this boundary
|
|
29
31
|
this.permalinks = {
|
|
30
|
-
value: object.permalink
|
|
32
|
+
value: toExpressNotation(object.permalink)
|
|
31
33
|
};
|
|
32
34
|
|
|
33
35
|
// @NOTE: see renderer/templates - we use unshift to prepend the templates
|
|
34
36
|
this.templates = (object.templates || []).reverse();
|
|
35
37
|
|
|
36
38
|
this.filter = object.filter;
|
|
37
|
-
this.data = object.data || {
|
|
39
|
+
this.data = object.data || {};
|
|
38
40
|
this.order = object.order;
|
|
39
41
|
this.limit = object.limit;
|
|
40
42
|
|
|
@@ -116,7 +118,7 @@ class CollectionRouter extends ParentRouter {
|
|
|
116
118
|
templates: this.templates,
|
|
117
119
|
identifier: this.identifier,
|
|
118
120
|
name: this.routerName,
|
|
119
|
-
data: this.data
|
|
121
|
+
data: this.data
|
|
120
122
|
};
|
|
121
123
|
|
|
122
124
|
next();
|