ghost 5.130.2 → 6.0.0-alpha.2

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 (281) hide show
  1. package/components/tryghost-i18n-6.0.0-alpha.2.tgz +0 -0
  2. package/core/boot.js +0 -2
  3. package/core/built/admin/assets/admin-x-activitypub/admin-x-activitypub.js +1 -1
  4. package/core/built/admin/assets/admin-x-activitypub/{index-B8te98RZ.mjs → index-BZDwG-OG.mjs} +7397 -7385
  5. package/core/built/admin/assets/admin-x-activitypub/{index-C8qwgKWF.mjs → index-DTlSQCGz.mjs} +2 -2
  6. package/core/built/admin/assets/admin-x-settings/{CodeEditorView-CAtv7MlN.mjs → CodeEditorView-CCUvrZhe.mjs} +2 -2
  7. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +3 -3
  8. package/core/built/admin/assets/admin-x-settings/{index-BVxh86CD.mjs → index-Cubs_8W6.mjs} +8088 -8532
  9. package/core/built/admin/assets/admin-x-settings/{index-DUhmXSBR.mjs → index-D0ejKdD5.mjs} +2 -2
  10. package/core/built/admin/assets/admin-x-settings/{modals-B5dtfzsB.mjs → modals-DSxs9dLy.mjs} +1676 -1614
  11. package/core/built/admin/assets/{chunk.524.1f2faf572078e5b86b09.js → chunk.524.0953dd72ae1efbabe0de.js} +7 -7
  12. package/core/built/admin/assets/{chunk.582.675905fe8f9be138fb19.js → chunk.582.3caa825c2a91efc48f1d.js} +8 -8
  13. package/core/built/admin/assets/{ghost-280b83af263b51bc4d6ce5bd8f536096.js → ghost-db0f84981913aec8a672c57aa22da07a.js} +40 -45
  14. package/core/built/admin/assets/posts/posts.js +6549 -6537
  15. package/core/built/admin/assets/stats/stats.js +8824 -8812
  16. package/core/built/admin/index.html +3 -3
  17. package/core/frontend/helpers/get.js +4 -2
  18. package/core/frontend/helpers/ghost_head.js +71 -77
  19. package/core/frontend/meta/canonical-url.js +1 -7
  20. package/core/frontend/meta/context-object.js +1 -1
  21. package/core/frontend/meta/get-meta.js +1 -4
  22. package/core/frontend/meta/og-image.js +1 -1
  23. package/core/frontend/meta/og-type.js +0 -2
  24. package/core/frontend/meta/schema.js +1 -1
  25. package/core/frontend/meta/twitter-image.js +1 -1
  26. package/core/frontend/meta/url.js +1 -12
  27. package/core/frontend/services/rendering/context.js +0 -8
  28. package/core/frontend/web/middleware/static-theme.js +20 -1
  29. package/core/server/api/endpoints/index.js +0 -4
  30. package/core/server/api/endpoints/session.js +0 -9
  31. package/core/server/api/endpoints/utils/serializers/input/settings.js +0 -2
  32. package/core/server/api/endpoints/utils/serializers/input/utils/settings-filter-type-group-mapper.js +0 -1
  33. package/core/server/api/endpoints/utils/serializers/input/utils/settings-key-group-mapper.js +0 -1
  34. package/core/server/api/endpoints/utils/serializers/input/utils/settings-key-type-mapper.js +0 -1
  35. package/core/server/api/endpoints/utils/serializers/output/all.js +1 -1
  36. package/core/server/api/endpoints/utils/serializers/output/index.js +0 -4
  37. package/core/server/api/endpoints/utils/serializers/output/mappers/snippets.js +1 -5
  38. package/core/server/api/endpoints/utils/serializers/output/members.js +0 -2
  39. package/core/server/api/endpoints/utils/validators/input/index.js +0 -4
  40. package/core/server/data/importer/importers/data/Base.js +1 -3
  41. package/core/server/data/importer/importers/data/SettingsImporter.js +1 -3
  42. package/core/server/data/migrations/utils/index.js +1 -4
  43. package/core/server/data/migrations/utils/permissions.js +14 -6
  44. package/core/server/data/migrations/utils/settings.js +39 -22
  45. package/core/server/data/migrations/versions/4.47/2022-05-03-15-30-final-v4.js +2 -0
  46. package/core/server/data/migrations/versions/4.47/2022-05-04-10-03-no-op.js +6 -0
  47. package/core/server/data/migrations/versions/5.100/2024-11-06-04-45-15-add-activitypub-integration.js +4 -2
  48. package/core/server/data/migrations/versions/5.113/2025-03-07-12-24-00-add-super-editor.js +4 -2
  49. package/core/server/data/migrations/versions/5.3/2022-07-06-07-58-add-ghost-explore-integration-role.js +4 -2
  50. package/core/server/data/migrations/versions/5.3/2022-07-06-09-17-add-ghost-explore-integration.js +4 -2
  51. package/core/server/data/migrations/versions/5.3/2022-07-06-09-26-add-ghost-explore-integration-api-key.js +4 -2
  52. package/core/server/data/migrations/versions/5.40/2023-03-21-18-42-add-self-serve-integration-role.js +4 -2
  53. package/core/server/data/migrations/versions/5.40/2023-03-21-18-52-add-self-serve-integration.js +4 -2
  54. package/core/server/data/migrations/versions/5.40/2023-03-21-19-02-add-self-serve-integration-api-key.js +4 -2
  55. package/core/server/data/migrations/versions/5.63/2023-09-13-13-03-10-add-ghost-core-content-integration.js +4 -2
  56. package/core/server/data/migrations/versions/5.63/2023-09-13-13-34-11-add-ghost-core-content-integration-key.js +4 -2
  57. package/core/server/data/migrations/versions/6.0/2025-06-20-01-41-54-remove-updated-by-column.js +46 -0
  58. package/core/server/data/migrations/versions/6.0/2025-06-20-13-41-55-remove-created-by-column.js +47 -0
  59. package/core/server/data/migrations/versions/6.0/2025-06-23-09-49-25-add-missing-member-uuids.js +22 -0
  60. package/core/server/data/migrations/versions/6.0/2025-06-23-10-03-26-members-nullable-uuid.js +5 -0
  61. package/core/server/data/migrations/versions/6.0/2025-06-24-09-19-42-use-object-id-for-hardcoded-user-id.js +95 -0
  62. package/core/server/data/migrations/versions/6.0/2025-06-25-15-03-29-remove-amp-from-settings.js +6 -0
  63. package/core/server/data/migrations/versions/6.0/2025-06-30-13-59-10-remove-mail-events-table.js +3 -0
  64. package/core/server/data/migrations/versions/6.0/2025-06-30-14-00-00-update-feature-image-alt-length.js +25 -0
  65. package/core/server/data/schema/default-settings/default-settings.json +0 -13
  66. package/core/server/data/schema/fixtures/FixtureManager.js +128 -5
  67. package/core/server/data/schema/fixtures/fixtures.json +4 -6
  68. package/core/server/data/schema/fixtures/index.js +3 -1
  69. package/core/server/data/schema/schema.js +20 -65
  70. package/core/server/data/seeders/DataGenerator.js +11 -2
  71. package/core/server/data/seeders/importers/EmailsImporter.js +1 -3
  72. package/core/server/data/seeders/importers/LabelsImporter.js +1 -3
  73. package/core/server/data/seeders/importers/MembersImporter.js +0 -1
  74. package/core/server/data/seeders/importers/MembersStripeCustomersImporter.js +1 -2
  75. package/core/server/data/seeders/importers/MembersStripeCustomersSubscriptionsImporter.js +0 -1
  76. package/core/server/data/seeders/importers/PostsImporter.js +0 -1
  77. package/core/server/data/seeders/importers/RolesUsersImporter.js +6 -1
  78. package/core/server/data/seeders/importers/TagsImporter.js +1 -2
  79. package/core/server/data/seeders/importers/UsersImporter.js +1 -2
  80. package/core/server/data/tinybird/ARCHITECTURE.md +0 -4
  81. package/core/server/data/tinybird/DOCS.md +0 -4
  82. package/core/server/models/base/bookshelf.js +8 -1
  83. package/core/server/models/base/plugins/events.js +0 -28
  84. package/core/server/models/base/plugins/user-type.js +10 -36
  85. package/core/server/models/post.js +25 -10
  86. package/core/server/models/relations/authors.js +2 -2
  87. package/core/server/models/settings.js +1 -14
  88. package/core/server/models/user.js +33 -6
  89. package/core/server/services/activitypub/ActivityPubService.js +1 -2
  90. package/core/server/services/activitypub/ActivityPubService.ts +1 -2
  91. package/core/server/services/explore-ping/ExplorePingService.js +3 -1
  92. package/core/server/services/link-redirection/README.md +1 -1
  93. package/core/server/services/mentions/MentionSendingService.js +1 -1
  94. package/core/server/services/settings/SettingsBREADService.js +5 -1
  95. package/core/server/services/settings/settings-service.js +3 -1
  96. package/core/server/services/settings-helpers/SettingsHelpers.js +0 -12
  97. package/core/server/services/update-check/UpdateCheckService.js +18 -2
  98. package/core/server/services/url/config.js +0 -2
  99. package/core/server/web/api/app.js +4 -0
  100. package/core/server/web/api/endpoints/admin/middleware.js +8 -9
  101. package/core/server/web/api/endpoints/admin/routes.js +0 -2
  102. package/core/server/web/comments/routes.js +3 -0
  103. package/core/server/web/shared/middleware/index.js +4 -0
  104. package/core/server/web/shared/middleware/max-limit-cap.js +27 -0
  105. package/core/server/web/shared/middleware/pretty-urls.js +3 -1
  106. package/core/server/web/shared/middleware/redirect-amp-urls.js +36 -0
  107. package/core/shared/config/defaults.json +2 -0
  108. package/core/shared/config/overrides.json +1 -4
  109. package/core/shared/labs.js +2 -6
  110. package/core/shared/max-limit-cap.js +61 -0
  111. package/package.json +5 -6
  112. package/tsconfig.tsbuildinfo +1 -1
  113. package/yarn.lock +18 -107
  114. package/components/tryghost-i18n-5.130.2.tgz +0 -0
  115. package/core/built/admin/assets/img/amp-d7b72aae3315fda95921fb575dfca100.svg +0 -4
  116. package/core/frontend/apps/amp/index.js +0 -30
  117. package/core/frontend/apps/amp/lib/helpers/amp_analytics.js +0 -32
  118. package/core/frontend/apps/amp/lib/helpers/amp_components.js +0 -48
  119. package/core/frontend/apps/amp/lib/helpers/amp_content.js +0 -214
  120. package/core/frontend/apps/amp/lib/helpers/amp_style.js +0 -8
  121. package/core/frontend/apps/amp/lib/router.js +0 -95
  122. package/core/frontend/apps/amp/lib/views/amp.hbs +0 -1046
  123. package/core/frontend/meta/amp-url.js +0 -14
  124. package/core/server/api/endpoints/mail-events.js +0 -17
  125. package/core/server/api/endpoints/utils/serializers/output/mail-events.js +0 -9
  126. package/core/server/api/endpoints/utils/validators/input/mail-events.js +0 -7
  127. package/core/server/data/migrations/utils/constants.js +0 -3
  128. package/core/server/data/migrations/versions/4.0/01-update-mobiledoc.js +0 -61
  129. package/core/server/data/migrations/versions/4.0/02-add-status-column-to-members.js +0 -11
  130. package/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js +0 -81
  131. package/core/server/data/migrations/versions/4.0/04-drop-apps-related-tables.js +0 -10
  132. package/core/server/data/migrations/versions/4.0/05-add-members-subscribe-events-table.js +0 -9
  133. package/core/server/data/migrations/versions/4.0/06-populate-members-subscribe-events-table.js +0 -53
  134. package/core/server/data/migrations/versions/4.0/07-alter-unique-constraint-for-posts-slug.js +0 -7
  135. package/core/server/data/migrations/versions/4.0/08-add-members-login-events-table.js +0 -7
  136. package/core/server/data/migrations/versions/4.0/09-add-members-email-change-events-table.js +0 -9
  137. package/core/server/data/migrations/versions/4.0/10-add-members-status-events-table.js +0 -9
  138. package/core/server/data/migrations/versions/4.0/11-add-members-paid-subscription-events-table.js +0 -12
  139. package/core/server/data/migrations/versions/4.0/12-delete-apps-related-settings-keys.js +0 -16
  140. package/core/server/data/migrations/versions/4.0/13-add-members-payment-events-table.js +0 -10
  141. package/core/server/data/migrations/versions/4.0/14-remove-orphaned-stripe-records.js +0 -36
  142. package/core/server/data/migrations/versions/4.0/15-add-frontmatter-column-to-meta.js +0 -7
  143. package/core/server/data/migrations/versions/4.0/16-refactor-slack-setting.js +0 -96
  144. package/core/server/data/migrations/versions/4.0/17-populate-members-status-events-table.js +0 -41
  145. package/core/server/data/migrations/versions/4.0/18-transform-urls-absolute-to-transform-ready.js +0 -201
  146. package/core/server/data/migrations/versions/4.0/19-remove-labs-members-setting.js +0 -10
  147. package/core/server/data/migrations/versions/4.0/20-refactor-unsplash-setting.js +0 -41
  148. package/core/server/data/migrations/versions/4.0/21-sanitize-email-batches-provider-id.js +0 -8
  149. package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +0 -87
  150. package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +0 -66
  151. package/core/server/data/migrations/versions/4.0/24-add-missing-email-permissions.js +0 -36
  152. package/core/server/data/migrations/versions/4.0/25-populate-members-paid-subscription-events-table.js +0 -129
  153. package/core/server/data/migrations/versions/4.0/26-add-cascade-on-delete.js +0 -76
  154. package/core/server/data/migrations/versions/4.0/27-add-primary-key-brute-migrations-lock.js +0 -9
  155. package/core/server/data/migrations/versions/4.0/28-add-webhook-intergrations-foreign-key.js +0 -16
  156. package/core/server/data/migrations/versions/4.0/29-fix-foreign-key-for-members-stripe-customers-subscriptions.js +0 -35
  157. package/core/server/data/migrations/versions/4.0/30-set-default-accent-color.js +0 -21
  158. package/core/server/data/migrations/versions/4.1/01-fix-backup-content-permission-typo.js +0 -15
  159. package/core/server/data/migrations/versions/4.1/02-add-unique-constraint-for-member-stripe-tables.js +0 -21
  160. package/core/server/data/migrations/versions/4.11/01-add-oauth-user-data.js +0 -12
  161. package/core/server/data/migrations/versions/4.11/02-add-email-verification-required-setting.js +0 -43
  162. package/core/server/data/migrations/versions/4.12/01-add-email-only-column-to-posts-meta-table.js +0 -7
  163. package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +0 -39
  164. package/core/server/data/migrations/versions/4.13/01-add-members-stripe-connect-auth-permission-to-administrators.js +0 -6
  165. package/core/server/data/migrations/versions/4.13/02-add-members-products-events-table.js +0 -33
  166. package/core/server/data/migrations/versions/4.14/01-fix-comped-member-statuses.js +0 -73
  167. package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +0 -61
  168. package/core/server/data/migrations/versions/4.15/01-add-temp-members-analytic-events-table.js +0 -12
  169. package/core/server/data/migrations/versions/4.16/01-add-custom-theme-settings-table.js +0 -9
  170. package/core/server/data/migrations/versions/4.17/01-add-custom-theme-settings-permissions.js +0 -21
  171. package/core/server/data/migrations/versions/4.17/02-add-offers-table.js +0 -19
  172. package/core/server/data/migrations/versions/4.17/03-add-offers-permissions.js +0 -35
  173. package/core/server/data/migrations/versions/4.19/01-add-active-column-to-offers.js +0 -7
  174. package/core/server/data/migrations/versions/4.19/02-add-offer-redemptions-table.js +0 -8
  175. package/core/server/data/migrations/versions/4.2/01-fix-incorrect-mrr-delta-events.js +0 -13
  176. package/core/server/data/migrations/versions/4.20/01-remove-offer-redemptions-table.js +0 -19
  177. package/core/server/data/migrations/versions/4.20/02-remove-offers-table.js +0 -30
  178. package/core/server/data/migrations/versions/4.20/03-add-offers-table.js +0 -21
  179. package/core/server/data/migrations/versions/4.20/04-add-offer-redemptions-table.js +0 -9
  180. package/core/server/data/migrations/versions/4.20/05-remove-not-null-constraint-from-portal-title.js +0 -44
  181. package/core/server/data/migrations/versions/4.22/01-add-is-launch-complete-setting.js +0 -8
  182. package/core/server/data/migrations/versions/4.22/02-update-launch-complete-setting-from-user-data.js +0 -39
  183. package/core/server/data/migrations/versions/4.23/01-truncate-offer-names.js +0 -59
  184. package/core/server/data/migrations/versions/4.3/01-add-products-table.js +0 -9
  185. package/core/server/data/migrations/versions/4.3/02-add-members-products-table.js +0 -8
  186. package/core/server/data/migrations/versions/4.3/03-add-default-product.js +0 -39
  187. package/core/server/data/migrations/versions/4.3/04-attach-members-to-product.js +0 -50
  188. package/core/server/data/migrations/versions/4.3/05-add-stripe-products-table.js +0 -9
  189. package/core/server/data/migrations/versions/4.3/06-add-stripe-prices-table.js +0 -15
  190. package/core/server/data/migrations/versions/4.3/07-add-products-permissions.js +0 -29
  191. package/core/server/data/migrations/versions/4.3/08-migrate-members-signup-setting.js +0 -109
  192. package/core/server/data/migrations/versions/4.3/09-add-price-id-column-to-subscriptions-table.js +0 -10
  193. package/core/server/data/migrations/versions/4.3/10-populate-stripe-price-id-in-subscriptions.js +0 -20
  194. package/core/server/data/migrations/versions/4.33/2022-01-14-11-50-add-type-column-to-products.js +0 -12
  195. package/core/server/data/migrations/versions/4.33/2022-01-14-11-51-add-default-free-tier.js +0 -40
  196. package/core/server/data/migrations/versions/4.33/2022-01-18-09-07-remove-duplicate-offer-redemptions.js +0 -46
  197. package/core/server/data/migrations/versions/4.33/2022-01-19-10-43-add-active-column-to-products-table.js +0 -7
  198. package/core/server/data/migrations/versions/4.34/2022-01-25-13-53-add-welcome-page-url-column-to-products.js +0 -7
  199. package/core/server/data/migrations/versions/4.35/2022-01-20-05-55-add-post-products-table.js +0 -8
  200. package/core/server/data/migrations/versions/4.35/2022-01-30-15-17-set-welcome-page-url-from-settings.js +0 -45
  201. package/core/server/data/migrations/versions/4.35/2022-02-01-11-48-update-email-recipient-filter-column-type.js +0 -19
  202. package/core/server/data/migrations/versions/4.35/2022-02-01-12-03-update-recipient-filter-column-type.js +0 -19
  203. package/core/server/data/migrations/versions/4.35/2022-02-02-10-38-add-default-content-visibility-tiers-setting.js +0 -8
  204. package/core/server/data/migrations/versions/4.35/2022-02-02-13-10-transform-specific-tiers-default-content-visibility.js +0 -147
  205. package/core/server/data/migrations/versions/4.35/2022-02-04-04-34-populate-empty-portal-products.js +0 -60
  206. package/core/server/data/migrations/versions/4.36/2022-02-07-14-34-add-last-seen-at-column-to-members.js +0 -10
  207. package/core/server/data/migrations/versions/4.37/2022-02-21-09-53-backfill-members-last-seen-at-column.js +0 -32
  208. package/core/server/data/migrations/versions/4.38/2022-03-01-08-46-add-visibility-to-tiers.js +0 -11
  209. package/core/server/data/migrations/versions/4.38/2022-03-03-16-12-add-visibility-to-tiers.js +0 -8
  210. package/core/server/data/migrations/versions/4.38/2022-03-03-16-17-drop-tiers-visible-column.js +0 -7
  211. package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-free-products-visibility-column.js +0 -66
  212. package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-products-visibility-column.js +0 -36
  213. package/core/server/data/migrations/versions/4.4/01-restore-free-members-signup-setting-from-backup.js +0 -99
  214. package/core/server/data/migrations/versions/4.4/02-migrate-members-signup-access.js +0 -126
  215. package/core/server/data/migrations/versions/4.40/2022-03-07-14-37-add-members-cancel-events-table.js +0 -8
  216. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-offers-admin-integration-permission-roles.js +0 -23
  217. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-tiers-admin-integration-permission-roles.js +0 -20
  218. package/core/server/data/migrations/versions/4.42/2022-03-21-17-17-add.js +0 -25
  219. package/core/server/data/migrations/versions/4.42/2022-03-30-15-44-add-newsletter-permissions.js +0 -28
  220. package/core/server/data/migrations/versions/4.43/2022-03-28-19-26-recreate-newsletter-table.js +0 -29
  221. package/core/server/data/migrations/versions/4.43/2022-03-29-14-45-add-members-newsletters-table.js +0 -7
  222. package/core/server/data/migrations/versions/4.43/2022-04-01-10-13-add-post-newsletter-relation.js +0 -108
  223. package/core/server/data/migrations/versions/4.43/2022-04-06-09-47-add-type-column-to-paid-subscription-events.js +0 -7
  224. package/core/server/data/migrations/versions/4.43/2022-04-06-14-56-add-email-newsletter-relation.js +0 -8
  225. package/core/server/data/migrations/versions/4.43/2022-04-08-10-45-add-subscription-id-to-mrr-events.js +0 -7
  226. package/core/server/data/migrations/versions/4.44/2022-04-06-15-22-populate-type-column-for-paid-subscription-events.js +0 -21
  227. package/core/server/data/migrations/versions/4.44/2022-04-08-11-54-add-cancelled-events.js +0 -51
  228. package/core/server/data/migrations/versions/4.44/2022-04-11-08-24-add-newsletter-permissions.js +0 -33
  229. package/core/server/data/migrations/versions/4.44/2022-04-11-10-54-add-mrr-to-subscriptions.js +0 -8
  230. package/core/server/data/migrations/versions/4.44/2022-04-12-07-33-fill-mrr.js +0 -29
  231. package/core/server/data/migrations/versions/4.44/2022-04-13-12-00-remove-newsletter-sender-name-not-null-constraint.js +0 -33
  232. package/core/server/data/migrations/versions/4.44/2022-04-15-07-53-add-offer-id-to-subscriptions.js +0 -9
  233. package/core/server/data/migrations/versions/4.45/2022-04-19-12-23-backfill-subscriptions-offers.js +0 -60
  234. package/core/server/data/migrations/versions/4.45/2022-04-20-11-25-add-newsletter-read-permission.js +0 -9
  235. package/core/server/data/migrations/versions/4.45/2022-04-21-02-55-add-notifications-key-entry-to-settings-table.js +0 -8
  236. package/core/server/data/migrations/versions/4.46/2022-04-13-12-00-add-created-at-newsletters.js +0 -6
  237. package/core/server/data/migrations/versions/4.46/2022-04-13-12-01-add-updated-at-newsletters.js +0 -6
  238. package/core/server/data/migrations/versions/4.46/2022-04-13-12-02-fill-created-at-newsletters.js +0 -19
  239. package/core/server/data/migrations/versions/4.46/2022-04-13-12-03-drop-nullable-created-at-newsletters.js +0 -3
  240. package/core/server/data/migrations/versions/4.46/2022-04-13-12-08-newsletters-show-header-name.js +0 -7
  241. package/core/server/data/migrations/versions/4.46/2022-04-13-12-57-add-uuid-column-to-newsletters.js +0 -8
  242. package/core/server/data/migrations/versions/4.46/2022-04-13-12-58-fill-uuid-for-newsletters.js +0 -19
  243. package/core/server/data/migrations/versions/4.46/2022-04-13-12-59-drop-nullable-uuid-newsletters.js +0 -3
  244. package/core/server/data/migrations/versions/4.46/2022-04-13-13-00-add-default-newsletter.js +0 -92
  245. package/core/server/data/migrations/versions/4.46/2022-04-20-08-39-map-subscribers-to-default-newsletter.js +0 -66
  246. package/core/server/data/migrations/versions/4.46/2022-04-22-07-43-add-newsletter-id-to-subscribe-events.js +0 -9
  247. package/core/server/data/migrations/versions/4.46/2022-04-27-07-59-set-newsletter-id-subscribe-events.js +0 -31
  248. package/core/server/data/migrations/versions/4.47/2022-05-03-15-30-update-newsletter-sending-options.js +0 -34
  249. package/core/server/data/migrations/versions/4.47/2022-05-04-10-03-transform-newsletter-header-image.js +0 -26
  250. package/core/server/data/migrations/versions/4.5/01-add-stripe-price-description-column.js +0 -7
  251. package/core/server/data/migrations/versions/4.5/02-add-product-description-column.js +0 -7
  252. package/core/server/data/migrations/versions/4.5/03-give-label-read-permissions-to-editors.js +0 -14
  253. package/core/server/data/migrations/versions/4.5/04-remove-unique-constraint-from-product-name.js +0 -13
  254. package/core/server/data/migrations/versions/4.5/05-rename-default-product-to-site-title.js +0 -38
  255. package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +0 -47
  256. package/core/server/data/migrations/versions/4.7/01-add-monthly-price-column-to-products.js +0 -7
  257. package/core/server/data/migrations/versions/4.7/02-add-yearly-price-column-to-products.js +0 -7
  258. package/core/server/data/migrations/versions/4.7/03-add-labs-setting.js +0 -42
  259. package/core/server/data/migrations/versions/4.8/01-add-feature-image-alt-column-to-posts-meta.js +0 -7
  260. package/core/server/data/migrations/versions/4.8/02-add-feature-image-caption-column-to-posts-meta.js +0 -7
  261. package/core/server/data/migrations/versions/4.8/03-add-default-product-portal-products.js +0 -69
  262. package/core/server/data/migrations/versions/4.8/04-migrate-show-newsletter-header-setting.js +0 -124
  263. package/core/server/data/migrations/versions/4.9/01-add-reset-all-passwords-permission.js +0 -11
  264. package/core/server/data/migrations/versions/4.9/02-add-benefits-table.js +0 -9
  265. package/core/server/data/migrations/versions/4.9/03-add-products-benefits-table.js +0 -8
  266. package/core/server/data/migrations/versions/4.9/04-add-member-segment-to-email-batches.js +0 -7
  267. package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +0 -87
  268. package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +0 -47
  269. package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +0 -39
  270. package/core/server/models/mail-event.js +0 -12
  271. package/core/server/services/mail-events/BookshelfMailEventRepository.js +0 -40
  272. package/core/server/services/mail-events/InMemoryMailEventRepository.js +0 -10
  273. package/core/server/services/mail-events/InMemoryMailEventRepository.ts +0 -8
  274. package/core/server/services/mail-events/MailEvent.js +0 -20
  275. package/core/server/services/mail-events/MailEvent.ts +0 -10
  276. package/core/server/services/mail-events/MailEventRepository.js +0 -2
  277. package/core/server/services/mail-events/MailEventRepository.ts +0 -5
  278. package/core/server/services/mail-events/MailEventService.js +0 -124
  279. package/core/server/services/mail-events/MailEventService.ts +0 -169
  280. package/core/server/services/mail-events/index.js +0 -21
  281. package/core/server/services/mail-events/libraries.d.ts +0 -2
