ghost 6.62.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/tryghost-adapter-base-jobs-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/content/themes/source/package.json +2 -2
- package/content/themes/source/partials/post-card.hbs +1 -1
- package/core/boot.js +7 -5
- package/core/built/admin/assets/{about-Dyae_UT6.js → about-C1C3s5-g.js} +1 -1
- package/core/built/admin/assets/accordion-CxGsDKwa.js +1 -0
- package/core/built/admin/assets/{account-migration-CESa0mnX.js → account-migration-CbUhW6gk.js} +1 -1
- package/core/built/admin/assets/activitypub/{account-migration-By69CgCp.js → account-migration-KA6Jjf9L.js} +7 -7
- package/core/built/admin/assets/activitypub/activitypub.js +3 -3
- 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-BJcPMrDd.js → bluesky-sharing-C7nTDMvw.js} +9 -9
- package/core/built/admin/assets/activitypub/{content-formatters-3rTHg3mp.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-DUR4xSkV.js → domain-fZ-X8i4-.js} +9 -9
- package/core/built/admin/assets/activitypub/{edit-profile-BqtfzxCp.js → edit-profile-BqMLQV88.js} +6 -6
- package/core/built/admin/assets/activitypub/{explore-BxuJd-J4.js → explore-B4yPoP8E.js} +10 -10
- package/core/built/admin/assets/activitypub/{feed-BM1TcksA.js → feed-BRC_mvAe.js} +9 -9
- package/core/built/admin/assets/activitypub/{field-Dn7HHx2-.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-CCjkuow2.js → inbox-BW-yvUoN.js} +10 -10
- package/core/built/admin/assets/activitypub/{inbox-d8oJRTf4.js → inbox-CbTTdDQ3.js} +2 -2
- package/core/built/admin/assets/activitypub/{label-1AA_s9Fa.js → label-kPMmYI7l.js} +3 -3
- package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-CnmxEB8w.js → moderation-CuidJzc0.js} +10 -10
- package/core/built/admin/assets/activitypub/{note-ZKc_Bnba.js → note-CAMRRSqD.js} +7 -7
- package/core/built/admin/assets/activitypub/{notifications-CB2tJZau.js → notifications-BmNlXGgp.js} +9 -9
- package/core/built/admin/assets/activitypub/{onboarding-BsJ9E5qf.js → onboarding-Bqg7fh_L.js} +2 -2
- package/core/built/admin/assets/activitypub/{onboarding-CSUJJIlh.js → onboarding-Dmun9jr_.js} +2 -2
- package/core/built/admin/assets/activitypub/{preferences-0-JZnUkI.js → preferences--oH19wf9.js} +11 -11
- package/core/built/admin/assets/activitypub/{profile-C35cFIhM.js → profile-DH_tQx2D.js} +14 -14
- package/core/built/admin/assets/activitypub/{reply-DYK5vVqb.js → reply-Cap9PxSH.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-BD4vscyc.js → routes-DdyY9uFF.js} +30 -30
- package/core/built/admin/assets/activitypub/{separator-BbQqTm-p.js → separator-CAxxu8VV.js} +3 -3
- package/core/built/admin/assets/activitypub/{settings-BsMROdqh.js → settings-B6EEcVkW.js} +6 -6
- package/core/built/admin/assets/activitypub/{site-O0RL9YCN.js → site-BYps63oh.js} +2 -2
- package/core/built/admin/assets/activitypub/{step-1-BMSx7c_X.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-CLlOZTyt.js → step-3-C-qBbcUo.js} +11 -11
- package/core/built/admin/assets/activitypub/{tabs-Dxk-b9M-.js → tabs-DLhZtVde.js} +6 -6
- package/core/built/admin/assets/activitypub/{topic-filter-5yZH6tId.js → topic-filter-DsUOuu0k.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CV50qe03.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-Cbvzgjzd.js → use-reply-chain-data-AJi9zkzm.js} +5 -5
- package/core/built/admin/assets/activitypub/{users-BjcoP_HC.js → users-inweyKL5.js} +186 -160
- package/core/built/admin/assets/activitypub/{x-DbQZOLiI.js → x-DR8AT3-4.js} +2 -2
- package/core/built/admin/assets/{add-integration-modal-BlF6rs_f.js → add-integration-modal-BT_onDJy.js} +1 -1
- package/core/built/admin/assets/{add-newsletter-modal-CglVQqah.js → add-newsletter-modal-Cx1kQpiY.js} +1 -1
- package/core/built/admin/assets/{add-recommendation-modal-wz7BsuaG.js → add-recommendation-modal-B5nvAhvr.js} +1 -1
- package/core/built/admin/assets/{analytics-C4HE1gBg.js → analytics-DjoJWPI7.js} +1 -1
- package/core/built/admin/assets/{announcement-bar-modal-Ci4zz8jO.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-Ck-Yteiv.js → api-keys-BoeacM-s.js} +1 -1
- package/core/built/admin/assets/{audience-CtbA54Sn.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-BEtJ_gL_.js → bluesky-sharing-vzh-oPXL.js} +1 -1
- package/core/built/admin/assets/{breadcrumb-zUrZrBtW.js → breadcrumb-CaLk2b7D.js} +1 -1
- package/core/built/admin/assets/{button-eNMKQWXr.js → button-Dvcv1QSR.js} +1 -1
- package/core/built/admin/assets/calendar-Bl9RLcZX.js +1 -0
- package/core/built/admin/assets/{chart-helpers-CfBKt0vT.js → chart-helpers-FHywU0pj.js} +1 -1
- package/core/built/admin/assets/{checkbox-CgOn_tKW.js → checkbox-BtayFtjg.js} +1 -1
- package/core/built/admin/assets/chunk.254.035b85ec456ebbd7336b.js +440 -0
- package/core/built/admin/assets/{chunk.524.a697dee88db67fdf6021.js → chunk.524.e6975095fccdf22d90f8.js} +5 -5
- package/core/built/admin/assets/{chunk.582.5ed5d124cfca9c259b9c.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-K2wI-I5f.js → code-editor-view-C3ZfoF1X.js} +1 -1
- package/core/built/admin/assets/{code-editor-view-BYNoAoNV.js → code-editor-view-CAyRWy1s.js} +1 -1
- package/core/built/admin/assets/{color-picker-Ddw80xX6.js → color-picker-G4kGR7rp.js} +1 -1
- package/core/built/admin/assets/{color-picker-field-D9nUhvA7.js → color-picker-field-DQFVTNnT.js} +1 -1
- package/core/built/admin/assets/{combobox-w9j8PPQT.js → combobox-BnYzgEB4.js} +1 -1
- package/core/built/admin/assets/{command-BfpHORBv.js → command-C_vyTikI.js} +1 -1
- 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-CBM8G0Vj.js → confirmation-context-DwXX_Y5h.js} +1 -1
- package/core/built/admin/assets/{content-api-modal-TXRz3U7S.js → content-api-modal-D2G0nJP6.js} +1 -1
- package/core/built/admin/assets/{context-menu-_QMdd3kp.js → context-menu-DOVB6yaz.js} +1 -1
- package/core/built/admin/assets/{copy-field-6N01S07E.js → copy-field-DCJwh9qf.js} +1 -1
- package/core/built/admin/assets/{create-ghost-browse-value-source-qIBymvvf.js → create-ghost-browse-value-source-5C53jJaX.js} +1 -1
- package/core/built/admin/assets/custom-field-type-option-BAuW0F-E.js +1 -0
- package/core/built/admin/assets/{custom-integration-modal-DmNquxUV.js → custom-integration-modal-AbJGVyKc.js} +1 -1
- package/core/built/admin/assets/{date-range-select-uvz_DtPh.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-BZ1iytEd.js → dirty-confirm-dialog-DVPuGz3U.js} +1 -1
- package/core/built/admin/assets/{disabled-sources-indicator-DMRrxsiJ.js → disabled-sources-indicator-Cy7Zp4c8.js} +1 -1
- package/core/built/admin/assets/{domain-BNYrt0aD.js → domain-Dl61QGuk.js} +1 -1
- package/core/built/admin/assets/{dropzone-D7nFdAe5.js → dropzone-Dtz5Rmjt.js} +4 -4
- 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-Ds6mPEi5.js → embed-signup-form-modal-DGqsORxS.js} +1 -1
- package/core/built/admin/assets/{explore-UY10Egsp.js → explore-nnRr1Fja.js} +1 -1
- package/core/built/admin/assets/feature-flag-overrides-context-DQjdJFAk.js +1 -0
- package/core/built/admin/assets/{feature-image-placeholder-D1iF_8bc.js → feature-image-placeholder-BrIHmPs8.js} +1 -1
- package/core/built/admin/assets/{feed-81C8mJWR.js → feed-BNUcNu-W.js} +1 -1
- package/core/built/admin/assets/feedback-DJ4Zb9rZ.js +1 -0
- package/core/built/admin/assets/{field-Dihp5p18.js → field-C93_Mg6j.js} +1 -1
- package/core/built/admin/assets/filter-sources-CGJb4C5r.js +1 -0
- package/core/built/admin/assets/{filters-DirqNXjH.js → filters--kKP-EC8.js} +1 -1
- package/core/built/admin/assets/filters-DxA_a4FP.js +1 -0
- package/core/built/admin/assets/{first-promoter-modal-CT6MxYZb.js → first-promoter-modal-BYDtrz2S.js} +1 -1
- package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-BbSnGOtK.js +1 -0
- package/core/built/admin/assets/{ghost-8eabfc1ece81b03cf7b90780d31487e8.css → ghost-8fd5bb799356bbefb254210ba7e1236d.css} +1 -1
- package/core/built/admin/assets/{ghost-c2848508292937415f20f5a830eea59e.js → ghost-b4e8a403baba61905cd7560e30b9732d.js} +43 -27
- package/core/built/admin/assets/{ghost-dark-a7bebe2c561f55369dcf29f4c820f7ff.css → ghost-dark-cac0cb2d5bb78e9bd14d8d1c2768ed45.css} +1 -1
- package/core/built/admin/assets/{gift-link-modal-CQVAye17.js → gift-link-modal-B7u5bD4e.js} +1 -1
- package/core/built/admin/assets/{gift-links-DLDS7ljO.js → gift-links-CfLSnst2.js} +1 -1
- package/core/built/admin/assets/growth-Cd1uO9d2.js +1 -0
- package/core/built/admin/assets/growth-aG32xfdE.js +3 -0
- package/core/built/admin/assets/{history-modal-CFd1Hvx6.js → history-modal-Df8lW8h-.js} +1 -1
- package/core/built/admin/assets/hooks-Cy_-oZ4o.js +2 -0
- package/core/built/admin/assets/{html-field-CJBCLTvv.js → html-field-DA4eU7eq.js} +1 -1
- package/core/built/admin/assets/{images-scfkWZiK.js → images-KXmyO3Ss.js} +1 -1
- package/core/built/admin/assets/{inbox-Mcp4DXZN.js → inbox-gJHG7_xd.js} +6 -6
- 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-CMhe2DvY.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-DfheMXs0.js → invite-user-modal-B4CuNcx4.js} +1 -1
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +2 -2
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +2 -2
- package/core/built/admin/assets/{koenig-lexical-DBSqAuiI.js → koenig-lexical-CGXb0F8o.js} +2 -2
- package/core/built/admin/assets/koenig-loader-BeM5rFPX.js +2 -0
- package/core/built/admin/assets/{kpi-card-DBRMfGOW.js → kpi-card-B21aToe8.js} +1 -1
- package/core/built/admin/assets/{kpi-card-DFafD1qq.js → kpi-card-pz6Wv4Ae.js} +1 -1
- package/core/built/admin/assets/{kpi-helpers-Cv8i8hns.js → kpi-helpers-Dq5jelmP.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-BJItvLYm.js → kpi-tabs-DEZHpKUt.js} +1 -1
- package/core/built/admin/assets/{label-BnSCvffu.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-DDQV6QeG.js → member-custom-fields-TRTHCAz9.js} +1 -1
- 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-AgCIEso4.js → moderation-ZWefD9uH.js} +1 -1
- package/core/built/admin/assets/{multi-select-combobox-BcITkUVr.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-DKzwafuh.js → newsletter-emails-DZH6I-PY.js} +1 -1
- package/core/built/admin/assets/{newsletters-BRBb_uQC.js → newsletters-DOC9KBcX.js} +1 -1
- package/core/built/admin/assets/newsletters-Rq1M3GD-.js +1 -0
- package/core/built/admin/assets/{note-DyGHtS9a.js → note-DIV-Pojr.js} +1 -1
- package/core/built/admin/assets/{notifications-ZgWniKna.js → notifications-s20-H49V.js} +1 -1
- package/core/built/admin/assets/{offers-9J1CSiLy.js → offers--e2nGvkW.js} +1 -1
- package/core/built/admin/assets/{offers-container-modal-B-E8TIWr.js → offers-container-modal-BmG5M5Tv.js} +1 -1
- package/core/built/admin/assets/onboarding-CUuy9unR.js +1 -0
- package/core/built/admin/assets/{onboarding-CzIsre-d.js → onboarding-pXyct0Jm.js} +1 -1
- package/core/built/admin/assets/{onboarding-route-CaavZulg.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-De0VzKBi.js → page-header-DM_KyoFI.js} +1 -1
- package/core/built/admin/assets/{pagemenu-B5KKCpbA.js → pagemenu-vgZVUVKR.js} +1 -1
- 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/{pintura-modal-BZ2J9w3n.js → pintura-modal-DExCF1ii.js} +1 -1
- package/core/built/admin/assets/{portal-frame-B6Hr9wHc.js → portal-frame-Cqanidq4.js} +1 -1
- 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-C5YJLp74.js → preferences--vNubsqD.js} +2 -2
- package/core/built/admin/assets/{preview-modal-BfeFqi5y.js → preview-modal-YYbzlYdO.js} +1 -1
- package/core/built/admin/assets/profile-BllKV3dR.js +1 -0
- package/core/built/admin/assets/radio-group-DL8GI8rt.js +1 -0
- 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-cb0t_TAJ.js → select-v5YbA3Mw.js} +1 -1
- package/core/built/admin/assets/settings-PEsZupw1.js +4 -0
- package/core/built/admin/assets/{settings-breadcrumbs-DLzbRRSt.js → settings-breadcrumbs-NwPnCTC7.js} +1 -1
- package/core/built/admin/assets/{settings-DZqxR0Da.js → settings-u_s1CRkr.js} +1 -1
- package/core/built/admin/assets/{share-modal-D2-Bz1_I.js → share-modal-SskCmVGL.js} +1 -1
- package/core/built/admin/assets/{slack-modal-DYDTUria.js → slack-modal-XxSJiYgo.js} +1 -1
- package/core/built/admin/assets/{sort-button-VVeQjjbu.js → sort-button-Cx1KtINE.js} +1 -1
- package/core/built/admin/assets/{source-icon-Ck5_5Kgq.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-CsaBjeN4.js → step-1-BQYzvBzr.js} +1 -1
- package/core/built/admin/assets/{step-2-D2vnxOOM.js → step-2-xES32xJV.js} +1 -1
- package/core/built/admin/assets/{step-3-wBoLdGEb.js → step-3-DA_XK5kW.js} +2 -2
- package/core/built/admin/assets/{stripe-button-CDgLz0S0.js → stripe-button-CVsLHelt.js} +1 -1
- package/core/built/admin/assets/{stripe-connect-modal-CSjMJetP.js → stripe-connect-modal-ClmLOMGS.js} +1 -1
- package/core/built/admin/assets/style-Wd9nQubI.css +1 -0
- package/core/built/admin/assets/{table-Do6iQ83Q.js → table-BenqVupI.js} +1 -1
- package/core/built/admin/assets/{tabs-D2yWLMp_.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-CtnZBJKl.js → testimonials-modal-9Q6fT06V.js} +1 -1
- 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-ByUJsxwD.js → toggle-group-CviIkyok.js} +1 -1
- package/core/built/admin/assets/{topic-filter-BgC3g5_v.js → topic-filter-I2jCBGxm.js} +1 -1
- package/core/built/admin/assets/{transistor-modal-Drr0SNfo.js → transistor-modal-p53u3W8y.js} +1 -1
- package/core/built/admin/assets/{trend-badge-6ye93YAW.js → trend-badge-CideVzQd.js} +1 -1
- package/core/built/admin/assets/{unsplash-modal-p6AoQoWp.js → unsplash-modal-DY8UcKcE.js} +1 -1
- package/core/built/admin/assets/{use-analytics-data-CWCMAESo.js → use-analytics-data-DAIGcr2f.js} +1 -1
- package/core/built/admin/assets/{use-check-theme-limit-error-Cw3WQHy8.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-DCVG3s9w.js → use-growth-stats-937CUj6j.js} +1 -1
- package/core/built/admin/assets/use-host-limits-D0Dv3tKA.js +1 -0
- package/core/built/admin/assets/{use-limiter-D2WRRx0H.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-BfN1UwzH.js → use-pintura-editor-CaV1mbfO.js} +1 -1
- package/core/built/admin/assets/{use-post-referrers-Czg47m8s.js → use-post-referrers-BCQI7fDg.js} +1 -1
- package/core/built/admin/assets/{use-reply-chain-data-ns0caK8k.js → use-reply-chain-data-CYRhoaxY.js} +1 -1
- package/core/built/admin/assets/{use-router-history-entry-uldn7zJO.js → use-router-history-entry-NOKcd--l.js} +1 -1
- package/core/built/admin/assets/{use-setting-group-DpcuCUDg.js → use-setting-group-bLKMwoBT.js} +1 -1
- package/core/built/admin/assets/{use-settings-navigation-CZjGrhsp.js → use-settings-navigation-B-qrriKD.js} +1 -1
- package/core/built/admin/assets/{use-simple-pagination-DzJWobPR.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-CSnGXzZh.js → use-tinybird-query-CmdbCS9X.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-DTOKRR7e.js → use-tinybird-token-KLne235s.js} +1 -1
- package/core/built/admin/assets/{use-unsaved-changes-guard-CBzs-KPi.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-DFr8lCbS.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-Cg-OeGzC.js → users-DVNWrqg9.js} +1 -1
- package/core/built/admin/assets/{vendor-5753232c7d6ffb3c44e1eb0a02133953.js → vendor-2dd263291938d407802568d3357ec69e.js} +19 -17
- package/core/built/admin/assets/{virtual-list-BW-padMe.js → virtual-list-CZ3RK2Yf.js} +1 -1
- package/core/built/admin/assets/{web-C1v33ehA.js → web-ClEJsCAj.js} +2 -2
- package/core/built/admin/assets/web-X9rdnrtq.js +1 -0
- package/core/built/admin/assets/{zapier-modal-BBFfI6Ml.js → zapier-modal-DfVhV17j.js} +1 -1
- package/core/built/admin/index.html +19 -18
- 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 +8 -0
- package/core/server/api/endpoints/member-metafields-members.js +23 -0
- package/core/server/api/endpoints/member-metafields.js +33 -20
- package/core/server/api/endpoints/members-account.js +42 -0
- 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/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 +16 -2
- 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 +4 -0
- package/core/server/api/endpoints/utils/serializers/output/member-metafields.js +3 -3
- 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/tiers.js +10 -2
- package/core/server/api/endpoints/utils/serializers/output/users.js +0 -10
- package/core/server/data/exporter/table-lists.js +3 -3
- 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/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 +6 -6
- package/core/server/models/user.js +1 -1
- 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/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 -0
- package/core/server/services/email-service/email-controller.js +18 -2
- package/core/server/services/email-service/email-service-wrapper.js +3 -0
- 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/gift-service.js +19 -57
- package/core/server/services/gifts/index.js +0 -2
- 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 +13 -2
- package/core/server/services/members/account-service.js +98 -0
- package/core/server/services/members/api.js +4 -4
- package/core/server/services/members/import-export/export/exporter.js +20 -20
- package/core/server/services/members/import-export/import/completion-email.js +6 -6
- package/core/server/services/members/import-export/import/importer.js +13 -13
- package/core/server/services/members/import-export/index.js +7 -7
- package/core/server/services/members/members-api/members-api.js +26 -6
- 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 +45 -39
- 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 +70 -42
- 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-custom-fields → members-metafields}/codec.js +4 -4
- 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 +17 -23
- package/core/server/services/{members-custom-fields → members-metafields}/filter.js +9 -9
- package/core/server/services/{members-custom-fields → members-metafields}/index.js +16 -7
- package/core/server/services/{members-custom-fields → members-metafields}/key.js +1 -1
- package/core/server/services/{members-custom-fields → members-metafields}/models.js +4 -4
- 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-custom-fields → members-metafields}/serializers.js +6 -6
- package/core/server/services/{members-custom-fields → members-metafields}/values-service.js +32 -22
- package/core/server/services/mentions/mention-sending-service.js +26 -9
- package/core/server/services/mentions/send-webmentions-job.js +18 -0
- package/core/server/services/mentions/service.js +1 -31
- package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +2 -2
- package/core/server/services/stripe/stripe-service.js +4 -4
- package/core/server/services/tier-checkout-config/codec.js +2 -2
- package/core/server/services/tier-checkout-config/index.js +2 -1
- package/core/server/services/tier-checkout-config/models.js +2 -2
- package/core/server/services/tier-checkout-config/queries.js +8 -8
- package/core/server/services/tier-checkout-config/serializers.js +57 -0
- package/core/server/services/tier-checkout-config/service.js +1 -1
- package/core/server/services/tiers/service.js +3 -3
- package/core/server/services/url/router-filter.js +8 -10
- package/core/server/services/users.js +1 -19
- package/core/server/web/api/endpoints/admin/routes.js +1 -0
- 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/labs.js +4 -2
- package/package.json +22 -22
- package/pnpm-lock.yaml +513 -571
- package/pnpm-workspace.yaml +12 -12
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/core/built/admin/assets/activitypub/layout-2-0bw6HN.js +0 -1
- package/core/built/admin/assets/automated-emails-D5VVMND9.js +0 -1
- package/core/built/admin/assets/automations-CzKt5fb8.js +0 -1
- package/core/built/admin/assets/chunk.598.7e056fabb47ce7dbd73f.js +0 -366
- package/core/built/admin/assets/comments-BLmCmyCs.js +0 -1
- package/core/built/admin/assets/custom-field-type-option-BddFlJFa.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-BSmo12Op.js +0 -2
- package/core/built/admin/assets/edit-profile-C5Asm4LA.js +0 -1
- package/core/built/admin/assets/editor-REokrzci.js +0 -8
- package/core/built/admin/assets/filter-sources-BO9xUPj7.js +0 -1
- package/core/built/admin/assets/filters-CRUWecfY.js +0 -1
- package/core/built/admin/assets/growth-BWIu-6xj.js +0 -3
- package/core/built/admin/assets/growth-DU29oxeA.js +0 -1
- package/core/built/admin/assets/hooks-CuEZV2-q.js +0 -2
- package/core/built/admin/assets/index-6MkPdCtr.js +0 -4
- package/core/built/admin/assets/index-Bn7QhcZu.css +0 -2
- package/core/built/admin/assets/index.es-CNnuNH0d.js +0 -1
- package/core/built/admin/assets/koenig-loader-aFQNlJlD.js +0 -2
- package/core/built/admin/assets/label-picker-KVoo91sh.js +0 -1
- package/core/built/admin/assets/layout-Bjv2Ll-5.js +0 -1
- package/core/built/admin/assets/link-helpers-MVDdnFCY.js +0 -1
- package/core/built/admin/assets/member-detail-CdJF6Agw.js +0 -1
- package/core/built/admin/assets/members-DjQbq9Z2.js +0 -4
- package/core/built/admin/assets/navigation-modal-BkT7b1M2.js +0 -1
- package/core/built/admin/assets/newsletter-BMMAuvgq.js +0 -1
- package/core/built/admin/assets/newsletter-detail-modal-0SCJ7Zpm.js +0 -1
- package/core/built/admin/assets/newsletters-DhNigJUh.js +0 -1
- package/core/built/admin/assets/onboarding-qg8Akovm.js +0 -1
- package/core/built/admin/assets/overview-BW8GLeYi.js +0 -1
- package/core/built/admin/assets/overview-BkXZNzaZ.js +0 -1
- package/core/built/admin/assets/pages-jgaFm69d.js +0 -1
- package/core/built/admin/assets/pages-route-CIUAQxtY.js +0 -1
- package/core/built/admin/assets/portal-modal-D4ceei3t.js +0 -1
- package/core/built/admin/assets/post-analytics-header-BYCsT0GP.js +0 -1
- package/core/built/admin/assets/post-analytics-ot7f6pih.js +0 -1
- package/core/built/admin/assets/post-analytics-provider-Bo1gmYaP.js +0 -1
- package/core/built/admin/assets/post-helpers-C5OQMBoi.js +0 -1
- package/core/built/admin/assets/post-share-modal-C-PaYZ_e.js +0 -1
- package/core/built/admin/assets/posts-DuGazgTb.js +0 -1
- package/core/built/admin/assets/posts-list-screen-CBGGgjjj.js +0 -2
- package/core/built/admin/assets/posts-route-D6xmS7Vf.js +0 -1
- package/core/built/admin/assets/profile-B8mx2yAu.js +0 -1
- package/core/built/admin/assets/radio-group-DczlLKOn.js +0 -1
- package/core/built/admin/assets/router-provider-B0gZyiGJ.js +0 -1
- package/core/built/admin/assets/schemas-DppqmpeJ.js +0 -64
- package/core/built/admin/assets/settings-DvfTNdHQ.js +0 -4
- package/core/built/admin/assets/stats-Rjmk5owg.js +0 -1
- package/core/built/admin/assets/stats-view-BGGmkmgv.js +0 -1
- package/core/built/admin/assets/tag-detail-BhXlOsCa.js +0 -2
- package/core/built/admin/assets/tags-ldukRApe.js +0 -1
- package/core/built/admin/assets/tier-detail-modal-BOs8e_G8.js +0 -1
- package/core/built/admin/assets/tiers-Nd_z4BZY.js +0 -1
- package/core/built/admin/assets/use-filter-params-BIni9taJ.js +0 -1
- package/core/built/admin/assets/use-host-limits-DZtR08oa.js +0 -1
- package/core/built/admin/assets/use-pintura-config-h-J0Lvta.js +0 -1
- package/core/built/admin/assets/use-staff-users-Csipb-O0.js +0 -1
- package/core/built/admin/assets/use-upgrade-route-DhRSo7at.js +0 -1
- package/core/built/admin/assets/user-detail-modal-B_iUClI6.js +0 -1
- package/core/built/admin/assets/web-C4BKzn2T.js +0 -1
- package/core/server/services/email-suppression-list/in-memory-email-suppression-list.js +0 -39
- package/core/server/services/members-custom-fields/bindings-service.js +0 -120
- /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
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const serializers_1 = require("../../../../../services/members-
|
|
3
|
+
const serializers_1 = require("../../../../../services/members-metafields/serializers");
|
|
4
4
|
const serializeOne = (field, _apiConfig, frame) => {
|
|
5
|
-
frame.response = serializers_1.
|
|
5
|
+
frame.response = serializers_1.toMetafieldsResponse.parse([field]);
|
|
6
6
|
};
|
|
7
7
|
const serializeMany = (fields, _apiConfig, frame) => {
|
|
8
|
-
frame.response = serializers_1.
|
|
8
|
+
frame.response = serializers_1.toMetafieldsResponse.parse(fields);
|
|
9
9
|
};
|
|
10
10
|
// The API framework loads this file with `require()`, so it exports CommonJS-style;
|
|
11
11
|
// `export default` would not be picked up.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const { formattedMemberResponse } = require('../../../../../services/members/utils');
|
|
3
|
+
/**
|
|
4
|
+
* A member's own record, as this API has always written one down.
|
|
5
|
+
*
|
|
6
|
+
* The projection itself is unchanged and still lives beside the other member
|
|
7
|
+
* formatting; what changes is that it is now reached the way every other
|
|
8
|
+
* serializer is, by this endpoint's `docName`, rather than being called by hand
|
|
9
|
+
* from a request handler.
|
|
10
|
+
*/
|
|
11
|
+
const serialize = (member, _apiConfig, frame) => {
|
|
12
|
+
frame.response = formattedMemberResponse(member);
|
|
13
|
+
};
|
|
14
|
+
// The API framework loads this file with `require()`, so it exports CommonJS-style;
|
|
15
|
+
// `export default` would not be picked up.
|
|
16
|
+
module.exports = {
|
|
17
|
+
read: serialize,
|
|
18
|
+
update: serialize,
|
|
19
|
+
};
|
|
@@ -14,7 +14,7 @@ const { toExportCsvRow } = require('../../../../../services/members/import-expor
|
|
|
14
14
|
* @returns {Transform} Transform stream that converts objects to CSV
|
|
15
15
|
*/
|
|
16
16
|
function createCSVTransform() {
|
|
17
|
-
// Locked in from the first row rather than declared up front:
|
|
17
|
+
// Locked in from the first row rather than declared up front: metafields
|
|
18
18
|
// add a column per site, so the column set isn't known until a row arrives.
|
|
19
19
|
// Every row carries the same keys, so the first is representative.
|
|
20
20
|
let fields = null;
|
|
@@ -20,7 +20,7 @@ module.exports = {
|
|
|
20
20
|
function paginatedTiers(page, _apiConfig, frame) {
|
|
21
21
|
return {
|
|
22
22
|
tiers: page.data.map((model) => {
|
|
23
|
-
return serializeTier(model, frame.options);
|
|
23
|
+
return serializeTier(model, frame.options, page.requirements);
|
|
24
24
|
}),
|
|
25
25
|
meta: page.meta,
|
|
26
26
|
};
|
|
@@ -45,7 +45,7 @@ function singleTier(model, _apiConfig, frame) {
|
|
|
45
45
|
*
|
|
46
46
|
* @returns {SerializedTier}
|
|
47
47
|
*/
|
|
48
|
-
function serializeTier(tier, options) {
|
|
48
|
+
function serializeTier(tier, options, requirements = null) {
|
|
49
49
|
const json = tier.toJSON(options);
|
|
50
50
|
|
|
51
51
|
const serialized = {
|
|
@@ -70,6 +70,14 @@ function serializeTier(tier, options) {
|
|
|
70
70
|
serialized.benefits = null;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
// Only the payload that was asked for these carries them, so a response that did not
|
|
74
|
+
// look them up says nothing rather than saying every tier asks for nothing. Where they
|
|
75
|
+
// were looked up, every tier carries the key and an empty one means it asks for
|
|
76
|
+
// nothing.
|
|
77
|
+
if (requirements) {
|
|
78
|
+
serialized.requirements = requirements.get(json.id) ?? {};
|
|
79
|
+
}
|
|
80
|
+
|
|
73
81
|
if (serialized.type === 'free') {
|
|
74
82
|
delete serialized.currency;
|
|
75
83
|
delete serialized.monthly_price;
|
|
@@ -6,16 +6,6 @@ const messages = {
|
|
|
6
6
|
};
|
|
7
7
|
|
|
8
8
|
module.exports = {
|
|
9
|
-
destroy(filename, apiConfig, frame) {
|
|
10
|
-
debug('destroy');
|
|
11
|
-
|
|
12
|
-
frame.response = {
|
|
13
|
-
meta: {
|
|
14
|
-
filename: filename,
|
|
15
|
-
},
|
|
16
|
-
};
|
|
17
|
-
},
|
|
18
|
-
|
|
19
9
|
changePassword(models, apiConfig, frame) {
|
|
20
10
|
debug('changePassword');
|
|
21
11
|
|
|
@@ -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',
|
|
@@ -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.
|