ghost 6.60.0 → 6.61.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/components/tryghost-adapter-base-scheduling-0.2.3.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.1.3.tgz +0 -0
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-kg-default-cards-10.3.5.tgz +0 -0
- package/core/boot.js +13 -4
- package/core/built/admin/assets/{Combination-gnJO3vIw.js → Combination-5fYEzgbs.js} +1 -1
- package/core/built/admin/assets/{PolarAngleAxis-C4qtHy1B.js → PolarAngleAxis-pkMyqz8g.js} +1 -1
- package/core/built/admin/assets/{RadialBarChart-Bh09Stsj.js → RadialBarChart-JAKoS4KT.js} +1 -1
- package/core/built/admin/assets/{about-BgpmhCuM.js → about-Bve7IJS2.js} +1 -1
- package/core/built/admin/assets/{account-migration-8qTEI1i1.js → account-migration-DRhAehfw.js} +1 -1
- package/core/built/admin/assets/{action-list-lGzZLHc8.js → action-list-C4v0-du8.js} +1 -1
- package/core/built/admin/assets/activitypub/{account-migration-DMHuPnJn.js → account-migration-C-aej4x_.js} +7 -7
- package/core/built/admin/assets/activitypub/activitypub.js +3 -4
- package/core/built/admin/assets/activitypub/{avatar-DhTo5D1B.js → avatar-DLPL3Abs.js} +59 -68
- package/core/built/admin/assets/activitypub/{avatar-flipboard-DnVgbEfa.js → avatar-flipboard-C9iDY-QV.js} +2 -2
- package/core/built/admin/assets/activitypub/{bluesky-sharing-BT4zAlW7.js → bluesky-sharing-BXkA5mqV.js} +8 -8
- package/core/built/admin/assets/activitypub/{content-formatters-BeDZ-DIa.js → content-formatters-CHcyMFk4.js} +17 -17
- package/core/built/admin/assets/activitypub/{copy-8sqxUuNd.js → copy-DIAOQoCZ.js} +2 -2
- package/core/built/admin/assets/activitypub/{domain-xQDDu1CS.js → domain-B3ihkPde.js} +8 -8
- package/core/built/admin/assets/activitypub/{edit-profile-BXdF_r2G.js → edit-profile-DsZM3rTX.js} +5 -5
- package/core/built/admin/assets/activitypub/{explore-CMt7gKlL.js → explore-BodNrZgR.js} +8 -8
- package/core/built/admin/assets/activitypub/{feed-Bwqdddp_.js → feed-PwH1iJ84.js} +9 -9
- package/core/built/admin/assets/activitypub/{field-4co_8FVg.js → field-D06-kmOJ.js} +3 -3
- package/core/built/admin/assets/activitypub/{hash-DwakMs4X.js → hash-Bm3WxYN4.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-DQ5CwLma.js → inbox-BluD2ucT.js} +16 -16
- package/core/built/admin/assets/activitypub/{inbox-ckD4wo_r.js → inbox-d8oJRTf4.js} +2 -2
- package/core/built/admin/assets/activitypub/{label-B72sfvEU.js → label-FHSh6ZAw.js} +3 -3
- package/core/built/admin/assets/activitypub/layout-Cq4NG0Xr.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-KCCO7L2J.js → moderation-D1Yapsod.js} +9 -9
- package/core/built/admin/assets/activitypub/{note-BX_Bz5A0.js → note-C5zjqq5C.js} +8 -8
- package/core/built/admin/assets/activitypub/{notifications-BQOYGvRv.js → notifications-B9p8eCHD.js} +9 -9
- package/core/built/admin/assets/activitypub/{preferences-6h43G9_q.js → preferences-BCqUdC3v.js} +9 -9
- package/core/built/admin/assets/activitypub/{profile-BMN9VVZ2.js → profile-BRCWoFem.js} +178 -178
- package/core/built/admin/assets/activitypub/{reply-ZNo04xsO.js → reply-DYK5vVqb.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-3B9mUQ7i.js → routes-BSXT992i.js} +81 -84
- package/core/built/admin/assets/activitypub/{separator-D9taVCCa.js → separator-BbQqTm-p.js} +3 -3
- package/core/built/admin/assets/activitypub/{settings-71gCm3SO.js → settings-DQDkr06X.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-1-BsGGnBuT.js → step-1-B-YfsVeO.js} +5 -5
- package/core/built/admin/assets/activitypub/{step-2-teosIS0k.js → step-2-DtPQzlTH.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-3-BjD5TokC.js → step-3-D6BFMXL_.js} +10 -10
- package/core/built/admin/assets/activitypub/{tabs-Cvwl1wXU.js → tabs-GpNecvfB.js} +6 -6
- package/core/built/admin/assets/activitypub/{topic-filter-C3LZJc2X.js → topic-filter-BPDeQQys.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-Dp9f0gov.js → use-activity-pub-queries-BoVOxXkV.js} +2 -2
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-C4RI0sa9.js → use-navigate-with-base-path-Bmk5h4lW.js} +220 -220
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-C2oNDMUH.js → use-reply-chain-data-wVBX7swM.js} +5 -5
- package/core/built/admin/assets/activitypub/{x-Dxm6pV9X.js → x-DbQZOLiI.js} +2 -2
- package/core/built/admin/assets/{add-integration-modal--YpTq3c0.js → add-integration-modal-BC0jExDZ.js} +1 -1
- package/core/built/admin/assets/{add-newsletter-modal-C8Ix2hol.js → add-newsletter-modal-DchTkA7l.js} +1 -1
- package/core/built/admin/assets/{add-recommendation-modal-CScuNFz4.js → add-recommendation-modal-DMvaJZKp.js} +1 -1
- package/core/built/admin/assets/alert-dialog-QhXzdHfc.js +1 -0
- package/core/built/admin/assets/{analytics-Cnji45H5.js → analytics-No1DDY3A.js} +1 -1
- package/core/built/admin/assets/{announcement-bar-modal-BTHiy1ZO.js → announcement-bar-modal-DM3cYOpo.js} +1 -1
- package/core/built/admin/assets/{api-keys-Boy5pLbD.js → api-keys-BLm2NDBh.js} +1 -1
- package/core/built/admin/assets/audience-9mwU5TW6.js +1 -0
- package/core/built/admin/assets/{automations-BWpRCZ_f.js → automations-DpUNUdcZ.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-DHOpQxff.js → bluesky-sharing-Cjrv_f62.js} +1 -1
- package/core/built/admin/assets/{box-By_EgGtm.js → box-CdfQAP_F.js} +1 -1
- package/core/built/admin/assets/{brand-icon-09YqFZjV.js → brand-icon-CrIGOA3Z.js} +1 -1
- package/core/built/admin/assets/{breadcrumb-CcFr_ltt.js → breadcrumb-DLiqCyFc.js} +1 -1
- package/core/built/admin/assets/{button-BshWPHvn.js → button-B2jcu6bk.js} +1 -1
- package/core/built/admin/assets/{card-CiiE7QfM.js → card--VNbfgo3.js} +1 -1
- package/core/built/admin/assets/{chart-BnXyfH11.js → chart-BrhA41Zi.js} +1 -1
- package/core/built/admin/assets/chart-helpers-Fo3bUL3K.js +1 -0
- package/core/built/admin/assets/{checkbox-Dwwr_3Py.js → checkbox-BfKktMph.js} +1 -1
- package/core/built/admin/assets/{chunk.524.91ecb33e6afc3bd8949b.js → chunk.524.60ca4692d91c6022042f.js} +4 -4
- package/core/built/admin/assets/{chunk.582.512549909741883f960c.js → chunk.582.525c7617c2d9e94c940a.js} +6 -6
- package/core/built/admin/assets/{chunk.16.f76a6314082d813d67e0.js → chunk.896.435fe0637944d4a69810.js} +3 -3
- package/core/built/admin/assets/{code-editor-view-BwIdPy_k.js → code-editor-view-CYVu4EW6.js} +1 -1
- package/core/built/admin/assets/{code-editor-view-CtkF82Fv.js → code-editor-view-DCQJxsfU.js} +1 -1
- package/core/built/admin/assets/{color-picker-Bmo1r9Fc.js → color-picker-BTY_NdEm.js} +1 -1
- package/core/built/admin/assets/{color-picker-field-DywowPhF.js → color-picker-field-CPlkzOH0.js} +1 -1
- package/core/built/admin/assets/{combobox-C4QCh6Yw.js → combobox-DrMtv_4P.js} +1 -1
- package/core/built/admin/assets/command-ZdgYJpoI.js +1 -0
- package/core/built/admin/assets/comments-kidj60-h.js +1 -0
- package/core/built/admin/assets/{confirmation-context-CLFHhyyH.js → confirmation-context-BhbmQQEl.js} +1 -1
- package/core/built/admin/assets/{container-LiZf3XdY.js → container-BuQG1wuP.js} +1 -1
- package/core/built/admin/assets/{content-api-modal-BtpNI92-.js → content-api-modal-CyQEC3fr.js} +1 -1
- package/core/built/admin/assets/{copy-field-CglgRZyG.js → copy-field-B3M1s78L.js} +1 -1
- package/core/built/admin/assets/{custom-field-type-option-D0PXoSnP.js → custom-field-type-option-CsGIZk1J.js} +1 -1
- package/core/built/admin/assets/{custom-integration-modal-DCIHKN33.js → custom-integration-modal-BY37O_9X.js} +1 -1
- package/core/built/admin/assets/{data-list-CupF7bjM.js → data-list-CA2jYGPq.js} +1 -1
- package/core/built/admin/assets/{date-range-select-JPwM0yUj.js → date-range-select-DD2RKkgB.js} +1 -1
- package/core/built/admin/assets/design-and-theme-modal-DUSKM4uC.js +22 -0
- package/core/built/admin/assets/{detail-page-D8lx2SdP.js → detail-page-Dnv-CdR1.js} +1 -1
- package/core/built/admin/assets/dialog-B44iRwlc.js +1 -0
- package/core/built/admin/assets/{dirty-confirm-dialog-CmARpZQS.js → dirty-confirm-dialog-BxgQgQ6H.js} +1 -1
- package/core/built/admin/assets/{disabled-sources-indicator-BTJ2ClQu.js → disabled-sources-indicator-Cvy47bE2.js} +1 -1
- package/core/built/admin/assets/{dist-DzcfoDJ3.js → dist-8YJUlf3B.js} +1 -1
- package/core/built/admin/assets/{dist-Cb5RSHSg.js → dist-B3keLvjj.js} +1 -1
- package/core/built/admin/assets/{dist-QLZuGq7o2.js → dist-Cy8tfrp_.js} +1 -1
- package/core/built/admin/assets/{dist-BT_Z-eCn.js → dist-Dgt2cr6a.js} +1 -1
- package/core/built/admin/assets/{domain-D0SAtc-T.js → domain-Ca6KhoQt.js} +1 -1
- package/core/built/admin/assets/{dropzone-CaPOeDRZ.js → dropzone-Bb-5zQTk.js} +1 -1
- package/core/built/admin/assets/edit-profile-BdupLlus.js +1 -0
- package/core/built/admin/assets/{editor-COXn4Atu.js → editor-BP883Lpn.js} +3 -3
- package/core/built/admin/assets/{embed-signup-form-modal-BFTPf04i.js → embed-signup-form-modal-DeBMLxlL.js} +1 -1
- package/core/built/admin/assets/{empty-indicator-WB1WgT9h.js → empty-indicator-D9QdpuNX.js} +1 -1
- package/core/built/admin/assets/{explore-BsNYrubV.js → explore-FB-CimXw.js} +1 -1
- package/core/built/admin/assets/{feed-8RR1O1bK.js → feed-C1GxsmI2.js} +1 -1
- package/core/built/admin/assets/{field-LmNk7wZh.js → field-Cj8lmDOo.js} +1 -1
- package/core/built/admin/assets/{filter-sources-4C0kF1NU.js → filter-sources-D5n5bFA2.js} +1 -1
- package/core/built/admin/assets/{filters-CV5jCb9n.js → filters-DJEzkMUK.js} +1 -1
- package/core/built/admin/assets/{filters-Dmr0PoqU.js → filters-MZXvdH5D.js} +1 -1
- package/core/built/admin/assets/{first-promoter-modal-OCzSaL3B.js → first-promoter-modal-CGTGLCr5.js} +1 -1
- package/core/built/admin/assets/{ghost-403cb39badad3df411fc0ba27d220047.js → ghost-3894eedcc6968f658578c0abfe942aab.js} +2 -2
- package/core/built/admin/assets/{gift-link-modal-0mzjn5oF.js → gift-link-modal-B6v0tnRN.js} +1 -1
- package/core/built/admin/assets/{grid-CUciBfjf.js → grid-Dj29PY05.js} +1 -1
- package/core/built/admin/assets/growth-BGAJD1rs.js +3 -0
- package/core/built/admin/assets/growth-D6mhcx3q.js +1 -0
- package/core/built/admin/assets/{heading-CRZZ2FUe.js → heading-Dh5SFVjL.js} +1 -1
- package/core/built/admin/assets/history-modal-iKwUY3XR.js +1 -0
- package/core/built/admin/assets/html-field-C8qVGGC1.js +1 -0
- package/core/built/admin/assets/{images-C0XvUYMb.js → images-h8VZEQ9k.js} +1 -1
- package/core/built/admin/assets/{inbox-DZXDUt4s.js → inbox-BYd1M06Q.js} +13 -13
- package/core/built/admin/assets/index-DjQe-e5s.js +4 -0
- package/core/built/admin/assets/{index.es-BMUCj9TR.js → index.es-VihPwfeH.js} +1 -1
- package/core/built/admin/assets/{inline-Cw-gigDW.js → inline-BWSs_VzR.js} +1 -1
- package/core/built/admin/assets/{input-UHrKuvBT.js → input--W-rCTrX.js} +1 -1
- package/core/built/admin/assets/{input-group-BPAxETpQ.js → input-group-D8sCXRF5.js} +1 -1
- package/core/built/admin/assets/{input-surface-BdOe4KzO.js → input-surface-BsrIZeSF.js} +1 -1
- package/core/built/admin/assets/{integration-header-B4DyXV06.js → integration-header-Bm6IDb1A.js} +1 -1
- package/core/built/admin/assets/{invite-user-modal-BrAkxEO3.js → invite-user-modal-MdImLCaJ.js} +1 -1
- package/core/built/admin/assets/{koenig-lexical-60O_8aiO.js → koenig-lexical-_-IsVI7E.js} +1 -1
- package/core/built/admin/assets/koenig-loader-DYZpm6El.js +2 -0
- package/core/built/admin/assets/{kpi-card-fUHZlzBX.js → kpi-card-DW_2y3ug.js} +1 -1
- package/core/built/admin/assets/kpi-card-DZQk_0W8.js +1 -0
- package/core/built/admin/assets/kpi-helpers-PueTKuA6.js +1 -0
- package/core/built/admin/assets/kpi-tabs-CojDs-Qz.js +1 -0
- package/core/built/admin/assets/{label-VIG969IC.js → label-DjbT91GM.js} +1 -1
- package/core/built/admin/assets/{label-picker-BBWykUeA.js → label-picker-cB51xl1r.js} +1 -1
- package/core/built/admin/assets/layout-c_B_1hax.js +1 -0
- package/core/built/admin/assets/{link-helpers-Dtq9fxQg.js → link-helpers-MVDdnFCY.js} +1 -1
- package/core/built/admin/assets/{list-page-CdsnQR9N.js → list-page-BucXJ0hi.js} +1 -1
- package/core/built/admin/assets/{loading-indicator-SFTqyYVE.js → loading-indicator-BpFWTVgh.js} +1 -1
- package/core/built/admin/assets/{member-custom-fields-gOv6Hoh3.js → member-custom-fields-qs0dIkxM.js} +1 -1
- package/core/built/admin/assets/member-detail-B6uec2a6.js +1 -0
- package/core/built/admin/assets/members-BQF3CqhI.js +2 -0
- package/core/built/admin/assets/{modal-page-BMTzFHVO.js → modal-page-xCivTMvI.js} +1 -1
- package/core/built/admin/assets/{moderation-DzzPLDyl.js → moderation-DY4wF1Q3.js} +1 -1
- package/core/built/admin/assets/{multi-select-combobox-CGohnsxJ.js → multi-select-combobox-B6LiRzDO.js} +1 -1
- package/core/built/admin/assets/navigation-modal-DX-gNF3X.js +1 -0
- package/core/built/admin/assets/newsletter-CyQA7m3m.js +1 -0
- package/core/built/admin/assets/{newsletter-detail-modal-DQU3r4g2.js → newsletter-detail-modal-BDrptuxn.js} +1 -1
- package/core/built/admin/assets/{newsletter-emails-D5ql1rud.js → newsletter-emails-CFeLlt4z.js} +1 -1
- package/core/built/admin/assets/newsletters-DXuNmC42.js +1 -0
- package/core/built/admin/assets/{note-i8k6pjaw.js → note-Cgo2LCJ6.js} +1 -1
- package/core/built/admin/assets/notifications-BC50AMku.js +1 -0
- package/core/built/admin/assets/{offers-container-modal-BWfjSdyg.js → offers-container-modal-DWycIMzT.js} +1 -1
- package/core/built/admin/assets/{onboarding-route-Cu_ROWPn.js → onboarding-route-Dmc4IPm3.js} +1 -1
- package/core/built/admin/assets/overview-CVbFtn-k.js +1 -0
- package/core/built/admin/assets/overview-YKj7SZaK.js +1 -0
- package/core/built/admin/assets/{page-header-Cfds8pCg.js → page-header-BR_nbIPp.js} +1 -1
- package/core/built/admin/assets/{pintura-modal-TDTrJ89x.js → pintura-modal-BR9hEvS8.js} +1 -1
- package/core/built/admin/assets/popover-CCy0h5rq.js +1 -0
- package/core/built/admin/assets/{portal-frame-DjBF-uy2.js → portal-frame-dc4XKr0e.js} +1 -1
- package/core/built/admin/assets/portal-modal-BvvdF_B9.js +1 -0
- package/core/built/admin/assets/{post-analytics-Buz1COoY.js → post-analytics-DX470WRG.js} +1 -1
- package/core/built/admin/assets/{post-analytics-header-B-P0eFnT.js → post-analytics-header-CXpJmdDv.js} +1 -1
- package/core/built/admin/assets/{post-analytics-provider-Cu3jNeFh.js → post-analytics-provider-CLfKGWZy.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-P1_M6o-H.js → post-share-modal-Cl0NXRJr.js} +1 -1
- package/core/built/admin/assets/{preferences-Cq1aOiLy.js → preferences-DO0UUWFp.js} +2 -2
- package/core/built/admin/assets/{preview-chrome-BOVO6_PE.js → preview-chrome-BljUBlOk.js} +1 -1
- package/core/built/admin/assets/{preview-modal-MlTjP8UU.js → preview-modal-C-BL-F9k.js} +1 -1
- package/core/built/admin/assets/profile-CxT-0l4d.js +1 -0
- package/core/built/admin/assets/radio-group-Bgz60i81.js +1 -0
- package/core/built/admin/assets/{router-provider-CJC58zTy.js → router-provider-B0gZyiGJ.js} +1 -1
- package/core/built/admin/assets/{schemas-CRsC53ls.js → schemas-4UPic-oD.js} +2 -2
- package/core/built/admin/assets/select-DuDUFdPq.js +1 -0
- package/core/built/admin/assets/{settings-B5hJKZ5C.js → settings-BjCii7BM.js} +1 -1
- package/core/built/admin/assets/settings-b8kNzZSQ.js +4 -0
- package/core/built/admin/assets/{settings-breadcrumbs-sLDNedBW.js → settings-breadcrumbs-CyP_9zTo.js} +1 -1
- package/core/built/admin/assets/{shade-app-F7WxOyfk-nufqw1hd.js → shade-app-CcS3f8MZ-vwURazk8.js} +2 -2
- package/core/built/admin/assets/{share-modal-CLBfj377.js → share-modal-BV70mr9k.js} +1 -1
- package/core/built/admin/assets/{skeleton-D7hwjdry.js → skeleton-Ce9GgUpf.js} +1 -1
- package/core/built/admin/assets/{slack-modal-Bt9I_tEo.js → slack-modal-Be2_KK-z.js} +1 -1
- package/core/built/admin/assets/sort-button-Cc-Z96sA.js +1 -0
- package/core/built/admin/assets/{source-icon-BPsD5ees.js → source-icon-v6PUnmyM.js} +1 -1
- package/core/built/admin/assets/{stack-CIfOAAVf.js → stack-B2eszIiq.js} +1 -1
- package/core/built/admin/assets/{stats-B_YkF7bp.js → stats-C4reGh9O.js} +1 -1
- package/core/built/admin/assets/{stats-view-BOCp9RG8.js → stats-view-DP9pQ62k.js} +1 -1
- package/core/built/admin/assets/{step-1-CMta6YFO.js → step-1-DSRp2vBj.js} +1 -1
- package/core/built/admin/assets/{step-2-BG04nh5q.js → step-2-COqv2g0u.js} +1 -1
- package/core/built/admin/assets/{step-3-ZnMaVIPj.js → step-3-6W1NMVQc.js} +2 -2
- package/core/built/admin/assets/{stripe-button-DDoUKN5a.js → stripe-button-D2K42Uty.js} +1 -1
- package/core/built/admin/assets/{stripe-connect-modal-BeSukI8q.js → stripe-connect-modal-Z-UT_BGc.js} +1 -1
- package/core/built/admin/assets/{switch-C9djUIMO.js → switch-CI4gLWqb.js} +1 -1
- package/core/built/admin/assets/{table-CrqQtkR2.js → table-B2pIKjVh.js} +1 -1
- package/core/built/admin/assets/{tabs-CGisSbWq.js → tabs-SaW_UT-Q.js} +1 -1
- package/core/built/admin/assets/tag-detail-Dc0nTOtU.js +2 -0
- package/core/built/admin/assets/tags-BLaXBwnb.js +1 -0
- package/core/built/admin/assets/testimonials-modal-sFwRnNLh.js +1 -0
- package/core/built/admin/assets/{text-DU9Hv33_.js → text-BQDSDsKs.js} +1 -1
- package/core/built/admin/assets/{textarea-d9qEkMOP.js → textarea-DJ1Q5V39.js} +1 -1
- package/core/built/admin/assets/{tier-detail-modal-CxRwgTPR.js → tier-detail-modal-BCFpWwUS.js} +1 -1
- package/core/built/admin/assets/{toggle-group-CtKZURJd.js → toggle-group-EM9WpESu.js} +1 -1
- package/core/built/admin/assets/{topic-filter-D8JT8Tq1.js → topic-filter-DY4gNHn2.js} +1 -1
- package/core/built/admin/assets/{transistor-modal-6PUf0idx.js → transistor-modal-CpyPG-MH.js} +1 -1
- package/core/built/admin/assets/trend-badge-ByMkuAuH.js +1 -0
- package/core/built/admin/assets/{unsplash-modal-BPuDBPja.js → unsplash-modal-Cv2Q6GtY.js} +1 -1
- package/core/built/admin/assets/{use-analytics-data--opuzwcz.js → use-analytics-data-CHvjMYuT.js} +1 -1
- package/core/built/admin/assets/use-check-theme-limit-error-Qv4SVXqw.js +2 -0
- package/core/built/admin/assets/use-filter-params-CAvfDvf1.js +1 -0
- package/core/built/admin/assets/use-growth-stats-D6mZXGhK.js +1 -0
- package/core/built/admin/assets/{use-limiter-TDSNiHPB.js → use-limiter-cwJvsNBo.js} +1 -1
- package/core/built/admin/assets/{use-navigate-with-base-path-CK989MlC.js → use-navigate-with-base-path-BHPA228f.js} +1 -1
- package/core/built/admin/assets/{use-pintura-config-CnCGrDFk.js → use-pintura-config-CzTfnufz.js} +1 -1
- package/core/built/admin/assets/{use-pintura-editor-ntphvtUd.js → use-pintura-editor-BDBXWUYq.js} +1 -1
- package/core/built/admin/assets/{use-post-referrers-CbXLFIex.js → use-post-referrers-DbY-mzci.js} +1 -1
- package/core/built/admin/assets/{use-reply-chain-data-JYFKSO83.js → use-reply-chain-data-BeQwz8oF.js} +1 -1
- package/core/built/admin/assets/{use-router-history-entry-BwfQS2mq.js → use-router-history-entry-Bg6BhBQQ.js} +1 -1
- package/core/built/admin/assets/{use-setting-group-DQxV42-O.js → use-setting-group-VM7FQwMY.js} +1 -1
- package/core/built/admin/assets/{use-settings-navigation-BBzro2-V.js → use-settings-navigation-BbrSUVcf.js} +1 -1
- package/core/built/admin/assets/{use-simple-pagination-B2TdNX67.js → use-simple-pagination-Dum6Irbs.js} +1 -1
- package/core/built/admin/assets/{use-staff-users-QrR9voeC.js → use-staff-users-cZg4ugOF.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-query-D2Aeoty5.js → use-tinybird-query-B1IMyAcv.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-DBuwMmln.js → use-tinybird-token-Bow0Zwn8.js} +1 -1
- package/core/built/admin/assets/{use-unsaved-changes-guard-DpYJcj1d.js → use-unsaved-changes-guard-BAy0RANR.js} +1 -1
- package/core/built/admin/assets/{use-url-input-WnIqckzS.js → use-url-input-Df5QzNa7.js} +1 -1
- package/core/built/admin/assets/user-detail-modal-yipSoQfv.js +1 -0
- package/core/built/admin/assets/{virtual-list-D3MfPNOh.js → virtual-list-DEx8WgiO.js} +1 -1
- package/core/built/admin/assets/web-CKcXAu86.js +1 -0
- package/core/built/admin/assets/web-DR4TqM3E.js +2 -0
- package/core/built/admin/assets/{zapier-modal-BO6PS_Vd.js → zapier-modal-Cw3BTBUu.js} +1 -1
- package/core/built/admin/index.html +24 -25
- package/core/frontend/services/rendering/renderer.js +15 -0
- package/core/server/adapters/storage/LocalStorageBase.js +8 -5
- package/core/server/api/endpoints/db.js +19 -5
- package/core/server/api/endpoints/index.js +4 -0
- package/core/server/api/endpoints/member-custom-fields.js +4 -14
- package/core/server/api/endpoints/posts.js +1 -0
- package/core/server/api/endpoints/tiers-checkout-config.js +59 -0
- package/core/server/api/endpoints/utils/serializers/output/config.js +1 -0
- package/core/server/api/endpoints/utils/serializers/output/index.js +4 -0
- package/core/server/api/endpoints/utils/serializers/output/tiers-checkout-config.js +12 -0
- package/core/server/data/exporter/table-lists.js +3 -0
- package/core/server/data/importer/content-files.js +57 -0
- package/core/server/data/importer/handlers/image.js +2 -2
- package/core/server/data/importer/import-archive.js +131 -0
- package/core/server/data/importer/import-manager.js +18 -180
- package/core/server/data/importer/importers/content-file-importer.js +66 -4
- package/core/server/data/migrations/versions/6.61/2026-08-19-14-30-20-add-written-by-to-members-custom-field-values.js +42 -0
- package/core/server/data/migrations/versions/6.61/2026-08-19-14-38-53-add-members-custom-field-bindings-table.js +26 -0
- package/core/server/data/migrations/versions/6.61/2026-08-19-14-48-06-add-tier-checkout-field-tables.js +35 -0
- package/core/server/data/schema/schema.js +90 -0
- package/core/server/data/seeders/importers/automation-action-revisions-importer.js +3 -3
- package/core/server/data/seeders/importers/automation-actions-importer.js +3 -3
- package/core/server/data/seeders/importers/automation-run-steps-importer.js +3 -3
- package/core/server/data/seeders/importers/automation-runs-importer.js +5 -5
- package/core/server/data/seeders/importers/automations-importer.js +3 -3
- package/core/server/data/seeders/importers/comment-reports-importer.js +1 -1
- package/core/server/data/seeders/importers/comments-importer.js +1 -1
- package/core/server/data/seeders/importers/email-batches-importer.js +1 -1
- package/core/server/data/seeders/importers/email-recipients-importer.js +1 -1
- package/core/server/data/seeders/importers/emails-importer.js +1 -1
- package/core/server/data/seeders/importers/labels-importer.js +1 -1
- package/core/server/data/seeders/importers/members-click-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-created-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-feedback-importer.js +1 -1
- package/core/server/data/seeders/importers/members-importer.js +1 -1
- package/core/server/data/seeders/importers/members-login-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-products-importer.js +1 -1
- package/core/server/data/seeders/importers/members-status-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-stripe-customers-importer.js +1 -1
- package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +1 -1
- package/core/server/data/seeders/importers/members-subscribe-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +1 -1
- package/core/server/data/seeders/importers/offer-redemptions-importer.js +1 -1
- package/core/server/data/seeders/importers/offers-importer.js +1 -1
- package/core/server/data/seeders/importers/posts-importer.js +1 -1
- package/core/server/data/seeders/importers/table-importer.js +2 -2
- package/core/server/data/seeders/importers/tags-importer.js +1 -1
- package/core/server/data/seeders/importers/users-importer.js +1 -1
- package/core/server/data/seeders/importers/web-mentions-importer.js +1 -1
- package/core/server/data/seeders/utils/random.js +3 -3
- package/core/server/ghost-server.js +3 -2
- package/core/server/lib/db-types/boolean.js +18 -0
- package/core/server/lib/promise-pool.js +31 -0
- package/core/server/services/automations/database-automations-repository.js +26 -26
- package/core/server/services/automations/poll.js +1 -0
- package/core/server/services/content-import/import/assets.js +74 -0
- package/core/server/services/content-import/import/importer.js +57 -14
- package/core/server/services/content-import/import/post-data.js +1 -0
- package/core/server/services/content-import/import/post-repository.js +78 -0
- package/core/server/services/content-import/import/relations.js +149 -0
- package/core/server/services/content-import/import/row.js +11 -0
- package/core/server/services/content-import/import/schema.js +29 -0
- package/core/server/services/content-import/import/source.js +125 -0
- package/core/server/services/content-import/index.js +6 -28
- package/core/server/services/email-analytics/email-analytics-service.js +8 -1
- package/core/server/services/email-analytics/lib/queries.js +7 -1
- package/core/server/services/gift-links/schema.js +3 -3
- package/core/server/services/gifts/CONTEXT.md +1 -1
- package/core/server/services/gifts/constants.js +1 -1
- package/core/server/services/gifts/gift-bookshelf-repository.js +2 -2
- package/core/server/services/gifts/gift-delivery-bookshelf-repository.js +18 -9
- package/core/server/services/gifts/gift-delivery-schema.js +5 -5
- package/core/server/services/gifts/gift-delivery-service.js +4 -0
- package/core/server/services/gifts/gift-schema.js +10 -10
- package/core/server/services/gifts/gift-service.js +4 -2
- package/core/server/services/jobs-service/register-job-handlers.js +5 -5
- package/core/server/services/lib/mailgun-client.js +44 -8
- package/core/server/services/media-inliner/external-media-inliner-job.js +12 -0
- package/core/server/services/media-inliner/external-media-inliner.js +103 -29
- package/core/server/services/media-inliner/service.js +13 -41
- package/core/server/services/media-inliner/types.js +2 -0
- package/core/server/services/members/import-export/export/exporter.js +4 -6
- package/core/server/services/members/import-export/import/importer.js +21 -5
- package/core/server/services/members/import-export/import/stripe-utils.js +6 -1
- package/core/server/services/members/import-export/index.js +6 -1
- package/core/server/services/members/members-api/members-api.js +5 -0
- package/core/server/services/members/members-api/services/member-bread-service.js +19 -1
- package/core/server/services/members/members-api/services/payments-service.js +47 -1
- package/core/server/services/members-custom-fields/actions.js +27 -1
- package/core/server/services/members-custom-fields/bindings-service.js +119 -0
- package/core/server/services/members-custom-fields/definitions-service.js +104 -13
- package/core/server/services/members-custom-fields/index.js +11 -4
- package/core/server/services/members-custom-fields/queries.js +5 -0
- package/core/server/services/members-custom-fields/schema.js +37 -6
- package/core/server/services/members-custom-fields/values-service.js +15 -3
- package/core/server/services/public-config/config.js +7 -0
- package/core/server/services/stripe/services/checkout/allowed-countries.js +267 -0
- package/core/server/services/stripe/services/checkout/completed-session.js +68 -0
- package/core/server/services/stripe/services/checkout/field-ports.js +34 -0
- package/core/server/services/stripe/services/checkout/session-options.js +97 -0
- package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +49 -0
- package/core/server/services/stripe/stripe-api.js +29 -0
- package/core/server/services/stripe/stripe-service.js +7 -0
- package/core/server/services/tier-checkout-config/codec.js +95 -0
- package/core/server/services/tier-checkout-config/destinations.js +17 -0
- package/core/server/services/tier-checkout-config/index.js +26 -0
- package/core/server/services/tier-checkout-config/models.js +57 -0
- package/core/server/services/tier-checkout-config/queries.js +80 -0
- package/core/server/services/tier-checkout-config/schema.js +33 -0
- package/core/server/services/tier-checkout-config/serializers.js +122 -0
- package/core/server/services/tier-checkout-config/service.js +303 -0
- package/core/server/services/tiers/service.js +21 -0
- package/core/server/web/api/endpoints/admin/routes.js +24 -13
- package/core/server/web/api/middleware/upload.js +2 -2
- package/core/server/web/parent/app.js +5 -0
- package/core/server/web/parent/middleware/filter-query-parameters.js +94 -0
- package/core/server/web/parent/middleware/index.js +1 -0
- package/core/server/web/query-parameter-policy/index.js +9 -0
- package/core/server/web/query-parameter-policy/policy.json +58 -0
- package/core/server/web/query-parameter-policy/schema.js +38 -0
- package/core/shared/config/defaults.json +3 -0
- package/core/shared/config/env/config.testing-mysql.json +3 -0
- package/core/shared/config/env/config.testing.json +3 -0
- package/core/shared/config/overrides.json +4 -2
- package/core/shared/labs.js +5 -14
- package/package.json +12 -13
- package/pnpm-lock.yaml +44 -46
- package/pnpm-workspace.yaml +6 -6
- package/tsconfig.json +2 -3
- package/core/built/admin/assets/activitypub/layout-CXajhRsL.js +0 -1
- package/core/built/admin/assets/alert-dialog-wEbVxANM.js +0 -1
- package/core/built/admin/assets/app-utils-D2Wp7ZSS.js +0 -1
- package/core/built/admin/assets/audience-DTLMXAFH.js +0 -1
- package/core/built/admin/assets/chart-helpers-B3OqQ6Ez.js +0 -1
- package/core/built/admin/assets/command-DcLbSifC.js +0 -1
- package/core/built/admin/assets/comments-Bxy_3WyE.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-CZ-PkW7o.js +0 -23
- package/core/built/admin/assets/dialog-Db7c164G.js +0 -1
- package/core/built/admin/assets/edit-profile-By7v5XW5.js +0 -1
- package/core/built/admin/assets/growth-55vWlGT_.js +0 -1
- package/core/built/admin/assets/growth-DA5AluYw.js +0 -3
- package/core/built/admin/assets/history-modal-G1s5hHz7.js +0 -1
- package/core/built/admin/assets/html-field-BegxsWpw.js +0 -1
- package/core/built/admin/assets/index-CDP9tIOk.js +0 -4
- package/core/built/admin/assets/koenig-loader-DwVY_V-H.js +0 -1
- package/core/built/admin/assets/kpi-card-LERqWBoY.js +0 -1
- package/core/built/admin/assets/kpi-helpers-DB3ouhYF.js +0 -1
- package/core/built/admin/assets/kpi-tabs-BGvtMD8S.js +0 -1
- package/core/built/admin/assets/layout-Di5K7doM.js +0 -1
- package/core/built/admin/assets/member-detail-D7mZDDp3.js +0 -1
- package/core/built/admin/assets/member-route-0Aa52Ntz.js +0 -1
- package/core/built/admin/assets/members-DvZG9t69.js +0 -2
- package/core/built/admin/assets/navigation-modal-CI8Bx5vn.js +0 -1
- package/core/built/admin/assets/newsletter-Bg3cq5U-.js +0 -1
- package/core/built/admin/assets/newsletters-DMDfZbMS.js +0 -1
- package/core/built/admin/assets/notifications-psA_2Ph4.js +0 -1
- package/core/built/admin/assets/overview-C-6xOLaf.js +0 -1
- package/core/built/admin/assets/overview-DaLhpRrC.js +0 -1
- package/core/built/admin/assets/popover-CFgqFDvC.js +0 -1
- package/core/built/admin/assets/portal-modal-Cf0pBAk8.js +0 -1
- package/core/built/admin/assets/profile-D6dHYf2o.js +0 -1
- package/core/built/admin/assets/radio-group-CjtmsCPl.js +0 -1
- package/core/built/admin/assets/select-D_RQaXgt.js +0 -1
- package/core/built/admin/assets/settings-DIo_F-MF.js +0 -4
- package/core/built/admin/assets/sort-button-DMBXF7tP.js +0 -1
- package/core/built/admin/assets/tag-detail-2a3BfzTW.js +0 -2
- package/core/built/admin/assets/tags-Dp2_8UzL.js +0 -1
- package/core/built/admin/assets/testimonials-modal-C9nrypNo.js +0 -1
- package/core/built/admin/assets/use-check-theme-limit-error-C9-QhGdV.js +0 -1
- package/core/built/admin/assets/use-filter-params-CSpAvgD2.js +0 -1
- package/core/built/admin/assets/use-growth-stats-BOmoPDHJ.js +0 -1
- package/core/built/admin/assets/user-detail-modal-59mBJqxN.js +0 -1
- package/core/built/admin/assets/web-DUuX7nE2.js +0 -2
- package/core/built/admin/assets/web-N8ucs2aG.js +0 -1
- /package/core/server/lib/{db-date.js → db-types/date.js} +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.questionRowCodec = exports.QuestionRow = exports.collectionRowCodec = exports.CollectionRow = exports.optionsCodec = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const custom_field_types_1 = require("@tryghost/custom-field-types");
|
|
6
|
+
const boolean_1 = require("../../lib/db-types/boolean");
|
|
7
|
+
const schema_1 = require("./schema");
|
|
8
|
+
const models_1 = require("./models");
|
|
9
|
+
const SEPARATOR = ',';
|
|
10
|
+
exports.optionsCodec = zod_1.z.codec(schema_1.DbCheckoutOptions, models_1.CheckoutOptions, {
|
|
11
|
+
decode: (columns) => ({
|
|
12
|
+
shippingAllowedCountries: splitList(columns.shipping_allowed_countries),
|
|
13
|
+
taxNumber: columns.tax_number_collect,
|
|
14
|
+
}),
|
|
15
|
+
encode: (options) => ({
|
|
16
|
+
shipping_allowed_countries: options.shippingAllowedCountries.length
|
|
17
|
+
? joinList(options.shippingAllowedCountries)
|
|
18
|
+
: null,
|
|
19
|
+
tax_number_collect: options.taxNumber,
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
22
|
+
function splitList(stored) {
|
|
23
|
+
return stored ? stored.split(SEPARATOR).filter(Boolean) : [];
|
|
24
|
+
}
|
|
25
|
+
function joinList(values) {
|
|
26
|
+
return [...new Set(values)].join(SEPARATOR);
|
|
27
|
+
}
|
|
28
|
+
exports.CollectionRow = zod_1.z.object({
|
|
29
|
+
product_id: zod_1.z.string(),
|
|
30
|
+
config_id: zod_1.z.string().nullable(),
|
|
31
|
+
shipping_allowed_countries: zod_1.z.string().nullable(),
|
|
32
|
+
tax_number_collect: boolean_1.DbBoolean.nullable(),
|
|
33
|
+
shipping_name_key: zod_1.z.string().nullable(),
|
|
34
|
+
shipping_name_collectable: zod_1.z.string().nullable(),
|
|
35
|
+
shipping_address_key: zod_1.z.string().nullable(),
|
|
36
|
+
shipping_address_collectable: zod_1.z.string().nullable(),
|
|
37
|
+
phone_key: zod_1.z.string().nullable(),
|
|
38
|
+
phone_collectable: zod_1.z.string().nullable(),
|
|
39
|
+
});
|
|
40
|
+
exports.collectionRowCodec = exports.CollectionRow.transform((row) => {
|
|
41
|
+
const collection = collectedInto(row);
|
|
42
|
+
return {
|
|
43
|
+
tierId: row.product_id,
|
|
44
|
+
configured: row.config_id !== null,
|
|
45
|
+
collection,
|
|
46
|
+
collecting: {
|
|
47
|
+
// Stripe collects the recipient's name and their address under one parameter, so it
|
|
48
|
+
// asks for both or neither. Archiving one of the two destinations is the publisher
|
|
49
|
+
// saying they no longer want that half: the step is still worth asking for while the
|
|
50
|
+
// other half can land, and whatever arrives for the archived one is dropped. Only
|
|
51
|
+
// archiving both leaves nothing worth asking for.
|
|
52
|
+
shipping: row.shipping_name_collectable === null && row.shipping_address_collectable === null
|
|
53
|
+
? null
|
|
54
|
+
: collection.shipping,
|
|
55
|
+
taxNumber: collection.taxNumber,
|
|
56
|
+
phone: row.phone_collectable === null ? null : collection.phone,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
exports.QuestionRow = zod_1.z.object({
|
|
61
|
+
product_id: zod_1.z.string(),
|
|
62
|
+
port: zod_1.z.string(),
|
|
63
|
+
label: schema_1.DbCheckoutQuestion.shape.label,
|
|
64
|
+
optional: schema_1.DbCheckoutQuestion.shape.optional,
|
|
65
|
+
question_name: zod_1.z.string().nullable(),
|
|
66
|
+
question_type: custom_field_types_1.FieldTypeSchema.nullable(),
|
|
67
|
+
});
|
|
68
|
+
exports.questionRowCodec = exports.QuestionRow.transform((row) => ({
|
|
69
|
+
tierId: row.product_id,
|
|
70
|
+
question: {
|
|
71
|
+
key: row.port,
|
|
72
|
+
label: row.label,
|
|
73
|
+
optional: row.optional,
|
|
74
|
+
},
|
|
75
|
+
askable: row.question_type === null
|
|
76
|
+
? null
|
|
77
|
+
: { prompt: row.label ?? row.question_name ?? row.port, type: row.question_type },
|
|
78
|
+
}));
|
|
79
|
+
function collectedInto(row) {
|
|
80
|
+
const { shippingAllowedCountries, taxNumber } = zod_1.z.decode(exports.optionsCodec, {
|
|
81
|
+
shipping_allowed_countries: row.shipping_allowed_countries,
|
|
82
|
+
tax_number_collect: row.tax_number_collect ?? false,
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
shipping: row.shipping_name_key !== null && row.shipping_address_key !== null
|
|
86
|
+
? {
|
|
87
|
+
allowedCountries: shippingAllowedCountries,
|
|
88
|
+
nameCustomFieldKey: row.shipping_name_key,
|
|
89
|
+
addressCustomFieldKey: row.shipping_address_key,
|
|
90
|
+
}
|
|
91
|
+
: null,
|
|
92
|
+
taxNumber,
|
|
93
|
+
phone: row.phone_key === null ? null : { customFieldKey: row.phone_key },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PORT_FIELD = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* What a port supplies, and what to call a field made to hold it. The type is a rule about
|
|
6
|
+
* any destination: a port that returns an address can only be collected into a field that
|
|
7
|
+
* keeps one. The name is used only when the request names a key the site does not keep
|
|
8
|
+
* yet, which is the one moment a publisher has not chosen a label themselves.
|
|
9
|
+
*
|
|
10
|
+
* A key is not a port. `phone` is what Stripe calls what it returns; where it lands is
|
|
11
|
+
* whatever the request said, and `Shipping Phone` is only how that field is listed.
|
|
12
|
+
*/
|
|
13
|
+
exports.PORT_FIELD = {
|
|
14
|
+
shipping_name: { name: 'Shipping Name', type: 'short_text' },
|
|
15
|
+
shipping_address: { name: 'Shipping Address', type: 'address' },
|
|
16
|
+
phone: { name: 'Shipping Phone', type: 'short_text' },
|
|
17
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toCheckoutConfigResponse = exports.TierCheckoutConfig = exports.ShippingCollection = exports.ResolvedQuestion = exports.ResolvedCheckout = exports.PhoneCollection = exports.emptyCheckoutConfig = exports.CheckoutQuestion = exports.TierCheckoutConfigService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* What a tier's checkout asks and collects.
|
|
6
|
+
*
|
|
7
|
+
* A domain of its own rather than part of the Tier aggregate: a tier is loaded into memory
|
|
8
|
+
* once at boot, and these rows are read live because deleting a custom field cascades a
|
|
9
|
+
* question away without that repository ever seeing it.
|
|
10
|
+
*
|
|
11
|
+
* Constructed by the tiers service wrapper at boot, which already holds the collaborators
|
|
12
|
+
* this needs, rather than by an init() here — the custom field services are built before
|
|
13
|
+
* it, so both are ready by the time it runs.
|
|
14
|
+
*/
|
|
15
|
+
var service_1 = require("./service");
|
|
16
|
+
Object.defineProperty(exports, "TierCheckoutConfigService", { enumerable: true, get: function () { return service_1.TierCheckoutConfigService; } });
|
|
17
|
+
var models_1 = require("./models");
|
|
18
|
+
Object.defineProperty(exports, "CheckoutQuestion", { enumerable: true, get: function () { return models_1.CheckoutQuestion; } });
|
|
19
|
+
Object.defineProperty(exports, "emptyCheckoutConfig", { enumerable: true, get: function () { return models_1.emptyCheckoutConfig; } });
|
|
20
|
+
Object.defineProperty(exports, "PhoneCollection", { enumerable: true, get: function () { return models_1.PhoneCollection; } });
|
|
21
|
+
Object.defineProperty(exports, "ResolvedCheckout", { enumerable: true, get: function () { return models_1.ResolvedCheckout; } });
|
|
22
|
+
Object.defineProperty(exports, "ResolvedQuestion", { enumerable: true, get: function () { return models_1.ResolvedQuestion; } });
|
|
23
|
+
Object.defineProperty(exports, "ShippingCollection", { enumerable: true, get: function () { return models_1.ShippingCollection; } });
|
|
24
|
+
Object.defineProperty(exports, "TierCheckoutConfig", { enumerable: true, get: function () { return models_1.TierCheckoutConfig; } });
|
|
25
|
+
var serializers_1 = require("./serializers");
|
|
26
|
+
Object.defineProperty(exports, "toCheckoutConfigResponse", { enumerable: true, get: function () { return serializers_1.toCheckoutConfigResponse; } });
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResolvedCheckout = exports.ResolvedQuestion = exports.CheckoutOptions = exports.emptyCheckoutConfig = exports.emptyCollection = exports.TierCheckoutConfig = exports.PhoneCollection = exports.ShippingCollection = exports.CheckoutQuestion = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const custom_field_types_1 = require("@tryghost/custom-field-types");
|
|
6
|
+
exports.CheckoutQuestion = zod_1.z.object({
|
|
7
|
+
key: zod_1.z.string(),
|
|
8
|
+
label: zod_1.z.string().nullable(),
|
|
9
|
+
optional: zod_1.z.boolean(),
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* One toggle and two destinations: a processor returns the recipient and the address
|
|
13
|
+
* under one parameter, but a publisher keeps a name and an address in different fields.
|
|
14
|
+
*/
|
|
15
|
+
exports.ShippingCollection = zod_1.z.object({
|
|
16
|
+
/** ISO 3166-1 alpha-2. A processor will not render an address form without them. */
|
|
17
|
+
allowedCountries: zod_1.z.array(zod_1.z.string()),
|
|
18
|
+
nameCustomFieldKey: zod_1.z.string(),
|
|
19
|
+
addressCustomFieldKey: zod_1.z.string(),
|
|
20
|
+
});
|
|
21
|
+
exports.PhoneCollection = zod_1.z.object({
|
|
22
|
+
customFieldKey: zod_1.z.string(),
|
|
23
|
+
});
|
|
24
|
+
exports.TierCheckoutConfig = zod_1.z.object({
|
|
25
|
+
tierId: zod_1.z.string(),
|
|
26
|
+
customFields: zod_1.z.array(exports.CheckoutQuestion),
|
|
27
|
+
shipping: exports.ShippingCollection.nullable(),
|
|
28
|
+
/** Stripe keeps a tax number against the customer it invoices; Ghost never stores one. */
|
|
29
|
+
taxNumber: zod_1.z.boolean(),
|
|
30
|
+
phone: exports.PhoneCollection.nullable(),
|
|
31
|
+
});
|
|
32
|
+
const emptyCollection = () => ({
|
|
33
|
+
shipping: null,
|
|
34
|
+
taxNumber: false,
|
|
35
|
+
phone: null,
|
|
36
|
+
});
|
|
37
|
+
exports.emptyCollection = emptyCollection;
|
|
38
|
+
const emptyCheckoutConfig = (tierId) => ({
|
|
39
|
+
tierId,
|
|
40
|
+
customFields: [],
|
|
41
|
+
...(0, exports.emptyCollection)(),
|
|
42
|
+
});
|
|
43
|
+
exports.emptyCheckoutConfig = emptyCheckoutConfig;
|
|
44
|
+
exports.CheckoutOptions = zod_1.z.object({
|
|
45
|
+
shippingAllowedCountries: zod_1.z.array(zod_1.z.string()),
|
|
46
|
+
taxNumber: zod_1.z.boolean(),
|
|
47
|
+
});
|
|
48
|
+
exports.ResolvedQuestion = exports.CheckoutQuestion.extend({
|
|
49
|
+
prompt: zod_1.z.string(),
|
|
50
|
+
type: custom_field_types_1.FieldTypeSchema,
|
|
51
|
+
});
|
|
52
|
+
exports.ResolvedCheckout = zod_1.z.object({
|
|
53
|
+
customFields: zod_1.z.array(exports.ResolvedQuestion),
|
|
54
|
+
shipping: exports.ShippingCollection.nullable(),
|
|
55
|
+
taxNumber: zod_1.z.boolean(),
|
|
56
|
+
phone: exports.PhoneCollection.nullable(),
|
|
57
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FIELDS_TABLE = exports.BINDINGS_TABLE = exports.CONFIG_TABLE = exports.QUESTIONS_TABLE = void 0;
|
|
4
|
+
exports.collectionRowsForTier = collectionRowsForTier;
|
|
5
|
+
exports.configuredCollectionRows = configuredCollectionRows;
|
|
6
|
+
exports.questionRows = questionRows;
|
|
7
|
+
const schema_1 = require("../members-custom-fields/schema");
|
|
8
|
+
const field_ports_1 = require("../stripe/services/checkout/field-ports");
|
|
9
|
+
const schema_2 = require("./schema");
|
|
10
|
+
exports.QUESTIONS_TABLE = 'products_checkout_fields';
|
|
11
|
+
exports.CONFIG_TABLE = 'products_checkout_config';
|
|
12
|
+
exports.BINDINGS_TABLE = 'members_custom_field_bindings';
|
|
13
|
+
exports.FIELDS_TABLE = 'members_custom_fields';
|
|
14
|
+
const ACTIVE = schema_1.FIELD_STATUS.active;
|
|
15
|
+
const optionColumns = Object.keys(schema_2.DbCheckoutOptions.shape).map((column) => `${exports.CONFIG_TABLE}.${column}`);
|
|
16
|
+
function collectionQuery(db) {
|
|
17
|
+
const bindTo = (alias, port) => function () {
|
|
18
|
+
this.on(`${alias}.product_id`, 'products.id').andOn(db.raw(`${alias}.port = ?`, [port]));
|
|
19
|
+
};
|
|
20
|
+
const landsIn = (alias, binding) => function () {
|
|
21
|
+
this.on(`${alias}.key`, `${binding}.custom_field_key`).andOn(db.raw(`${alias}.status = ?`, [ACTIVE]));
|
|
22
|
+
};
|
|
23
|
+
const query = db('products')
|
|
24
|
+
.leftJoin(exports.CONFIG_TABLE, `${exports.CONFIG_TABLE}.product_id`, 'products.id')
|
|
25
|
+
.leftJoin({ name_binding: exports.BINDINGS_TABLE }, bindTo('name_binding', field_ports_1.STRIPE_PORT.shippingName))
|
|
26
|
+
.leftJoin({ name_field: exports.FIELDS_TABLE }, landsIn('name_field', 'name_binding'))
|
|
27
|
+
.leftJoin({ shipping_binding: exports.BINDINGS_TABLE }, bindTo('shipping_binding', field_ports_1.STRIPE_PORT.shippingAddress))
|
|
28
|
+
.leftJoin({ shipping_field: exports.FIELDS_TABLE }, landsIn('shipping_field', 'shipping_binding'))
|
|
29
|
+
.leftJoin({ phone_binding: exports.BINDINGS_TABLE }, bindTo('phone_binding', field_ports_1.STRIPE_PORT.phone))
|
|
30
|
+
.leftJoin({ phone_field: exports.FIELDS_TABLE }, landsIn('phone_field', 'phone_binding'))
|
|
31
|
+
.orderBy('products.id', 'asc')
|
|
32
|
+
.select([
|
|
33
|
+
'products.id as product_id',
|
|
34
|
+
`${exports.CONFIG_TABLE}.id as config_id`,
|
|
35
|
+
...optionColumns,
|
|
36
|
+
'name_binding.custom_field_key as shipping_name_key',
|
|
37
|
+
'name_field.key as shipping_name_collectable',
|
|
38
|
+
'shipping_binding.custom_field_key as shipping_address_key',
|
|
39
|
+
'shipping_field.key as shipping_address_collectable',
|
|
40
|
+
'phone_binding.custom_field_key as phone_key',
|
|
41
|
+
'phone_field.key as phone_collectable',
|
|
42
|
+
]);
|
|
43
|
+
return query;
|
|
44
|
+
}
|
|
45
|
+
/** One row, whether or not that tier has ever been configured. */
|
|
46
|
+
function collectionRowsForTier(db, productId) {
|
|
47
|
+
return collectionQuery(db).where('products.id', productId);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* This query starts from products, so without a filter it would return every tier on the
|
|
51
|
+
* site, configured or not. A tier only gets a row in products_checkout_config when someone
|
|
52
|
+
* saves checkout settings for it, so requiring that row narrows the list to the tiers
|
|
53
|
+
* somebody has actually set up. A tier that was set up and then had everything switched off
|
|
54
|
+
* keeps its row and stays in the list, reporting that it collects nothing.
|
|
55
|
+
*/
|
|
56
|
+
function configuredCollectionRows(db) {
|
|
57
|
+
return collectionQuery(db).whereNotNull(`${exports.CONFIG_TABLE}.id`);
|
|
58
|
+
}
|
|
59
|
+
function questionRows(db, productId) {
|
|
60
|
+
const query = db(exports.QUESTIONS_TABLE)
|
|
61
|
+
.join(exports.BINDINGS_TABLE, `${exports.BINDINGS_TABLE}.id`, `${exports.QUESTIONS_TABLE}.binding_id`)
|
|
62
|
+
.leftJoin({ question_field: exports.FIELDS_TABLE }, function () {
|
|
63
|
+
this.on('question_field.key', `${exports.BINDINGS_TABLE}.custom_field_key`).andOn(db.raw('question_field.status = ?', [ACTIVE]));
|
|
64
|
+
})
|
|
65
|
+
.orderBy(`${exports.BINDINGS_TABLE}.product_id`, 'asc')
|
|
66
|
+
.orderBy(`${exports.QUESTIONS_TABLE}.sort_order`, 'asc')
|
|
67
|
+
.orderBy(`${exports.QUESTIONS_TABLE}.id`, 'asc')
|
|
68
|
+
.select([
|
|
69
|
+
`${exports.BINDINGS_TABLE}.product_id`,
|
|
70
|
+
`${exports.BINDINGS_TABLE}.port`,
|
|
71
|
+
`${exports.QUESTIONS_TABLE}.label`,
|
|
72
|
+
`${exports.QUESTIONS_TABLE}.optional`,
|
|
73
|
+
'question_field.name as question_name',
|
|
74
|
+
'question_field.type as question_type',
|
|
75
|
+
]);
|
|
76
|
+
if (productId) {
|
|
77
|
+
return query.where(`${exports.BINDINGS_TABLE}.product_id`, productId);
|
|
78
|
+
}
|
|
79
|
+
return query;
|
|
80
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DbCheckoutOptions = exports.DbCheckoutConfig = exports.DbCheckoutQuestion = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const boolean_1 = require("../../lib/db-types/boolean");
|
|
6
|
+
const date_1 = require("../../lib/db-types/date");
|
|
7
|
+
exports.DbCheckoutQuestion = zod_1.z.object({
|
|
8
|
+
id: zod_1.z.string(),
|
|
9
|
+
binding_id: zod_1.z.string(),
|
|
10
|
+
sort_order: zod_1.z.number(),
|
|
11
|
+
label: zod_1.z.string().nullable(),
|
|
12
|
+
optional: boolean_1.DbBoolean,
|
|
13
|
+
created_at: date_1.DbDate,
|
|
14
|
+
updated_at: date_1.DbDate.nullable(),
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Options only. Whether a tier collects something it keeps is the binding; a tax number is
|
|
18
|
+
* the exception, since Stripe keeps it and Ghost never does, so there is nothing to bind.
|
|
19
|
+
*/
|
|
20
|
+
exports.DbCheckoutConfig = zod_1.z.object({
|
|
21
|
+
id: zod_1.z.string(),
|
|
22
|
+
product_id: zod_1.z.string(),
|
|
23
|
+
shipping_allowed_countries: zod_1.z.string().nullable(),
|
|
24
|
+
tax_number_collect: boolean_1.DbBoolean,
|
|
25
|
+
created_at: date_1.DbDate,
|
|
26
|
+
updated_at: date_1.DbDate.nullable(),
|
|
27
|
+
});
|
|
28
|
+
exports.DbCheckoutOptions = exports.DbCheckoutConfig.omit({
|
|
29
|
+
id: true,
|
|
30
|
+
product_id: true,
|
|
31
|
+
created_at: true,
|
|
32
|
+
updated_at: true,
|
|
33
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toCheckoutConfigResponse = exports.CheckoutConfigInput = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const field_ports_1 = require("../stripe/services/checkout/field-ports");
|
|
6
|
+
const allowed_countries_1 = require("../stripe/services/checkout/allowed-countries");
|
|
7
|
+
const models_1 = require("./models");
|
|
8
|
+
// Every country Stripe will take, sent at once, was measured as accepted — so the only
|
|
9
|
+
// ceiling is the list itself, and a request naming more than there are countries is naming
|
|
10
|
+
// something twice.
|
|
11
|
+
const MAX_ALLOWED_COUNTRIES = allowed_countries_1.STRIPE_ALLOWED_COUNTRIES.length;
|
|
12
|
+
const QuestionInput = zod_1.z.object({
|
|
13
|
+
key: zod_1.z.string().min(1, { error: 'Every checkout question needs a custom field key.' }),
|
|
14
|
+
label: zod_1.z.string().trim().min(1).nullish(),
|
|
15
|
+
optional: zod_1.z.boolean().optional(),
|
|
16
|
+
});
|
|
17
|
+
// Not checked against a list of countries: membership of that list is contested, and Ghost
|
|
18
|
+
// is not its arbiter.
|
|
19
|
+
const CountryCode = zod_1.z
|
|
20
|
+
.string()
|
|
21
|
+
.trim()
|
|
22
|
+
.regex(/^[A-Za-z]{2}$/, { error: 'Enter a 2-letter country code, like US.' })
|
|
23
|
+
.toUpperCase()
|
|
24
|
+
.refine(allowed_countries_1.isStripeAllowedCountry, {
|
|
25
|
+
error: 'Stripe will not ship to that country, so a checkout cannot offer it.',
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Where a collected value lands is the request's to state. Ghost keeps no convention about
|
|
29
|
+
* it, so a block that collects names its destination and one that does not carries nothing
|
|
30
|
+
* to name.
|
|
31
|
+
*/
|
|
32
|
+
const DESTINATION_REQUIRED = 'Say which custom field this is collected into.';
|
|
33
|
+
const CustomFieldKey = zod_1.z
|
|
34
|
+
.string({ error: DESTINATION_REQUIRED })
|
|
35
|
+
.min(1, { error: DESTINATION_REQUIRED });
|
|
36
|
+
const Destination = zod_1.z.strictObject({ custom_field_key: CustomFieldKey }, { error: DESTINATION_REQUIRED });
|
|
37
|
+
exports.CheckoutConfigInput = zod_1.z.strictObject({
|
|
38
|
+
custom_fields: zod_1.z
|
|
39
|
+
.array(QuestionInput)
|
|
40
|
+
.max(field_ports_1.MAX_CHECKOUT_CUSTOM_FIELDS, {
|
|
41
|
+
error: `A checkout can ask at most ${field_ports_1.MAX_CHECKOUT_CUSTOM_FIELDS} questions.`,
|
|
42
|
+
})
|
|
43
|
+
.refine((questions) => new Set(questions.map((question) => question.key)).size === questions.length, { error: 'This checkout already asks for that field.' })
|
|
44
|
+
.optional(),
|
|
45
|
+
shipping: zod_1.z
|
|
46
|
+
.discriminatedUnion('collect', [
|
|
47
|
+
zod_1.z.strictObject({ collect: zod_1.z.literal(false) }),
|
|
48
|
+
zod_1.z.strictObject({
|
|
49
|
+
collect: zod_1.z.literal(true),
|
|
50
|
+
allowed_countries: zod_1.z
|
|
51
|
+
.array(CountryCode, { error: 'Choose at least one country you deliver to.' })
|
|
52
|
+
.min(1, { error: 'Choose at least one country you deliver to.' })
|
|
53
|
+
.max(MAX_ALLOWED_COUNTRIES),
|
|
54
|
+
name: Destination,
|
|
55
|
+
address: Destination,
|
|
56
|
+
}),
|
|
57
|
+
])
|
|
58
|
+
.optional(),
|
|
59
|
+
tax_number: zod_1.z.strictObject({ collect: zod_1.z.boolean() }).optional(),
|
|
60
|
+
phone: zod_1.z
|
|
61
|
+
.discriminatedUnion('collect', [
|
|
62
|
+
zod_1.z.strictObject({ collect: zod_1.z.literal(false) }),
|
|
63
|
+
zod_1.z.strictObject({ collect: zod_1.z.literal(true), custom_field_key: CustomFieldKey }),
|
|
64
|
+
])
|
|
65
|
+
.optional(),
|
|
66
|
+
});
|
|
67
|
+
const QuestionResource = zod_1.z.object({
|
|
68
|
+
key: zod_1.z.string(),
|
|
69
|
+
label: zod_1.z.string().nullable(),
|
|
70
|
+
optional: zod_1.z.boolean(),
|
|
71
|
+
});
|
|
72
|
+
const CollectionResource = zod_1.z.object({
|
|
73
|
+
collect: zod_1.z.literal(true),
|
|
74
|
+
custom_field_key: zod_1.z.string(),
|
|
75
|
+
});
|
|
76
|
+
const ShippingResource = zod_1.z.object({
|
|
77
|
+
collect: zod_1.z.literal(true),
|
|
78
|
+
allowed_countries: zod_1.z.array(zod_1.z.string()),
|
|
79
|
+
name: zod_1.z.object({ custom_field_key: zod_1.z.string() }),
|
|
80
|
+
address: zod_1.z.object({ custom_field_key: zod_1.z.string() }),
|
|
81
|
+
});
|
|
82
|
+
const CheckoutConfigResource = zod_1.z.object({
|
|
83
|
+
tier_id: zod_1.z.string(),
|
|
84
|
+
custom_fields: zod_1.z.array(QuestionResource),
|
|
85
|
+
shipping: ShippingResource.optional(),
|
|
86
|
+
tax_number: zod_1.z.object({ collect: zod_1.z.literal(true) }).optional(),
|
|
87
|
+
phone: CollectionResource.optional(),
|
|
88
|
+
});
|
|
89
|
+
const CheckoutConfigResponse = zod_1.z.object({
|
|
90
|
+
tiers_checkout_config: zod_1.z.array(CheckoutConfigResource),
|
|
91
|
+
});
|
|
92
|
+
/** One resource per tier, so a browse and a read differ only in how many come back. */
|
|
93
|
+
exports.toCheckoutConfigResponse = zod_1.z
|
|
94
|
+
.array(models_1.TierCheckoutConfig)
|
|
95
|
+
.transform((configs) => ({
|
|
96
|
+
tiers_checkout_config: configs.map((config) => ({
|
|
97
|
+
tier_id: config.tierId,
|
|
98
|
+
custom_fields: config.customFields,
|
|
99
|
+
// A block appears only when the tier collects that thing, so a client reads
|
|
100
|
+
// presence rather than a flag it would have to check.
|
|
101
|
+
...(config.shipping
|
|
102
|
+
? {
|
|
103
|
+
shipping: {
|
|
104
|
+
collect: true,
|
|
105
|
+
allowed_countries: config.shipping.allowedCountries,
|
|
106
|
+
name: { custom_field_key: config.shipping.nameCustomFieldKey },
|
|
107
|
+
address: { custom_field_key: config.shipping.addressCustomFieldKey },
|
|
108
|
+
},
|
|
109
|
+
}
|
|
110
|
+
: {}),
|
|
111
|
+
...(config.taxNumber ? { tax_number: { collect: true } } : {}),
|
|
112
|
+
...(config.phone
|
|
113
|
+
? {
|
|
114
|
+
phone: {
|
|
115
|
+
collect: true,
|
|
116
|
+
custom_field_key: config.phone.customFieldKey,
|
|
117
|
+
},
|
|
118
|
+
}
|
|
119
|
+
: {}),
|
|
120
|
+
})),
|
|
121
|
+
}))
|
|
122
|
+
.pipe(CheckoutConfigResponse);
|