@@ -6,7 +6,7 @@
6
6
  <title>Ghost</title>
7
7
 
8
8
 
9
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22cdnUrl%22%3A%22%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%225.130%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%2237bd1e3e4d%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%223291c981c1%22%2C%22adminXActivitypubFilename%22%3A%22admin-x-activitypub.js%22%2C%22adminXActivitypubHash%22%3A%22b38d27bb5e%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%229a7e1b885b%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%225445ed6ca9%22%2C%22adminXActivitypubCustomUrl%22%3A%22https%3A%2F%2Fcdn.jsdelivr.net%2Fghost%2Fadmin-x-activitypub%400%2Fdist%2Fadmin-x-activitypub.js%22%7D" />
9
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22cdnUrl%22%3A%22%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.0%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%2237bd1e3e4d%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%22d033b6dcc1%22%2C%22adminXActivitypubFilename%22%3A%22admin-x-activitypub.js%22%2C%22adminXActivitypubHash%22%3A%2235ce5f3180%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%22be6ec893bf%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%225ddc4bf3f4%22%2C%22adminXActivitypubCustomUrl%22%3A%22https%3A%2F%2Fcdn.jsdelivr.net%2Fghost%2Fadmin-x-activitypub%400%2Fdist%2Fadmin-x-activitypub.js%22%7D" />
10
10
 
