ghost 6.57.1 → 6.58.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/LICENSE +22 -0
- package/bin/validate-adapters.js +1 -5
- package/components/ghost-storage-base-3.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-cache-0.2.0.tgz +0 -0
- package/components/tryghost-adapter-base-jobs-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-redirects-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-route-settings-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-scheduling-0.2.2.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.1.2.tgz +0 -0
- package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-i18n-0.0.0.tgz +0 -0
- package/components/tryghost-kg-card-factory-5.2.4.tgz +0 -0
- package/components/tryghost-kg-clean-basic-html-4.3.4.tgz +0 -0
- package/components/tryghost-kg-converters-1.2.5.tgz +0 -0
- package/components/tryghost-kg-default-cards-10.3.5.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.2.0.tgz +0 -0
- package/components/tryghost-kg-default-transforms-1.3.4.tgz +0 -0
- package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
- package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
- package/components/tryghost-kg-markdown-html-renderer-7.2.4.tgz +0 -0
- package/components/tryghost-kg-utils-1.1.4.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/boot.js +35 -3
- package/core/built/admin/assets/{about-BNojRaxf.js → about-B_BvSyLF.js} +1 -1
- package/core/built/admin/assets/{account-migration-DMS8JsM-.js → account-migration-oJUGxnzT.js} +1 -1
- package/core/built/admin/assets/activitypub/{account-migration-DHFbePl6.js → account-migration-BpDeIF3G.js} +8 -8
- package/core/built/admin/assets/activitypub/activitypub.js +4 -4
- package/core/built/admin/assets/activitypub/{avatar-CT4tS2_S.js → avatar-B0SpBPVL.js} +3 -3
- package/core/built/admin/assets/activitypub/{avatar-flipboard-ByYWKipo.js → avatar-flipboard-DKt1LGcE.js} +3 -3
- package/core/built/admin/assets/activitypub/{bluesky-sharing-srVnSHDz.js → bluesky-sharing-aPMtrS3L.js} +10 -10
- package/core/built/admin/assets/activitypub/{chunk-KS7C4IRE-D4HEcEwi.js → chunk-KS7C4IRE-CnTrsgmM.js} +26 -15
- package/core/built/admin/assets/activitypub/{content-formatters-C2sos5Ht.js → content-formatters-BORfuA9G.js} +318 -284
- package/core/built/admin/assets/activitypub/{copy-B1UBTOoZ.js → copy-D-YvNi2E.js} +2 -2
- package/core/built/admin/assets/activitypub/{dist-MPsb2WZ1.js → dist-Dqggkccr.js} +5 -5
- package/core/built/admin/assets/activitypub/{domain-DzcM9Dzo.js → domain-CPdiB27_.js} +10 -10
- package/core/built/admin/assets/activitypub/{edit-profile-CsQ_4xAk.js → edit-profile-BY2PawIe.js} +7 -7
- package/core/built/admin/assets/activitypub/{explore-CJe0DZBK.js → explore-Sp9bgAwq.js} +11 -11
- package/core/built/admin/assets/activitypub/{feed-CKV3qWON.js → feed-BjtF4ohL.js} +10 -10
- package/core/built/admin/assets/activitypub/{field-DckHfDJf.js → field-BDOYVTg6.js} +4 -4
- package/core/built/admin/assets/activitypub/{hash-Dlp8RM55.js → hash-DqXYHgzG.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-CsPy4R0M.js → inbox-CZ7IOAMn.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-DAsjzUUe.js → inbox-z1o2j1Tb.js} +11 -11
- package/core/built/admin/assets/activitypub/{label-DWyo9E5T.js → label-1jhN-qhD.js} +4 -4
- package/core/built/admin/assets/activitypub/layout-BRMezuty.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-B0Inc03M.js → moderation-CZudJi8N.js} +9 -9
- package/core/built/admin/assets/activitypub/{note-CSE54lER.js → note-nr_m_5yb.js} +8 -8
- package/core/built/admin/assets/activitypub/{notifications-RSwbKqdh.js → notifications-BdcyivbT.js} +10 -10
- package/core/built/admin/assets/activitypub/{onboarding-BFDkzeR2.js → onboarding-B4kwav9u.js} +2 -2
- package/core/built/admin/assets/activitypub/{onboarding-D6rcBdPe.js → onboarding-DZNElJYP.js} +3 -3
- package/core/built/admin/assets/activitypub/{preferences-CE231n2_.js → preferences-CNqy1x9C.js} +13 -13
- package/core/built/admin/assets/activitypub/{profile-aaQ1j1Eo.js → profile-DlY4rhbO.js} +15 -15
- package/core/built/admin/assets/activitypub/{reply-Cjb0Vs3m.js → reply-DASIN0Ec.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-Djb0mc9k.js → routes-CEHdEZzS.js} +31 -31
- package/core/built/admin/assets/activitypub/{separator-D8pROI5n.js → separator-B3k35sUV.js} +4 -4
- package/core/built/admin/assets/activitypub/{settings-DMc32IQl.js → settings-CrSV1cux.js} +6 -6
- package/core/built/admin/assets/activitypub/{site-DVIcsohX.js → site-CtBUCPBz.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-1-9Yey9usF.js → step-1-D9jGWyAy.js} +7 -7
- package/core/built/admin/assets/activitypub/{step-2-DdYmKRXV.js → step-2-Jz_enuo9.js} +7 -7
- package/core/built/admin/assets/activitypub/{step-3-hdSkcjZU.js → step-3-KpUqpGWi.js} +12 -12
- package/core/built/admin/assets/activitypub/{tabs-CUqseYzQ.js → tabs-DvlsxTCI.js} +7 -7
- package/core/built/admin/assets/activitypub/{topic-filter-Coni6OXM.js → topic-filter-CIN1E2jg.js} +4 -4
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-MeHTPMQv.js → use-activity-pub-queries-CATFd6YV.js} +4 -4
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-B046AM38.js → use-navigate-with-base-path-iCkcbMGk.js} +2 -2
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-1AO-Xob6.js → use-reply-chain-data-DJ0vhA8V.js} +6 -6
- package/core/built/admin/assets/activitypub/{users-BLeiOTHc.js → users-sgJ6GNZX.js} +12 -11
- package/core/built/admin/assets/activitypub/{x-BRfRYd16.js → x-Cy2jUiYM.js} +2 -2
- package/core/built/admin/assets/add-integration-modal-BW23PDYs.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-M0ls8BKO.js +1 -0
- package/core/built/admin/assets/{add-recommendation-modal-D-3LOrdd.js → add-recommendation-modal-B0NeBMzl.js} +1 -1
- package/core/built/admin/assets/{analytics-DTIMRhWw.js → analytics-BC2oR8ay.js} +1 -1
- package/core/built/admin/assets/announcement-bar-modal-pXBqjQE_.js +1 -0
- package/core/built/admin/assets/{api-keys-_iCT4dxr.js → api-keys-BgKr003d.js} +1 -1
- package/core/built/admin/assets/{api-keys-Dx4NeNpK.js → api-keys-Df6uv1dT.js} +1 -1
- package/core/built/admin/assets/{audience-DkknNqhZ.js → audience-BY8od8If.js} +1 -1
- package/core/built/admin/assets/{automated-emails-PayPCT8L.js → automated-emails-28c2Lbb3.js} +1 -1
- package/core/built/admin/assets/{automations-DvSU7QhW.js → automations-DCs6Wady.js} +1 -1
- package/core/built/admin/assets/{automations-162q5HjL.js → automations-Dzp_QnON.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-yZ9A_jL8.js → bluesky-sharing-D0P42Cws.js} +1 -1
- package/core/built/admin/assets/{breadcrumb-CjOH7LCU.js → breadcrumb-MTj_cKLb.js} +1 -1
- package/core/built/admin/assets/card-CiiE7QfM.js +1 -0
- package/core/built/admin/assets/{chart-helpers-DGxvWnBT.js → chart-helpers-DcO3k_vA.js} +1 -1
- package/core/built/admin/assets/{checkbox-BSUcnNq_.js → checkbox-LmClhqcS.js} +1 -1
- package/core/built/admin/assets/{chunk.424.4a27628efdade15c2dab.js → chunk.408.1a258af360eb8d905508.js} +40 -37
- package/core/built/admin/assets/{chunk.571.40f093ed6d883993714e.js → chunk.492.a9da46ca956b10116774.js} +1342 -1342
- package/core/built/admin/assets/{chunk.571.40f093ed6d883993714e.js.LICENSE.txt → chunk.492.a9da46ca956b10116774.js.LICENSE.txt} +1 -1
- package/core/built/admin/assets/chunk.524.4c693c3a00ac91df34fa.js +25 -0
- package/core/built/admin/assets/chunk.582.20b600e329e58d12d7c2.js +27 -0
- package/core/built/admin/assets/code-editor-view-DqTOUnbM.js +1 -0
- package/core/built/admin/assets/code-editor-view-bA0lfxUL.js +1 -0
- package/core/built/admin/assets/{debounce-Cx5B_9OI.js → color-picker-CBlJMv3y.js} +2 -2
- package/core/built/admin/assets/color-picker-field-Cv9GOJQZ.js +1 -0
- package/core/built/admin/assets/{combobox-5rdgDrDV.js → combobox-BbPJzjCp.js} +1 -1
- package/core/built/admin/assets/command-BrhXIlDr.js +1 -0
- package/core/built/admin/assets/comments-Cu4rD1aJ.js +1 -0
- package/core/built/admin/assets/confirmation-provider-BEdrnHns.js +1 -0
- package/core/built/admin/assets/{content-api-modal-BtW4Z1-1.js → content-api-modal-BOFWRUkC.js} +1 -1
- package/core/built/admin/assets/{copy-field-CEp_XieW.js → copy-field-8biQvNMD.js} +1 -1
- package/core/built/admin/assets/custom-field-type-option-CNhAgHbJ.js +1 -0
- package/core/built/admin/assets/custom-integration-modal-CrGOI8IB.js +1 -0
- package/core/built/admin/assets/{date-range-select-B3Ij1Rqg.js → date-range-select-Bsh4gIek.js} +1 -1
- package/core/built/admin/assets/debounce-pscB46sW.js +1 -0
- package/core/built/admin/assets/design-and-theme-modal-DWZguwWX.js +23 -0
- package/core/built/admin/assets/{dirty-confirm-dialog-YE9L21gY.js → dirty-confirm-dialog-DmdMpgyN.js} +1 -1
- package/core/built/admin/assets/{disabled-sources-indicator-uIzbWL7K.js → disabled-sources-indicator-BLnmyWgt.js} +1 -1
- package/core/built/admin/assets/dist-4m6pHdc0.js +23 -0
- package/core/built/admin/assets/{dist-DCk0UkGx.js → dist-B6bJuxL3.js} +1 -1
- package/core/built/admin/assets/{dist-CbHbGtQ-.js → dist-BtaTA7Ii.js} +1 -1
- package/core/built/admin/assets/{dist-Q1p9iXwH.js → dist-CZgIBXQN.js} +1 -1
- package/core/built/admin/assets/dist-CiHx7vA5.js +6 -0
- package/core/built/admin/assets/{dist-ARN6XTcR.js → dist-ECAUrdGc.js} +1 -1
- package/core/built/admin/assets/dist-Z97pCNqS.js +11 -0
- package/core/built/admin/assets/{dist-t6AXpf_4.js → dist-zwwGt8Yf.js} +1 -1
- package/core/built/admin/assets/{domain-DzrOAPY8.js → domain-Dp9TRrFp.js} +1 -1
- package/core/built/admin/assets/{dropzone-CzhP33wa.js → dropzone-B21Entqz.js} +1 -1
- package/core/built/admin/assets/{edit-profile-oufs4R4n.js → edit-profile-DG6lpMsr.js} +1 -1
- package/core/built/admin/assets/editor-CPQOrhrn.js +8 -0
- package/core/built/admin/assets/{editor-DtxX27Jz.css → editor-DLioOiRN.css} +1 -1
- package/core/built/admin/assets/{embed-signup-form-modal-Ch3s6lqA.js → embed-signup-form-modal-CgWniDha.js} +2 -2
- package/core/built/admin/assets/esm-CXo5SEPy.js +2 -0
- package/core/built/admin/assets/{explore-CA-R01Br.js → explore-C3rzONJv.js} +1 -1
- package/core/built/admin/assets/{feed-ClC8_Gld.js → feed-DpUwS1cU.js} +1 -1
- package/core/built/admin/assets/{field-B3OPenbP.js → field-BQqLTgHM.js} +1 -1
- package/core/built/admin/assets/{filter-sources-CiPLnG9A.js → filter-sources-FgqoUIL7.js} +1 -1
- package/core/built/admin/assets/{filters-yFvybRMe.js → filters-D0uIMD8n.js} +1 -1
- package/core/built/admin/assets/filters-DZJT29GW.js +1 -0
- package/core/built/admin/assets/{first-promoter-modal-BC0UpYCD.js → first-promoter-modal-DJhQQheG.js} +1 -1
- package/core/built/admin/assets/framework-provider-CFLwK5uS.js +4 -0
- package/core/built/admin/assets/{ghost-d38c30b866e59f2e06a357b5eb844fe5.css → ghost-68f447a1796b93a1f128b649bac8506d.css} +1 -1
- package/core/built/admin/assets/{ghost-d683fbeb945b13155ea669caa5d8db41.js → ghost-ba408063a5922b458b4a8f216cf23251.js} +124 -342
- package/core/built/admin/assets/{ghost-dark-1bffd5099ba7a749303133efacf8480b.css → ghost-dark-28ae4899c92022857f3584694bcb50ef.css} +1 -1
- package/core/built/admin/assets/{gift-link-modal-BKRuqo-k.js → gift-link-modal-sdFLjND9.js} +1 -1
- package/core/built/admin/assets/{gift-links-CVuqLhsZ.js → gift-links-D7BJ9qfe.js} +1 -1
- package/core/built/admin/assets/{global-data-provider-RzW6Bnlf.js → global-data-provider-CixmTX00.js} +1 -1
- package/core/built/admin/assets/{growth-ClNAldfL.js → growth-0YYkBEeS.js} +1 -1
- package/core/built/admin/assets/{growth-Dz8OSG06.js → growth-DpjAPeQT.js} +2 -2
- package/core/built/admin/assets/{history-modal-DIVuQ5Ct.js → history-modal-BWJ4-cJ0.js} +1 -1
- package/core/built/admin/assets/{hooks-D6EE7BIt.js → hooks-CJepWnbB.js} +1 -1
- package/core/built/admin/assets/{html-field-CVZ2sMxw.js → html-field-C-oa5DEl.js} +1 -1
- package/core/built/admin/assets/{iframe-buffering-e8vH4-Qn.js → iframe-buffering-Ba9sDpi2.js} +1 -1
- package/core/built/admin/assets/{images-Ok8FFJ3A.js → images-3cQgwfTD.js} +1 -1
- package/core/built/admin/assets/{inbox-CMUVI6qb.js → inbox-Dz_JblyJ.js} +6 -6
- package/core/built/admin/assets/index-BOJzlYiz.js +67 -0
- package/core/built/admin/assets/index-Bid6LAyc.css +1 -0
- package/core/built/admin/assets/{input-group-2XU-iuh_.js → input-group-DpogNUIt.js} +1 -1
- package/core/built/admin/assets/{integrations-BT6_iJvu.js → integrations-B9yYgci5.js} +1 -1
- package/core/built/admin/assets/{invite-user-modal-DrZ7xxrZ.js → invite-user-modal-DCiQSiuD.js} +1 -1
- package/core/built/admin/assets/{koenig-editor-base-BPj4S760.js → koenig-editor-base-BApy8Q7C.js} +1 -1
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +8328 -8294
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +84 -84
- package/core/built/admin/assets/{koenig-lexical-Cdjv-m3_.js → koenig-lexical-2KuqRwZI.js} +33 -33
- package/core/built/admin/assets/{kpi-card-J8Mj1sDX.js → kpi-card-Ck3tT2Wg.js} +1 -1
- package/core/built/admin/assets/{kpi-card-awos0BMH.js → kpi-card-DDIxptaS.js} +1 -1
- package/core/built/admin/assets/{kpi-helpers-SEhvH-8E.js → kpi-helpers-ssbuy-hD.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-R6BjsKhd.js → kpi-tabs-BqoIM6bI.js} +1 -1
- package/core/built/admin/assets/{label-BMC3dzLI.js → label-DodDsMzn.js} +1 -1
- package/core/built/admin/assets/label-picker-Cvvbmzb5.js +1 -0
- package/core/built/admin/assets/{labels-DAPjKPy2.js → labels-DqvSR6JF.js} +1 -1
- package/core/built/admin/assets/layout-DkkGyev2.js +1 -0
- package/core/built/admin/assets/limit-service-BhiEvqcP.js +20 -0
- package/core/built/admin/assets/{link-helpers-Bzkk68GD.js → link-helpers-kpbU8TWh.js} +1 -1
- package/core/built/admin/assets/luxon-D1RVjjpq.js +1 -0
- package/core/built/admin/assets/member-custom-fields-CvGcpaiW.js +1 -0
- package/core/built/admin/assets/member-detail-CMCMZ47_.js +1 -0
- package/core/built/admin/assets/members-sRl6fNfq.js +11 -0
- package/core/built/admin/assets/{moderation-mPjYHgZW.js → moderation-KhKwGqI1.js} +1 -1
- package/core/built/admin/assets/{multi-select-combobox-CsoyHAiX.js → multi-select-combobox-nhCff0_K.js} +1 -1
- package/core/built/admin/assets/{navigation-modal-D_c0badj.js → navigation-modal-MDJExWDJ.js} +1 -1
- package/core/built/admin/assets/newsletter-BIBHumfV.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-CfjBMH3v.js +1 -0
- package/core/built/admin/assets/{newsletter-emails-B-OLfrvr.js → newsletter-emails-ClDL-7dA.js} +1 -1
- package/core/built/admin/assets/newsletters-CBe-IPzK.js +1 -0
- package/core/built/admin/assets/{newsletters-Du0lzskS.js → newsletters-ILsexy-5.js} +1 -1
- package/core/built/admin/assets/{note-CSVsUKBm.js → note-HnNUOt4d.js} +1 -1
- package/core/built/admin/assets/{notifications-DV9FRtDw.js → notifications-Cj5e-258.js} +1 -1
- package/core/built/admin/assets/nql-lang-CaWrLesS.js +19 -0
- package/core/built/admin/assets/{offers-Um6ab71O.js → offers-DMxebaoK.js} +1 -1
- package/core/built/admin/assets/offers-container-modal-BHwHtixC.js +1 -0
- package/core/built/admin/assets/{onboarding-route--jL5KLPD.js → onboarding-route-D_4jp7Nq.js} +1 -1
- package/core/built/admin/assets/overview-CezDdg-F.js +1 -0
- package/core/built/admin/assets/overview-D5mM51Lj.js +1 -0
- package/core/built/admin/assets/{page-header-DAvDYKO9.js → page-header-VLPJfj_d.js} +1 -1
- package/core/built/admin/assets/{pages-BVMnpI2O.js → pages-Gchxp5c7.js} +1 -1
- package/core/built/admin/assets/{pintura-modal-jiUCxX0Q.js → pintura-modal-BXXJ8Iaa.js} +1 -1
- package/core/built/admin/assets/{portal-frame-D4D4nEO6.js → portal-frame-BLCvF8f-.js} +1 -1
- package/core/built/admin/assets/portal-modal-DN80tAcy.js +1 -0
- package/core/built/admin/assets/{post-analytics-BhAtiFJp.js → post-analytics-Gv81eN_g.js} +1 -1
- package/core/built/admin/assets/post-analytics-header-_ydSY8qO.js +1 -0
- package/core/built/admin/assets/{post-analytics-provider-DGg0FUqs.js → post-analytics-provider-O2YjZMhN.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-DtFAC132.js → post-share-modal-CzYak_a5.js} +1 -1
- package/core/built/admin/assets/{posts-CxG7v0-M.js → posts-DgcUi2rc.js} +1 -1
- package/core/built/admin/assets/preferences-gneLb6LV.js +5 -0
- package/core/built/admin/assets/{preview-modal-DctYx20m.js → preview-modal-Bkq-tgVm.js} +1 -1
- package/core/built/admin/assets/profile-CzXmCNTC.js +1 -0
- package/core/built/admin/assets/{radio-group-CI5_Kf_d.js → radio-group-Dsq5ZEbV.js} +1 -1
- package/core/built/admin/assets/{referrers-B9QDAfYm.js → referrers-C3a2K8qB.js} +1 -1
- package/core/built/admin/assets/{router-provider-DSQfprxH.js → router-provider-CkB_ArLF.js} +1 -1
- package/core/built/admin/assets/{select-CkXqNJDJ.js → select-xuZAuDyS.js} +1 -1
- package/core/built/admin/assets/{settings-ZCj-W56o.js → settings-Ct8pabhr.js} +1 -1
- package/core/built/admin/assets/settings-KSWWQanQ.js +4 -0
- package/core/built/admin/assets/{settings-breadcrumbs-DIq31FwA.js → settings-breadcrumbs-DbPGu-Tu.js} +1 -1
- package/core/built/admin/assets/{share-modal-BNj14g79.js → share-modal-CdiUx9WM.js} +1 -1
- package/core/built/admin/assets/{slack-modal-C6SpMQ-q.js → slack-modal-BP--Z3jE.js} +1 -1
- package/core/built/admin/assets/{sort-button-B-k54ow2.js → sort-button-CjfKdlsL.js} +1 -1
- package/core/built/admin/assets/{source-icon-Cej3sZM6.js → source-icon-DHj1h6Ts.js} +1 -1
- package/core/built/admin/assets/{stats-B2KW8E2y.js → stats-C615kulJ.js} +1 -1
- package/core/built/admin/assets/{stats-view-CVzU2-p5.js → stats-view-BSMRdYiN.js} +1 -1
- package/core/built/admin/assets/{step-1-Dbn1iIMU.js → step-1-pSdGYtIF.js} +1 -1
- package/core/built/admin/assets/{step-2-BahnSuN6.js → step-2-T9Uy4eBD.js} +1 -1
- package/core/built/admin/assets/{step-3-CW04e2ZJ.js → step-3-D4uXe_XG.js} +2 -2
- package/core/built/admin/assets/{stripe-button-BkBZqaGG.js → stripe-button-Bh4p6Wud.js} +1 -1
- package/core/built/admin/assets/stripe-connect-modal-C2vTvepi.js +1 -0
- package/core/built/admin/assets/{table-BtLcEi1M.js → table-DghJxZMH.js} +1 -1
- package/core/built/admin/assets/{tabs-BaWRfg8j.js → tabs-l9c7FjzI.js} +1 -1
- package/core/built/admin/assets/tag-detail-DBw_M2-p.js +2 -0
- package/core/built/admin/assets/{tags-BbygUvNB.js → tags-DoWsAG6l.js} +1 -1
- package/core/built/admin/assets/{tags-BwCgmr5v.js → tags-EmEvJN75.js} +1 -1
- package/core/built/admin/assets/{testimonials-modal--bdzppyh.js → testimonials-modal-BZKePE2T.js} +1 -1
- package/core/built/admin/assets/tier-detail-modal-D65pVWsN.js +1 -0
- package/core/built/admin/assets/{tiers-Da6kxHQP.js → tiers-8iTFjJWg.js} +1 -1
- package/core/built/admin/assets/{toggle-group-CVl-Xigr.js → toggle-group-uJnl42w3.js} +1 -1
- package/core/built/admin/assets/{topic-filter-BoRHRbL1.js → topic-filter-BM7hz0kW.js} +1 -1
- package/core/built/admin/assets/transistor-modal-VZOGN3od.js +1 -0
- package/core/built/admin/assets/{unsplash-modal-CixoRAO2.js → unsplash-modal-CKGfACxF.js} +1 -1
- package/core/built/admin/assets/{use-analytics-data-BiWvcf1u.js → use-analytics-data-IxJcSjc9.js} +1 -1
- package/core/built/admin/assets/use-check-theme-limit-error-CGp3CGT5.js +1 -0
- package/core/built/admin/assets/use-feature-flag-CSq2Lwzt.js +1 -0
- package/core/built/admin/assets/use-filter-params-0hcJJuEJ.js +1 -0
- package/core/built/admin/assets/{use-filterable-api-iMpDZBxD.js → use-filterable-api-CQBtVG-l.js} +1 -1
- package/core/built/admin/assets/{use-growth-stats-Dom8xVzo.js → use-growth-stats-1NW-8eEZ.js} +1 -1
- package/core/built/admin/assets/use-limiter-ffwpsZPp.js +2 -0
- package/core/built/admin/assets/{use-pintura-config-Bj4QmiVk.js → use-pintura-config-BjFChXV1.js} +1 -1
- package/core/built/admin/assets/{use-pintura-editor-DvrslmPE.js → use-pintura-editor-Cb41oJyL.js} +1 -1
- package/core/built/admin/assets/{use-post-referrers-pxIHTXFs.js → use-post-referrers-Dp1BnTAK.js} +1 -1
- package/core/built/admin/assets/{use-reply-chain-data-CmFe0N6F.js → use-reply-chain-data-C0ZUTkfk.js} +1 -1
- package/core/built/admin/assets/{use-setting-group-Cmp_sy-d.js → use-setting-group-Bx8M6FL2.js} +1 -1
- package/core/built/admin/assets/{use-settings-navigation-BmROPrls.js → use-settings-navigation-BOZcat_V.js} +1 -1
- package/core/built/admin/assets/{use-simple-pagination-D5rL3YwO.js → use-simple-pagination-DsEGSJhe.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-query-DP2dMaq7.js → use-tinybird-query-Ci_DiPkX.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-DrK_skPQ.js → use-tinybird-token-CsUwc722.js} +1 -1
- package/core/built/admin/assets/use-upgrade-route-B3_DUiuT.js +1 -0
- package/core/built/admin/assets/{use-url-input-ChrUZBFf.js → use-url-input-BEZJpVgN.js} +2 -2
- package/core/built/admin/assets/user-detail-modal-595z1N5r.js +1 -0
- package/core/built/admin/assets/{users-B6hIds6n.js → users-DmGMPfw7.js} +1 -1
- package/core/built/admin/assets/virtual-list-D5ugXyZY.js +1 -0
- package/core/built/admin/assets/{web-D71mjB2r.js → web-CAta3lRE.js} +1 -1
- package/core/built/admin/assets/web-Ds9_wWJK.js +2 -0
- package/core/built/admin/assets/zapier-modal-CcfDZY53.js +1 -0
- package/core/built/admin/index.html +12 -12
- package/core/frontend/apps/private-blogging/lib/middleware.js +5 -58
- package/core/frontend/helpers/ghost_head.js +52 -0
- package/core/frontend/meta/asset-url.js +20 -9
- package/core/frontend/public/cards.manifest.json +1 -0
- package/core/frontend/public/ghost-stats.min.js +1 -1
- package/core/frontend/services/assets-minification/card-assets.js +121 -46
- package/core/frontend/services/assets-minification/index.js +13 -4
- package/core/frontend/services/data/fetch-data.js +7 -14
- package/core/frontend/services/llms/service.js +27 -6
- package/core/frontend/services/proxy.js +1 -0
- package/core/frontend/services/routing/api-adapter.js +11 -5
- package/core/frontend/services/routing/collection-router.js +1 -2
- package/core/frontend/services/routing/controllers/entry/markdown.js +63 -5
- package/core/frontend/services/routing/controllers/entry.js +1 -1
- package/core/frontend/services/routing/controllers/previews.js +0 -3
- package/core/frontend/services/routing/events.js +2 -1
- package/core/frontend/services/routing/parent-router.js +0 -22
- package/core/frontend/services/routing/router-manager.js +2 -2
- package/core/frontend/services/routing/static-pages-router.js +0 -1
- package/core/frontend/services/sitemap/handler.js +3 -4
- package/core/frontend/services/sitemap/site-map-manager.js +1 -2
- package/core/frontend/services/theme-engine/i18n/i18n.js +0 -33
- package/core/frontend/web/middleware/llms-discovery.js +2 -2
- package/core/frontend/web/routers/serve-public-file.js +33 -3
- package/core/frontend/web/site.js +5 -4
- package/core/server/adapters/jobs/InMemoryJobsBackend.js +113 -0
- package/core/server/adapters/redirects/S3RedirectsStore.js +33 -13
- package/core/server/adapters/route-settings/S3RouteSettingsStore.js +33 -13
- package/core/server/adapters/scheduling/scheduling-default.js +6 -7
- package/core/server/adapters/storage/LocalStorageBase.js +1 -3
- package/core/server/api/endpoints/index.js +0 -4
- package/core/server/api/endpoints/member-custom-fields.js +15 -4
- package/core/server/api/endpoints/pages.js +3 -11
- package/core/server/api/endpoints/posts.js +3 -11
- package/core/server/api/endpoints/utils/api-filter-utils.js +15 -1
- package/core/server/api/endpoints/utils/serializers/input/settings.js +4 -0
- package/core/server/api/endpoints/utils/serializers/output/index.js +0 -4
- package/core/server/api/endpoints/utils/serializers/output/mappers/email-batches.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/mappers/snippets.js +0 -1
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.js +1 -0
- package/core/server/data/exporter/table-lists.js +4 -1
- package/core/server/data/migrations/utils/schema.js +5 -3
- package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +19 -7
- package/core/server/data/migrations/versions/6.58/2026-08-10-08-20-50-add-machine-payments-settings.js +41 -0
- package/core/server/data/migrations/versions/6.58/2026-08-10-08-21-00-add-machine-payment-events-table.js +18 -0
- package/core/server/data/migrations/versions/6.58/2026-08-10-15-24-09-reset-custom-field-definitions-for-underscored-keys.js +66 -0
- package/core/server/data/migrations/versions/6.58/2026-08-11-10-00-00-swap-custom-field-values-to-key-fk.js +65 -0
- package/core/server/data/migrations/versions/6.58/2026-08-11-10-34-25-remove-legacy-explore-integration.js +131 -0
- package/core/server/data/migrations/versions/6.58/2026-08-11-16-00-00-add-sort-order-to-members-custom-fields.js +13 -0
- package/core/server/data/migrations/versions/6.58/2026-08-11-21-22-48-rename-email-batches-provider-id.js +8 -0
- package/core/server/data/migrations/versions/6.58/2026-08-13-16-07-33-add-automation-runs-automation-id-created-at-index.js +28 -0
- package/core/server/data/schema/README.md +87 -0
- package/core/server/data/schema/commands.js +5 -2
- package/core/server/data/schema/default-settings/default-settings.json +27 -0
- package/core/server/data/schema/fixtures/fixtures.json +0 -21
- package/core/server/data/schema/schema.js +37 -9
- package/core/server/data/seeders/data-generator.js +3 -1
- package/core/server/data/seeders/importers/automation-action-edges-importer.js +38 -0
- package/core/server/data/seeders/importers/automation-action-revisions-importer.js +139 -0
- package/core/server/data/seeders/importers/automation-actions-importer.js +84 -0
- package/core/server/data/seeders/importers/automation-run-steps-importer.js +134 -0
- package/core/server/data/seeders/importers/automation-runs-importer.js +97 -0
- package/core/server/data/seeders/importers/automations-importer.js +78 -0
- package/core/server/data/seeders/importers/benefits-importer.js +1 -1
- package/core/server/data/seeders/importers/comment-reports-importer.js +5 -5
- package/core/server/data/seeders/importers/comments-importer.js +6 -6
- package/core/server/data/seeders/importers/email-batches-importer.js +9 -8
- package/core/server/data/seeders/importers/email-recipient-failures-importer.js +1 -1
- package/core/server/data/seeders/importers/email-recipients-importer.js +12 -12
- package/core/server/data/seeders/importers/emails-importer.js +7 -7
- package/core/server/data/seeders/importers/index.js +6 -0
- package/core/server/data/seeders/importers/labels-importer.js +4 -4
- package/core/server/data/seeders/importers/members-click-events-importer.js +4 -4
- package/core/server/data/seeders/importers/members-created-events-importer.js +5 -5
- package/core/server/data/seeders/importers/members-feedback-importer.js +7 -7
- package/core/server/data/seeders/importers/members-importer.js +5 -5
- package/core/server/data/seeders/importers/members-labels-importer.js +1 -1
- package/core/server/data/seeders/importers/members-login-events-importer.js +4 -4
- package/core/server/data/seeders/importers/members-newsletters-importer.js +1 -1
- package/core/server/data/seeders/importers/members-paid-subscription-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-products-importer.js +3 -3
- package/core/server/data/seeders/importers/members-status-events-importer.js +4 -4
- package/core/server/data/seeders/importers/members-stripe-customers-importer.js +3 -3
- package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +8 -8
- package/core/server/data/seeders/importers/members-subscribe-events-importer.js +3 -3
- package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +4 -4
- package/core/server/data/seeders/importers/newsletters-importer.js +1 -1
- package/core/server/data/seeders/importers/offer-redemptions-importer.js +6 -6
- package/core/server/data/seeders/importers/offers-importer.js +4 -4
- package/core/server/data/seeders/importers/posts-authors-importer.js +1 -1
- package/core/server/data/seeders/importers/posts-importer.js +5 -5
- package/core/server/data/seeders/importers/posts-products-importer.js +1 -1
- package/core/server/data/seeders/importers/posts-tags-importer.js +1 -1
- package/core/server/data/seeders/importers/products-benefits-importer.js +1 -1
- package/core/server/data/seeders/importers/products-importer.js +1 -1
- package/core/server/data/seeders/importers/recommendation-click-events-importer.js +1 -1
- package/core/server/data/seeders/importers/recommendation-subscribe-events-importer.js +1 -1
- package/core/server/data/seeders/importers/recommendations-importer.js +1 -1
- package/core/server/data/seeders/importers/redirects-importer.js +1 -1
- package/core/server/data/seeders/importers/roles-users-importer.js +1 -1
- package/core/server/data/seeders/importers/stripe-prices-importer.js +1 -1
- package/core/server/data/seeders/importers/stripe-products-importer.js +1 -1
- package/core/server/data/seeders/importers/table-importer.js +92 -91
- package/core/server/data/seeders/importers/tags-importer.js +3 -3
- package/core/server/data/seeders/importers/users-importer.js +3 -3
- package/core/server/data/seeders/importers/web-mentions-importer.js +3 -3
- package/core/server/data/seeders/utils/database-date.js +14 -18
- package/core/server/data/seeders/utils/json-importer.js +1 -1
- package/core/server/data/seeders/utils/random.js +8 -7
- package/core/server/data/seeders/utils/topological-sort.js +5 -3
- package/core/server/data/tinybird/ARCHITECTURE.md +1 -2
- package/core/server/models/base/plugins/crud.js +0 -5
- package/core/server/models/index.js +2 -0
- package/core/server/models/machine-payment-event.js +18 -0
- package/core/server/models/member.js +24 -0
- package/core/server/models/settings.js +32 -3
- package/core/server/models/user.js +1 -1
- package/core/server/services/README.md +30 -0
- package/core/server/services/activitypub/activity-pub-service.js +2 -3
- package/core/server/services/adapter-manager/base-classes.js +3 -1
- package/core/server/services/auth/passwordreset.js +47 -51
- package/core/server/services/automations/database-automations-repository.js +19 -3
- package/core/server/services/automations/poll.js +2 -8
- package/core/server/services/comments/comments-service.js +4 -16
- package/core/server/services/comments/index.js +1 -3
- package/core/server/services/email-analytics/email-analytics-service-wrapper.js +68 -119
- package/core/server/services/email-analytics/email-analytics-service.js +73 -229
- package/core/server/services/email-analytics/event-processing-result.js +0 -10
- package/core/server/services/email-analytics/fetch-mailgun-events.js +25 -0
- package/core/server/services/email-analytics/index.js +35 -67
- package/core/server/services/email-analytics/lib/queries.js +88 -51
- package/core/server/services/email-analytics/newsletter-email-analytics-batch-processor.js +4 -1
- package/core/server/services/email-service/batch-sending-service.js +1 -1
- package/core/server/services/email-service/email-event-processor.js +12 -12
- package/core/server/services/email-service/events/email-bounced-event.js +8 -46
- package/core/server/services/email-service/events/email-delivered-event.js +8 -36
- package/core/server/services/email-service/events/email-opened-event.js +8 -36
- package/core/server/services/email-service/events/email-temporary-bounced-event.js +8 -46
- package/core/server/services/email-service/events/email-unsubscribed-event.js +8 -31
- package/core/server/services/email-service/events/spam-complaint-event.js +8 -31
- package/core/server/services/email-service/newsletter-email-event-storage.js +8 -7
- package/core/server/services/email-service/sending-service.js +1 -1
- package/core/server/services/email-suppression-list/mailgun-email-suppression-list.js +2 -2
- package/core/server/services/email-suppression-list/service.js +1 -3
- package/core/server/services/explore-ping/explore-ping-service.js +1 -6
- package/core/server/services/explore-ping/index.js +0 -2
- package/core/server/services/gifts/index.js +109 -3
- package/core/server/services/gifts/jobs/clean-gifts-job.js +1 -1
- package/core/server/services/gifts/jobs/send-gift-reminders-job.js +1 -1
- package/core/server/services/jobs-service/index.js +36 -0
- package/core/server/services/jobs-service/job.js +6 -0
- package/core/server/services/jobs-service/jobs-service.js +91 -0
- package/core/server/services/jobs-service/register-job-handlers.js +6 -0
- package/core/server/services/lib/mailgun-client.js +1 -1
- package/core/server/services/machine-payments/README.md +23 -0
- package/core/server/services/machine-payments/adapters/mpp-adapter.js +195 -0
- package/core/server/services/machine-payments/content-loader.js +89 -0
- package/core/server/services/machine-payments/eligibility.js +6 -0
- package/core/server/services/machine-payments/events/machine-payment-event-repository.js +58 -0
- package/core/server/services/machine-payments/events/machine-payment-event.js +46 -0
- package/core/server/services/machine-payments/index.js +87 -0
- package/core/server/services/machine-payments/pricing.js +54 -0
- package/core/server/services/machine-payments/service.js +275 -0
- package/core/server/services/machine-payments/stripe/deposit-address-store.js +157 -0
- package/core/server/services/machine-payments/stripe/payment-recorder.js +85 -0
- package/core/server/services/machine-payments/stripe/stripe-client-options.js +25 -0
- package/core/server/services/machine-payments/types.js +2 -0
- package/core/server/services/members/import-export/csv/parse.js +9 -1
- package/core/server/services/members/import-export/import/completion-email.js +61 -27
- package/core/server/services/members/import-export/import/email-template.js +28 -15
- package/core/server/services/members/import-export/import/importer.js +99 -51
- package/core/server/services/members/import-export/import/spool.js +1 -1
- package/core/server/services/members/import-export/index.js +24 -1
- package/core/server/services/members/members-api/services/member-bread-service.js +2 -2
- package/core/server/services/members/members-config-provider.js +12 -2
- package/core/server/services/members-custom-fields/actions.js +2 -1
- package/core/server/services/members-custom-fields/definitions-service.js +109 -27
- package/core/server/services/members-custom-fields/filter.js +199 -0
- package/core/server/services/members-custom-fields/key.js +37 -0
- package/core/server/services/members-custom-fields/queries.js +15 -0
- package/core/server/services/members-custom-fields/schema.js +1 -1
- package/core/server/services/members-custom-fields/values-service.js +18 -14
- package/core/server/services/members-events/last-seen-at-updater.js +1 -1
- package/core/server/services/oembed/oembed-service.js +8 -2
- package/core/server/services/permissions/can-this.js +4 -1
- package/core/server/services/posts/posts-service.js +18 -16
- package/core/server/services/public-config/config.js +1 -1
- package/core/server/services/route-settings/dynamic-routing-service.js +2 -0
- package/core/server/services/settings-helpers/settings-helpers.js +0 -1
- package/core/server/services/stats/posts-stats-service.js +0 -2
- package/core/server/services/stripe/stripe-api.js +2 -9
- package/core/server/web/api/endpoints/admin/middleware.js +0 -1
- package/core/server/web/api/endpoints/admin/routes.js +2 -3
- package/core/server/web/comments/routes.js +31 -8
- package/core/shared/config/defaults.json +17 -2
- package/core/shared/config/loader.js +11 -2
- package/core/shared/config/overrides.json +2 -0
- package/core/shared/config/secrets.js +71 -0
- package/core/shared/labs.js +4 -13
- package/core/shared/machine-payments.js +30 -0
- package/core/shared/private-site-access/index.js +68 -0
- package/package.json +48 -43
- package/pnpm-lock.yaml +1412 -1583
- package/pnpm-workspace.yaml +85 -48
- package/bin/validate-adapters.ts +0 -87
- package/components/tryghost-adapter-base-scheduling-0.2.1.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.1.1.tgz +0 -0
- package/components/tryghost-kg-card-factory-5.2.3.tgz +0 -0
- package/components/tryghost-kg-clean-basic-html-4.3.3.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-kg-markdown-html-renderer-7.2.3.tgz +0 -0
- package/components/tryghost-kg-utils-1.1.3.tgz +0 -0
- package/content/themes/casper/assets/built/casper.js.map +0 -1
- package/content/themes/casper/assets/built/global.css.map +0 -1
- package/content/themes/casper/assets/built/screen.css.map +0 -1
- package/content/themes/source/assets/built/screen.css.map +0 -1
- package/content/themes/source/assets/built/source.js.map +0 -1
- package/core/built/admin/assets/activitypub/layout-DM_3pqsU.js +0 -1
- package/core/built/admin/assets/add-integration-modal-DU9ghGLS.js +0 -1
- package/core/built/admin/assets/add-newsletter-modal-DFxuQrYu.js +0 -1
- package/core/built/admin/assets/announcement-bar-modal-DGCcezB6.js +0 -1
- package/core/built/admin/assets/card-aUHX0hyR.js +0 -1
- package/core/built/admin/assets/chunk.524.dce1c51e0bc30fb2718e.js +0 -25
- package/core/built/admin/assets/chunk.582.3a430d5c6a744fd475b6.js +0 -27
- package/core/built/admin/assets/code-editor-view-BcyKABrG.js +0 -1
- package/core/built/admin/assets/color-picker-field-8NoSnhNI.js +0 -1
- package/core/built/admin/assets/command-BOYMbZa_.js +0 -1
- package/core/built/admin/assets/comments-BhNM5CYl.js +0 -1
- package/core/built/admin/assets/confirmation-modal-CYD7x3UQ.js +0 -1
- package/core/built/admin/assets/custom-integration-modal-bk3lNEuQ.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-B2xYKS1I.js +0 -23
- package/core/built/admin/assets/dist-Bg8bSvLA.js +0 -6
- package/core/built/admin/assets/dist-BnFdlebk.js +0 -11
- package/core/built/admin/assets/dist-CsvXCJSe.js +0 -23
- package/core/built/admin/assets/editor-BBKrunMK.js +0 -8
- package/core/built/admin/assets/filters-Bz0HsRie.js +0 -1
- package/core/built/admin/assets/framework-provider-CmtnPXIT.js +0 -4
- package/core/built/admin/assets/index-DUXM0NlS.js +0 -67
- package/core/built/admin/assets/index-Ds2iUoF6.css +0 -1
- package/core/built/admin/assets/label-picker-Bnlru5tO.js +0 -1
- package/core/built/admin/assets/layout-yR9rlvEw.js +0 -1
- package/core/built/admin/assets/limit-modal-COmLevuY.js +0 -1
- package/core/built/admin/assets/limit-service-9fwD33lU.js +0 -20
- package/core/built/admin/assets/member-custom-fields-BvFKEpxJ.js +0 -1
- package/core/built/admin/assets/member-detail-CWdPAe3p.js +0 -1
- package/core/built/admin/assets/members-Bnt0ih2R.js +0 -11
- package/core/built/admin/assets/newsletter-DR49NyGS.js +0 -1
- package/core/built/admin/assets/newsletter-detail-modal-B45pL1pb.js +0 -1
- package/core/built/admin/assets/newsletters-DGs5BaKH.js +0 -1
- package/core/built/admin/assets/nql-lang-B7faUf8D.js +0 -19
- package/core/built/admin/assets/offers-container-modal-B0hFS8nk.js +0 -1
- package/core/built/admin/assets/overview-B-ZPNqMo.js +0 -1
- package/core/built/admin/assets/overview-D96iwoJi.js +0 -1
- package/core/built/admin/assets/portal-modal-BLFdYeDH.js +0 -1
- package/core/built/admin/assets/post-analytics-header-DK27VjJm.js +0 -1
- package/core/built/admin/assets/preferences-CuWLISHa.js +0 -5
- package/core/built/admin/assets/profile-BsKYYtuL.js +0 -1
- package/core/built/admin/assets/settings-B4vM-rgV.js +0 -4
- package/core/built/admin/assets/stripe-connect-modal-CYDDrSJm.js +0 -1
- package/core/built/admin/assets/tag-detail-CmqiC32L.js +0 -1
- package/core/built/admin/assets/tier-detail-modal-BZmAsIy4.js +0 -1
- package/core/built/admin/assets/transistor-modal-CBPDqEGy.js +0 -1
- package/core/built/admin/assets/use-check-theme-limit-error-B14lZukR.js +0 -2
- package/core/built/admin/assets/use-feature-flag-BmJoc5WN.js +0 -1
- package/core/built/admin/assets/use-filter-params-ChoV72Hw.js +0 -1
- package/core/built/admin/assets/use-limiter-Dwg8ivgQ.js +0 -2
- package/core/built/admin/assets/user-detail-modal-XODpOqNC.js +0 -1
- package/core/built/admin/assets/virtual-list-Dnoafqbk.js +0 -1
- package/core/built/admin/assets/web-z71lA1Y3.js +0 -2
- package/core/built/admin/assets/zapier-modal-Bp507Um7.js +0 -1
- package/core/frontend/meta/og-type.ts +0 -13
- package/core/frontend/services/routing/api-adapter.ts +0 -157
- package/core/frontend/services/routing/config.ts +0 -59
- package/core/frontend/services/routing/controllers/entry/canonical-url.ts +0 -14
- package/core/frontend/services/routing/controllers/entry/gift-links.ts +0 -56
- package/core/frontend/services/routing/controllers/entry/markdown.ts +0 -72
- package/core/frontend/services/routing/controllers/entry.ts +0 -120
- package/core/frontend/services/routing/controllers/rss.ts +0 -66
- package/core/frontend/services/routing/permalink-adapter.ts +0 -10
- package/core/frontend/src/utils/privacy.ts +0 -66
- package/core/server/adapters/redirects/FileStore.ts +0 -113
- package/core/server/adapters/redirects/S3RedirectsStore.ts +0 -185
- package/core/server/adapters/route-settings/FileStore.ts +0 -144
- package/core/server/adapters/route-settings/S3RouteSettingsStore.ts +0 -199
- package/core/server/adapters/route-settings/utils.ts +0 -17
- package/core/server/adapters/scheduling/deps.d.ts +0 -1
- package/core/server/adapters/scheduling/error-capture.ts +0 -91
- package/core/server/adapters/scheduling/scheduling-default.ts +0 -248
- package/core/server/adapters/scheduling/utils.ts +0 -36
- package/core/server/adapters/sso/DefaultSSOAdapter.ts +0 -15
- package/core/server/adapters/storage/LocalFilesStorage.ts +0 -24
- package/core/server/adapters/storage/LocalImagesStorage.ts +0 -24
- package/core/server/adapters/storage/LocalMediaStorage.ts +0 -24
- package/core/server/adapters/storage/LocalStorageBase.ts +0 -342
- package/core/server/adapters/storage/S3Storage.ts +0 -506
- package/core/server/adapters/storage/utils.ts +0 -60
- package/core/server/api/endpoints/automation-action-links.ts +0 -46
- package/core/server/api/endpoints/explore.js +0 -18
- package/core/server/api/endpoints/gift-links.ts +0 -87
- package/core/server/api/endpoints/libraries.d.ts +0 -2
- package/core/server/api/endpoints/member-commenting.ts +0 -92
- package/core/server/api/endpoints/member-custom-fields.ts +0 -106
- package/core/server/api/endpoints/utils/api-filter-utils.ts +0 -22
- package/core/server/api/endpoints/utils/gift-link-access.ts +0 -82
- package/core/server/api/endpoints/utils/public-cache-keys.ts +0 -47
- package/core/server/api/endpoints/utils/serializers/input/member-commenting.ts +0 -29
- package/core/server/api/endpoints/utils/serializers/output/explore.js +0 -11
- package/core/server/api/endpoints/utils/serializers/output/gift-links.ts +0 -21
- package/core/server/api/endpoints/utils/serializers/output/member-commenting.ts +0 -8
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.ts +0 -25
- package/core/server/api/endpoints/utils/serializers/output/members.d.ts +0 -20
- package/core/server/api/endpoints/utils/serializers/output/posts-csv-transform.ts +0 -46
- package/core/server/api/endpoints/utils/serializers/output/stream-csv-response.ts +0 -47
- package/core/server/api/endpoints/utils/validate-email-sender-fields.ts +0 -42
- package/core/server/data/importer/email-template.ts +0 -213
- package/core/server/data/seeders/utils/topological-sort.ts +0 -48
- package/core/server/lib/auto-filling-map.ts +0 -23
- package/core/server/lib/bootstrap-socket.ts +0 -114
- package/core/server/lib/case-keys.ts +0 -30
- package/core/server/lib/common/to-plain.ts +0 -25
- package/core/server/lib/db-date.ts +0 -8
- package/core/server/lib/get-inbox-links.ts +0 -276
- package/core/server/lib/post-revisions.ts +0 -152
- package/core/server/lib/soonest-timer.ts +0 -57
- package/core/server/models/base/plugins/bulk-filters.ts +0 -35
- package/core/server/models/role-utils.ts +0 -56
- package/core/server/services/activitypub/activity-pub-service.ts +0 -216
- package/core/server/services/adapter-manager/adapter-manager.ts +0 -253
- package/core/server/services/adapter-manager/adapter-paths.ts +0 -26
- package/core/server/services/adapter-manager/base-classes.ts +0 -22
- package/core/server/services/adapter-manager/index.ts +0 -16
- package/core/server/services/adapter-manager/types.ts +0 -45
- package/core/server/services/adapter-manager/utils.ts +0 -308
- package/core/server/services/auth/reset-authentication.ts +0 -72
- package/core/server/services/automations/automations-api.ts +0 -396
- package/core/server/services/automations/automations-repository.ts +0 -218
- package/core/server/services/automations/constants.ts +0 -4
- package/core/server/services/automations/database-automations-repository.ts +0 -1513
- package/core/server/services/automations/database-date.ts +0 -26
- package/core/server/services/automations/fake-wait-hours-multiplier.ts +0 -12
- package/core/server/services/automations/get-scheduler-idempotency-key.ts +0 -8
- package/core/server/services/automations/mailgun-message-id.ts +0 -27
- package/core/server/services/automations/poll.ts +0 -325
- package/core/server/services/automations/scheduler-poll-time.ts +0 -38
- package/core/server/services/automations/service.ts +0 -131
- package/core/server/services/automations/stale-lock-cutoff.ts +0 -5
- package/core/server/services/comments/email-templates/new-comment-reply.txt.ts +0 -25
- package/core/server/services/comments/email-templates/new-comment.txt.ts +0 -25
- package/core/server/services/comments/email-templates/report.txt.ts +0 -34
- package/core/server/services/custom-redirects/redirect-config-parser.ts +0 -148
- package/core/server/services/custom-redirects/redirects-service.ts +0 -181
- package/core/server/services/custom-redirects/utils.ts +0 -7
- package/core/server/services/donations/donation-bookshelf-repository.ts +0 -63
- package/core/server/services/donations/donation-payment-event.ts +0 -51
- package/core/server/services/email-address/email-address-parser.d.ts +0 -12
- package/core/server/services/email-address/email-address-service.ts +0 -241
- package/core/server/services/email-analytics/automation-email-analytics-batch-processor.ts +0 -130
- package/core/server/services/email-analytics/batch-event-processor.ts +0 -18
- package/core/server/services/email-analytics/email-analytics-provider-mailgun.js +0 -57
- package/core/server/services/email-analytics/event-processing-result.ts +0 -66
- package/core/server/services/email-analytics/events/start-automation-email-analytics-job-event.ts +0 -14
- package/core/server/services/email-analytics/events/start-email-analytics-job-event.ts +0 -15
- package/core/server/services/email-analytics/index.ts +0 -109
- package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.ts +0 -126
- package/core/server/services/email-analytics/lib/queries.ts +0 -341
- package/core/server/services/email-service/domain-warming-service.ts +0 -91
- package/core/server/services/explore/explore-service.js +0 -59
- package/core/server/services/explore/index.js +0 -18
- package/core/server/services/explore-ping/explore-ping-service.ts +0 -198
- package/core/server/services/explore-ping/index.ts +0 -42
- package/core/server/services/files/file-type-utils.ts +0 -56
- package/core/server/services/gift-links/actions.ts +0 -51
- package/core/server/services/gift-links/codec.ts +0 -16
- package/core/server/services/gift-links/index.ts +0 -20
- package/core/server/services/gift-links/models.ts +0 -22
- package/core/server/services/gift-links/schema.ts +0 -33
- package/core/server/services/gift-links/serializers.ts +0 -20
- package/core/server/services/gift-links/service.ts +0 -95
- package/core/server/services/gifts/constants.ts +0 -3
- package/core/server/services/gifts/email-templates/gift-purchase-confirmation.ts +0 -43
- package/core/server/services/gifts/email-templates/gift-reminder.ts +0 -50
- package/core/server/services/gifts/gift-bookshelf-repository.ts +0 -366
- package/core/server/services/gifts/gift-checkout-offer.ts +0 -127
- package/core/server/services/gifts/gift-codec.ts +0 -62
- package/core/server/services/gifts/gift-controller.ts +0 -51
- package/core/server/services/gifts/gift-email-renderer.ts +0 -97
- package/core/server/services/gifts/gift-email-service.ts +0 -158
- package/core/server/services/gifts/gift-reminder-scheduler.ts +0 -107
- package/core/server/services/gifts/gift-schema.ts +0 -39
- package/core/server/services/gifts/gift-service-wrapper.js +0 -142
- package/core/server/services/gifts/gift-service.ts +0 -1034
- package/core/server/services/gifts/gift.ts +0 -234
- package/core/server/services/identity-tokens/identity-token-service.ts +0 -36
- package/core/server/services/indexnow-ping/constants.ts +0 -32
- package/core/server/services/indexnow-ping/index.ts +0 -35
- package/core/server/services/indexnow-ping/indexnow-ping-service.ts +0 -311
- package/core/server/services/internal-keys/index.ts +0 -53
- package/core/server/services/lib/dynamic-redirect-manager.d.ts +0 -20
- package/core/server/services/lib/in-memory-repository.ts +0 -78
- package/core/server/services/lib/member-signup-contexts.ts +0 -22
- package/core/server/services/link-redirection/link-redirect.ts +0 -24
- package/core/server/services/member-welcome-emails/constants.ts +0 -35
- package/core/server/services/members/commenting/index.ts +0 -2
- package/core/server/services/members/commenting/member-commenting-codec.ts +0 -73
- package/core/server/services/members/commenting/member-commenting.ts +0 -69
- package/core/server/services/members/create-paid-member-shim.ts +0 -40
- package/core/server/services/members/import-export/config.ts +0 -34
- package/core/server/services/members/import-export/csv/formula.ts +0 -14
- package/core/server/services/members/import-export/csv/index.ts +0 -3
- package/core/server/services/members/import-export/csv/parse.ts +0 -69
- package/core/server/services/members/import-export/csv/serialize.ts +0 -18
- package/core/server/services/members/import-export/export/exporter.ts +0 -325
- package/core/server/services/members/import-export/import/completion-email.ts +0 -146
- package/core/server/services/members/import-export/import/importer.ts +0 -489
- package/core/server/services/members/import-export/import/reader.ts +0 -33
- package/core/server/services/members/import-export/import/row.ts +0 -56
- package/core/server/services/members/import-export/import/spool.ts +0 -38
- package/core/server/services/members/import-export/index.ts +0 -143
- package/core/server/services/members/index.d.ts +0 -32
- package/core/server/services/members-custom-fields/actions.ts +0 -62
- package/core/server/services/members-custom-fields/codec.ts +0 -13
- package/core/server/services/members-custom-fields/config.ts +0 -38
- package/core/server/services/members-custom-fields/definitions-service.ts +0 -413
- package/core/server/services/members-custom-fields/index.ts +0 -50
- package/core/server/services/members-custom-fields/models.ts +0 -15
- package/core/server/services/members-custom-fields/queries.ts +0 -13
- package/core/server/services/members-custom-fields/schema.ts +0 -71
- package/core/server/services/members-custom-fields/serializers.ts +0 -22
- package/core/server/services/members-custom-fields/storage.ts +0 -122
- package/core/server/services/members-custom-fields/values-service.ts +0 -269
- package/core/server/services/notifications/notification-email.ts +0 -66
- package/core/server/services/notifications/sanitize-email-html.ts +0 -35
- package/core/server/services/post-scheduling/index.ts +0 -13
- package/core/server/services/post-scheduling/post-scheduling.ts +0 -133
- package/core/server/services/recommendations/service/bookshelf-click-event-repository.ts +0 -49
- package/core/server/services/recommendations/service/bookshelf-recommendation-repository.ts +0 -117
- package/core/server/services/recommendations/service/bookshelf-repository.ts +0 -192
- package/core/server/services/recommendations/service/bookshelf-subscribe-event-repository.ts +0 -49
- package/core/server/services/recommendations/service/click-event.ts +0 -32
- package/core/server/services/recommendations/service/in-memory-recommendation-repository.ts +0 -20
- package/core/server/services/recommendations/service/incoming-recommendation-controller.ts +0 -51
- package/core/server/services/recommendations/service/incoming-recommendation-email-renderer.ts +0 -37
- package/core/server/services/recommendations/service/incoming-recommendation-service.ts +0 -159
- package/core/server/services/recommendations/service/index.ts +0 -15
- package/core/server/services/recommendations/service/libraries.d.ts +0 -2
- package/core/server/services/recommendations/service/recommendation-controller.ts +0 -257
- package/core/server/services/recommendations/service/recommendation-metadata-service.ts +0 -132
- package/core/server/services/recommendations/service/recommendation-repository.ts +0 -13
- package/core/server/services/recommendations/service/recommendation-service.ts +0 -285
- package/core/server/services/recommendations/service/recommendation.ts +0 -200
- package/core/server/services/recommendations/service/subscribe-event.ts +0 -32
- package/core/server/services/recommendations/service/unsafe-data.ts +0 -217
- package/core/server/services/recommendations/service/well-known-service.ts +0 -47
- package/core/server/services/remote-flags/index.ts +0 -101
- package/core/server/services/remote-flags/remote-flags-service.ts +0 -236
- package/core/server/services/remote-flags/resolve.ts +0 -108
- package/core/server/services/route-settings/route-settings-parser.ts +0 -455
- package/core/server/services/route-settings/validation-errors.ts +0 -271
- package/core/server/services/route-settings/yaml-parser.d.ts +0 -4
- package/core/server/services/slack-ping/constants.ts +0 -15
- package/core/server/services/slack-ping/index.ts +0 -35
- package/core/server/services/slack-ping/slack-ping-service.ts +0 -295
- package/core/server/services/staff/email-templates/donation.txt.ts +0 -26
- package/core/server/services/staff/email-templates/gift.txt.ts +0 -27
- package/core/server/services/staff/email-templates/new-free-signup.txt.ts +0 -15
- package/core/server/services/staff/email-templates/new-gift-subscription.txt.ts +0 -26
- package/core/server/services/staff/email-templates/new-milestone-received.txt.ts +0 -20
- package/core/server/services/staff/email-templates/new-paid-cancellation.txt.ts +0 -15
- package/core/server/services/staff/email-templates/new-paid-started.txt.ts +0 -15
- package/core/server/services/staff/email-templates/recommendation-received.txt.ts +0 -23
- package/core/server/services/staff/email-templates/types.ts +0 -13
- package/core/server/services/url/lazy-find-resource.ts +0 -104
- package/core/server/services/url/lazy-url-service.ts +0 -647
- package/core/server/services/url/permalink-matcher.ts +0 -119
- package/core/server/services/url/router-filter.ts +0 -80
- package/core/server/services/verification/verification-webhook-service.ts +0 -137
- package/core/shared/config/helpers.ts +0 -133
- package/core/shared/config/index.ts +0 -12
- package/core/shared/config/loader.ts +0 -87
- package/core/shared/config/utils.ts +0 -104
- package/core/shared/errify.ts +0 -31
- package/core/shared/events-ts/index.ts +0 -8
- package/core/shared/events-ts/post-deleted-event.ts +0 -15
- package/core/shared/events-ts/posts-bulk-add-tags-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-destroyed-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-featured-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-unfeatured-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-unpublished-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-unscheduled-event.ts +0 -13
- package/core/shared/labs-flag-overrides.ts +0 -35
- package/core/shared/one-at-a-time.ts +0 -47
- package/core/shared/url-utils.ts +0 -20
|
@@ -1 +0,0 @@
|
|
|
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};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type {ReadonlyDeep} from 'type-fest';
|
|
2
|
-
|
|
3
|
-
export function getOgType(data: ReadonlyDeep<{context?: unknown[]}>): 'profile' | 'article' | 'website' {
|
|
4
|
-
const context = data.context ? data.context[0] : null;
|
|
5
|
-
|
|
6
|
-
if (context === 'author') {
|
|
7
|
-
return 'profile';
|
|
8
|
-
}
|
|
9
|
-
if (context === 'post') {
|
|
10
|
-
return 'article';
|
|
11
|
-
}
|
|
12
|
-
return 'website';
|
|
13
|
-
}
|
|
@@ -1,157 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
export const QUERY = {
|
|
2
|
-
tag: {
|
|
3
|
-
controller: 'tagsPublic',
|
|
4
|
-
type: 'read',
|
|
5
|
-
resource: 'tags',
|
|
6
|
-
options: {
|
|
7
|
-
slug: '%s',
|
|
8
|
-
visibility: 'public'
|
|
9
|
-
}
|
|
10
|
-
},
|
|
11
|
-
author: {
|
|
12
|
-
controller: 'authorsPublic',
|
|
13
|
-
type: 'read',
|
|
14
|
-
resource: 'authors',
|
|
15
|
-
options: {
|
|
16
|
-
slug: '%s'
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
post: {
|
|
20
|
-
controller: 'postsPublic',
|
|
21
|
-
type: 'read',
|
|
22
|
-
resource: 'posts',
|
|
23
|
-
options: {
|
|
24
|
-
slug: '%s'
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
page: {
|
|
28
|
-
controller: 'pagesPublic',
|
|
29
|
-
type: 'read',
|
|
30
|
-
resource: 'pages',
|
|
31
|
-
options: {
|
|
32
|
-
slug: '%s'
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
previews: {
|
|
36
|
-
controller: 'previews',
|
|
37
|
-
resource: 'previews'
|
|
38
|
-
},
|
|
39
|
-
email: {
|
|
40
|
-
controller: 'emailPost',
|
|
41
|
-
resource: 'email_posts',
|
|
42
|
-
options: {
|
|
43
|
-
slug: '%s'
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
} as const;
|
|
47
|
-
|
|
48
|
-
export const TAXONOMIES = {
|
|
49
|
-
tag: {
|
|
50
|
-
filter: 'tags:\'%s\'+tags.visibility:public',
|
|
51
|
-
editRedirect: '#/tags/:slug/',
|
|
52
|
-
resource: 'tags'
|
|
53
|
-
},
|
|
54
|
-
author: {
|
|
55
|
-
filter: 'authors:\'%s\'',
|
|
56
|
-
editRedirect: '#/settings/staff/:slug/',
|
|
57
|
-
resource: 'authors'
|
|
58
|
-
}
|
|
59
|
-
} as const;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {format, parse} from 'node:url';
|
|
2
|
-
import type {Request} from 'express';
|
|
3
|
-
import type {Entry} from '../entry';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Build the entry's canonical URL (its own pathname) carrying over the current
|
|
7
|
-
* request's query string. Shared by the permalink and markdown-url redirects.
|
|
8
|
-
*/
|
|
9
|
-
export default function buildCanonicalUrl(req: Request, entry: Entry): string {
|
|
10
|
-
return format({
|
|
11
|
-
pathname: parse(entry.url).pathname,
|
|
12
|
-
search: parse(req.originalUrl).search
|
|
13
|
-
});
|
|
14
|
-
};
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import {format, parse} from 'node:url';
|
|
2
|
-
import type {ParsedUrlQueryInput} from 'node:querystring';
|
|
3
|
-
import type {Request} from 'express';
|
|
4
|
-
import type {EntryResponse} from '../entry';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Build this request's URL with `?gift` removed, preserving path, subdirectory
|
|
8
|
-
* and other query params. Rebuilt from req.query (qs-parsed) so bracket forms
|
|
9
|
-
* like `?gift[]=x` are dropped too — otherwise the stripped redirect would loop.
|
|
10
|
-
*/
|
|
11
|
-
function strippedGiftUrl(req: Request): string {
|
|
12
|
-
const query = {...req.query} as ParsedUrlQueryInput;
|
|
13
|
-
delete query.gift;
|
|
14
|
-
return format({pathname: parse(req.originalUrl).pathname, query});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Whether this request is an attempt to use a gift link: a `?gift` param is
|
|
19
|
-
* present (in any form).
|
|
20
|
-
*/
|
|
21
|
-
export function isGiftRequest(req: Request): boolean {
|
|
22
|
-
return req.query.gift !== undefined;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* The gift token from the request, or null. A non-string or empty form (e.g.
|
|
27
|
-
* `?gift[]=x`, `?gift=`) isn't a token.
|
|
28
|
-
*/
|
|
29
|
-
export function giftToken(req: Request): string | null {
|
|
30
|
-
return typeof req.query.gift === 'string' && req.query.gift !== '' ? req.query.gift : null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function isInvalidGiftTokenError(err: unknown): boolean {
|
|
34
|
-
return (err as {code?: string} | null)?.code === 'INVALID_GIFT_TOKEN';
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Strip `?gift` and 301 to the clean URL (the page still renders, paywalled).
|
|
39
|
-
* res.redirect, not urlUtils.redirect301, so the no-store set for ?gift
|
|
40
|
-
* requests survives and the token-bearing redirect isn't cached.
|
|
41
|
-
*/
|
|
42
|
-
export function stripGiftAndRedirect(req: Request, res: EntryResponse) {
|
|
43
|
-
return res.redirect(301, strippedGiftUrl(req));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Prepare a verified gift render: don't index the unlocked variant, keep the
|
|
48
|
-
* token out of the Referer on sub-resource requests, and set the internal
|
|
49
|
-
* `_giftLink` flag on res.locals so it merges onto the render context root,
|
|
50
|
-
* where `ghost_foot` (toast) and `ghost_head` (analytics) read it.
|
|
51
|
-
*/
|
|
52
|
-
export function prepareGiftRender(res: EntryResponse, token: string): void {
|
|
53
|
-
res.set('X-Robots-Tag', 'noindex');
|
|
54
|
-
res.set('Referrer-Policy', 'no-referrer');
|
|
55
|
-
res.locals._giftLink = token;
|
|
56
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import type {Request, Response} from 'express';
|
|
2
|
-
import type {Entry, EntryResponse} from '../entry';
|
|
3
|
-
import buildCanonicalUrl from './canonical-url';
|
|
4
|
-
|
|
5
|
-
const config = require('../../../../../shared/config');
|
|
6
|
-
const urlUtils = require('../../../../../shared/url-utils').default;
|
|
7
|
-
const {getAcceptedMarkdownContentType, getMarkdownPath, renderEntryMarkdown} = require('../../../llms/markdown');
|
|
8
|
-
|
|
9
|
-
const MEMBERS_ONLY_MARKDOWN = '# Members-only content\n\nThis post requires a subscription and is not available for public access.\n';
|
|
10
|
-
|
|
11
|
-
function llmsEnabled(req: Request): boolean {
|
|
12
|
-
const llmsService = req.app.get('llmsService') || null;
|
|
13
|
-
return Boolean(llmsService && llmsService.isEnabled());
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Only public entries ever render as markdown; gated entries stay html (or
|
|
18
|
-
* 403 on an explicit `.md` URL).
|
|
19
|
-
*/
|
|
20
|
-
export function isPublic(entry: Entry): boolean {
|
|
21
|
-
return entry.visibility === 'public';
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function serveMarkdown(res: Response, entry: Entry) {
|
|
25
|
-
const llmsIndexUrl = urlUtils.urlFor({relativeUrl: '/llms.txt'}, true);
|
|
26
|
-
res.set('Cache-Control', `public, max-age=${config.get('caching:llms:maxAge')}`);
|
|
27
|
-
res.set('Content-Location', getMarkdownPath(new URL(entry.url).pathname));
|
|
28
|
-
res.type('text/markdown');
|
|
29
|
-
return res.send(renderEntryMarkdown(entry, {llmsIndexUrl}));
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Whether this is a `.md` URL request (the scoped suffix route sets the flag).
|
|
34
|
-
*/
|
|
35
|
-
export function isMdRequest(res: EntryResponse): boolean {
|
|
36
|
-
return Boolean(res.routerOptions.isMarkdownRequest);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Serve a `.md` URL as markdown for LLM consumption. When the feature is
|
|
41
|
-
* disabled we redirect to the canonical (html) url; members-only content is
|
|
42
|
-
* refused.
|
|
43
|
-
*/
|
|
44
|
-
export function serveMdRequest(req: Request, res: Response, entry: Entry) {
|
|
45
|
-
if (!llmsEnabled(req)) {
|
|
46
|
-
return res.redirect(302, buildCanonicalUrl(req, entry));
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (!isPublic(entry)) {
|
|
50
|
-
return res.status(403).type('text/markdown').send(MEMBERS_ONLY_MARKDOWN);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return serveMarkdown(res, entry);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Whether the request negotiates markdown via the Accept header (and the llms
|
|
58
|
-
* feature is on) — request knowledge only, so it can be decided before the
|
|
59
|
-
* entry lookup. Whether markdown is actually served still depends on the
|
|
60
|
-
* entry: see `isPublic`.
|
|
61
|
-
*/
|
|
62
|
-
export function isAcceptsRequest(req: Request): boolean {
|
|
63
|
-
return Boolean(getAcceptedMarkdownContentType(req)) && llmsEnabled(req);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Serve markdown negotiated via the Accept header.
|
|
68
|
-
*/
|
|
69
|
-
export function serveAcceptsRequest(res: Response, entry: Entry) {
|
|
70
|
-
res.vary('Accept');
|
|
71
|
-
return serveMarkdown(res, entry);
|
|
72
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import type {NextFunction, Request, Response} from 'express';
|
|
2
|
-
import * as markdown from './entry/markdown';
|
|
3
|
-
import * as giftLinks from './entry/gift-links';
|
|
4
|
-
import buildCanonicalUrl from './entry/canonical-url';
|
|
5
|
-
|
|
6
|
-
const debug = require('@tryghost/debug')('services:routing:controllers:entry');
|
|
7
|
-
const config = require('../../../../shared/config');
|
|
8
|
-
const urlUtils = require('../../../../shared/url-utils').default;
|
|
9
|
-
const dataService = require('../../data');
|
|
10
|
-
const renderer = require('../../rendering');
|
|
11
|
-
|
|
12
|
-
// Routing context the router attaches to the matched entry's response.
|
|
13
|
-
export interface RouterOptions {
|
|
14
|
-
isMarkdownRequest?: boolean;
|
|
15
|
-
context?: string[];
|
|
16
|
-
[key: string]: unknown;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface EntryResponse extends Response {
|
|
20
|
-
routerOptions: RouterOptions;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// The resolved post/page entry from the data layer; only the fields used here are typed.
|
|
24
|
-
export interface Entry {
|
|
25
|
-
id: string;
|
|
26
|
-
url: string;
|
|
27
|
-
visibility: string;
|
|
28
|
-
[key: string]: unknown;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* The request's last url param is `/edit`: redirect to the admin editor, or fall
|
|
33
|
-
* through to a 404 when admin redirects are disabled.
|
|
34
|
-
*/
|
|
35
|
-
function editRedirect(res: EntryResponse, next: NextFunction, entry: Entry) {
|
|
36
|
-
if (!config.get('admin:redirects')) {
|
|
37
|
-
debug('is edit url but admin redirects are disabled');
|
|
38
|
-
return next();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
debug('redirect. is edit url');
|
|
42
|
-
const resourceType = res.routerOptions.context?.includes('page') ? 'page' : 'post';
|
|
43
|
-
return urlUtils.redirectToAdmin(302, res, `/#/editor/${resourceType}/${entry.id}`);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* The requested path no longer matches the entry's canonical url — happens with
|
|
48
|
-
* date permalinks after a publish date change.
|
|
49
|
-
*/
|
|
50
|
-
function isPermalinkStale(req: Request, entry: Entry): boolean {
|
|
51
|
-
return urlUtils.absoluteToRelative(entry.url, {withoutSubdirectory: true}) !== req.path;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function entryController(req: Request, res: EntryResponse, next: NextFunction): Promise<void | Response> {
|
|
55
|
-
debug('entryController', res.routerOptions);
|
|
56
|
-
|
|
57
|
-
try {
|
|
58
|
-
// A gift view is html-only. Redirecting before the lookup keeps the
|
|
59
|
-
// token off the read, so markdown paths can never see an unlocked entry.
|
|
60
|
-
if (giftLinks.isGiftRequest(req) && (markdown.isMdRequest(res) || markdown.isAcceptsRequest(req))) {
|
|
61
|
-
return giftLinks.stripGiftAndRedirect(req, res);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// The raw gift token rides the lookup as read context; the API read
|
|
65
|
-
// verifies it against the entry and unlocks, or rejects the lookup.
|
|
66
|
-
const giftToken = giftLinks.isGiftRequest(req) ? giftLinks.giftToken(req) : null;
|
|
67
|
-
|
|
68
|
-
let lookup;
|
|
69
|
-
try {
|
|
70
|
-
lookup = await dataService.entryLookup(req.path, res.routerOptions, res.locals, {giftToken});
|
|
71
|
-
} catch (err) {
|
|
72
|
-
if (giftLinks.isInvalidGiftTokenError(err)) {
|
|
73
|
-
return giftLinks.stripGiftAndRedirect(req, res);
|
|
74
|
-
}
|
|
75
|
-
throw err;
|
|
76
|
-
}
|
|
77
|
-
const entry = lookup ? lookup.entry : false;
|
|
78
|
-
|
|
79
|
-
if (!entry || lookup.isUnknownOption) {
|
|
80
|
-
debug('no entry or unknown option');
|
|
81
|
-
return next();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (lookup.isEditURL) {
|
|
85
|
-
return editRedirect(res, next, entry);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// MUST run before the permalink redirect below: a `.md` path can never
|
|
89
|
-
// equal the entry's canonical (html) path, so the redirect would always
|
|
90
|
-
// fire and 301 the request to html, losing the markdown intent.
|
|
91
|
-
if (markdown.isMdRequest(res)) {
|
|
92
|
-
return markdown.serveMdRequest(req, res, entry);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (isPermalinkStale(req, entry)) {
|
|
96
|
-
debug('redirect');
|
|
97
|
-
return urlUtils.redirect301(res, buildCanonicalUrl(req, entry));
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// MUST run after the permalink redirect above: negotiation rides on the
|
|
101
|
-
// canonical URL, so a stale dated-permalink URL is 301'd to canonical
|
|
102
|
-
// first, then markdown is served.
|
|
103
|
-
if (markdown.isAcceptsRequest(req) && markdown.isPublic(entry)) {
|
|
104
|
-
return markdown.serveAcceptsRequest(res, entry);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (giftLinks.isGiftRequest(req)) {
|
|
108
|
-
if (!giftToken) {
|
|
109
|
-
return giftLinks.stripGiftAndRedirect(req, res);
|
|
110
|
-
}
|
|
111
|
-
// Reaching here means the lookup verified the token: the entry is
|
|
112
|
-
// the unlocked variant.
|
|
113
|
-
giftLinks.prepareGiftRender(res, giftToken);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
return renderer.renderEntry(req, res)(entry);
|
|
117
|
-
} catch (err) {
|
|
118
|
-
return renderer.handleError(next)(err);
|
|
119
|
-
}
|
|
120
|
-
};
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import type {Request, Response, NextFunction} from 'express';
|
|
2
|
-
import _ from 'lodash';
|
|
3
|
-
import url from 'node:url';
|
|
4
|
-
|
|
5
|
-
const debug = require('@tryghost/debug')('services:routing:controllers:rss');
|
|
6
|
-
const security = require('@tryghost/security');
|
|
7
|
-
const settingsCache = require('../../../../shared/settings-cache');
|
|
8
|
-
const rssService = require('../../rss');
|
|
9
|
-
const renderer = require('../../rendering');
|
|
10
|
-
const dataService = require('../../data');
|
|
11
|
-
|
|
12
|
-
export interface RSSPathOptions {
|
|
13
|
-
page: number;
|
|
14
|
-
slug?: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface RSSResponse extends Response {
|
|
18
|
-
routerOptions: Record<string, unknown>;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface RelatedData {
|
|
22
|
-
author?: Array<{name: string}>;
|
|
23
|
-
tag?: Array<{name: string}>;
|
|
24
|
-
[key: string]: unknown;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Generates the title for the RSS feed based on author, tag, or publication settings.
|
|
29
|
-
*/
|
|
30
|
-
function getTitle(relatedData?: RelatedData): string {
|
|
31
|
-
const data = relatedData || {};
|
|
32
|
-
let titleStart = _.get(data, 'author[0].name') || _.get(data, 'tag[0].name') || '';
|
|
33
|
-
|
|
34
|
-
titleStart += titleStart ? ' - ' : '';
|
|
35
|
-
return titleStart + settingsCache.get('title');
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* RSS routing controller.
|
|
40
|
-
* Fetches posts/meta data and delegates rendering to `rssService`.
|
|
41
|
-
*/
|
|
42
|
-
export function rssController(req: Request, res: RSSResponse, next: NextFunction): Promise<void> {
|
|
43
|
-
debug('rssController');
|
|
44
|
-
|
|
45
|
-
const pathOptions: RSSPathOptions = {
|
|
46
|
-
page: 1, // required for fetchData
|
|
47
|
-
slug: req.params.slug ? security.string.safe(req.params.slug) : undefined
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
// CASE: Ghost is using an rss cache - normalize the URL for use as a key
|
|
51
|
-
const baseUrl = url.parse(req.originalUrl).pathname;
|
|
52
|
-
|
|
53
|
-
return dataService.fetchData(pathOptions, res.routerOptions, res.locals)
|
|
54
|
-
.then(function formatResult(result: {posts?: unknown[]; meta?: unknown; data?: RelatedData}) {
|
|
55
|
-
const response = _.pick(result, ['posts', 'meta']) as Record<string, unknown>;
|
|
56
|
-
|
|
57
|
-
response.title = getTitle(result.data);
|
|
58
|
-
response.description = settingsCache.get('description');
|
|
59
|
-
|
|
60
|
-
return response;
|
|
61
|
-
})
|
|
62
|
-
.then(function (data: Record<string, unknown>) {
|
|
63
|
-
return rssService.render(res, baseUrl, data);
|
|
64
|
-
})
|
|
65
|
-
.catch(renderer.handleError(next));
|
|
66
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Convert a domain-model permalink into Express / URL-service notation.
|
|
3
|
-
*
|
|
4
|
-
* @example toExpressNotation('/{slug}/') // => '/:slug/'
|
|
5
|
-
* @example toExpressNotation('/{primary_tag}/{slug}/') // => '/:primary_tag/:slug/'
|
|
6
|
-
* @example toExpressNotation('/:slug/') // => '/:slug/' (idempotent)
|
|
7
|
-
*/
|
|
8
|
-
export function toExpressNotation(permalink: string): string {
|
|
9
|
-
return permalink.replace(/{(\w+)}/g, ':$1');
|
|
10
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import type {JsonValue} from 'type-fest';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Utility functions for data privacy and PII protection
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Default attributes that should be masked for privacy
|
|
9
|
-
*/
|
|
10
|
-
export const SENSITIVE_ATTRIBUTES = [
|
|
11
|
-
'username',
|
|
12
|
-
'user',
|
|
13
|
-
'user_id',
|
|
14
|
-
'userid',
|
|
15
|
-
'password',
|
|
16
|
-
'pass',
|
|
17
|
-
'pin',
|
|
18
|
-
'passcode',
|
|
19
|
-
'token',
|
|
20
|
-
'api_token',
|
|
21
|
-
'email',
|
|
22
|
-
'address',
|
|
23
|
-
'phone',
|
|
24
|
-
'sex',
|
|
25
|
-
'gender',
|
|
26
|
-
'order',
|
|
27
|
-
'order_id',
|
|
28
|
-
'orderid',
|
|
29
|
-
'payment',
|
|
30
|
-
'credit_card'
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Mask sensitive attributes in a payload
|
|
35
|
-
*/
|
|
36
|
-
export function maskSensitiveData(payload: unknown, attributesToMask: ReadonlyArray<string> = SENSITIVE_ATTRIBUTES): string {
|
|
37
|
-
// Deep copy
|
|
38
|
-
let payloadStr = JSON.stringify(payload);
|
|
39
|
-
|
|
40
|
-
attributesToMask.forEach((attr) => {
|
|
41
|
-
payloadStr = payloadStr.replace(
|
|
42
|
-
new RegExp(`("${attr}"):(".+?"|\\d+)`, 'mgi'),
|
|
43
|
-
'$1:"********"'
|
|
44
|
-
);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
return payloadStr;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Process a payload with sensitive data masked
|
|
52
|
-
*/
|
|
53
|
-
export function processPayload(payload: unknown, globalAttributes?: Record<string, unknown>, stringify?: true): string;
|
|
54
|
-
export function processPayload(payload: unknown, globalAttributes: Record<string, unknown>, stringify: false): JsonValue;
|
|
55
|
-
export function processPayload(payload: unknown, globalAttributes?: Record<string, unknown>, stringify?: boolean): string | JsonValue;
|
|
56
|
-
export function processPayload(payload: unknown, globalAttributes = {}, stringify = true): string | JsonValue {
|
|
57
|
-
if (stringify) {
|
|
58
|
-
const maskedStr = maskSensitiveData(payload);
|
|
59
|
-
const processed = Object.assign({}, JSON.parse(maskedStr), globalAttributes);
|
|
60
|
-
return JSON.stringify(processed);
|
|
61
|
-
} else {
|
|
62
|
-
const processed = Object.assign({}, payload, globalAttributes);
|
|
63
|
-
const maskedStr = maskSensitiveData(processed);
|
|
64
|
-
return JSON.parse(maskedStr);
|
|
65
|
-
}
|
|
66
|
-
}
|