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.
Files changed (439) hide show
  1. package/components/tryghost-adapter-base-jobs-0.0.0.tgz +0 -0
  2. package/components/tryghost-adapter-base-scheduling-0.2.3.tgz +0 -0
  3. package/components/tryghost-adapter-base-sso-0.1.3.tgz +0 -0
  4. package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
  5. package/components/tryghost-checkout-0.0.0.tgz +0 -0
  6. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  7. package/components/tryghost-kg-card-factory-5.2.4.tgz +0 -0
  8. package/components/tryghost-kg-clean-basic-html-4.3.4.tgz +0 -0
  9. package/components/tryghost-kg-converters-1.2.5.tgz +0 -0
  10. package/components/tryghost-kg-default-cards-10.3.5.tgz +0 -0
  11. package/components/tryghost-kg-default-nodes-2.2.1.tgz +0 -0
  12. package/components/tryghost-kg-default-transforms-1.3.4.tgz +0 -0
  13. package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
  14. package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
  15. package/components/tryghost-kg-markdown-html-renderer-7.2.4.tgz +0 -0
  16. package/components/tryghost-kg-utils-1.1.4.tgz +0 -0
  17. package/components/tryghost-limit-service-0.0.0.tgz +0 -0
  18. package/components/tryghost-metafield-types-0.0.0.tgz +0 -0
  19. package/content/themes/source/package.json +2 -2
  20. package/content/themes/source/partials/post-card.hbs +1 -1
  21. package/core/boot.js +7 -5
  22. package/core/built/admin/assets/{about-Dyae_UT6.js → about-C1C3s5-g.js} +1 -1
  23. package/core/built/admin/assets/accordion-CxGsDKwa.js +1 -0
  24. package/core/built/admin/assets/{account-migration-CESa0mnX.js → account-migration-CbUhW6gk.js} +1 -1
  25. package/core/built/admin/assets/activitypub/{account-migration-By69CgCp.js → account-migration-KA6Jjf9L.js} +7 -7
  26. package/core/built/admin/assets/activitypub/activitypub.js +3 -3
  27. package/core/built/admin/assets/activitypub/{avatar-DLPL3Abs.js → avatar-DVJF5bxP.js} +2 -2
  28. package/core/built/admin/assets/activitypub/{avatar-flipboard-C9iDY-QV.js → avatar-flipboard-csQaNeYK.js} +2 -2
  29. package/core/built/admin/assets/activitypub/{bluesky-sharing-BJcPMrDd.js → bluesky-sharing-C7nTDMvw.js} +9 -9
  30. package/core/built/admin/assets/activitypub/{content-formatters-3rTHg3mp.js → content-formatters-CLcjaBwV.js} +4 -4
  31. package/core/built/admin/assets/activitypub/{copy-DIAOQoCZ.js → copy-DcOh8kXw.js} +2 -2
  32. package/core/built/admin/assets/activitypub/{domain-DUR4xSkV.js → domain-fZ-X8i4-.js} +9 -9
  33. package/core/built/admin/assets/activitypub/{edit-profile-BqtfzxCp.js → edit-profile-BqMLQV88.js} +6 -6
  34. package/core/built/admin/assets/activitypub/{explore-BxuJd-J4.js → explore-B4yPoP8E.js} +10 -10
  35. package/core/built/admin/assets/activitypub/{feed-BM1TcksA.js → feed-BRC_mvAe.js} +9 -9
  36. package/core/built/admin/assets/activitypub/{field-Dn7HHx2-.js → field-COacNgOt.js} +3 -3
  37. package/core/built/admin/assets/activitypub/{hash-Bm3WxYN4.js → hash-C7u-irQQ.js} +2 -2
  38. package/core/built/admin/assets/activitypub/{inbox-CCjkuow2.js → inbox-BW-yvUoN.js} +10 -10
  39. package/core/built/admin/assets/activitypub/{inbox-d8oJRTf4.js → inbox-CbTTdDQ3.js} +2 -2
  40. package/core/built/admin/assets/activitypub/{label-1AA_s9Fa.js → label-kPMmYI7l.js} +3 -3
  41. package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +1 -0
  42. package/core/built/admin/assets/activitypub/{moderation-CnmxEB8w.js → moderation-CuidJzc0.js} +10 -10
  43. package/core/built/admin/assets/activitypub/{note-ZKc_Bnba.js → note-CAMRRSqD.js} +7 -7
  44. package/core/built/admin/assets/activitypub/{notifications-CB2tJZau.js → notifications-BmNlXGgp.js} +9 -9
  45. package/core/built/admin/assets/activitypub/{onboarding-BsJ9E5qf.js → onboarding-Bqg7fh_L.js} +2 -2
  46. package/core/built/admin/assets/activitypub/{onboarding-CSUJJIlh.js → onboarding-Dmun9jr_.js} +2 -2
  47. package/core/built/admin/assets/activitypub/{preferences-0-JZnUkI.js → preferences--oH19wf9.js} +11 -11
  48. package/core/built/admin/assets/activitypub/{profile-C35cFIhM.js → profile-DH_tQx2D.js} +14 -14
  49. package/core/built/admin/assets/activitypub/{reply-DYK5vVqb.js → reply-Cap9PxSH.js} +2 -2
  50. package/core/built/admin/assets/activitypub/{routes-BD4vscyc.js → routes-DdyY9uFF.js} +30 -30
  51. package/core/built/admin/assets/activitypub/{separator-BbQqTm-p.js → separator-CAxxu8VV.js} +3 -3
  52. package/core/built/admin/assets/activitypub/{settings-BsMROdqh.js → settings-B6EEcVkW.js} +6 -6
  53. package/core/built/admin/assets/activitypub/{site-O0RL9YCN.js → site-BYps63oh.js} +2 -2
  54. package/core/built/admin/assets/activitypub/{step-1-BMSx7c_X.js → step-1-CKjR2KAm.js} +6 -6
  55. package/core/built/admin/assets/activitypub/{step-2-DtPQzlTH.js → step-2-B6PKfOUQ.js} +6 -6
  56. package/core/built/admin/assets/activitypub/{step-3-CLlOZTyt.js → step-3-C-qBbcUo.js} +11 -11
  57. package/core/built/admin/assets/activitypub/{tabs-Dxk-b9M-.js → tabs-DLhZtVde.js} +6 -6
  58. package/core/built/admin/assets/activitypub/{topic-filter-5yZH6tId.js → topic-filter-DsUOuu0k.js} +3 -3
  59. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CV50qe03.js → use-activity-pub-queries-CX9snsLs.js} +3 -3
  60. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-Bmk5h4lW.js → use-navigate-with-base-path-DsJTGDSS.js} +988 -959
  61. package/core/built/admin/assets/activitypub/{use-reply-chain-data-Cbvzgjzd.js → use-reply-chain-data-AJi9zkzm.js} +5 -5
  62. package/core/built/admin/assets/activitypub/{users-BjcoP_HC.js → users-inweyKL5.js} +186 -160
  63. package/core/built/admin/assets/activitypub/{x-DbQZOLiI.js → x-DR8AT3-4.js} +2 -2
  64. package/core/built/admin/assets/{add-integration-modal-BlF6rs_f.js → add-integration-modal-BT_onDJy.js} +1 -1
  65. package/core/built/admin/assets/{add-newsletter-modal-CglVQqah.js → add-newsletter-modal-Cx1kQpiY.js} +1 -1
  66. package/core/built/admin/assets/{add-recommendation-modal-wz7BsuaG.js → add-recommendation-modal-B5nvAhvr.js} +1 -1
  67. package/core/built/admin/assets/{analytics-C4HE1gBg.js → analytics-DjoJWPI7.js} +1 -1
  68. package/core/built/admin/assets/{announcement-bar-modal-Ci4zz8jO.js → announcement-bar-modal-Dwd0EGFP.js} +1 -1
  69. package/core/built/admin/assets/{api-keys-3-0vJC3Y.js → api-keys-BGPzLHzA.js} +1 -1
  70. package/core/built/admin/assets/{api-keys-Ck-Yteiv.js → api-keys-BoeacM-s.js} +1 -1
  71. package/core/built/admin/assets/{audience-CtbA54Sn.js → audience-ceV3XVHq.js} +1 -1
  72. package/core/built/admin/assets/automated-emails-BLesE41L.js +1 -0
  73. package/core/built/admin/assets/{automations-sAcJ1334.js → automations-BN4u3GR8.js} +1 -1
  74. package/core/built/admin/assets/automations-C-ZTUwW3.js +1 -0
  75. package/core/built/admin/assets/{bluesky-sharing-BEtJ_gL_.js → bluesky-sharing-vzh-oPXL.js} +1 -1
  76. package/core/built/admin/assets/{breadcrumb-zUrZrBtW.js → breadcrumb-CaLk2b7D.js} +1 -1
  77. package/core/built/admin/assets/{button-eNMKQWXr.js → button-Dvcv1QSR.js} +1 -1
  78. package/core/built/admin/assets/calendar-Bl9RLcZX.js +1 -0
  79. package/core/built/admin/assets/{chart-helpers-CfBKt0vT.js → chart-helpers-FHywU0pj.js} +1 -1
  80. package/core/built/admin/assets/{checkbox-CgOn_tKW.js → checkbox-BtayFtjg.js} +1 -1
  81. package/core/built/admin/assets/chunk.254.035b85ec456ebbd7336b.js +440 -0
  82. package/core/built/admin/assets/{chunk.524.a697dee88db67fdf6021.js → chunk.524.e6975095fccdf22d90f8.js} +5 -5
  83. package/core/built/admin/assets/{chunk.582.5ed5d124cfca9c259b9c.js → chunk.582.98b485f9b2802f540897.js} +6 -6
  84. package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js → chunk.901.4ccc639821020230bcca.js} +9949 -7921
  85. package/core/built/admin/assets/{code-editor-view-K2wI-I5f.js → code-editor-view-C3ZfoF1X.js} +1 -1
  86. package/core/built/admin/assets/{code-editor-view-BYNoAoNV.js → code-editor-view-CAyRWy1s.js} +1 -1
  87. package/core/built/admin/assets/{color-picker-Ddw80xX6.js → color-picker-G4kGR7rp.js} +1 -1
  88. package/core/built/admin/assets/{color-picker-field-D9nUhvA7.js → color-picker-field-DQFVTNnT.js} +1 -1
  89. package/core/built/admin/assets/{combobox-w9j8PPQT.js → combobox-BnYzgEB4.js} +1 -1
  90. package/core/built/admin/assets/{command-BfpHORBv.js → command-C_vyTikI.js} +1 -1
  91. package/core/built/admin/assets/comments-aBrxfnZf.js +1 -0
  92. package/core/built/admin/assets/{config-DOMQDZGZ.js → config-kSHvwdTG.js} +1 -1
  93. package/core/built/admin/assets/{confirmation-context-CBM8G0Vj.js → confirmation-context-DwXX_Y5h.js} +1 -1
  94. package/core/built/admin/assets/{content-api-modal-TXRz3U7S.js → content-api-modal-D2G0nJP6.js} +1 -1
  95. package/core/built/admin/assets/{context-menu-_QMdd3kp.js → context-menu-DOVB6yaz.js} +1 -1
  96. package/core/built/admin/assets/{copy-field-6N01S07E.js → copy-field-DCJwh9qf.js} +1 -1
  97. package/core/built/admin/assets/{create-ghost-browse-value-source-qIBymvvf.js → create-ghost-browse-value-source-5C53jJaX.js} +1 -1
  98. package/core/built/admin/assets/custom-field-type-option-BAuW0F-E.js +1 -0
  99. package/core/built/admin/assets/{custom-integration-modal-DmNquxUV.js → custom-integration-modal-AbJGVyKc.js} +1 -1
  100. package/core/built/admin/assets/{date-range-select-uvz_DtPh.js → date-range-select-BY3K-ukj.js} +1 -1
  101. package/core/built/admin/assets/design-and-theme-modal-BvEy4_pC.js +2 -0
  102. package/core/built/admin/assets/{dirty-confirm-dialog-BZ1iytEd.js → dirty-confirm-dialog-DVPuGz3U.js} +1 -1
  103. package/core/built/admin/assets/{disabled-sources-indicator-DMRrxsiJ.js → disabled-sources-indicator-Cy7Zp4c8.js} +1 -1
  104. package/core/built/admin/assets/{domain-BNYrt0aD.js → domain-Dl61QGuk.js} +1 -1
  105. package/core/built/admin/assets/{dropzone-D7nFdAe5.js → dropzone-Dtz5Rmjt.js} +4 -4
  106. package/core/built/admin/assets/edit-profile-DNJSMDwm.js +1 -0
  107. package/core/built/admin/assets/editor-DbAen9zf.js +8 -0
  108. package/core/built/admin/assets/editor-screen-BFWThIai.js +26 -0
  109. package/core/built/admin/assets/email-sending-status-context-CWDOD1FN.js +1 -0
  110. package/core/built/admin/assets/email-sending-status-provider-DCPkDICt.js +1 -0
  111. package/core/built/admin/assets/emails-vFMk4yYl.js +1 -0
  112. package/core/built/admin/assets/{embed-signup-form-modal-Ds6mPEi5.js → embed-signup-form-modal-DGqsORxS.js} +1 -1
  113. package/core/built/admin/assets/{explore-UY10Egsp.js → explore-nnRr1Fja.js} +1 -1
  114. package/core/built/admin/assets/feature-flag-overrides-context-DQjdJFAk.js +1 -0
  115. package/core/built/admin/assets/{feature-image-placeholder-D1iF_8bc.js → feature-image-placeholder-BrIHmPs8.js} +1 -1
  116. package/core/built/admin/assets/{feed-81C8mJWR.js → feed-BNUcNu-W.js} +1 -1
  117. package/core/built/admin/assets/feedback-DJ4Zb9rZ.js +1 -0
  118. package/core/built/admin/assets/{field-Dihp5p18.js → field-C93_Mg6j.js} +1 -1
  119. package/core/built/admin/assets/filter-sources-CGJb4C5r.js +1 -0
  120. package/core/built/admin/assets/{filters-DirqNXjH.js → filters--kKP-EC8.js} +1 -1
  121. package/core/built/admin/assets/filters-DxA_a4FP.js +1 -0
  122. package/core/built/admin/assets/{first-promoter-modal-CT6MxYZb.js → first-promoter-modal-BYDtrz2S.js} +1 -1
  123. package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-BbSnGOtK.js +1 -0
  124. package/core/built/admin/assets/{ghost-8eabfc1ece81b03cf7b90780d31487e8.css → ghost-8fd5bb799356bbefb254210ba7e1236d.css} +1 -1
  125. package/core/built/admin/assets/{ghost-c2848508292937415f20f5a830eea59e.js → ghost-b4e8a403baba61905cd7560e30b9732d.js} +43 -27
  126. package/core/built/admin/assets/{ghost-dark-a7bebe2c561f55369dcf29f4c820f7ff.css → ghost-dark-cac0cb2d5bb78e9bd14d8d1c2768ed45.css} +1 -1
  127. package/core/built/admin/assets/{gift-link-modal-CQVAye17.js → gift-link-modal-B7u5bD4e.js} +1 -1
  128. package/core/built/admin/assets/{gift-links-DLDS7ljO.js → gift-links-CfLSnst2.js} +1 -1
  129. package/core/built/admin/assets/growth-Cd1uO9d2.js +1 -0
  130. package/core/built/admin/assets/growth-aG32xfdE.js +3 -0
  131. package/core/built/admin/assets/{history-modal-CFd1Hvx6.js → history-modal-Df8lW8h-.js} +1 -1
  132. package/core/built/admin/assets/hooks-Cy_-oZ4o.js +2 -0
  133. package/core/built/admin/assets/{html-field-CJBCLTvv.js → html-field-DA4eU7eq.js} +1 -1
  134. package/core/built/admin/assets/{images-scfkWZiK.js → images-KXmyO3Ss.js} +1 -1
  135. package/core/built/admin/assets/{inbox-Mcp4DXZN.js → inbox-gJHG7_xd.js} +6 -6
  136. package/core/built/admin/assets/index-BHHXtR5C.css +2 -0
  137. package/core/built/admin/assets/index-CgMCwsxN.js +4 -0
  138. package/core/built/admin/assets/index.es-CY6-yuw9.js +1 -0
  139. package/core/built/admin/assets/{input-group-CMhe2DvY.js → input-group-BE8rM2y1.js} +1 -1
  140. package/core/built/admin/assets/{integrations-Bjbu86Z0.js → integrations-B4kuRBFY.js} +1 -1
  141. package/core/built/admin/assets/{invite-user-modal-DfheMXs0.js → invite-user-modal-B4CuNcx4.js} +1 -1
  142. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +2 -2
  143. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +2 -2
  144. package/core/built/admin/assets/{koenig-lexical-DBSqAuiI.js → koenig-lexical-CGXb0F8o.js} +2 -2
  145. package/core/built/admin/assets/koenig-loader-BeM5rFPX.js +2 -0
  146. package/core/built/admin/assets/{kpi-card-DBRMfGOW.js → kpi-card-B21aToe8.js} +1 -1
  147. package/core/built/admin/assets/{kpi-card-DFafD1qq.js → kpi-card-pz6Wv4Ae.js} +1 -1
  148. package/core/built/admin/assets/{kpi-helpers-Cv8i8hns.js → kpi-helpers-Dq5jelmP.js} +1 -1
  149. package/core/built/admin/assets/{kpi-tabs-BJItvLYm.js → kpi-tabs-DEZHpKUt.js} +1 -1
  150. package/core/built/admin/assets/{label-BnSCvffu.js → label-OLCzze8N.js} +1 -1
  151. package/core/built/admin/assets/label-picker-BigOvMPV.js +1 -0
  152. package/core/built/admin/assets/{labels-CH3Kn8RV.js → labels-Dr0SgUQD.js} +1 -1
  153. package/core/built/admin/assets/layout-DUTL8SH5.js +1 -0
  154. package/core/built/admin/assets/lib-7QPTI0FS.js +1 -0
  155. package/core/built/admin/assets/link-helpers-BRAg9SCj.js +1 -0
  156. package/core/built/admin/assets/links-BDHPTlyj.js +1 -0
  157. package/core/built/admin/assets/{member-custom-fields-DDQV6QeG.js → member-custom-fields-TRTHCAz9.js} +1 -1
  158. package/core/built/admin/assets/member-detail-b6dRwc3C.js +1 -0
  159. package/core/built/admin/assets/members-Czt5lJSc.js +4 -0
  160. package/core/built/admin/assets/{moderation-AgCIEso4.js → moderation-ZWefD9uH.js} +1 -1
  161. package/core/built/admin/assets/{multi-select-combobox-BcITkUVr.js → multi-select-combobox-CT13MTo-.js} +1 -1
  162. package/core/built/admin/assets/navigation-modal-C8FEhBK5.js +1 -0
  163. package/core/built/admin/assets/newsletter-5VYW4RyJ.js +1 -0
  164. package/core/built/admin/assets/newsletter-detail-modal-ChjC0ZqH.js +1 -0
  165. package/core/built/admin/assets/{newsletter-emails-DKzwafuh.js → newsletter-emails-DZH6I-PY.js} +1 -1
  166. package/core/built/admin/assets/{newsletters-BRBb_uQC.js → newsletters-DOC9KBcX.js} +1 -1
  167. package/core/built/admin/assets/newsletters-Rq1M3GD-.js +1 -0
  168. package/core/built/admin/assets/{note-DyGHtS9a.js → note-DIV-Pojr.js} +1 -1
  169. package/core/built/admin/assets/{notifications-ZgWniKna.js → notifications-s20-H49V.js} +1 -1
  170. package/core/built/admin/assets/{offers-9J1CSiLy.js → offers--e2nGvkW.js} +1 -1
  171. package/core/built/admin/assets/{offers-container-modal-B-E8TIWr.js → offers-container-modal-BmG5M5Tv.js} +1 -1
  172. package/core/built/admin/assets/onboarding-CUuy9unR.js +1 -0
  173. package/core/built/admin/assets/{onboarding-CzIsre-d.js → onboarding-pXyct0Jm.js} +1 -1
  174. package/core/built/admin/assets/{onboarding-route-CaavZulg.js → onboarding-route-CK4pcXoR.js} +1 -1
  175. package/core/built/admin/assets/overview-CaPsciMs.js +1 -0
  176. package/core/built/admin/assets/overview-a8GfcsKX.js +1 -0
  177. package/core/built/admin/assets/{page-header-De0VzKBi.js → page-header-DM_KyoFI.js} +1 -1
  178. package/core/built/admin/assets/{pagemenu-B5KKCpbA.js → pagemenu-vgZVUVKR.js} +1 -1
  179. package/core/built/admin/assets/pages-CjDY2CBI.js +1 -0
  180. package/core/built/admin/assets/pages-route-BzKZYdV5.js +1 -0
  181. package/core/built/admin/assets/{pintura-modal-BZ2J9w3n.js → pintura-modal-DExCF1ii.js} +1 -1
  182. package/core/built/admin/assets/{portal-frame-B6Hr9wHc.js → portal-frame-Cqanidq4.js} +1 -1
  183. package/core/built/admin/assets/portal-modal-oinBgA27.js +1 -0
  184. package/core/built/admin/assets/post-analytics-C5oJ1dWV.js +1 -0
  185. package/core/built/admin/assets/post-analytics-header-OATo3X_r.js +1 -0
  186. package/core/built/admin/assets/post-analytics-provider-tOpIVGT5.js +1 -0
  187. package/core/built/admin/assets/post-helpers-C88JBa4D.js +1 -0
  188. package/core/built/admin/assets/post-share-modal-DvhC1XgV.js +1 -0
  189. package/core/built/admin/assets/post-utils-DKF4mfuo.js +1 -0
  190. package/core/built/admin/assets/posts-list-screen-o4ZjbgS3.js +2 -0
  191. package/core/built/admin/assets/posts-pCPrhQeR.js +1 -0
  192. package/core/built/admin/assets/posts-route-9F--xdIb.js +1 -0
  193. package/core/built/admin/assets/{preferences-C5YJLp74.js → preferences--vNubsqD.js} +2 -2
  194. package/core/built/admin/assets/{preview-modal-BfeFqi5y.js → preview-modal-YYbzlYdO.js} +1 -1
  195. package/core/built/admin/assets/profile-BllKV3dR.js +1 -0
  196. package/core/built/admin/assets/radio-group-DL8GI8rt.js +1 -0
  197. package/core/built/admin/assets/{referrers-CnhCMWCs.js → referrers-D8oHPmDB.js} +1 -1
  198. package/core/built/admin/assets/router-provider-BSvTXgZY.js +1 -0
  199. package/core/built/admin/assets/schemas-BoYdB6YU.js +64 -0
  200. package/core/built/admin/assets/{select-cb0t_TAJ.js → select-v5YbA3Mw.js} +1 -1
  201. package/core/built/admin/assets/settings-PEsZupw1.js +4 -0
  202. package/core/built/admin/assets/{settings-breadcrumbs-DLzbRRSt.js → settings-breadcrumbs-NwPnCTC7.js} +1 -1
  203. package/core/built/admin/assets/{settings-DZqxR0Da.js → settings-u_s1CRkr.js} +1 -1
  204. package/core/built/admin/assets/{share-modal-D2-Bz1_I.js → share-modal-SskCmVGL.js} +1 -1
  205. package/core/built/admin/assets/{slack-modal-DYDTUria.js → slack-modal-XxSJiYgo.js} +1 -1
  206. package/core/built/admin/assets/{sort-button-VVeQjjbu.js → sort-button-Cx1KtINE.js} +1 -1
  207. package/core/built/admin/assets/{source-icon-Ck5_5Kgq.js → source-icon-Bdp9Im_5.js} +1 -1
  208. package/core/built/admin/assets/stats-D9PDLS3x.js +1 -0
  209. package/core/built/admin/assets/stats-view-W2g6Jsd-.js +1 -0
  210. package/core/built/admin/assets/{step-1-CsaBjeN4.js → step-1-BQYzvBzr.js} +1 -1
  211. package/core/built/admin/assets/{step-2-D2vnxOOM.js → step-2-xES32xJV.js} +1 -1
  212. package/core/built/admin/assets/{step-3-wBoLdGEb.js → step-3-DA_XK5kW.js} +2 -2
  213. package/core/built/admin/assets/{stripe-button-CDgLz0S0.js → stripe-button-CVsLHelt.js} +1 -1
  214. package/core/built/admin/assets/{stripe-connect-modal-CSjMJetP.js → stripe-connect-modal-ClmLOMGS.js} +1 -1
  215. package/core/built/admin/assets/style-Wd9nQubI.css +1 -0
  216. package/core/built/admin/assets/{table-Do6iQ83Q.js → table-BenqVupI.js} +1 -1
  217. package/core/built/admin/assets/{tabs-D2yWLMp_.js → tabs-eBBlxPp8.js} +1 -1
  218. package/core/built/admin/assets/tag-detail-Ce8Se2qd.js +2 -0
  219. package/core/built/admin/assets/tag-picker-C3UR-uJ-.js +1 -0
  220. package/core/built/admin/assets/tags-B-kJxCs7.js +1 -0
  221. package/core/built/admin/assets/{tags-zTFiKRpb.js → tags-ChfdwJyS.js} +1 -1
  222. package/core/built/admin/assets/{testimonials-modal-CtnZBJKl.js → testimonials-modal-9Q6fT06V.js} +1 -1
  223. package/core/built/admin/assets/tier-detail-modal-CDyYdqK7.js +1 -0
  224. package/core/built/admin/assets/tiers-BCpIOGQr.js +1 -0
  225. package/core/built/admin/assets/{toggle-group-ByUJsxwD.js → toggle-group-CviIkyok.js} +1 -1
  226. package/core/built/admin/assets/{topic-filter-BgC3g5_v.js → topic-filter-I2jCBGxm.js} +1 -1
  227. package/core/built/admin/assets/{transistor-modal-Drr0SNfo.js → transistor-modal-p53u3W8y.js} +1 -1
  228. package/core/built/admin/assets/{trend-badge-6ye93YAW.js → trend-badge-CideVzQd.js} +1 -1
  229. package/core/built/admin/assets/{unsplash-modal-p6AoQoWp.js → unsplash-modal-DY8UcKcE.js} +1 -1
  230. package/core/built/admin/assets/{use-analytics-data-CWCMAESo.js → use-analytics-data-DAIGcr2f.js} +1 -1
  231. package/core/built/admin/assets/{use-check-theme-limit-error-Cw3WQHy8.js → use-check-theme-limit-error-DRUjK4YM.js} +1 -1
  232. package/core/built/admin/assets/use-filter-params-JkZhIS8L.js +1 -0
  233. package/core/built/admin/assets/{use-filterable-api-CzXcpUh8.js → use-filterable-api-BVEVMrhZ.js} +1 -1
  234. package/core/built/admin/assets/{use-growth-stats-DCVG3s9w.js → use-growth-stats-937CUj6j.js} +1 -1
  235. package/core/built/admin/assets/use-host-limits-D0Dv3tKA.js +1 -0
  236. package/core/built/admin/assets/{use-limiter-D2WRRx0H.js → use-limiter-CohWfzvK.js} +1 -1
  237. package/core/built/admin/assets/{use-navigate-with-base-path-BHPA228f.js → use-navigate-with-base-path-BkxcPj5l.js} +1 -1
  238. package/core/built/admin/assets/use-pintura-config-xgytjU35.js +1 -0
  239. package/core/built/admin/assets/{use-pintura-editor-BfN1UwzH.js → use-pintura-editor-CaV1mbfO.js} +1 -1
  240. package/core/built/admin/assets/{use-post-referrers-Czg47m8s.js → use-post-referrers-BCQI7fDg.js} +1 -1
  241. package/core/built/admin/assets/{use-reply-chain-data-ns0caK8k.js → use-reply-chain-data-CYRhoaxY.js} +1 -1
  242. package/core/built/admin/assets/{use-router-history-entry-uldn7zJO.js → use-router-history-entry-NOKcd--l.js} +1 -1
  243. package/core/built/admin/assets/{use-setting-group-DpcuCUDg.js → use-setting-group-bLKMwoBT.js} +1 -1
  244. package/core/built/admin/assets/{use-settings-navigation-CZjGrhsp.js → use-settings-navigation-B-qrriKD.js} +1 -1
  245. package/core/built/admin/assets/{use-simple-pagination-DzJWobPR.js → use-simple-pagination-CNPd6Rf6.js} +1 -1
  246. package/core/built/admin/assets/use-staff-users-pRIMIyiW.js +1 -0
  247. package/core/built/admin/assets/{use-tinybird-query-CSnGXzZh.js → use-tinybird-query-CmdbCS9X.js} +1 -1
  248. package/core/built/admin/assets/{use-tinybird-token-DTOKRR7e.js → use-tinybird-token-KLne235s.js} +1 -1
  249. package/core/built/admin/assets/{use-unsaved-changes-guard-CBzs-KPi.js → use-unsaved-changes-guard-7-ug0JdH.js} +1 -1
  250. package/core/built/admin/assets/use-upgrade-route-Dm_qqKr0.js +1 -0
  251. package/core/built/admin/assets/{use-url-input-DFr8lCbS.js → use-url-input-fvp-TpPx.js} +1 -1
  252. package/core/built/admin/assets/user-detail-modal-D3KlGYv-.js +1 -0
  253. package/core/built/admin/assets/{users-Cg-OeGzC.js → users-DVNWrqg9.js} +1 -1
  254. package/core/built/admin/assets/{vendor-5753232c7d6ffb3c44e1eb0a02133953.js → vendor-2dd263291938d407802568d3357ec69e.js} +19 -17
  255. package/core/built/admin/assets/{virtual-list-BW-padMe.js → virtual-list-CZ3RK2Yf.js} +1 -1
  256. package/core/built/admin/assets/{web-C1v33ehA.js → web-ClEJsCAj.js} +2 -2
  257. package/core/built/admin/assets/web-X9rdnrtq.js +1 -0
  258. package/core/built/admin/assets/{zapier-modal-BBFfI6Ml.js → zapier-modal-DfVhV17j.js} +1 -1
  259. package/core/built/admin/index.html +19 -18
  260. package/core/server/adapters/jobs/InMemoryJobsBackend.js +74 -29
  261. package/core/server/api/endpoints/authentication.js +1 -2
  262. package/core/server/api/endpoints/authors-public.js +15 -5
  263. package/core/server/api/endpoints/emails.js +13 -0
  264. package/core/server/api/endpoints/index.js +8 -0
  265. package/core/server/api/endpoints/member-metafields-members.js +23 -0
  266. package/core/server/api/endpoints/member-metafields.js +33 -20
  267. package/core/server/api/endpoints/members-account.js +42 -0
  268. package/core/server/api/endpoints/newsletters-public.js +10 -1
  269. package/core/server/api/endpoints/pages-public.js +15 -5
  270. package/core/server/api/endpoints/posts-public.js +15 -5
  271. package/core/server/api/endpoints/tags-public.js +22 -3
  272. package/core/server/api/endpoints/tiers-checkout-config.js +2 -2
  273. package/core/server/api/endpoints/tiers-public.js +38 -1
  274. package/core/server/api/endpoints/users.js +2 -2
  275. package/core/server/api/endpoints/utils/api-filter-utils.js +170 -3
  276. package/core/server/api/endpoints/utils/public-cache-keys.js +3 -0
  277. package/core/server/api/endpoints/utils/serializers/input/authors.js +2 -0
  278. package/core/server/api/endpoints/utils/serializers/input/members.js +16 -2
  279. package/core/server/api/endpoints/utils/serializers/input/pages.js +2 -0
  280. package/core/server/api/endpoints/utils/serializers/input/posts.js +2 -0
  281. package/core/server/api/endpoints/utils/serializers/input/tags.js +2 -0
  282. package/core/server/api/endpoints/utils/serializers/output/emails.js +7 -0
  283. package/core/server/api/endpoints/utils/serializers/output/index.js +4 -0
  284. package/core/server/api/endpoints/utils/serializers/output/member-metafields.js +3 -3
  285. package/core/server/api/endpoints/utils/serializers/output/members-account.js +19 -0
  286. package/core/server/api/endpoints/utils/serializers/output/members-csv-transform.js +1 -1
  287. package/core/server/api/endpoints/utils/serializers/output/tiers.js +10 -2
  288. package/core/server/api/endpoints/utils/serializers/output/users.js +0 -10
  289. package/core/server/data/exporter/table-lists.js +3 -3
  290. package/core/server/data/migrations/versions/6.53/2026-07-15-20-22-53-add-members-custom-field-values.js +1 -1
  291. package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +10 -1
  292. package/core/server/data/migrations/versions/6.63/2026-09-03-10-07-03-rename-custom-field-tables-to-metafields.js +169 -0
  293. package/core/server/data/migrations/versions/6.63/2026-09-03-11-03-31-remove-member-custom-field-read-permissions.js +30 -0
  294. package/core/server/data/schema/fixtures/fixtures.json +0 -11
  295. package/core/server/data/schema/lib/default-index-name.js +8 -11
  296. package/core/server/data/schema/schema.js +18 -18
  297. package/core/server/data/seeders/README.md +48 -0
  298. package/core/server/data/tinybird/pipes/mv_hits.pipe +86 -50
  299. package/core/server/lib/db-types/count.js +16 -0
  300. package/core/server/lib/validate-password.js +81 -120
  301. package/core/server/models/action.js +4 -4
  302. package/core/server/models/base/plugins/filtered-collection.js +16 -0
  303. package/core/server/models/member.js +6 -6
  304. package/core/server/models/user.js +1 -1
  305. package/core/server/services/automations/automations-api.js +1 -1
  306. package/core/server/services/automations/database-automations-repository.js +11 -4
  307. package/core/server/services/email-service/CONTEXT.md +37 -0
  308. package/core/server/services/email-service/README.md +42 -0
  309. package/core/server/services/email-service/batch-sending-service.js +2 -0
  310. package/core/server/services/email-service/email-controller.js +18 -2
  311. package/core/server/services/email-service/email-service-wrapper.js +3 -0
  312. package/core/server/services/email-service/sending-status-schema.js +21 -0
  313. package/core/server/services/email-service/sending-status-serializers.js +33 -0
  314. package/core/server/services/email-service/sending-status-service.js +47 -0
  315. package/core/server/services/email-service/sending-status.js +111 -0
  316. package/core/server/services/email-suppression-list/email-suppression-list.js +0 -33
  317. package/core/server/services/email-suppression-list/mailgun-email-suppression-list.js +6 -7
  318. package/core/server/services/gifts/README.md +2 -2
  319. package/core/server/services/gifts/constants.js +1 -1
  320. package/core/server/services/gifts/gift-service.js +19 -57
  321. package/core/server/services/gifts/index.js +0 -2
  322. package/core/server/services/jobs-service/index.js +8 -0
  323. package/core/server/services/jobs-service/jobs-service.js +52 -3
  324. package/core/server/services/jobs-service/register-job-handlers.js +13 -2
  325. package/core/server/services/members/account-service.js +98 -0
  326. package/core/server/services/members/api.js +4 -4
  327. package/core/server/services/members/import-export/export/exporter.js +20 -20
  328. package/core/server/services/members/import-export/import/completion-email.js +6 -6
  329. package/core/server/services/members/import-export/import/importer.js +13 -13
  330. package/core/server/services/members/import-export/index.js +7 -7
  331. package/core/server/services/members/members-api/members-api.js +26 -6
  332. package/core/server/services/members/members-api/repositories/member-repository.js +4 -4
  333. package/core/server/services/members/members-api/services/member-bread-service.js +45 -39
  334. package/core/server/services/members/members-ssr.js +18 -0
  335. package/core/server/services/members/middleware.js +95 -81
  336. package/core/server/services/members/service.js +70 -42
  337. package/core/server/services/members/utils.js +9 -0
  338. package/core/server/services/members-metafields/access.js +28 -0
  339. package/core/server/services/{members-custom-fields → members-metafields}/actions.js +5 -5
  340. package/core/server/services/members-metafields/bindings-service.js +147 -0
  341. package/core/server/services/{members-custom-fields → members-metafields}/codec.js +4 -4
  342. package/core/server/services/{members-custom-fields → members-metafields}/config.js +1 -1
  343. package/core/server/services/{members-custom-fields → members-metafields}/definitions-service.js +17 -23
  344. package/core/server/services/{members-custom-fields → members-metafields}/filter.js +9 -9
  345. package/core/server/services/{members-custom-fields → members-metafields}/index.js +16 -7
  346. package/core/server/services/{members-custom-fields → members-metafields}/key.js +1 -1
  347. package/core/server/services/{members-custom-fields → members-metafields}/models.js +4 -4
  348. package/core/server/services/members-metafields/namespaces.js +34 -0
  349. package/core/server/services/{members-custom-fields → members-metafields}/queries.js +1 -1
  350. package/core/server/services/{members-custom-fields → members-metafields}/schema.js +16 -12
  351. package/core/server/services/{members-custom-fields → members-metafields}/serializers.js +6 -6
  352. package/core/server/services/{members-custom-fields → members-metafields}/values-service.js +32 -22
  353. package/core/server/services/mentions/mention-sending-service.js +26 -9
  354. package/core/server/services/mentions/send-webmentions-job.js +18 -0
  355. package/core/server/services/mentions/service.js +1 -31
  356. package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +2 -2
  357. package/core/server/services/stripe/stripe-service.js +4 -4
  358. package/core/server/services/tier-checkout-config/codec.js +2 -2
  359. package/core/server/services/tier-checkout-config/index.js +2 -1
  360. package/core/server/services/tier-checkout-config/models.js +2 -2
  361. package/core/server/services/tier-checkout-config/queries.js +8 -8
  362. package/core/server/services/tier-checkout-config/serializers.js +57 -0
  363. package/core/server/services/tier-checkout-config/service.js +1 -1
  364. package/core/server/services/tiers/service.js +3 -3
  365. package/core/server/services/url/router-filter.js +8 -10
  366. package/core/server/services/users.js +1 -19
  367. package/core/server/web/api/endpoints/admin/routes.js +1 -0
  368. package/core/server/web/members/account/index.js +2 -0
  369. package/core/server/web/members/account/routes.js +46 -0
  370. package/core/server/web/members/app.js +4 -18
  371. package/core/shared/config/defaults.json +1 -1
  372. package/core/shared/labs.js +4 -2
  373. package/package.json +22 -22
  374. package/pnpm-lock.yaml +513 -571
  375. package/pnpm-workspace.yaml +12 -12
  376. package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
  377. package/core/built/admin/assets/activitypub/layout-2-0bw6HN.js +0 -1
  378. package/core/built/admin/assets/automated-emails-D5VVMND9.js +0 -1
  379. package/core/built/admin/assets/automations-CzKt5fb8.js +0 -1
  380. package/core/built/admin/assets/chunk.598.7e056fabb47ce7dbd73f.js +0 -366
  381. package/core/built/admin/assets/comments-BLmCmyCs.js +0 -1
  382. package/core/built/admin/assets/custom-field-type-option-BddFlJFa.js +0 -1
  383. package/core/built/admin/assets/design-and-theme-modal-BSmo12Op.js +0 -2
  384. package/core/built/admin/assets/edit-profile-C5Asm4LA.js +0 -1
  385. package/core/built/admin/assets/editor-REokrzci.js +0 -8
  386. package/core/built/admin/assets/filter-sources-BO9xUPj7.js +0 -1
  387. package/core/built/admin/assets/filters-CRUWecfY.js +0 -1
  388. package/core/built/admin/assets/growth-BWIu-6xj.js +0 -3
  389. package/core/built/admin/assets/growth-DU29oxeA.js +0 -1
  390. package/core/built/admin/assets/hooks-CuEZV2-q.js +0 -2
  391. package/core/built/admin/assets/index-6MkPdCtr.js +0 -4
  392. package/core/built/admin/assets/index-Bn7QhcZu.css +0 -2
  393. package/core/built/admin/assets/index.es-CNnuNH0d.js +0 -1
  394. package/core/built/admin/assets/koenig-loader-aFQNlJlD.js +0 -2
  395. package/core/built/admin/assets/label-picker-KVoo91sh.js +0 -1
  396. package/core/built/admin/assets/layout-Bjv2Ll-5.js +0 -1
  397. package/core/built/admin/assets/link-helpers-MVDdnFCY.js +0 -1
  398. package/core/built/admin/assets/member-detail-CdJF6Agw.js +0 -1
  399. package/core/built/admin/assets/members-DjQbq9Z2.js +0 -4
  400. package/core/built/admin/assets/navigation-modal-BkT7b1M2.js +0 -1
  401. package/core/built/admin/assets/newsletter-BMMAuvgq.js +0 -1
  402. package/core/built/admin/assets/newsletter-detail-modal-0SCJ7Zpm.js +0 -1
  403. package/core/built/admin/assets/newsletters-DhNigJUh.js +0 -1
  404. package/core/built/admin/assets/onboarding-qg8Akovm.js +0 -1
  405. package/core/built/admin/assets/overview-BW8GLeYi.js +0 -1
  406. package/core/built/admin/assets/overview-BkXZNzaZ.js +0 -1
  407. package/core/built/admin/assets/pages-jgaFm69d.js +0 -1
  408. package/core/built/admin/assets/pages-route-CIUAQxtY.js +0 -1
  409. package/core/built/admin/assets/portal-modal-D4ceei3t.js +0 -1
  410. package/core/built/admin/assets/post-analytics-header-BYCsT0GP.js +0 -1
  411. package/core/built/admin/assets/post-analytics-ot7f6pih.js +0 -1
  412. package/core/built/admin/assets/post-analytics-provider-Bo1gmYaP.js +0 -1
  413. package/core/built/admin/assets/post-helpers-C5OQMBoi.js +0 -1
  414. package/core/built/admin/assets/post-share-modal-C-PaYZ_e.js +0 -1
  415. package/core/built/admin/assets/posts-DuGazgTb.js +0 -1
  416. package/core/built/admin/assets/posts-list-screen-CBGGgjjj.js +0 -2
  417. package/core/built/admin/assets/posts-route-D6xmS7Vf.js +0 -1
  418. package/core/built/admin/assets/profile-B8mx2yAu.js +0 -1
  419. package/core/built/admin/assets/radio-group-DczlLKOn.js +0 -1
  420. package/core/built/admin/assets/router-provider-B0gZyiGJ.js +0 -1
  421. package/core/built/admin/assets/schemas-DppqmpeJ.js +0 -64
  422. package/core/built/admin/assets/settings-DvfTNdHQ.js +0 -4
  423. package/core/built/admin/assets/stats-Rjmk5owg.js +0 -1
  424. package/core/built/admin/assets/stats-view-BGGmkmgv.js +0 -1
  425. package/core/built/admin/assets/tag-detail-BhXlOsCa.js +0 -2
  426. package/core/built/admin/assets/tags-ldukRApe.js +0 -1
  427. package/core/built/admin/assets/tier-detail-modal-BOs8e_G8.js +0 -1
  428. package/core/built/admin/assets/tiers-Nd_z4BZY.js +0 -1
  429. package/core/built/admin/assets/use-filter-params-BIni9taJ.js +0 -1
  430. package/core/built/admin/assets/use-host-limits-DZtR08oa.js +0 -1
  431. package/core/built/admin/assets/use-pintura-config-h-J0Lvta.js +0 -1
  432. package/core/built/admin/assets/use-staff-users-Csipb-O0.js +0 -1
  433. package/core/built/admin/assets/use-upgrade-route-DhRSo7at.js +0 -1
  434. package/core/built/admin/assets/user-detail-modal-B_iUClI6.js +0 -1
  435. package/core/built/admin/assets/web-C4BKzn2T.js +0 -1
  436. package/core/server/services/email-suppression-list/in-memory-email-suppression-list.js +0 -39
  437. package/core/server/services/members-custom-fields/bindings-service.js +0 -120
  438. /package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js.LICENSE.txt → chunk.901.4ccc639821020230bcca.js.LICENSE.txt} +0 -0
  439. /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-custom-fields/serializers");
