ghost 6.61.0 → 6.63.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/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.3.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.1.3.tgz +0 -0
- package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
- package/components/tryghost-checkout-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.1.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-limit-service-0.0.0.tgz +0 -0
- package/components/tryghost-metafield-types-0.0.0.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/content/settings/README.md +1 -1
- package/content/themes/casper/.gitignore +28 -0
- package/content/themes/casper/assets/built/casper.js +1 -1
- package/content/themes/casper/assets/built/screen.css +1 -1
- package/content/themes/casper/assets/css/screen.css +2 -1
- package/content/themes/casper/assets/js/lightbox.js +63 -46
- package/content/themes/casper/package.json +6 -6
- package/content/themes/casper/page.hbs +1 -0
- package/content/themes/casper/post.hbs +1 -0
- package/content/themes/source/.gitignore +28 -0
- package/content/themes/source/assets/built/screen.css +1 -1
- package/content/themes/source/assets/built/source.js +1 -1
- package/content/themes/source/assets/css/screen.css +2 -1
- package/content/themes/source/assets/js/lightbox.js +62 -45
- package/content/themes/source/assets/js/main.js +2 -2
- package/content/themes/source/package.json +4 -4
- package/content/themes/source/partials/feature-image.hbs +1 -0
- package/content/themes/source/partials/post-card.hbs +1 -1
- package/core/boot.js +61 -27
- package/core/built/admin/assets/Combination-B0l4MKVh.js +41 -0
- package/core/built/admin/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
- package/core/built/admin/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
- package/core/built/admin/assets/{about-Bve7IJS2.js → about-C1C3s5-g.js} +1 -1
- package/core/built/admin/assets/accordion-CxGsDKwa.js +1 -0
- package/core/built/admin/assets/account-migration-CbUhW6gk.js +1 -0
- package/core/built/admin/assets/activitypub/{account-migration-C-aej4x_.js → account-migration-KA6Jjf9L.js} +16 -16
- package/core/built/admin/assets/activitypub/activitypub.js +9 -9
- package/core/built/admin/assets/activitypub/{avatar-DLPL3Abs.js → avatar-DVJF5bxP.js} +2 -2
- package/core/built/admin/assets/activitypub/{avatar-flipboard-C9iDY-QV.js → avatar-flipboard-csQaNeYK.js} +2 -2
- package/core/built/admin/assets/activitypub/{bluesky-sharing-BXkA5mqV.js → bluesky-sharing-C7nTDMvw.js} +37 -37
- package/core/built/admin/assets/activitypub/{content-formatters-CHcyMFk4.js → content-formatters-CLcjaBwV.js} +4 -4
- package/core/built/admin/assets/activitypub/{copy-DIAOQoCZ.js → copy-DcOh8kXw.js} +2 -2
- package/core/built/admin/assets/activitypub/{domain-B3ihkPde.js → domain-fZ-X8i4-.js} +121 -121
- package/core/built/admin/assets/activitypub/{edit-profile-DsZM3rTX.js → edit-profile-BqMLQV88.js} +40 -40
- package/core/built/admin/assets/activitypub/{explore-BodNrZgR.js → explore-B4yPoP8E.js} +27 -27
- package/core/built/admin/assets/activitypub/{feed-PwH1iJ84.js → feed-BRC_mvAe.js} +51 -51
- package/core/built/admin/assets/activitypub/{field-D06-kmOJ.js → field-COacNgOt.js} +3 -3
- package/core/built/admin/assets/activitypub/{hash-Bm3WxYN4.js → hash-C7u-irQQ.js} +2 -2
- package/core/built/admin/assets/activitypub/inbox-BW-yvUoN.js +1284 -0
- package/core/built/admin/assets/activitypub/{inbox-d8oJRTf4.js → inbox-CbTTdDQ3.js} +2 -2
- package/core/built/admin/assets/activitypub/label-kPMmYI7l.js +16 -0
- package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-D1Yapsod.js → moderation-CuidJzc0.js} +91 -91
- package/core/built/admin/assets/activitypub/{note-C5zjqq5C.js → note-CAMRRSqD.js} +24 -24
- package/core/built/admin/assets/activitypub/{notifications-B9p8eCHD.js → notifications-BmNlXGgp.js} +51 -51
- package/core/built/admin/assets/activitypub/{onboarding-CNelD_uF.js → onboarding-Bqg7fh_L.js} +2 -2
- package/core/built/admin/assets/activitypub/{onboarding-mat5Hrl0.js → onboarding-Dmun9jr_.js} +2 -2
- package/core/built/admin/assets/activitypub/{preferences-BCqUdC3v.js → preferences--oH19wf9.js} +1519 -1519
- package/core/built/admin/assets/activitypub/{profile-BRCWoFem.js → profile-DH_tQx2D.js} +185 -185
- package/core/built/admin/assets/activitypub/{reply-DYK5vVqb.js → reply-Cap9PxSH.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-BSXT992i.js → routes-DdyY9uFF.js} +744 -735
- package/core/built/admin/assets/activitypub/{separator-BbQqTm-p.js → separator-CAxxu8VV.js} +3 -3
- package/core/built/admin/assets/activitypub/settings-B6EEcVkW.js +315 -0
- package/core/built/admin/assets/activitypub/{site-DHoMupSB.js → site-BYps63oh.js} +2 -2
- package/core/built/admin/assets/activitypub/{step-1-B-YfsVeO.js → step-1-CKjR2KAm.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-2-DtPQzlTH.js → step-2-B6PKfOUQ.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-3-D6BFMXL_.js → step-3-C-qBbcUo.js} +11 -11
- package/core/built/admin/assets/activitypub/{tabs-GpNecvfB.js → tabs-DLhZtVde.js} +306 -306
- package/core/built/admin/assets/activitypub/{topic-filter-BPDeQQys.js → topic-filter-DsUOuu0k.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-BoVOxXkV.js → use-activity-pub-queries-CX9snsLs.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-Bmk5h4lW.js → use-navigate-with-base-path-DsJTGDSS.js} +988 -959
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-wVBX7swM.js → use-reply-chain-data-AJi9zkzm.js} +30 -30
- package/core/built/admin/assets/activitypub/{users-CoX6FT_K.js → users-inweyKL5.js} +192 -164
- package/core/built/admin/assets/activitypub/{x-DbQZOLiI.js → x-DR8AT3-4.js} +2 -2
- package/core/built/admin/assets/add-integration-modal-BT_onDJy.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-Cx1kQpiY.js +1 -0
- package/core/built/admin/assets/add-recommendation-modal-B5nvAhvr.js +1 -0
- package/core/built/admin/assets/analytics-DjoJWPI7.js +1 -0
- package/core/built/admin/assets/{announcement-bar-modal-DM3cYOpo.js → announcement-bar-modal-Dwd0EGFP.js} +1 -1
- package/core/built/admin/assets/{api-keys-3-0vJC3Y.js → api-keys-BGPzLHzA.js} +1 -1
- package/core/built/admin/assets/{api-keys-BLm2NDBh.js → api-keys-BoeacM-s.js} +1 -1
- package/core/built/admin/assets/{audience-9mwU5TW6.js → audience-ceV3XVHq.js} +1 -1
- package/core/built/admin/assets/automated-emails-BLesE41L.js +1 -0
- package/core/built/admin/assets/{automations-sAcJ1334.js → automations-BN4u3GR8.js} +1 -1
- package/core/built/admin/assets/automations-C-ZTUwW3.js +1 -0
- package/core/built/admin/assets/bluesky-sharing-vzh-oPXL.js +1 -0
- package/core/built/admin/assets/{breadcrumb-DLiqCyFc.js → breadcrumb-CaLk2b7D.js} +1 -1
- package/core/built/admin/assets/{button-B2jcu6bk.js → button-Dvcv1QSR.js} +1 -1
- package/core/built/admin/assets/calendar-Bl9RLcZX.js +1 -0
- package/core/built/admin/assets/{chart-helpers-Fo3bUL3K.js → chart-helpers-FHywU0pj.js} +1 -1
- package/core/built/admin/assets/{checkbox-BfKktMph.js → checkbox-BtayFtjg.js} +1 -1
- package/core/built/admin/assets/chunk.254.035b85ec456ebbd7336b.js +440 -0
- package/core/built/admin/assets/{chunk.524.60ca4692d91c6022042f.js → chunk.524.e6975095fccdf22d90f8.js} +5 -5
- package/core/built/admin/assets/{chunk.582.525c7617c2d9e94c940a.js → chunk.582.98b485f9b2802f540897.js} +6 -6
- package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js → chunk.901.4ccc639821020230bcca.js} +9949 -7921
- package/core/built/admin/assets/{code-editor-view-DCQJxsfU.js → code-editor-view-C3ZfoF1X.js} +1 -1
- package/core/built/admin/assets/{code-editor-view-CYVu4EW6.js → code-editor-view-CAyRWy1s.js} +1 -1
- package/core/built/admin/assets/color-picker-G4kGR7rp.js +3 -0
- package/core/built/admin/assets/color-picker-field-DQFVTNnT.js +1 -0
- package/core/built/admin/assets/combobox-BnYzgEB4.js +1 -0
- package/core/built/admin/assets/command-C_vyTikI.js +1 -0
- package/core/built/admin/assets/comments-aBrxfnZf.js +1 -0
- package/core/built/admin/assets/{config-DOMQDZGZ.js → config-kSHvwdTG.js} +1 -1
- package/core/built/admin/assets/confirmation-context-DwXX_Y5h.js +1 -0
- package/core/built/admin/assets/{content-api-modal-CyQEC3fr.js → content-api-modal-D2G0nJP6.js} +1 -1
- package/core/built/admin/assets/context-menu-DOVB6yaz.js +1 -0
- package/core/built/admin/assets/{copy-field-B3M1s78L.js → copy-field-DCJwh9qf.js} +1 -1
- package/core/built/admin/assets/create-ghost-browse-value-source-5C53jJaX.js +1 -0
- package/core/built/admin/assets/custom-field-type-option-BAuW0F-E.js +1 -0
- package/core/built/admin/assets/custom-integration-modal-AbJGVyKc.js +1 -0
- package/core/built/admin/assets/{date-range-select-DD2RKkgB.js → date-range-select-BY3K-ukj.js} +1 -1
- package/core/built/admin/assets/design-and-theme-modal-BvEy4_pC.js +2 -0
- package/core/built/admin/assets/dirty-confirm-dialog-DVPuGz3U.js +1 -0
- package/core/built/admin/assets/{disabled-sources-indicator-Cvy47bE2.js → disabled-sources-indicator-Cy7Zp4c8.js} +1 -1
- package/core/built/admin/assets/dist-Dcsslyo72.js +1 -0
- package/core/built/admin/assets/domain-Dl61QGuk.js +1 -0
- package/core/built/admin/assets/dropzone-Dtz5Rmjt.js +5 -0
- package/core/built/admin/assets/edit-profile-DNJSMDwm.js +1 -0
- package/core/built/admin/assets/editor-DbAen9zf.js +8 -0
- package/core/built/admin/assets/editor-screen-BFWThIai.js +26 -0
- package/core/built/admin/assets/email-sending-status-context-CWDOD1FN.js +1 -0
- package/core/built/admin/assets/email-sending-status-provider-DCPkDICt.js +1 -0
- package/core/built/admin/assets/emails-vFMk4yYl.js +1 -0
- package/core/built/admin/assets/{embed-signup-form-modal-DeBMLxlL.js → embed-signup-form-modal-DGqsORxS.js} +1 -1
- package/core/built/admin/assets/en-B1jX3WMs.js +1 -0
- package/core/built/admin/assets/explore-nnRr1Fja.js +1 -0
- package/core/built/admin/assets/feature-flag-overrides-context-DQjdJFAk.js +1 -0
- package/core/built/admin/assets/feature-image-placeholder-BrIHmPs8.js +1 -0
- package/core/built/admin/assets/feed-BNUcNu-W.js +1 -0
- package/core/built/admin/assets/feedback-DJ4Zb9rZ.js +1 -0
- package/core/built/admin/assets/{field-Cj8lmDOo.js → field-C93_Mg6j.js} +1 -1
- package/core/built/admin/assets/filter-bar-Da1qxybu.js +1 -0
- package/core/built/admin/assets/filter-sources-CGJb4C5r.js +1 -0
- package/core/built/admin/assets/filters--kKP-EC8.js +1 -0
- package/core/built/admin/assets/filters-DxA_a4FP.js +1 -0
- package/core/built/admin/assets/first-promoter-modal-BYDtrz2S.js +1 -0
- package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-BbSnGOtK.js +1 -0
- package/core/built/admin/assets/{ghost-c8807202a07c20030acb719ee0114815.css → ghost-8fd5bb799356bbefb254210ba7e1236d.css} +1 -1
- package/core/built/admin/assets/{ghost-3894eedcc6968f658578c0abfe942aab.js → ghost-b4e8a403baba61905cd7560e30b9732d.js} +63 -44
- package/core/built/admin/assets/{ghost-dark-fbf1e384aaef3ae315e540f0eb7373a7.css → ghost-dark-cac0cb2d5bb78e9bd14d8d1c2768ed45.css} +1 -1
- package/core/built/admin/assets/gift-link-modal-B7u5bD4e.js +1 -0
- package/core/built/admin/assets/{gift-links-DLDS7ljO.js → gift-links-CfLSnst2.js} +1 -1
- package/core/built/admin/assets/{growth-D6mhcx3q.js → growth-Cd1uO9d2.js} +1 -1
- package/core/built/admin/assets/growth-aG32xfdE.js +3 -0
- package/core/built/admin/assets/history-modal-Df8lW8h-.js +1 -0
- package/core/built/admin/assets/hooks-Cy_-oZ4o.js +2 -0
- package/core/built/admin/assets/{html-field-C8qVGGC1.js → html-field-DA4eU7eq.js} +1 -1
- package/core/built/admin/assets/{images-h8VZEQ9k.js → images-KXmyO3Ss.js} +1 -1
- package/core/built/admin/assets/{inbox-BYd1M06Q.js → inbox-gJHG7_xd.js} +14 -14
- package/core/built/admin/assets/index-BHHXtR5C.css +2 -0
- package/core/built/admin/assets/index-CgMCwsxN.js +4 -0
- package/core/built/admin/assets/index.es-CY6-yuw9.js +1 -0
- package/core/built/admin/assets/{input-group-D8sCXRF5.js → input-group-BE8rM2y1.js} +1 -1
- package/core/built/admin/assets/{integrations-Bjbu86Z0.js → integrations-B4kuRBFY.js} +1 -1
- package/core/built/admin/assets/invite-user-modal-B4CuNcx4.js +1 -0
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +14 -14
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +3 -3
- package/core/built/admin/assets/koenig-lexical/style.css +1 -1
- package/core/built/admin/assets/{koenig-lexical-_-IsVI7E.js → koenig-lexical-CGXb0F8o.js} +3 -3
- package/core/built/admin/assets/koenig-loader-BeM5rFPX.js +2 -0
- package/core/built/admin/assets/{kpi-card-DZQk_0W8.js → kpi-card-B21aToe8.js} +1 -1
- package/core/built/admin/assets/{kpi-card-DW_2y3ug.js → kpi-card-pz6Wv4Ae.js} +1 -1
- package/core/built/admin/assets/{kpi-helpers-PueTKuA6.js → kpi-helpers-Dq5jelmP.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-CojDs-Qz.js → kpi-tabs-DEZHpKUt.js} +1 -1
- package/core/built/admin/assets/{label-DjbT91GM.js → label-OLCzze8N.js} +1 -1
- package/core/built/admin/assets/label-picker-BigOvMPV.js +1 -0
- package/core/built/admin/assets/{labels-CH3Kn8RV.js → labels-Dr0SgUQD.js} +1 -1
- package/core/built/admin/assets/layout-DUTL8SH5.js +1 -0
- package/core/built/admin/assets/lib-7QPTI0FS.js +1 -0
- package/core/built/admin/assets/link-helpers-BRAg9SCj.js +1 -0
- package/core/built/admin/assets/links-BDHPTlyj.js +1 -0
- package/core/built/admin/assets/member-custom-fields-TRTHCAz9.js +1 -0
- package/core/built/admin/assets/member-detail-b6dRwc3C.js +1 -0
- package/core/built/admin/assets/members-Czt5lJSc.js +4 -0
- package/core/built/admin/assets/moderation-ZWefD9uH.js +1 -0
- package/core/built/admin/assets/{multi-select-combobox-B6LiRzDO.js → multi-select-combobox-CT13MTo-.js} +1 -1
- package/core/built/admin/assets/navigation-modal-C8FEhBK5.js +1 -0
- package/core/built/admin/assets/newsletter-5VYW4RyJ.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-ChjC0ZqH.js +1 -0
- package/core/built/admin/assets/{newsletter-emails-CFeLlt4z.js → newsletter-emails-DZH6I-PY.js} +1 -1
- package/core/built/admin/assets/newsletters-DOC9KBcX.js +1 -0
- package/core/built/admin/assets/newsletters-Rq1M3GD-.js +1 -0
- package/core/built/admin/assets/note-DIV-Pojr.js +1 -0
- package/core/built/admin/assets/notifications-s20-H49V.js +1 -0
- package/core/built/admin/assets/nql-BLpCn7qX.js +21 -0
- package/core/built/admin/assets/{offers-9J1CSiLy.js → offers--e2nGvkW.js} +1 -1
- package/core/built/admin/assets/offers-container-modal-BmG5M5Tv.js +1 -0
- package/core/built/admin/assets/onboarding-CUuy9unR.js +1 -0
- package/core/built/admin/assets/{onboarding-B4YhlZ0i.js → onboarding-pXyct0Jm.js} +1 -1
- package/core/built/admin/assets/{onboarding-route-Dmc4IPm3.js → onboarding-route-CK4pcXoR.js} +1 -1
- package/core/built/admin/assets/overview-CaPsciMs.js +1 -0
- package/core/built/admin/assets/overview-a8GfcsKX.js +1 -0
- package/core/built/admin/assets/{page-header-BR_nbIPp.js → page-header-DM_KyoFI.js} +1 -1
- package/core/built/admin/assets/pagemenu-vgZVUVKR.js +1 -0
- package/core/built/admin/assets/pages-CjDY2CBI.js +1 -0
- package/core/built/admin/assets/pages-route-BzKZYdV5.js +1 -0
- package/core/built/admin/assets/papaparse.min-cQwnxGCG.js +10 -0
- package/core/built/admin/assets/{pintura-modal-BR9hEvS8.js → pintura-modal-DExCF1ii.js} +1 -1
- package/core/built/admin/assets/portal-frame-Cqanidq4.js +1 -0
- package/core/built/admin/assets/portal-modal-oinBgA27.js +1 -0
- package/core/built/admin/assets/post-analytics-C5oJ1dWV.js +1 -0
- package/core/built/admin/assets/post-analytics-header-OATo3X_r.js +1 -0
- package/core/built/admin/assets/post-analytics-provider-tOpIVGT5.js +1 -0
- package/core/built/admin/assets/post-helpers-C88JBa4D.js +1 -0
- package/core/built/admin/assets/post-share-modal-DvhC1XgV.js +1 -0
- package/core/built/admin/assets/post-utils-DKF4mfuo.js +1 -0
- package/core/built/admin/assets/posts-list-screen-o4ZjbgS3.js +2 -0
- package/core/built/admin/assets/posts-pCPrhQeR.js +1 -0
- package/core/built/admin/assets/posts-route-9F--xdIb.js +1 -0
- package/core/built/admin/assets/preferences--vNubsqD.js +5 -0
- package/core/built/admin/assets/{preview-modal-C-BL-F9k.js → preview-modal-YYbzlYdO.js} +1 -1
- package/core/built/admin/assets/profile-BllKV3dR.js +1 -0
- package/core/built/admin/assets/{radio-group-Bgz60i81.js → radio-group-DL8GI8rt.js} +1 -1
- package/core/built/admin/assets/{referrers-CnhCMWCs.js → referrers-D8oHPmDB.js} +1 -1
- package/core/built/admin/assets/router-provider-BSvTXgZY.js +1 -0
- package/core/built/admin/assets/schemas-BoYdB6YU.js +64 -0
- package/core/built/admin/assets/select-v5YbA3Mw.js +1 -0
- package/core/built/admin/assets/settings-PEsZupw1.js +4 -0
- package/core/built/admin/assets/{settings-breadcrumbs-CyP_9zTo.js → settings-breadcrumbs-NwPnCTC7.js} +1 -1
- package/core/built/admin/assets/settings-u_s1CRkr.js +1 -0
- package/core/built/admin/assets/share-modal-SskCmVGL.js +1 -0
- package/core/built/admin/assets/slack-modal-XxSJiYgo.js +1 -0
- package/core/built/admin/assets/{sort-button-Cc-Z96sA.js → sort-button-Cx1KtINE.js} +1 -1
- package/core/built/admin/assets/{source-icon-v6PUnmyM.js → source-icon-Bdp9Im_5.js} +1 -1
- package/core/built/admin/assets/stats-D9PDLS3x.js +1 -0
- package/core/built/admin/assets/stats-view-W2g6Jsd-.js +1 -0
- package/core/built/admin/assets/{step-1-DSRp2vBj.js → step-1-BQYzvBzr.js} +1 -1
- package/core/built/admin/assets/{step-2-COqv2g0u.js → step-2-xES32xJV.js} +1 -1
- package/core/built/admin/assets/{step-3-6W1NMVQc.js → step-3-DA_XK5kW.js} +2 -2
- package/core/built/admin/assets/{stripe-button-D2K42Uty.js → stripe-button-CVsLHelt.js} +1 -1
- package/core/built/admin/assets/stripe-connect-modal-ClmLOMGS.js +1 -0
- package/core/built/admin/assets/style-Wd9nQubI.css +1 -0
- package/core/built/admin/assets/{table-B2pIKjVh.js → table-BenqVupI.js} +1 -1
- package/core/built/admin/assets/{tabs-SaW_UT-Q.js → tabs-eBBlxPp8.js} +1 -1
- package/core/built/admin/assets/tag-detail-Ce8Se2qd.js +2 -0
- package/core/built/admin/assets/tag-picker-C3UR-uJ-.js +1 -0
- package/core/built/admin/assets/tags-B-kJxCs7.js +1 -0
- package/core/built/admin/assets/{tags-zTFiKRpb.js → tags-ChfdwJyS.js} +1 -1
- package/core/built/admin/assets/testimonials-modal-9Q6fT06V.js +1 -0
- package/core/built/admin/assets/tier-detail-modal-CDyYdqK7.js +1 -0
- package/core/built/admin/assets/tiers-BCpIOGQr.js +1 -0
- package/core/built/admin/assets/{toggle-group-EM9WpESu.js → toggle-group-CviIkyok.js} +1 -1
- package/core/built/admin/assets/{topic-filter-DY4gNHn2.js → topic-filter-I2jCBGxm.js} +1 -1
- package/core/built/admin/assets/{transistor-modal-CpyPG-MH.js → transistor-modal-p53u3W8y.js} +1 -1
- package/core/built/admin/assets/{trend-badge-ByMkuAuH.js → trend-badge-CideVzQd.js} +1 -1
- package/core/built/admin/assets/{unsplash-modal-Cv2Q6GtY.js → unsplash-modal-DY8UcKcE.js} +1 -1
- package/core/built/admin/assets/{use-analytics-data-CHvjMYuT.js → use-analytics-data-DAIGcr2f.js} +1 -1
- package/core/built/admin/assets/use-check-theme-limit-error-B8bjF-gO.css +1 -0
- package/core/built/admin/assets/{use-check-theme-limit-error-Qv4SVXqw.js → use-check-theme-limit-error-DRUjK4YM.js} +1 -1
- package/core/built/admin/assets/use-filter-params-JkZhIS8L.js +1 -0
- package/core/built/admin/assets/{use-filterable-api-CzXcpUh8.js → use-filterable-api-BVEVMrhZ.js} +1 -1
- package/core/built/admin/assets/use-growth-stats-937CUj6j.js +1 -0
- package/core/built/admin/assets/use-host-limits-D0Dv3tKA.js +1 -0
- package/core/built/admin/assets/{use-limiter-cwJvsNBo.js → use-limiter-CohWfzvK.js} +1 -1
- package/core/built/admin/assets/{use-navigate-with-base-path-BHPA228f.js → use-navigate-with-base-path-BkxcPj5l.js} +1 -1
- package/core/built/admin/assets/use-pintura-config-xgytjU35.js +1 -0
- package/core/built/admin/assets/{use-pintura-editor-BDBXWUYq.js → use-pintura-editor-CaV1mbfO.js} +1 -1
- package/core/built/admin/assets/{use-post-referrers-DbY-mzci.js → use-post-referrers-BCQI7fDg.js} +1 -1
- package/core/built/admin/assets/use-reply-chain-data-CYRhoaxY.js +1 -0
- package/core/built/admin/assets/{use-router-history-entry-Bg6BhBQQ.js → use-router-history-entry-NOKcd--l.js} +1 -1
- package/core/built/admin/assets/{use-setting-group-VM7FQwMY.js → use-setting-group-bLKMwoBT.js} +1 -1
- package/core/built/admin/assets/use-settings-navigation-B-qrriKD.js +1 -0
- package/core/built/admin/assets/{use-simple-pagination-Dum6Irbs.js → use-simple-pagination-CNPd6Rf6.js} +1 -1
- package/core/built/admin/assets/use-staff-users-pRIMIyiW.js +1 -0
- package/core/built/admin/assets/use-tinybird-query-CmdbCS9X.js +1 -0
- package/core/built/admin/assets/use-tinybird-token-KLne235s.js +1 -0
- package/core/built/admin/assets/{use-unsaved-changes-guard-BAy0RANR.js → use-unsaved-changes-guard-7-ug0JdH.js} +1 -1
- package/core/built/admin/assets/use-upgrade-route-Dm_qqKr0.js +1 -0
- package/core/built/admin/assets/{use-url-input-Df5QzNa7.js → use-url-input-fvp-TpPx.js} +1 -1
- package/core/built/admin/assets/user-detail-modal-D3KlGYv-.js +1 -0
- package/core/built/admin/assets/users-DVNWrqg9.js +1 -0
- package/core/built/admin/assets/{vendor-5753232c7d6ffb3c44e1eb0a02133953.js → vendor-2dd263291938d407802568d3357ec69e.js} +19 -17
- package/core/built/admin/assets/{virtual-list-DEx8WgiO.js → virtual-list-CZ3RK2Yf.js} +1 -1
- package/core/built/admin/assets/web-ClEJsCAj.js +2 -0
- package/core/built/admin/assets/web-X9rdnrtq.js +1 -0
- package/core/built/admin/assets/{zapier-modal-Cw3BTBUu.js → zapier-modal-DfVhV17j.js} +1 -1
- package/core/built/admin/index.html +23 -27
- package/core/frontend/apps/private-blogging/lib/views/private.hbs +44 -43
- package/core/frontend/helpers/cancel_link.js +2 -2
- package/core/frontend/helpers/pagination.js +2 -2
- package/core/frontend/helpers/social_accounts.js +2 -2
- package/core/frontend/public/ghost.css +1 -1
- package/core/frontend/public/ghost.min.css +1 -1
- package/core/frontend/services/sitemap/user-map-generator.js +9 -2
- package/core/server/adapters/jobs/InMemoryJobsBackend.js +74 -29
- package/core/server/api/endpoints/authentication.js +1 -2
- package/core/server/api/endpoints/authors-public.js +15 -5
- package/core/server/api/endpoints/emails.js +13 -0
- package/core/server/api/endpoints/index.js +10 -2
- package/core/server/api/endpoints/mail.js +1 -1
- package/core/server/api/endpoints/member-metafields-members.js +23 -0
- package/core/server/api/endpoints/member-metafields.js +102 -0
- package/core/server/api/endpoints/members-account.js +42 -0
- package/core/server/api/endpoints/members.js +4 -4
- package/core/server/api/endpoints/newsletters-public.js +10 -1
- package/core/server/api/endpoints/pages-public.js +15 -5
- package/core/server/api/endpoints/posts-public.js +15 -5
- package/core/server/api/endpoints/posts.js +3 -3
- package/core/server/api/endpoints/tags-public.js +22 -3
- package/core/server/api/endpoints/tiers-checkout-config.js +2 -2
- package/core/server/api/endpoints/tiers-public.js +38 -1
- package/core/server/api/endpoints/users.js +2 -2
- package/core/server/api/endpoints/utils/api-filter-utils.js +170 -3
- package/core/server/api/endpoints/utils/public-cache-keys.js +3 -0
- package/core/server/api/endpoints/utils/serializers/input/authors.js +2 -0
- package/core/server/api/endpoints/utils/serializers/input/members.js +20 -9
- package/core/server/api/endpoints/utils/serializers/input/pages.js +2 -0
- package/core/server/api/endpoints/utils/serializers/input/posts.js +2 -0
- package/core/server/api/endpoints/utils/serializers/input/tags.js +2 -0
- package/core/server/api/endpoints/utils/serializers/output/emails.js +7 -0
- package/core/server/api/endpoints/utils/serializers/output/index.js +6 -2
- package/core/server/api/endpoints/utils/serializers/output/member-metafields.js +18 -0
- package/core/server/api/endpoints/utils/serializers/output/members-account.js +19 -0
- package/core/server/api/endpoints/utils/serializers/output/members-csv-transform.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/members.js +2 -4
- package/core/server/api/endpoints/utils/serializers/output/tiers.js +10 -2
- package/core/server/api/endpoints/utils/serializers/output/users.js +0 -10
- package/core/server/api/endpoints/utils/validators/input/invitations.js +0 -5
- package/core/server/api/endpoints/utils/validators/input/pages.js +1 -1
- package/core/server/api/endpoints/utils/validators/input/posts.js +1 -1
- package/core/server/data/exporter/table-lists.js +3 -3
- package/core/server/data/importer/importers/data/data-importer.js +3 -3
- package/core/server/data/migrations/utils/migrations.js +1 -1
- package/core/server/data/migrations/versions/6.53/2026-07-15-20-22-53-add-members-custom-field-values.js +1 -1
- package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +10 -1
- package/core/server/data/migrations/versions/6.63/2026-09-03-10-07-03-rename-custom-field-tables-to-metafields.js +169 -0
- package/core/server/data/migrations/versions/6.63/2026-09-03-11-03-31-remove-member-custom-field-read-permissions.js +30 -0
- package/core/server/data/schema/fixtures/fixtures.json +0 -11
- package/core/server/data/schema/lib/default-index-name.js +8 -11
- package/core/server/data/schema/schema.js +18 -18
- package/core/server/data/seeders/README.md +48 -0
- package/core/server/data/tinybird/pipes/mv_hits.pipe +86 -50
- package/core/server/lib/db-types/count.js +16 -0
- package/core/server/lib/image/image-size.js +24 -0
- package/core/server/lib/package-json/parse.js +2 -2
- package/core/server/lib/validate-password.js +81 -120
- package/core/server/models/action.js +4 -4
- package/core/server/models/base/plugins/filtered-collection.js +16 -0
- package/core/server/models/member.js +10 -21
- package/core/server/models/post.js +2 -2
- package/core/server/models/relations/authors.js +2 -16
- package/core/server/models/user.js +10 -3
- package/core/server/services/auth/passwordreset.js +13 -0
- package/core/server/services/automations/automations-api.js +1 -1
- package/core/server/services/automations/database-automations-repository.js +11 -4
- package/core/server/services/comments/comments-controller.js +30 -9
- package/core/server/services/comments/comments-service.js +55 -5
- package/core/server/services/content-import/csv/formula.js +12 -0
- package/core/server/services/content-import/csv/index.js +6 -1
- package/core/server/services/content-import/csv/parse.js +27 -6
- package/core/server/services/content-import/csv/serialize.js +13 -0
- package/core/server/services/content-import/import/completion-email.js +164 -0
- package/core/server/services/content-import/import/errors-file.js +36 -0
- package/core/server/services/content-import/import/importer.js +160 -53
- package/core/server/services/content-import/import/local-media-url.js +63 -0
- package/core/server/services/content-import/import/media.js +254 -0
- package/core/server/services/content-import/import/post-data.js +0 -1
- package/core/server/services/content-import/import/post-link.js +11 -0
- package/core/server/services/content-import/import/post-repository.js +25 -3
- package/core/server/services/content-import/import/reader.js +9 -2
- package/core/server/services/content-import/import/report.js +34 -0
- package/core/server/services/content-import/import/row.js +0 -2
- package/core/server/services/content-import/import/schema.js +1 -0
- package/core/server/services/content-import/import/staged-file.js +29 -0
- package/core/server/services/content-import/import/store.js +25 -2
- package/core/server/services/content-import/index.js +52 -6
- package/core/server/services/content-import/jobs/content-csv-import-job.js +20 -0
- package/core/server/services/custom-redirects/redirect-config-parser.js +2 -2
- package/core/server/services/custom-redirects/redirects-service.js +1 -1
- package/core/server/services/custom-redirects/validation.js +1 -1
- package/core/server/services/email-address/email-address-parser.js +30 -38
- package/core/server/services/email-address/email-address-service.js +37 -4
- package/core/server/services/email-analytics/index.js +2 -7
- package/core/server/services/email-service/CONTEXT.md +37 -0
- package/core/server/services/email-service/README.md +42 -0
- package/core/server/services/email-service/batch-sending-service.js +2 -4
- package/core/server/services/email-service/email-controller.js +18 -2
- package/core/server/services/email-service/email-renderer.js +14 -4
- package/core/server/services/email-service/email-service-wrapper.js +3 -9
- package/core/server/services/email-service/mailgun-email-provider.js +20 -9
- package/core/server/services/email-service/sending-status-schema.js +21 -0
- package/core/server/services/email-service/sending-status-serializers.js +33 -0
- package/core/server/services/email-service/sending-status-service.js +47 -0
- package/core/server/services/email-service/sending-status.js +111 -0
- package/core/server/services/email-suppression-list/email-suppression-list.js +0 -33
- package/core/server/services/email-suppression-list/mailgun-email-suppression-list.js +6 -7
- package/core/server/services/gifts/README.md +2 -2
- package/core/server/services/gifts/constants.js +1 -1
- package/core/server/services/gifts/email-templates/gift-delivery.hbs +3 -3
- package/core/server/services/gifts/gift-email-service.js +0 -1
- package/core/server/services/gifts/gift-service.js +19 -57
- package/core/server/services/gifts/index.js +3 -5
- package/core/server/services/gifts/jobs/index.js +4 -4
- package/core/server/services/indexnow-ping/indexnow-ping-service.js +2 -2
- package/core/server/services/invitations/accept.js +4 -2
- package/core/server/services/jobs/job-service.js +0 -9
- package/core/server/services/jobs-service/index.js +8 -0
- package/core/server/services/jobs-service/jobs-service.js +52 -3
- package/core/server/services/jobs-service/register-job-handlers.js +32 -11
- package/core/server/services/mail/ghost-mailer.js +4 -4
- package/core/server/services/member-welcome-emails/service.js +7 -7
- package/core/server/services/members/account-service.js +98 -0
- package/core/server/services/members/api.js +4 -3
- package/core/server/services/members/import-export/csv/parse.js +0 -7
- package/core/server/services/members/import-export/export/exporter.js +20 -20
- package/core/server/services/members/import-export/import/completion-email.js +8 -11
- package/core/server/services/members/import-export/import/importer.js +13 -13
- package/core/server/services/members/import-export/import/row.js +0 -3
- package/core/server/services/members/import-export/index.js +10 -17
- package/core/server/services/members/jobs/clean-expired-comped-job.js +7 -0
- package/core/server/services/members/jobs/clean-expired-comped-task.js +145 -0
- package/core/server/services/members/jobs/index.js +48 -24
- package/core/server/services/members/members-api/controllers/member-controller.js +11 -0
- package/core/server/services/members/members-api/controllers/router-controller.js +3 -6
- package/core/server/services/members/members-api/members-api.js +26 -8
- package/core/server/services/members/members-api/repositories/event-repository.js +0 -4
- package/core/server/services/members/members-api/repositories/member-repository.js +4 -4
- package/core/server/services/members/members-api/services/member-bread-service.js +62 -84
- package/core/server/services/members/members-api/services/payments-service.js +1 -1
- package/core/server/services/members/members-ssr.js +18 -0
- package/core/server/services/members/middleware.js +95 -81
- package/core/server/services/members/service.js +71 -47
- package/core/server/services/members/utils.js +9 -0
- package/core/server/services/members-metafields/access.js +28 -0
- package/core/server/services/{members-custom-fields → members-metafields}/actions.js +5 -5
- package/core/server/services/members-metafields/bindings-service.js +147 -0
- package/core/server/services/members-metafields/codec.js +14 -0
- package/core/server/services/{members-custom-fields → members-metafields}/config.js +1 -1
- package/core/server/services/{members-custom-fields → members-metafields}/definitions-service.js +68 -22
- package/core/server/services/members-metafields/filter.js +181 -0
- package/core/server/services/{members-custom-fields → members-metafields}/index.js +16 -7
- package/core/server/services/{members-custom-fields → members-metafields}/key.js +2 -1
- package/core/server/services/{members-custom-fields → members-metafields}/models.js +5 -5
- package/core/server/services/members-metafields/namespaces.js +34 -0
- package/core/server/services/{members-custom-fields → members-metafields}/queries.js +1 -1
- package/core/server/services/{members-custom-fields → members-metafields}/schema.js +16 -12
- package/core/server/services/members-metafields/serializers.js +22 -0
- package/core/server/services/{members-custom-fields → members-metafields}/values-service.js +80 -48
- package/core/server/services/mentions/mention-controller.js +23 -21
- package/core/server/services/mentions/mention-sending-service.js +26 -9
- package/core/server/services/mentions/process-webmention-job.js +16 -0
- package/core/server/services/mentions/send-webmentions-job.js +18 -0
- package/core/server/services/mentions/service.js +7 -33
- package/core/server/services/route-settings/validation-errors.js +1 -1
- package/core/server/services/route-settings/yaml-parser.js +1 -1
- package/core/server/services/settings/settings-service.js +1 -8
- package/core/server/services/settings-helpers/settings-helpers.js +4 -6
- package/core/server/services/slack-ping/slack-ping-service.js +1 -1
- package/core/server/services/staff/staff-service-emails.js +2 -2
- package/core/server/services/stripe/config.js +14 -8
- package/core/server/services/stripe/service.js +10 -1
- package/core/server/services/stripe/services/checkout/completed-session.js +2 -2
- package/core/server/services/stripe/services/checkout/session-options.js +18 -15
- package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +28 -7
- package/core/server/services/stripe/stripe-api.js +2 -0
- package/core/server/services/stripe/stripe-service.js +24 -14
- package/core/server/services/stripe/webhook-controller.js +10 -0
- package/core/server/services/tier-checkout-config/codec.js +11 -7
- package/core/server/services/tier-checkout-config/index.js +2 -1
- package/core/server/services/tier-checkout-config/models.js +11 -5
- package/core/server/services/tier-checkout-config/queries.js +12 -12
- package/core/server/services/tier-checkout-config/serializers.js +73 -10
- package/core/server/services/tier-checkout-config/service.js +14 -13
- package/core/server/services/tiers/service.js +3 -3
- package/core/server/services/update-check/index.js +13 -13
- package/core/server/services/update-check/jobs/update-check-job.js +7 -0
- package/core/server/services/update-check/update-check-service.js +2 -2
- package/core/server/services/url/router-filter.js +8 -10
- package/core/server/services/users.js +1 -19
- package/core/server/web/admin/controller.js +1 -1
- package/core/server/web/api/endpoints/admin/routes.js +20 -16
- package/core/server/web/members/account/index.js +2 -0
- package/core/server/web/members/account/routes.js +46 -0
- package/core/server/web/members/app.js +4 -18
- package/core/shared/config/defaults.json +1 -1
- package/core/shared/config/env/config.testing-mysql.json +1 -1
- package/core/shared/labs.js +7 -2
- package/package.json +42 -41
- package/pnpm-lock.yaml +1159 -582
- package/pnpm-workspace.yaml +18 -15
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.2.0.tgz +0 -0
- package/core/built/admin/assets/Combination-5fYEzgbs.js +0 -41
- package/core/built/admin/assets/account-migration-DRhAehfw.js +0 -1
- package/core/built/admin/assets/activitypub/inbox-BluD2ucT.js +0 -1284
- package/core/built/admin/assets/activitypub/label-FHSh6ZAw.js +0 -16
- package/core/built/admin/assets/activitypub/layout-Cq4NG0Xr.js +0 -1
- package/core/built/admin/assets/activitypub/settings-DQDkr06X.js +0 -315
- package/core/built/admin/assets/add-integration-modal-BC0jExDZ.js +0 -1
- package/core/built/admin/assets/add-newsletter-modal-DchTkA7l.js +0 -1
- package/core/built/admin/assets/add-recommendation-modal-DMvaJZKp.js +0 -1
- package/core/built/admin/assets/alert-dialog-QhXzdHfc.js +0 -1
- package/core/built/admin/assets/analytics-No1DDY3A.js +0 -1
- package/core/built/admin/assets/automated-emails-te1D5kq-.js +0 -1
- package/core/built/admin/assets/automations-DpUNUdcZ.js +0 -1
- package/core/built/admin/assets/bluesky-sharing-Cjrv_f62.js +0 -1
- package/core/built/admin/assets/chunk.896.435fe0637944d4a69810.js +0 -366
- package/core/built/admin/assets/color-picker-BTY_NdEm.js +0 -3
- package/core/built/admin/assets/color-picker-field-CPlkzOH0.js +0 -1
- package/core/built/admin/assets/combobox-DrMtv_4P.js +0 -1
- package/core/built/admin/assets/command-ZdgYJpoI.js +0 -1
- package/core/built/admin/assets/comments-kidj60-h.js +0 -1
- package/core/built/admin/assets/confirmation-context-BhbmQQEl.js +0 -1
- package/core/built/admin/assets/custom-field-type-option-CsGIZk1J.js +0 -10
- package/core/built/admin/assets/custom-integration-modal-BY37O_9X.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-DUSKM4uC.js +0 -22
- package/core/built/admin/assets/dialog-B44iRwlc.js +0 -1
- package/core/built/admin/assets/dirty-confirm-dialog-BxgQgQ6H.js +0 -1
- package/core/built/admin/assets/dist-Cy8tfrp_.js +0 -1
- package/core/built/admin/assets/domain-Ca6KhoQt.js +0 -1
- package/core/built/admin/assets/dropzone-Bb-5zQTk.js +0 -5
- package/core/built/admin/assets/edit-profile-BdupLlus.js +0 -1
- package/core/built/admin/assets/editor-BP883Lpn.js +0 -8
- package/core/built/admin/assets/explore-FB-CimXw.js +0 -1
- package/core/built/admin/assets/feed-C1GxsmI2.js +0 -1
- package/core/built/admin/assets/filter-sources-D5n5bFA2.js +0 -1
- package/core/built/admin/assets/filters-DJEzkMUK.js +0 -1
- package/core/built/admin/assets/filters-MZXvdH5D.js +0 -1
- package/core/built/admin/assets/first-promoter-modal-CGTGLCr5.js +0 -1
- package/core/built/admin/assets/gift-link-modal-B6v0tnRN.js +0 -1
- package/core/built/admin/assets/growth-BGAJD1rs.js +0 -3
- package/core/built/admin/assets/history-modal-iKwUY3XR.js +0 -1
- package/core/built/admin/assets/hooks-CuEZV2-q.js +0 -2
- package/core/built/admin/assets/index-DjQe-e5s.js +0 -4
- package/core/built/admin/assets/index-Dqf2x-ry.css +0 -1
- package/core/built/admin/assets/index.es-VihPwfeH.js +0 -1
- package/core/built/admin/assets/input--W-rCTrX.js +0 -1
- package/core/built/admin/assets/invite-user-modal-MdImLCaJ.js +0 -1
- package/core/built/admin/assets/koenig-loader-DYZpm6El.js +0 -2
- package/core/built/admin/assets/label-picker-cB51xl1r.js +0 -1
- package/core/built/admin/assets/layout-c_B_1hax.js +0 -1
- package/core/built/admin/assets/link-helpers-MVDdnFCY.js +0 -1
- package/core/built/admin/assets/loading-indicator-BpFWTVgh.js +0 -1
- package/core/built/admin/assets/member-custom-fields-qs0dIkxM.js +0 -1
- package/core/built/admin/assets/member-detail-B6uec2a6.js +0 -1
- package/core/built/admin/assets/members-BQF3CqhI.js +0 -2
- package/core/built/admin/assets/moderation-DY4wF1Q3.js +0 -1
- package/core/built/admin/assets/navigation-modal-DX-gNF3X.js +0 -1
- package/core/built/admin/assets/newsletter-CyQA7m3m.js +0 -1
- package/core/built/admin/assets/newsletter-detail-modal-BDrptuxn.js +0 -1
- package/core/built/admin/assets/newsletters-DXuNmC42.js +0 -1
- package/core/built/admin/assets/newsletters-DhNigJUh.js +0 -1
- package/core/built/admin/assets/note-Cgo2LCJ6.js +0 -1
- package/core/built/admin/assets/notifications-BC50AMku.js +0 -1
- package/core/built/admin/assets/offers-container-modal-DWycIMzT.js +0 -1
- package/core/built/admin/assets/onboarding-DGQuV7Ew.js +0 -1
- package/core/built/admin/assets/overview-CVbFtn-k.js +0 -1
- package/core/built/admin/assets/overview-YKj7SZaK.js +0 -1
- package/core/built/admin/assets/pages-B6vr9F_D.js +0 -1
- package/core/built/admin/assets/popover-CCy0h5rq.js +0 -1
- package/core/built/admin/assets/portal-frame-dc4XKr0e.js +0 -1
- package/core/built/admin/assets/portal-modal-BvvdF_B9.js +0 -1
- package/core/built/admin/assets/post-analytics-DX470WRG.js +0 -1
- package/core/built/admin/assets/post-analytics-header-CXpJmdDv.js +0 -1
- package/core/built/admin/assets/post-analytics-provider-CLfKGWZy.js +0 -1
- package/core/built/admin/assets/post-helpers-C5OQMBoi.js +0 -1
- package/core/built/admin/assets/post-share-modal-Cl0NXRJr.js +0 -1
- package/core/built/admin/assets/posts-KY3aUhVV.js +0 -1
- package/core/built/admin/assets/preferences-DO0UUWFp.js +0 -5
- package/core/built/admin/assets/profile-CxT-0l4d.js +0 -1
- package/core/built/admin/assets/router-provider-B0gZyiGJ.js +0 -1
- package/core/built/admin/assets/schemas-4UPic-oD.js +0 -64
- package/core/built/admin/assets/select-DuDUFdPq.js +0 -1
- package/core/built/admin/assets/settings-BjCii7BM.js +0 -1
- package/core/built/admin/assets/settings-b8kNzZSQ.js +0 -4
- package/core/built/admin/assets/share-modal-BV70mr9k.js +0 -1
- package/core/built/admin/assets/shim-ClF_m5ux.js +0 -1
- package/core/built/admin/assets/slack-modal-Be2_KK-z.js +0 -1
- package/core/built/admin/assets/stats-C4reGh9O.js +0 -1
- package/core/built/admin/assets/stats-view-DP9pQ62k.js +0 -1
- package/core/built/admin/assets/stripe-connect-modal-Z-UT_BGc.js +0 -1
- package/core/built/admin/assets/tag-detail-Dc0nTOtU.js +0 -2
- package/core/built/admin/assets/tags-BLaXBwnb.js +0 -1
- package/core/built/admin/assets/testimonials-modal-sFwRnNLh.js +0 -1
- package/core/built/admin/assets/tier-detail-modal-BCFpWwUS.js +0 -1
- package/core/built/admin/assets/tiers-Nd_z4BZY.js +0 -1
- package/core/built/admin/assets/use-filter-params-CAvfDvf1.js +0 -1
- package/core/built/admin/assets/use-growth-stats-D6mZXGhK.js +0 -1
- package/core/built/admin/assets/use-host-limits-DZtR08oa.js +0 -1
- package/core/built/admin/assets/use-pintura-config-CzTfnufz.js +0 -1
- package/core/built/admin/assets/use-reply-chain-data-BeQwz8oF.js +0 -1
- package/core/built/admin/assets/use-settings-navigation-BbrSUVcf.js +0 -1
- package/core/built/admin/assets/use-staff-users-cZg4ugOF.js +0 -1
- package/core/built/admin/assets/use-tinybird-query-B1IMyAcv.js +0 -39
- package/core/built/admin/assets/use-tinybird-token-Bow0Zwn8.js +0 -1
- package/core/built/admin/assets/use-upgrade-route-DhRSo7at.js +0 -1
- package/core/built/admin/assets/user-detail-modal-yipSoQfv.js +0 -1
- package/core/built/admin/assets/users-5msE1WMs.js +0 -1
- package/core/built/admin/assets/web-CKcXAu86.js +0 -1
- package/core/built/admin/assets/web-DR4TqM3E.js +0 -2
- package/core/server/api/endpoints/member-custom-fields.js +0 -90
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.js +0 -20
- package/core/server/services/email-suppression-list/in-memory-email-suppression-list.js +0 -39
- package/core/server/services/jobs/worker-model-event-bridge.js +0 -149
- package/core/server/services/members/jobs/clean-expired-comped.js +0 -132
- package/core/server/services/members-custom-fields/bindings-service.js +0 -119
- package/core/server/services/members-custom-fields/codec.js +0 -15
- package/core/server/services/members-custom-fields/filter.js +0 -199
- package/core/server/services/members-custom-fields/serializers.js +0 -24
- package/core/server/services/stripe/services/checkout/allowed-countries.js +0 -267
- package/core/server/services/stripe/services/checkout/field-ports.js +0 -34
- package/core/server/services/tier-checkout-config/destinations.js +0 -17
- package/core/server/services/update-check/run-update-check.js +0 -63
- /package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js.LICENSE.txt → chunk.901.4ccc639821020230bcca.js.LICENSE.txt} +0 -0
- /package/core/server/services/{members-custom-fields → members-metafields}/storage.js +0 -0
|
@@ -4,7 +4,6 @@ const tpl = require('@tryghost/tpl');
|
|
|
4
4
|
const errors = require('@tryghost/errors');
|
|
5
5
|
|
|
6
6
|
const messages = {
|
|
7
|
-
noEmailProvided: 'No email provided.',
|
|
8
7
|
noNameProvided: 'No name provided.',
|
|
9
8
|
noPasswordProvided: 'No password provided.',
|
|
10
9
|
noTokenProvided: 'No token provided.',
|
|
@@ -21,10 +20,6 @@ module.exports = {
|
|
|
21
20
|
return Promise.reject(new errors.ValidationError({ message: tpl(messages.noTokenProvided) }));
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
if (!data.email) {
|
|
25
|
-
return Promise.reject(new errors.ValidationError({ message: tpl(messages.noEmailProvided) }));
|
|
26
|
-
}
|
|
27
|
-
|
|
28
23
|
if (!data.password) {
|
|
29
24
|
return Promise.reject(
|
|
30
25
|
new errors.ValidationError({ message: tpl(messages.noPasswordProvided) }),
|
|
@@ -8,7 +8,7 @@ const messages = {
|
|
|
8
8
|
onlySingleContentSource: 'Pages can have either a mobiledoc or a lexical property, never both.',
|
|
9
9
|
onlySingleContentSourceContext:
|
|
10
10
|
'Both the mobiledoc and lexical properties are set, one must be null',
|
|
11
|
-
onlySingleContentSourceHelp: 'https://ghost.org/
|
|
11
|
+
onlySingleContentSourceHelp: 'https://docs.ghost.org/admin-api/#the-post-object',
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
const validateVisibility = async function (frame) {
|
|
@@ -8,7 +8,7 @@ const messages = {
|
|
|
8
8
|
onlySingleContentSource: 'Posts can have either a mobiledoc or a lexical property, never both.',
|
|
9
9
|
onlySingleContentSourceContext:
|
|
10
10
|
'Both the mobiledoc and lexical properties are set, one must be null',
|
|
11
|
-
onlySingleContentSourceHelp: 'https://ghost.org/
|
|
11
|
+
onlySingleContentSourceHelp: 'https://docs.ghost.org/admin-api/#the-post-object',
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
const validateVisibility = async function (frame) {
|
|
@@ -42,9 +42,9 @@ const BACKUP_TABLES = [
|
|
|
42
42
|
'members_current_subscription',
|
|
43
43
|
'members_subscription_created_events',
|
|
44
44
|
'members_newsletters',
|
|
45
|
-
'
|
|
46
|
-
'
|
|
47
|
-
'
|
|
45
|
+
'members_metafields',
|
|
46
|
+
'members_metafield_values',
|
|
47
|
+
'members_metafield_bindings',
|
|
48
48
|
'products_checkout_fields',
|
|
49
49
|
'products_checkout_config',
|
|
50
50
|
'mentions',
|
|
@@ -99,7 +99,7 @@ DataImporter = {
|
|
|
99
99
|
return Promise.reject(
|
|
100
100
|
new IncorrectUsageError({
|
|
101
101
|
message: 'Wrong importer structure. `meta` is missing.',
|
|
102
|
-
help: 'https://ghost.org/
|
|
102
|
+
help: 'https://docs.ghost.org/migration/custom/',
|
|
103
103
|
}),
|
|
104
104
|
);
|
|
105
105
|
}
|
|
@@ -108,7 +108,7 @@ DataImporter = {
|
|
|
108
108
|
return Promise.reject(
|
|
109
109
|
new IncorrectUsageError({
|
|
110
110
|
message: 'Wrong importer structure. `meta.version` is missing.',
|
|
111
|
-
help: 'https://ghost.org/
|
|
111
|
+
help: 'https://docs.ghost.org/migration/custom/',
|
|
112
112
|
}),
|
|
113
113
|
);
|
|
114
114
|
}
|
|
@@ -119,7 +119,7 @@ DataImporter = {
|
|
|
119
119
|
return Promise.reject(
|
|
120
120
|
new IncorrectUsageError({
|
|
121
121
|
message: 'Detected unsupported file structure.',
|
|
122
|
-
help: 'Please install Ghost 1.0, import the file and then update your blog to the latest Ghost version.\nVisit https://ghost.org/
|
|
122
|
+
help: 'Please install Ghost 1.0, import the file and then update your blog to the latest Ghost version.\nVisit https://docs.ghost.org/update/ or ask for help in our https://forum.ghost.org.',
|
|
123
123
|
}),
|
|
124
124
|
);
|
|
125
125
|
}
|
|
@@ -117,7 +117,7 @@ function createFinalMigration(major) {
|
|
|
117
117
|
async function up() {
|
|
118
118
|
throw new errors.InternalServerError({
|
|
119
119
|
message: `Unable to run migrations`,
|
|
120
|
-
context: `You must be on the latest v${major}.x to update across major versions - https://ghost.org/
|
|
120
|
+
context: `You must be on the latest v${major}.x to update across major versions - https://docs.ghost.org/update/`,
|
|
121
121
|
help: `Run 'ghost update v${major}' to get the latest v${major}.x version, then run 'ghost update' to get to the latest.`,
|
|
122
122
|
});
|
|
123
123
|
},
|
|
@@ -28,7 +28,7 @@ module.exports = addTable('members_custom_field_values', {
|
|
|
28
28
|
cascadeDelete: true,
|
|
29
29
|
},
|
|
30
30
|
// Exactly one value column is populated per row, chosen by the field type's
|
|
31
|
-
// storage type in @tryghost/
|
|
31
|
+
// storage type in @tryghost/metafield-types. Splitting text from json
|
|
32
32
|
// keeps text-backed values directly queryable rather than behind a JSON
|
|
33
33
|
// extraction, which is what filtering will need.
|
|
34
34
|
//
|
|
@@ -45,7 +45,16 @@ module.exports = createNonTransactionalMigration(
|
|
|
45
45
|
await discardStoredValues(knex);
|
|
46
46
|
|
|
47
47
|
if (!(await knex.schema.hasColumn(TABLE, 'path'))) {
|
|
48
|
-
|
|
48
|
+
// Spec pinned rather than read from schema.js, the way `down` already pins its own:
|
|
49
|
+
// a later migration renames this table, and an unpinned spec resolves against a
|
|
50
|
+
// schema that no longer names it.
|
|
51
|
+
await addColumn(
|
|
52
|
+
TABLE,
|
|
53
|
+
'path',
|
|
54
|
+
knex,
|
|
55
|
+
{ type: 'string', maxlength: 191, nullable: false, defaultTo: '' },
|
|
56
|
+
{ algorithm: 'auto' },
|
|
57
|
+
);
|
|
49
58
|
}
|
|
50
59
|
|
|
51
60
|
// A later 6.58 migration re-keys this table onto `custom_field_key`, dropping
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
const logging = require('@tryghost/logging');
|
|
2
|
+
const { commands } = require('../../../schema');
|
|
3
|
+
const { createNonTransactionalMigration } = require('../../utils');
|
|
4
|
+
|
|
5
|
+
// The tables that held member custom fields are renamed to metafields, the name the API
|
|
6
|
+
// and the rest of the domain already use. Dropped and recreated rather than renamed in
|
|
7
|
+
// place: the feature is behind the `membersCustomFields` flag with no released data, so
|
|
8
|
+
// there is nothing to carry across, and rebuilding gives every foreign key and index the
|
|
9
|
+
// new name without a per-dialect rename dance.
|
|
10
|
+
//
|
|
11
|
+
// `products_checkout_fields` keeps its name but is rebuilt too, because its foreign key
|
|
12
|
+
// points at the bindings table and would otherwise reference a table that no longer
|
|
13
|
+
// exists.
|
|
14
|
+
const DROP_ORDER = [
|
|
15
|
+
'products_checkout_fields',
|
|
16
|
+
'members_custom_field_bindings',
|
|
17
|
+
'members_custom_field_values',
|
|
18
|
+
'members_custom_fields',
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
// Specs pinned as they stand in schema.js at the time of writing, per the migration rules:
|
|
22
|
+
// this file must keep building the same shape however schema.js moves on.
|
|
23
|
+
const CREATE_ORDER = [
|
|
24
|
+
[
|
|
25
|
+
'members_metafields',
|
|
26
|
+
{
|
|
27
|
+
id: { type: 'string', maxlength: 24, nullable: false, primary: true },
|
|
28
|
+
key: { type: 'string', maxlength: 191, nullable: false, unique: true },
|
|
29
|
+
name: { type: 'string', maxlength: 191, nullable: false, unique: true },
|
|
30
|
+
type: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
maxlength: 50,
|
|
33
|
+
nullable: false,
|
|
34
|
+
validations: { isIn: [['short_text', 'long_text', 'address']] },
|
|
35
|
+
},
|
|
36
|
+
status: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
maxlength: 50,
|
|
39
|
+
nullable: false,
|
|
40
|
+
defaultTo: 'active',
|
|
41
|
+
validations: { isIn: [['active', 'archived']] },
|
|
42
|
+
},
|
|
43
|
+
sort_order: { type: 'integer', nullable: false, unsigned: true, defaultTo: 0 },
|
|
44
|
+
created_at: { type: 'dateTime', nullable: false },
|
|
45
|
+
updated_at: { type: 'dateTime', nullable: true },
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
[
|
|
49
|
+
'members_metafield_values',
|
|
50
|
+
{
|
|
51
|
+
id: { type: 'string', maxlength: 24, nullable: false, primary: true },
|
|
52
|
+
metafield_key: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
maxlength: 191,
|
|
55
|
+
nullable: false,
|
|
56
|
+
references: 'members_metafields.key',
|
|
57
|
+
cascadeDelete: true,
|
|
58
|
+
},
|
|
59
|
+
member_id: {
|
|
60
|
+
type: 'string',
|
|
61
|
+
maxlength: 24,
|
|
62
|
+
nullable: false,
|
|
63
|
+
references: 'members.id',
|
|
64
|
+
cascadeDelete: true,
|
|
65
|
+
},
|
|
66
|
+
path: { type: 'string', maxlength: 191, nullable: false, defaultTo: '' },
|
|
67
|
+
value_text: { type: 'text', maxlength: 65535, nullable: true },
|
|
68
|
+
written_by_type: { type: 'string', maxlength: 50, nullable: false },
|
|
69
|
+
written_by_id: { type: 'string', maxlength: 24, nullable: true },
|
|
70
|
+
created_at: { type: 'dateTime', nullable: false },
|
|
71
|
+
updated_at: { type: 'dateTime', nullable: true },
|
|
72
|
+
'@@UNIQUE_CONSTRAINTS@@': [
|
|
73
|
+
{
|
|
74
|
+
columns: ['member_id', 'metafield_key', 'path'],
|
|
75
|
+
indexName: 'members_metafield_values_leaf_unique',
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
'@@INDEXES@@': [['metafield_key', 'path']],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
[
|
|
82
|
+
'members_metafield_bindings',
|
|
83
|
+
{
|
|
84
|
+
id: { type: 'string', maxlength: 24, nullable: false, primary: true },
|
|
85
|
+
product_id: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
maxlength: 24,
|
|
88
|
+
nullable: false,
|
|
89
|
+
references: 'products.id',
|
|
90
|
+
cascadeDelete: true,
|
|
91
|
+
},
|
|
92
|
+
port: { type: 'string', maxlength: 191, nullable: false },
|
|
93
|
+
metafield_key: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
maxlength: 191,
|
|
96
|
+
nullable: false,
|
|
97
|
+
references: 'members_metafields.key',
|
|
98
|
+
cascadeDelete: true,
|
|
99
|
+
},
|
|
100
|
+
created_at: { type: 'dateTime', nullable: false },
|
|
101
|
+
updated_at: { type: 'dateTime', nullable: true },
|
|
102
|
+
'@@UNIQUE_CONSTRAINTS@@': [
|
|
103
|
+
{ columns: ['product_id', 'port'], indexName: 'members_metafield_bindings_unique' },
|
|
104
|
+
],
|
|
105
|
+
'@@INDEXES@@': [['metafield_key']],
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
[
|
|
109
|
+
'products_checkout_fields',
|
|
110
|
+
{
|
|
111
|
+
id: { type: 'string', maxlength: 24, nullable: false, primary: true },
|
|
112
|
+
binding_id: {
|
|
113
|
+
type: 'string',
|
|
114
|
+
maxlength: 24,
|
|
115
|
+
nullable: false,
|
|
116
|
+
unique: true,
|
|
117
|
+
references: 'members_metafield_bindings.id',
|
|
118
|
+
cascadeDelete: true,
|
|
119
|
+
},
|
|
120
|
+
sort_order: { type: 'integer', nullable: false, unsigned: true, defaultTo: 0 },
|
|
121
|
+
label: { type: 'string', maxlength: 191, nullable: true },
|
|
122
|
+
optional: { type: 'boolean', nullable: false, defaultTo: true },
|
|
123
|
+
created_at: { type: 'dateTime', nullable: false },
|
|
124
|
+
updated_at: { type: 'dateTime', nullable: true },
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
module.exports = createNonTransactionalMigration(
|
|
130
|
+
async function up(connection) {
|
|
131
|
+
// The whole migration hangs on the old definitions table being there. A fresh install
|
|
132
|
+
// builds the new names straight from schema.js, and the replay suite runs this against
|
|
133
|
+
// that same final schema, so both reach here with nothing to rename — and must not
|
|
134
|
+
// drop `products_checkout_fields`, which by then is already pointing at the new
|
|
135
|
+
// bindings table.
|
|
136
|
+
if (!(await connection.schema.hasTable('members_custom_fields'))) {
|
|
137
|
+
logging.warn('Skipping the metafield table rename - members_custom_fields does not exist');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Both loops walk a fixed list of four tables, in an order foreign keys dictate, so
|
|
142
|
+
// the usual objection to looping in a migration — that it scales with the rows a site
|
|
143
|
+
// happens to hold — does not apply.
|
|
144
|
+
/* eslint-disable no-restricted-syntax */
|
|
145
|
+
for (const name of DROP_ORDER) {
|
|
146
|
+
if (await connection.schema.hasTable(name)) {
|
|
147
|
+
logging.info(`Dropping table: ${name}`);
|
|
148
|
+
await commands.deleteTable(name, connection);
|
|
149
|
+
} else {
|
|
150
|
+
logging.warn(`Skipping dropping table: ${name} - table does not exist`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
for (const [name, spec] of CREATE_ORDER) {
|
|
155
|
+
if (await connection.schema.hasTable(name)) {
|
|
156
|
+
logging.warn(`Skipping adding table: ${name} - table already exists`);
|
|
157
|
+
} else {
|
|
158
|
+
logging.info(`Adding table: ${name}`);
|
|
159
|
+
await commands.createTable(name, connection, spec);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/* eslint-enable no-restricted-syntax */
|
|
163
|
+
},
|
|
164
|
+
async function down() {
|
|
165
|
+
// Irreversible in the only sense that matters: the old tables can be rebuilt, but
|
|
166
|
+
// whatever they held cannot, and nothing on a released site holds anything.
|
|
167
|
+
logging.warn('Ignoring rollback for the custom field to metafield table rename');
|
|
168
|
+
},
|
|
169
|
+
);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const { combineTransactionalMigrations, createRemovePermissionMigration } = require('../../utils');
|
|
2
|
+
|
|
3
|
+
const RESOURCE = 'member_custom_field';
|
|
4
|
+
|
|
5
|
+
// Reading a field definition is no longer a permission. A definition says a site collects
|
|
6
|
+
// a shoe size; every signed-in member already sees the whole list through Portal, so
|
|
7
|
+
// gating staff behind a role protected nothing and inverted the two halves: an integration
|
|
8
|
+
// holding `member: browse` received members' field values on the member payload, which
|
|
9
|
+
// never consults this permission, while a request for the definitions describing those
|
|
10
|
+
// values was refused.
|
|
11
|
+
//
|
|
12
|
+
// What remains on this resource is defining fields, which stays with the publisher.
|
|
13
|
+
module.exports = combineTransactionalMigrations(
|
|
14
|
+
createRemovePermissionMigration(
|
|
15
|
+
{
|
|
16
|
+
name: 'Browse member custom fields',
|
|
17
|
+
action: 'browse',
|
|
18
|
+
object: RESOURCE,
|
|
19
|
+
},
|
|
20
|
+
['Administrator', 'Admin Integration', 'Super Editor'],
|
|
21
|
+
),
|
|
22
|
+
createRemovePermissionMigration(
|
|
23
|
+
{
|
|
24
|
+
name: 'Read member custom fields',
|
|
25
|
+
action: 'read',
|
|
26
|
+
object: RESOURCE,
|
|
27
|
+
},
|
|
28
|
+
['Administrator', 'Admin Integration', 'Super Editor'],
|
|
29
|
+
),
|
|
30
|
+
);
|
|
@@ -515,16 +515,6 @@
|
|
|
515
515
|
"action_type": "destroy",
|
|
516
516
|
"object_type": "label"
|
|
517
517
|
},
|
|
518
|
-
{
|
|
519
|
-
"name": "Browse member custom fields",
|
|
520
|
-
"action_type": "browse",
|
|
521
|
-
"object_type": "member_custom_field"
|
|
522
|
-
},
|
|
523
|
-
{
|
|
524
|
-
"name": "Read member custom fields",
|
|
525
|
-
"action_type": "read",
|
|
526
|
-
"object_type": "member_custom_field"
|
|
527
|
-
},
|
|
528
518
|
{
|
|
529
519
|
"name": "Edit member custom fields",
|
|
530
520
|
"action_type": "edit",
|
|
@@ -1069,7 +1059,6 @@
|
|
|
1069
1059
|
"collection": "all",
|
|
1070
1060
|
"recommendation": ["browse", "read"],
|
|
1071
1061
|
"member": ["browse", "read", "add", "edit", "destroy"],
|
|
1072
|
-
"member_custom_field": ["browse", "read"],
|
|
1073
1062
|
"member_signin_url": "read",
|
|
1074
1063
|
"offer": ["browse", "read"],
|
|
1075
1064
|
"comment": "all",
|
|
@@ -1,20 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultIndexName = defaultIndexName;
|
|
1
4
|
/**
|
|
2
5
|
* Normally, we use Knex for index names. But in some cases, we need to derive
|
|
3
6
|
* them because Knex won't get it right. We try to match [Knex's code][0] as
|
|
4
7
|
* closely as possible.
|
|
5
8
|
*
|
|
6
9
|
* [0]: https://github.com/knex/knex/blob/e25d54bcb707714a17f5a5744eba5c4246bb4d1d/lib/schema/tablecompiler.js#L401-L415
|
|
7
|
-
*
|
|
8
|
-
* @param {string} tableName
|
|
9
|
-
* @param {string|string[]} columns
|
|
10
|
-
* @returns {string}
|
|
11
10
|
*/
|
|
12
11
|
function defaultIndexName(tableName, columns) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
if (!Array.isArray(columns)) {
|
|
13
|
+
columns = columns ? [columns] : [];
|
|
14
|
+
}
|
|
15
|
+
const table = tableName.replace(/\.|-/g, '_');
|
|
16
|
+
return (table + '_' + columns.join('_') + '_index').toLowerCase();
|
|
18
17
|
}
|
|
19
|
-
|
|
20
|
-
exports.defaultIndexName = defaultIndexName;
|
|
@@ -1033,7 +1033,7 @@ module.exports = {
|
|
|
1033
1033
|
},
|
|
1034
1034
|
sort_order: { type: 'integer', nullable: false, unsigned: true, defaultTo: 0 },
|
|
1035
1035
|
},
|
|
1036
|
-
|
|
1036
|
+
members_metafields: {
|
|
1037
1037
|
id: { type: 'string', maxlength: 24, nullable: false, primary: true },
|
|
1038
1038
|
key: { type: 'string', maxlength: 191, nullable: false, unique: true },
|
|
1039
1039
|
name: { type: 'string', maxlength: 191, nullable: false, unique: true },
|
|
@@ -1041,7 +1041,7 @@ module.exports = {
|
|
|
1041
1041
|
type: 'string',
|
|
1042
1042
|
maxlength: 50,
|
|
1043
1043
|
nullable: false,
|
|
1044
|
-
// Keep in sync with FIELD_TYPE_IDS in @tryghost/
|
|
1044
|
+
// Keep in sync with FIELD_TYPE_IDS in @tryghost/metafield-types,
|
|
1045
1045
|
// the source of truth (this static schema can't import it).
|
|
1046
1046
|
validations: {
|
|
1047
1047
|
isIn: [['short_text', 'long_text', 'address']],
|
|
@@ -1071,7 +1071,7 @@ module.exports = {
|
|
|
1071
1071
|
//
|
|
1072
1072
|
// A second kind of source becomes a `source_type` beside a widened id. What it must not
|
|
1073
1073
|
// become is a second table holding destinations.
|
|
1074
|
-
|
|
1074
|
+
members_metafield_bindings: {
|
|
1075
1075
|
id: { type: 'string', maxlength: 24, nullable: false, primary: true },
|
|
1076
1076
|
product_id: {
|
|
1077
1077
|
type: 'string',
|
|
@@ -1082,19 +1082,19 @@ module.exports = {
|
|
|
1082
1082
|
},
|
|
1083
1083
|
port: { type: 'string', maxlength: 191, nullable: false },
|
|
1084
1084
|
// Indexed rather than unique: several sources landing in one field is expected.
|
|
1085
|
-
|
|
1085
|
+
metafield_key: {
|
|
1086
1086
|
type: 'string',
|
|
1087
1087
|
maxlength: 191,
|
|
1088
1088
|
nullable: false,
|
|
1089
|
-
references: '
|
|
1089
|
+
references: 'members_metafields.key',
|
|
1090
1090
|
cascadeDelete: true,
|
|
1091
1091
|
},
|
|
1092
1092
|
created_at: { type: 'dateTime', nullable: false },
|
|
1093
1093
|
updated_at: { type: 'dateTime', nullable: true },
|
|
1094
1094
|
'@@UNIQUE_CONSTRAINTS@@': [
|
|
1095
|
-
{ columns: ['product_id', 'port'], indexName: '
|
|
1095
|
+
{ columns: ['product_id', 'port'], indexName: 'members_metafield_bindings_unique' },
|
|
1096
1096
|
],
|
|
1097
|
-
'@@INDEXES@@': [['
|
|
1097
|
+
'@@INDEXES@@': [['metafield_key']],
|
|
1098
1098
|
},
|
|
1099
1099
|
// How a tier's checkout question is asked. Where the answer lands is the binding it
|
|
1100
1100
|
// hangs off.
|
|
@@ -1105,7 +1105,7 @@ module.exports = {
|
|
|
1105
1105
|
maxlength: 24,
|
|
1106
1106
|
nullable: false,
|
|
1107
1107
|
unique: true,
|
|
1108
|
-
references: '
|
|
1108
|
+
references: 'members_metafield_bindings.id',
|
|
1109
1109
|
cascadeDelete: true,
|
|
1110
1110
|
},
|
|
1111
1111
|
sort_order: { type: 'integer', nullable: false, unsigned: true, defaultTo: 0 },
|
|
@@ -1137,17 +1137,17 @@ module.exports = {
|
|
|
1137
1137
|
created_at: { type: 'dateTime', nullable: false },
|
|
1138
1138
|
updated_at: { type: 'dateTime', nullable: true },
|
|
1139
1139
|
},
|
|
1140
|
-
|
|
1140
|
+
members_metafield_values: {
|
|
1141
1141
|
id: { type: 'string', maxlength: 24, nullable: false, primary: true },
|
|
1142
1142
|
// The field's stable key, not its id: a value is addressed by key everywhere it
|
|
1143
1143
|
// matters (the write names it, a filter names it, the key is immutable), so the row
|
|
1144
1144
|
// carries it directly and the read and filter paths skip an id-to-key join. Matches
|
|
1145
1145
|
// the referenced column's 191, as a foreign key must.
|
|
1146
|
-
|
|
1146
|
+
metafield_key: {
|
|
1147
1147
|
type: 'string',
|
|
1148
1148
|
maxlength: 191,
|
|
1149
1149
|
nullable: false,
|
|
1150
|
-
references: '
|
|
1150
|
+
references: 'members_metafields.key',
|
|
1151
1151
|
cascadeDelete: true,
|
|
1152
1152
|
},
|
|
1153
1153
|
member_id: {
|
|
@@ -1188,14 +1188,14 @@ module.exports = {
|
|
|
1188
1188
|
written_by_id: { type: 'string', maxlength: 24, nullable: true },
|
|
1189
1189
|
created_at: { type: 'dateTime', nullable: false },
|
|
1190
1190
|
updated_at: { type: 'dateTime', nullable: true },
|
|
1191
|
-
// Named
|
|
1192
|
-
//
|
|
1193
|
-
//
|
|
1194
|
-
//
|
|
1191
|
+
// Named rather than derived. The name knex builds from the table and all three
|
|
1192
|
+
// columns used to overrun MySQL's 64-character identifier limit; the shorter table
|
|
1193
|
+
// name now fits, but the index is named in a migration either way, so pinning it
|
|
1194
|
+
// here keeps the two statements of it identical.
|
|
1195
1195
|
'@@UNIQUE_CONSTRAINTS@@': [
|
|
1196
1196
|
{
|
|
1197
|
-
columns: ['member_id', '
|
|
1198
|
-
indexName: '
|
|
1197
|
+
columns: ['member_id', 'metafield_key', 'path'],
|
|
1198
|
+
indexName: 'members_metafield_values_leaf_unique',
|
|
1199
1199
|
},
|
|
1200
1200
|
],
|
|
1201
1201
|
// What a segment filter looks up: every member holding a given value for a
|
|
@@ -1203,7 +1203,7 @@ module.exports = {
|
|
|
1203
1203
|
// TEXT, so MySQL would need a prefix length, and the schema's index builder
|
|
1204
1204
|
// applies one length to every column in a composite index rather than to a
|
|
1205
1205
|
// single chosen one.
|
|
1206
|
-
'@@INDEXES@@': [['
|
|
1206
|
+
'@@INDEXES@@': [['metafield_key', 'path']],
|
|
1207
1207
|
},
|
|
1208
1208
|
members_stripe_customers: {
|
|
1209
1209
|
id: { type: 'string', maxlength: 24, nullable: false, primary: true },
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Data Generator
|
|
2
|
+
|
|
3
|
+
The development data generator populates related Ghost tables in dependency
|
|
4
|
+
order. Its CLI entry point is `node index.js generate-data`; contributors
|
|
5
|
+
normally use the root `reset:data` scripts described in the
|
|
6
|
+
[test-data guide](../../../../../../docs/contributing/test-data.md).
|
|
7
|
+
|
|
8
|
+
## How It Works
|
|
9
|
+
|
|
10
|
+
Importers live in `importers/` and each own one table. An importer declares its
|
|
11
|
+
default quantity and any dependencies that are not represented by schema
|
|
12
|
+
foreign keys. The generator adds schema and declared dependencies, sorts the
|
|
13
|
+
tables, generates their records, and calls each importer's `finalise()` method.
|
|
14
|
+
|
|
15
|
+
A numeric seed resets Faker for every table. This keeps Faker-generated values
|
|
16
|
+
stable when another table is added or omitted. Time-dependent fields may still
|
|
17
|
+
vary between runs. Use the provided Faker instances and random-data helpers
|
|
18
|
+
rather than `Math.random()` so seeded values remain repeatable.
|
|
19
|
+
|
|
20
|
+
## Add or Change an Importer
|
|
21
|
+
|
|
22
|
+
- Extend `TableImporter` and register the importer in `importers/index.js`.
|
|
23
|
+
- Set a modest `defaultQuantity`; callers can request larger datasets through
|
|
24
|
+
`--tables` or `--quantities`.
|
|
25
|
+
- Declare dependencies that the database schema cannot supply. The generator
|
|
26
|
+
derives normal foreign-key dependencies itself.
|
|
27
|
+
- Use `setReferencedModel()` and maps or indexes when records depend on another
|
|
28
|
+
generated table. Avoid repeatedly scanning large arrays during generation.
|
|
29
|
+
- Generate IDs with `fastFakeObjectId()` rather than Faker's MongoDB ID helper.
|
|
30
|
+
The generated IDs are fast and safely earlier than the current time.
|
|
31
|
+
- Put derived-table or summary work in `finalise()` so it runs after every
|
|
32
|
+
importer has completed.
|
|
33
|
+
|
|
34
|
+
## Bulk Inserts
|
|
35
|
+
|
|
36
|
+
`TableImporter.batchInsert()` uses Knex for small datasets. Above 5,000 records
|
|
37
|
+
it writes CSV chunks and uses MySQL's `LOAD DATA LOCAL INFILE`, unless
|
|
38
|
+
`DISABLE_FAST_IMPORT` is set.
|
|
39
|
+
|
|
40
|
+
The CLI requires infile streaming. It is enabled automatically in development;
|
|
41
|
+
other environments must explicitly set `ALLOW_INFILE_STREAM=1`. Do not broaden
|
|
42
|
+
that permission in application configuration: it allows the database client to
|
|
43
|
+
read a requested local file.
|
|
44
|
+
|
|
45
|
+
The generator temporarily changes MySQL foreign-key, uniqueness, local-infile,
|
|
46
|
+
and redo-log settings for fast imports. It re-enables redo logging at the end of
|
|
47
|
+
a successful import. When changing this lifecycle, ensure failure paths also
|
|
48
|
+
restore any persistent database setting they changed.
|