11
11
  <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1, minimal-ui, viewport-fit=cover" />
12
12
  <meta name="pinterest" content="nopin" />
@@ -49,7 +49,7 @@
49
49
 
50
50
  <script src="assets/vendor-aed0068cf9b67d042dd23a6343545b7b.js"></script>
51
51
  <script src="assets/chunk.728.985c45ad584b4b91ca60.js"></script>
52
- <script src="assets/chunk.524.1f2faf572078e5b86b09.js"></script>
53
- <script src="assets/ghost-280b83af263b51bc4d6ce5bd8f536096.js"></script>
52
+ <script src="assets/chunk.524.0953dd72ae1efbabe0de.js"></script>
53
+ <script src="assets/ghost-db0f84981913aec8a672c57aa22da07a.js"></script>
54
54
  </body>
55
55
  </html>
@@ -3,6 +3,7 @@
3
3
  // Fetches data from the API
4
4
  const {config, api, prepareContextResource} = require('../services/proxy');
5
5
  const {hbs, SafeString} = require('../services/handlebars');
6
+ const {applyLimitCap} = require('../../shared/max-limit-cap');
6
7
 
7
8
  const logging = require('@tryghost/logging');
8
9
  const errors = require('@tryghost/errors');
@@ -114,8 +115,9 @@ function parseOptions(globals, data, options) {
114
115
  options.filter = resolvePaths(globals, data, options.filter);
115
116
  }