3
+ const serializers_1 = require("../../../../../services/members-metafields/serializers");
4
4
  const serializeOne = (field, _apiConfig, frame) => {
5
- frame.response = serializers_1.toCustomFieldsResponse.parse([field]);
5
+ frame.response = serializers_1.toMetafieldsResponse.parse([field]);
6
6
  };
7
7
  const serializeMany = (fields, _apiConfig, frame) => {
8
- frame.response = serializers_1.toCustomFieldsResponse.parse(fields);
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: custom fields
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
- 'members_custom_fields',
46
- 'members_custom_field_values',
47
- 'members_custom_field_bindings',
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/custom-field-types. Splitting text from json
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
- await addColumn(TABLE, 'path', knex, undefined, { algorithm: 'auto' });
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
- if (!Array.isArray(columns)) {
14
- columns = columns ? [columns] : [];
15
- }
16
- const table = tableName.replace(/\.|-/g, '_');
17
- return (table + '_' + columns.join('_') + '_index').toLowerCase();
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
- members_custom_fields: {
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/custom-field-types,
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
- members_custom_field_bindings: {
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
- custom_field_key: {
1085
+ metafield_key: {
1086
1086
  type: 'string',
1087
1087
  maxlength: 191,
1088
1088
  nullable: false,
1089
- references: 'members_custom_fields.key',
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: 'members_custom_field_bindings_unique' },
1095
+ { columns: ['product_id', 'port'], indexName: 'members_metafield_bindings_unique' },
1096
1096
  ],
1097
- '@@INDEXES@@': [['custom_field_key']],
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: 'members_custom_field_bindings.id',
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
- members_custom_field_values: {
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
- custom_field_key: {
1146
+ metafield_key: {
1147
1147
  type: 'string',
1148
1148
  maxlength: 191,
1149
1149
  nullable: false,
1150
- references: 'members_custom_fields.key',
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, because the name knex derives from the table and all three columns
1192
- // overruns MySQL's 64-character identifier limit. The migration that first
1193
- // created this table already shortened a column for the same reason; a third
1194
- // column spends what headroom that bought.
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', 'custom_field_key', 'path'],
1198
- indexName: 'members_custom_field_values_leaf_unique',
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@@': [['custom_field_key', 'path']],
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.