116
117
 
117
- if (options.limit === 'all' && config.get('getHelperLimitAllMax')) {
118
- options.limit = config.get('getHelperLimitAllMax');
118
+ // Adjust limit to Ghost's max allowed value (default: 100 and no limit=all)
119
+ if (options.limit) {
120
+ options.limit = applyLimitCap(options.limit);
119
121
  }
120
122
 
121
123
  return options;
@@ -271,11 +271,6 @@ module.exports = async function ghost_head(options) { // eslint-disable-line cam
271
271
  head.push(writeMetaTag('referrer', referrerPolicy, 'name'));
272
272
  }
273
273
  }
274
- // show amp link in post when 1. we are not on the amp page and 2. amp is enabled
275
- if (_.includes(context, 'post') && !_.includes(context, 'amp') && settingsCache.get('amp')) {
276
- head.push('<link rel="amphtml" href="' +
277
- escapeExpression(meta.ampUrl) + '">');
278
- }
279
274
 
280
275
  if (meta.previousUrl) {
281
276
  head.push('<link rel="prev" href="' +
@@ -306,93 +301,92 @@ module.exports = async function ghost_head(options) { // eslint-disable-line cam
306
301
  head.push('<link rel="alternate" type="application/rss+xml" title="' +
307
302
  escapeExpression(meta.site.title) + '" href="' +
308
303
  escapeExpression(meta.rssUrl) + '">');
309
- // no code injection for amp context!!!
310
- if (!_.includes(context, 'amp')) {
311
- head.push(getMembersHelper(options.data, frontendKey, excludeList)); // controlling for excludes within the function
312
- if (!excludeList.has('search')) {
313
- head.push(getSearchHelper(frontendKey));
314
- }
315
- if (!excludeList.has('announcement')) {
316
- head.push(getAnnouncementBarHelper(options.data));
317
- }
318
- try {
319
- head.push(getWebmentionDiscoveryLink());
320
- } catch (err) {
321
- logging.warn(err);
322
- }
323
304
 
324
- // @TODO do this in a more "frameworky" way
305
+ head.push(getMembersHelper(options.data, frontendKey, excludeList)); // controlling for excludes within the function
306
+ if (!excludeList.has('search')) {
307
+ head.push(getSearchHelper(frontendKey));
308
+ }
309
+ if (!excludeList.has('announcement')) {
310
+ head.push(getAnnouncementBarHelper(options.data));
311
+ }
312
+ try {
313
+ head.push(getWebmentionDiscoveryLink());
314
+ } catch (err) {
315
+ logging.warn(err);
316
+ }
325
317
 
326
- if (!excludeList.has('card_assets')) {
327
- if (cardAssets.hasFile('js')) {
328
- head.push(`<script defer src="${getAssetUrl('public/cards.min.js')}"></script>`);
329
- }
330
- if (cardAssets.hasFile('css')) {
331
- head.push(`<link rel="stylesheet" type="text/css" href="${getAssetUrl('public/cards.min.css')}">`);
332
- }
333
- }
318
+ // @TODO do this in a more "frameworky" way
334
319
 
335
- if (!excludeList.has('comment_counts') && settingsCache.get('comments_enabled') !== 'off') {
336
- head.push(`<script defer src="${getAssetUrl('public/comment-counts.min.js')}" data-ghost-comments-counts-api="${urlUtils.getSiteUrl(true)}members/api/comments/counts/"></script>`);
320
+ if (!excludeList.has('card_assets')) {
321
+ if (cardAssets.hasFile('js')) {
322
+ head.push(`<script defer src="${getAssetUrl('public/cards.min.js')}"></script>`);
337
323
  }
338
-
339
- if (settingsCache.get('members_enabled') && settingsCache.get('members_track_sources')) {
340
- head.push(`<script defer src="${getAssetUrl('public/member-attribution.min.js')}"></script>`);
324
+ if (cardAssets.hasFile('css')) {
325
+ head.push(`<link rel="stylesheet" type="text/css" href="${getAssetUrl('public/cards.min.css')}">`);
341
326
  }
327
+ }
342
328
 
343
- if (options.data.site.accent_color) {
344
- const accentColor = escapeExpression(options.data.site.accent_color);
345
- const styleTag = `<style>:root {--ghost-accent-color: ${accentColor};}</style>`;
346
- const existingScriptIndex = _.findLastIndex(head, str => str.match(/<\/(style|script)>/));
329
+ if (!excludeList.has('comment_counts') && settingsCache.get('comments_enabled') !== 'off') {
330
+ head.push(`<script defer src="${getAssetUrl('public/comment-counts.min.js')}" data-ghost-comments-counts-api="${urlUtils.getSiteUrl(true)}members/api/comments/counts/"></script>`);
331
+ }
347
332
 
348
- if (existingScriptIndex !== -1) {
349
- head[existingScriptIndex] = head[existingScriptIndex] + styleTag;
350
- } else {
351
- head.push(styleTag);
352
- }
353
- }
354
- if (!_.isEmpty(globalCodeinjection)) {
355
- head.push(globalCodeinjection);
356
- }
333
+ if (settingsCache.get('members_enabled') && settingsCache.get('members_track_sources')) {
334
+ head.push(`<script defer src="${getAssetUrl('public/member-attribution.min.js')}"></script>`);
335
+ }
357
336
 
358
- if (!_.isEmpty(postCodeInjection)) {
359
- head.push(postCodeInjection);
360
- }
337
+ if (options.data.site.accent_color) {
338
+ const accentColor = escapeExpression(options.data.site.accent_color);
339
+ const styleTag = `<style>:root {--ghost-accent-color: ${accentColor};}</style>`;
340
+ const existingScriptIndex = _.findLastIndex(head, str => str.match(/<\/(style|script)>/));
361
341
 
362
- if (!_.isEmpty(tagCodeInjection)) {
363
- head.push(tagCodeInjection);
342
+ if (existingScriptIndex !== -1) {
343
+ head[existingScriptIndex] = head[existingScriptIndex] + styleTag;
344
+ } else {
345
+ head.push(styleTag);
364
346
  }
365
- // Use settingsHelpers to check if web analytics is enabled (includes all necessary checks)
366
- if (settingsHelpers.isWebAnalyticsEnabled()) {
367
- head.push(getTinybirdTrackerScript(dataRoot));
368
- // Set a flag in response locals to indicate tracking script is being served
369
- if (dataRoot._locals) {
370
- dataRoot._locals.ghostAnalytics = true;
371
- }
347
+ }
348
+ if (!_.isEmpty(globalCodeinjection)) {
349
+ head.push(globalCodeinjection);
350
+ }
351
+
352
+ if (!_.isEmpty(postCodeInjection)) {
353
+ head.push(postCodeInjection);
354
+ }
355
+
356
+ if (!_.isEmpty(tagCodeInjection)) {
357
+ head.push(tagCodeInjection);
358
+ }
359
+
360
+ // Use settingsHelpers to check if web analytics is enabled (includes all necessary checks)
361
+ if (settingsHelpers.isWebAnalyticsEnabled()) {
362
+ head.push(getTinybirdTrackerScript(dataRoot));
363
+ // Set a flag in response locals to indicate tracking script is being served
364
+ if (dataRoot._locals) {
365
+ dataRoot._locals.ghostAnalytics = true;
372
366
  }
367
+ }
373
368
 
374
- // Check if if the request is for a site preview, in which case we **always** use the custom font values
375
- // from the passed in data, even when they're empty strings or settings cache has values.
376
- const isSitePreview = options.data?.site?._preview ?? false;
377
- // Taking the fonts straight from the passed in data, as they can't be used from the
378
- // settings cache for the theme preview until the settings are saved. Once saved,
379
- // we need to use the settings cache to provide the correct CSS injection.
380
- const headingFont = isSitePreview ? options.data?.site?.heading_font : settingsCache.get('heading_font');
381
- const bodyFont = isSitePreview ? options.data?.site?.body_font : settingsCache.get('body_font');
382
- if ((typeof headingFont === 'string' && isValidCustomHeadingFont(headingFont)) ||
369
+ // Check if if the request is for a site preview, in which case we **always** use the custom font values
370
+ // from the passed in data, even when they're empty strings or settings cache has values.
371
+ const isSitePreview = options.data?.site?._preview ?? false;
372
+ // Taking the fonts straight from the passed in data, as they can't be used from the
373
+ // settings cache for the theme preview until the settings are saved. Once saved,
374
+ // we need to use the settings cache to provide the correct CSS injection.
375
+ const headingFont = isSitePreview ? options.data?.site?.heading_font : settingsCache.get('heading_font');
376
+ const bodyFont = isSitePreview ? options.data?.site?.body_font : settingsCache.get('body_font');
377
+ if ((typeof headingFont === 'string' && isValidCustomHeadingFont(headingFont)) ||
383
378
  (typeof bodyFont === 'string' && isValidCustomFont(bodyFont))) {
384
- /** @type FontSelection */
385
- const fontSelection = {};
379
+ /** @type FontSelection */
380
+ const fontSelection = {};
386
381
 
387
- if (headingFont) {
388
- fontSelection.heading = headingFont;
389
- }
390
- if (bodyFont) {
391
- fontSelection.body = bodyFont;
392
- }
393
- const customCSS = generateCustomFontCss(fontSelection);
394
- head.push(new SafeString(customCSS));
382
+ if (headingFont) {
383
+ fontSelection.heading = headingFont;
384
+ }
385
+ if (bodyFont) {
386
+ fontSelection.body = bodyFont;
395
387
  }
388
+ const customCSS = generateCustomFontCss(fontSelection);
389
+ head.push(new SafeString(customCSS));
396
390
  }
397
391
 
398
392
  debug('end');
@@ -12,13 +12,7 @@ function getCanonicalUrl(data) {
12
12
  return data.tag.canonical_url;
13
13
  }
14
14
 
15
- let url = urlUtils.urlJoin(urlUtils.urlFor('home', true), getUrl(data, false));
16
-
17
- if (url.indexOf('/amp/')) {
18
- url = url.replace(/\/amp\/$/i, '/');
19
- }
20
-
21
- return url;
15
+ return urlUtils.urlJoin(urlUtils.urlFor('home', true), getUrl(data, false));
22
16
  }
23
17
 
24
18
  module.exports = getCanonicalUrl;
@@ -7,7 +7,7 @@ function getContextObject(data, context) {
7
7
  // @TODO: meta layer is very broken, it's really hard to understand what it's doing
8
8
  // The problem is that handlebars root object is structured differently. Sometimes the object is flat on data
9
9
  // and sometimes the object is part of a key e.g. data.post. This needs to be prepared at the very first stage and not in each helper.
10
- if ((_.includes(context, 'page') || _.includes(context, 'amp')) && data.post) {
10
+ if (_.includes(context, 'page') && data.post) {
11
11
  chosenContext = data.post;
12
12
  } else if (_.includes(context, 'post') && data.post) {
13
13
  chosenContext = data.post;
@@ -3,7 +3,6 @@ const urlUtils = require('../../shared/url-utils');
3
3
  const logging = require('@tryghost/logging');
4
4
 
5
5
  // These are in filename order
6
- const getAmpUrl = require('./amp-url');
7
6
  const getAuthorFacebook = require('./author-fb-url');
8
7
  const getAuthorImage = require('./author-image');
9
8
  const getAuthorUrl = require('./author-url');
@@ -31,7 +30,6 @@ function getMetaData(data, root) {
31
30
  const metaData = {
32
31
  url: getUrl(data, true),
33
32
  canonicalUrl: getCanonicalUrl(data),
34
- ampUrl: getAmpUrl(data),
35
33
  previousUrl: getPaginatedUrl('prev', data, true),
36
34
  nextUrl: getPaginatedUrl('next', data, true),
37
35
  authorUrl: getAuthorUrl(data, true),
@@ -70,8 +68,7 @@ function getMetaData(data, root) {
70
68
  navigation: settingsCache.get('navigation'),
71
69
  icon: settingsCache.get('icon'),
72
70
  cover_image: settingsCache.get('cover_image'),
73
- logo: getBlogLogo(),
74
- amp: settingsCache.get('amp')
71
+ logo: getBlogLogo()
75
72
  }
76
73
  };
77
74
 
@@ -12,7 +12,7 @@ function getOgImage(data) {
12
12
  return (imgUrl && urlUtils.relativeToAbsolute(imgUrl)) || null;
13
13
  }
14
14
 
15
- if (_.includes(context, 'post') || _.includes(context, 'page') || _.includes(context, 'amp')) {
15
+ if (_.includes(context, 'post') || _.includes(context, 'page')) {
16
16
  if (contextObject.og_image) {
17
17
  return urlUtils.relativeToAbsolute(contextObject.og_image);
18
18
  } else if (contextObject.feature_image) {
@@ -1,8 +1,6 @@
1
1
  function getOgType(data) {
2
2
  let context = data.context ? data.context[0] : null;
3
3
 
4
- context = context === 'amp' ? 'post' : context;
5
-
6
4
  if (context === 'author') {
7
5
  return 'profile';
8
6
  }
@@ -187,7 +187,7 @@ function getAuthorSchema(metaData, data) {
187
187
  function getSchema(metaData, data) {
188
188
  if (!config.isPrivacyDisabled('useStructuredData')) {
189
189
  const context = data.context ? data.context : null;
190
- if (_.includes(context, 'post') || _.includes(context, 'page') || _.includes(context, 'amp')) {
190
+ if (_.includes(context, 'post') || _.includes(context, 'page')) {
191
191
  return getPostSchema(metaData, data);
192
192
  } else if (_.includes(context, 'home')) {
193
193
  return getHomeSchema(metaData);
@@ -12,7 +12,7 @@ function getTwitterImage(data) {
12
12
  return (imgUrl && urlUtils.relativeToAbsolute(imgUrl)) || null;
13
13
  }
14
14
 
15
- if (_.includes(context, 'post') || _.includes(context, 'page') || _.includes(context, 'amp')) {
15
+ if (_.includes(context, 'post') || _.includes(context, 'page')) {
16
16
  if (contextObject.twitter_image) {
17
17
  return urlUtils.relativeToAbsolute(contextObject.twitter_image);
18
18
  } else if (contextObject.feature_image) {
@@ -2,16 +2,6 @@ const urlUtils = require('../../shared/url-utils');
2
2
  const urlService = require('../../server/services/url');
3
3
  const {checks} = require('../services/data');
4
4
 
5
- // This cleans the url from any `/amp` postfixes, so we'll never
6
- // output a url with `/amp` in the end, except for the needed `amphtml`
7
- // canonical link, which is rendered by `getAmpUrl`.
8
- function sanitizeAmpUrl(url) {
9
- if (url.indexOf('/amp/') !== -1) {
10
- url = url.replace(/\/amp\/$/i, '/');
11
- }
12
- return url;
13
- }
14
-
15
5
  function getUrl(data, absolute) {
16
6
  if (checks.isPost(data)) {
17
7
  /**
@@ -41,8 +31,7 @@ function getUrl(data, absolute) {
41
31
  return urlUtils.urlFor('nav', {nav: data}, absolute);
42
32
  }
43
33
 
44
- // sanitize any trailing `/amp` in the url
45
- return sanitizeAmpUrl(urlUtils.urlFor(data, {}, absolute));
34
+ return urlUtils.urlFor(data, {}, absolute);
46
35
  }
47
36
 
48
37
  module.exports = getUrl;
@@ -14,9 +14,6 @@
14
14
  // routeKeywords.private: 'private'
15
15
  const privatePattern = new RegExp('^\\/private\\/');
16
16
 
17
- // routeKeywords.amp: 'amp'
18
- const ampPattern = new RegExp('\\/amp\\/$');
19
-
20
17
  const homePattern = new RegExp('^\\/$');
21
18
 
22
19
  function setResponseContext(req, res, data) {
@@ -41,11 +38,6 @@ function setResponseContext(req, res, data) {
41
38
  res.locals.context.push('home');
42
39
  }
43
40
 
44
- // Add context 'amp' to either post or page, if we have an `*/amp` route
45
- if (ampPattern.test(res.locals.relativeUrl) && (data.post || data.page)) {
46
- res.locals.context.push('amp');
47
- }
48
-
49
41
  // Each page can only have at most one of these
50
42
  if (res.routerOptions && res.routerOptions.context) {
51
43
  res.locals.context = res.locals.context.concat(res.routerOptions.context);
@@ -59,16 +59,35 @@ function forwardToExpressStatic(req, res, next) {
59
59
  return next();
60
60
  }
61
61
 
62
+ // We allow robots.txt to fall through to the next middleware, so that we can return our default robots.txt
63
+ // We also allow sitemap.xml and sitemap-:resource.xml to fall through so that we can serve our defaults if they're not found in the theme
64
+ const fallthroughFiles = [
65
+ '/robots.txt',
66
+ '/sitemap.xml',
67
+ '/sitemap-posts.xml',
68
+ '/sitemap-pages.xml',
69
+ '/sitemap-tags.xml',
70
+ '/sitemap-authors.xml',
71
+ '/sitemap-users.xml',
72
+ '/sitemap.xsl'
73
+ ];
74
+ const fallthrough = fallthroughFiles.includes(req.path) ? true : false;
75
+
62
76
  express.static(themeEngine.getActive().path, {
63
77
  // @NOTE: the maxAge config passed below are in milliseconds and the config
64
78
  // is specified in seconds. See https://github.com/expressjs/serve-static/issues/150 for more context
65
- maxAge: config.get('caching:theme:maxAge') * 1000
79
+ maxAge: config.get('caching:theme:maxAge') * 1000,
80
+ fallthrough
66
81
  }
67
82
  )(req, res, next);
68
83
  }
69
84
 
70
85
  function staticTheme() {
71
86
  return function denyStatic(req, res, next) {
87
+ if (!path.extname(req.path)) {
88
+ return next();
89
+ }
90
+
72
91
  if (!isAllowedFile(req.path.toLowerCase()) && isDeniedFile(req.path.toLowerCase())) {
73
92
  return next();
74
93
  }
@@ -205,10 +205,6 @@ module.exports = {
205
205
  return apiFramework.pipeline(require('./links'), localUtils);
206
206
  },
207
207
 
208
- get mailEvents() {
209
- return apiFramework.pipeline(require('./mail-events'), localUtils);
210
- },
211
-
212
208
  get recommendations() {
213
209
  return apiFramework.pipeline(require('./recommendations'), localUtils);
214
210
  },
@@ -10,15 +10,6 @@ const messages = {
10
10
 
11
11
  /** @type {import('@tryghost/api-framework').Controller} */
12
12
  const controller = {
13
- read(frame) {
14
- /*
15
- * TODO
16
- * Don't query db for user, when new api http wrapper is in we can
17
- * have direct access to req.user, we can also get access to some session
18
- * inofrmation too and send it back
19
- */
20
- return models.User.findOne({id: frame.options.context.user});
21
- },
22
13
  add(frame) {
23
14
  const object = frame.data;
24
15
 
@@ -53,8 +53,6 @@ const EDITABLE_SETTINGS = [
53
53
  'email_track_clicks',
54
54
  'members_track_sources',
55
55
  'web_analytics',
56
- 'amp',
57
- 'amp_gtag_id',
58
56
  'slack_url',
59
57
  'slack_username',
60
58
  'unsplash',
@@ -4,7 +4,6 @@ const typeGroupMapping = {
4
4
  ],
5
5
  blog: [
6
6
  'site',
7
- 'amp',
8
7
  'labs',
9
8
  'slack',
10
9
  'unsplash',
@@ -36,7 +36,6 @@ const keyGroupMapping = {
36
36
  is_private: 'private',
37
37
  password: 'private',
38
38
  public_hash: 'private',
39
- amp: 'amp',
40
39
  labs: 'labs',
41
40
  slack: 'slack',
42
41
  unsplash: 'unsplash',
@@ -46,7 +46,6 @@ const keyTypeMapping = {
46
46
  portal_plans: 'array',
47
47
  stripe_plans: 'array',
48
48
  next_update_check: 'number',
49
- amp: 'boolean',
50
49
  is_private: 'boolean',
51
50
  members_allow_free_signup: 'boolean',
52
51
  portal_name: 'boolean',
@@ -6,7 +6,7 @@ const removeXBY = (object) => {
6
6
  // CASE: go deeper
7
7
  if (_.isObject(value) || _.isArray(value)) {
8
8
  removeXBY(value);
9
- } else if (['updated_by', 'created_by', 'published_by'].includes(key)) {
9
+ } else if (['published_by'].includes(key)) {
10
10
  delete object[key];
11
11
  }
12
12
  }
@@ -137,10 +137,6 @@ module.exports = {
137
137
  return require('./links');
138
138
  },
139
139
 
140
- get mail_events() {
141
- return require('./mail-events');
142
- },
143
-
144
140
  get search_index() {
145
141
  return require('./search-index');
146
142
  },
@@ -14,9 +14,7 @@ module.exports = (snippet, frame) => {
14
14
  mobiledoc: json.mobiledoc,
15
15
  lexical: json.lexical,
16
16
  created_at: json.created_at,
17
- updated_at: json.updated_at,
18
- created_by: json.created_by,
19
- updated_by: json.updated_by
17
+ updated_at: json.updated_at
20
18
  };
21
19
  };
22
20
 
@@ -28,8 +26,6 @@ module.exports = (snippet, frame) => {
28
26
  * @prop {string} [lexical]
29
27
  * @prop {string} created_at
30
28
  * @prop {string} updated_at
31
- * @prop {string} created_by
32
- * @prop {string} updated_by
33
29
  */
34
30
 
35
31
  /**
@@ -342,9 +342,7 @@ function createSerializer(debugString, serialize) {
342
342
  * @prop {string} plaintext
343
343
  * @prop {boolean} track_opens
344
344
  * @prop {string} created_at
345
- * @prop {string} created_by
346
345
  * @prop {string} updated_at
347
- * @prop {string} updated_by
348
346
  */
349
347
 
350
348
  /**
@@ -75,9 +75,5 @@ module.exports = {
75
75
 
76
76
  get snippets() {
77
77
  return require('./snippets');
78
- },
79
-
80
- get mail_events() {
81
- return require('./mail-events');
82
78
  }
83
79
  };
@@ -287,9 +287,7 @@ class Base {
287
287
  _.each(this.dataToImport, (obj) => {
288
288
  _.each([
289
289
  'author_id',
290
- 'published_by',
291
- 'created_by',
292
- 'updated_by'
290
+ 'published_by'
293
291
  ], (key) => {
294
292
  return handleObject(obj, key);
295
293
  });
@@ -10,7 +10,7 @@ const {WRITABLE_KEYS_ALLOWLIST} = require('../../../../../shared/labs');
10
10
  const {sequence} = require('@tryghost/promise');
11
11
 
12
12
  const labsDefaults = JSON.parse(defaultSettings.labs.labs.defaultValue);
13
- const ignoredSettings = ['slack_url', 'members_from_address', 'members_support_address', 'portal_products', 'email_verification_required', 'site_uuid'];
13
+ const ignoredSettings = ['slack_url', 'members_from_address', 'members_support_address', 'portal_products', 'email_verification_required', 'site_uuid', 'amp'];
14
14
 
15
15
  // Importer maintains as much backwards compatibility as possible
16
16
  const renamedSettingsMap = {
@@ -140,9 +140,7 @@ class SettingsImporter extends BaseImporter {
140
140
  group: to.group,
141
141
  type: to.type,
142
142
  flags: to.flags || null,
143
- created_by: deprecatedSetting.created_by || 1,
144
143
  created_at: deprecatedSetting.created_at,
145
- updated_by: deprecatedSetting.updated_by || 1,
146
144
  updated_at: deprecatedSetting.updated_at
147
145
  });
148
146
  });
@@ -3,8 +3,5 @@ module.exports = {
3
3
  ...require('./permissions'),
4
4
  ...require('./schema'),
5
5
  ...require('./settings'),
6
- ...require('./tables'),
7
- meta: {
8
- MIGRATION_USER: require('./constants').MIGRATION_USER
9
- }
6
+ ...require('./tables')
10
7
  };
@@ -4,7 +4,7 @@ const errors = require('@tryghost/errors');
4
4
  const tpl = require('@tryghost/tpl');
5
5
 
6
6
  const {createTransactionalMigration, combineTransactionalMigrations} = require('./migrations');
7
- const {MIGRATION_USER} = require('./constants');
7
+ const MIGRATION_USER = 1;
8
8
 
9
9
  const messages = {
10
10
  permissionRoleActionError: 'Cannot {action} permission({permission}) with role({role}) - {resource} does not exist'
@@ -30,16 +30,24 @@ async function addPermissionHelper(connection, config) {
30
30
 
31
31
  const date = connection.raw('CURRENT_TIMESTAMP');
32
32
 
33
- await connection('permissions').insert({
33
+ const data = {
34
34
  id: ObjectId().toHexString(),
35
35
  name: config.name,
36
36
  action_type: config.action,
37
37
  object_type: config.object,
38
38
  created_at: date,
39
- created_by: MIGRATION_USER,
40
- updated_at: date,
41
- updated_by: MIGRATION_USER
42
- });
39
+ updated_at: date
40
+ };
41
+
42
+ if (await connection.schema.hasColumn('permissions', 'created_by')) {
43
+ data.created_by = MIGRATION_USER;
44
+ }
45
+
46
+ if (await connection.schema.hasColumn('permissions', 'updated_by')) {
47
+ data.updated_by = MIGRATION_USER;
48
+ }
49
+
50
+ await connection('permissions').insert(data);
43
51
  }
44
52
 
45
53
  /**