ghost 4.48.0 → 5.0.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 (660) hide show
  1. package/Gruntfile.js +24 -24
  2. package/README.md +3 -2
  3. package/content/themes/casper/assets/built/global.css +1 -1
  4. package/content/themes/casper/assets/built/global.css.map +1 -1
  5. package/content/themes/casper/assets/built/screen.css +1 -1
  6. package/content/themes/casper/assets/built/screen.css.map +1 -1
  7. package/content/themes/casper/assets/css/global.css +2 -2
  8. package/content/themes/casper/assets/css/screen.css +412 -664
  9. package/content/themes/casper/author.hbs +48 -35
  10. package/content/themes/casper/default.hbs +5 -23
  11. package/content/themes/casper/error-404.hbs +1 -1
  12. package/content/themes/casper/index.hbs +29 -22
  13. package/content/themes/casper/package.json +25 -37
  14. package/content/themes/casper/page.hbs +12 -12
  15. package/content/themes/casper/partials/icons/facebook.hbs +1 -1
  16. package/content/themes/casper/partials/icons/twitter.hbs +1 -1
  17. package/content/themes/casper/partials/post-card.hbs +26 -40
  18. package/content/themes/casper/post.hbs +54 -50
  19. package/content/themes/casper/tag.hbs +42 -47
  20. package/core/boot.js +18 -15
  21. package/core/bridge.js +24 -25
  22. package/core/built/assets/ghost-dark-08acba9994ea4f9478dfdca2a97b36f1.css +1 -0
  23. package/core/built/assets/{ghost.min-10ba0de3ecb93d63d62bb43ac11c740f.js → ghost.min-75bec566fbea362ed98811fe6d5b6e24.js} +1115 -1185
  24. package/core/built/assets/ghost.min-855c93486d789aa09dbe97f272672bf9.css +1 -0
  25. package/core/built/assets/icons/analytics.svg +14 -0
  26. package/core/built/assets/icons/calendar.svg +4 -1
  27. package/core/built/assets/icons/email-at.svg +1 -1
  28. package/core/built/assets/icons/email-name.svg +1 -1
  29. package/core/built/assets/icons/info.svg +1 -1
  30. package/core/built/assets/icons/twitter-logo.svg +3 -0
  31. package/core/built/assets/{vendor.min-97fd438f4772c5ec6bb30ad779b8530e.js → vendor.min-14ad7269e0529dd20f61d2989e69fa1e.js} +95 -90
  32. package/core/cli/README.md +88 -0
  33. package/core/cli/command.js +129 -0
  34. package/core/cli/repl.js +32 -0
  35. package/core/cli/timetravel.js +87 -0
  36. package/core/frontend/apps/amp/lib/helpers/amp_content.js +10 -12
  37. package/core/frontend/apps/amp/lib/router.js +2 -3
  38. package/core/frontend/helpers/body_class.js +2 -2
  39. package/core/frontend/helpers/excerpt.js +0 -2
  40. package/core/frontend/helpers/get.js +23 -24
  41. package/core/frontend/helpers/ghost_head.js +102 -103
  42. package/core/frontend/helpers/navigation.js +0 -2
  43. package/core/frontend/helpers/prev_post.js +20 -26
  44. package/core/frontend/helpers/price.js +2 -2
  45. package/core/frontend/meta/author-url.js +2 -2
  46. package/core/frontend/meta/description.js +3 -3
  47. package/core/frontend/meta/excerpt.js +1 -2
  48. package/core/frontend/meta/generate-excerpt.js +2 -11
  49. package/core/frontend/meta/paginated-url.js +1 -1
  50. package/core/frontend/meta/rss-url.js +0 -1
  51. package/core/frontend/meta/url.js +4 -4
  52. package/core/frontend/services/data/entry-lookup.js +1 -1
  53. package/core/frontend/services/data/fetch-data.js +1 -1
  54. package/core/frontend/services/helpers/handlebars.js +11 -12
  55. package/core/frontend/services/proxy.js +11 -1
  56. package/core/frontend/services/rendering/format-response.js +9 -2
  57. package/core/frontend/services/rendering/index.js +0 -4
  58. package/core/frontend/services/rendering/render-entry.js +1 -1
  59. package/core/frontend/services/rendering/templates.js +15 -5
  60. package/core/frontend/services/routing/CollectionRouter.js +2 -2
  61. package/core/frontend/services/routing/EmailRouter.js +2 -2
  62. package/core/frontend/services/routing/ParentRouter.js +1 -1
  63. package/core/frontend/services/routing/PreviewRouter.js +3 -3
  64. package/core/frontend/services/routing/{config/v4.js → config.js} +3 -5
  65. package/core/frontend/services/routing/controllers/channel.js +0 -10
  66. package/core/frontend/services/routing/controllers/collection.js +0 -9
  67. package/core/frontend/services/routing/controllers/email-post.js +2 -7
  68. package/core/frontend/services/routing/controllers/entry.js +1 -3
  69. package/core/frontend/services/routing/controllers/index.js +2 -2
  70. package/core/frontend/services/routing/controllers/{preview.js → previews.js} +3 -8
  71. package/core/frontend/services/routing/controllers/static.js +1 -6
  72. package/core/frontend/services/routing/router-manager.js +38 -20
  73. package/core/frontend/services/rss/generate-feed.js +7 -9
  74. package/core/frontend/services/theme-engine/active.js +0 -8
  75. package/core/frontend/services/theme-engine/config/defaults.json +1 -3
  76. package/core/frontend/services/theme-engine/middleware/index.js +0 -1
  77. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +0 -69
  78. package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +3 -6
  79. package/core/frontend/web/middleware/static-theme.js +14 -6
  80. package/core/frontend/web/routes.js +9 -9
  81. package/core/frontend/web/site.js +15 -18
  82. package/core/server/adapters/scheduling/post-scheduling/index.js +1 -1
  83. package/core/server/api/README.md +2 -6
  84. package/core/server/api/canary/authentication.js +4 -3
  85. package/core/server/api/canary/{email-preview.js → email-previews.js} +9 -8
  86. package/core/server/api/canary/index.js +14 -18
  87. package/core/server/api/canary/members.js +1 -13
  88. package/core/server/api/{v3/actions.js → canary/newsletters-public.js} +6 -6
  89. package/core/server/api/canary/newsletters.js +1 -13
  90. package/core/server/api/canary/notifications.js +17 -22
  91. package/core/server/api/canary/offers-public.js +28 -0
  92. package/core/server/api/canary/pages.js +1 -1
  93. package/core/server/api/canary/posts.js +4 -8
  94. package/core/server/api/canary/{preview.js → previews.js} +1 -1
  95. package/core/server/api/canary/schedules.js +1 -1
  96. package/core/server/api/canary/session.js +1 -1
  97. package/core/server/api/canary/settings-public.js +3 -1
  98. package/core/server/api/canary/settings.js +28 -16
  99. package/core/server/api/canary/utils/index.js +2 -4
  100. package/core/server/api/canary/utils/serializers/input/index.js +0 -4
  101. package/core/server/api/canary/utils/serializers/input/members.js +46 -17
  102. package/core/server/api/canary/utils/serializers/input/pages.js +0 -17
  103. package/core/server/api/canary/utils/serializers/input/posts.js +1 -28
  104. package/core/server/api/canary/utils/serializers/input/settings.js +61 -142
  105. package/core/server/api/canary/utils/serializers/input/tiers.js +39 -4
  106. package/core/server/api/canary/utils/serializers/output/authentication.js +2 -6
  107. package/core/server/api/canary/utils/serializers/output/index.js +2 -10
  108. package/core/server/api/canary/utils/serializers/output/mappers/index.js +1 -0
  109. package/core/server/api/canary/utils/serializers/output/mappers/newsletters.js +24 -0
  110. package/core/server/api/canary/utils/serializers/output/mappers/pages.js +1 -1
  111. package/core/server/api/canary/utils/serializers/output/mappers/posts.js +9 -7
  112. package/core/server/api/canary/utils/serializers/output/mappers/settings.js +5 -31
  113. package/core/server/api/canary/utils/serializers/output/members.js +18 -3
  114. package/core/server/api/canary/utils/serializers/output/offers.js +9 -1
  115. package/core/server/api/canary/utils/serializers/output/{preview.js → previews.js} +2 -2
  116. package/core/server/api/canary/utils/serializers/output/settings.js +6 -14
  117. package/core/server/api/canary/utils/serializers/output/site.js +0 -1
  118. package/core/server/api/canary/utils/serializers/output/tiers.js +21 -62
  119. package/core/server/api/canary/utils/serializers/output/utils/clean.js +5 -10
  120. package/core/server/api/canary/utils/serializers/output/utils/extra-attrs.js +0 -126
  121. package/core/server/api/canary/utils/serializers/output/utils/post-gating.js +1 -1
  122. package/core/server/api/canary/utils/serializers/output/utils/url.js +0 -5
  123. package/core/server/api/canary/utils/validators/input/index.js +2 -2
  124. package/core/server/api/canary/utils/validators/input/{passwordreset.js → password_reset.js} +2 -2
  125. package/core/server/api/canary/utils/validators/input/settings.js +2 -23
  126. package/core/server/api/canary/utils/validators/utils/json-schema.js +1 -2
  127. package/core/server/api/index.js +1 -7
  128. package/core/server/api/shared/serializers/input/utils/settings-key-group-mapper.js +2 -2
  129. package/core/server/api/shared/serializers/input/utils/settings-key-type-mapper.js +2 -4
  130. package/core/server/data/db/connection.js +0 -13
  131. package/core/server/data/exporter/table-lists.js +0 -3
  132. package/core/server/data/importer/importers/data/base.js +16 -7
  133. package/core/server/data/importer/importers/data/data-importer.js +38 -1
  134. package/core/server/data/importer/importers/data/newsletters.js +45 -0
  135. package/core/server/data/importer/importers/data/posts.js +40 -12
  136. package/core/server/data/importer/importers/data/products.js +68 -0
  137. package/core/server/data/importer/importers/data/settings.js +10 -10
  138. package/core/server/data/importer/importers/data/stripe-prices.js +59 -0
  139. package/core/server/data/importer/importers/data/stripe-products.js +61 -0
  140. package/core/server/data/migrations/utils/constants.js +3 -0
  141. package/core/server/data/migrations/utils/index.js +10 -0
  142. package/core/server/data/migrations/utils/migrations.js +156 -0
  143. package/core/server/data/migrations/utils/permissions.js +291 -0
  144. package/core/server/data/migrations/utils/schema.js +158 -0
  145. package/core/server/data/migrations/utils/settings.js +59 -0
  146. package/core/server/data/migrations/utils/tables.js +94 -0
  147. package/core/server/data/migrations/versions/1.25/01-final-v1.js +2 -0
  148. package/core/server/data/migrations/versions/1.25/02-noop.js +6 -0
  149. package/core/server/data/migrations/versions/2.37/01-final-v2.js +2 -0
  150. package/core/server/data/migrations/versions/3.41/01-final-v3.js +2 -0
  151. package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +3 -9
  152. package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +2 -11
  153. package/core/server/data/migrations/versions/4.11/02-add-email-verification-required-setting.js +1 -1
  154. package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +1 -1
  155. package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +1 -1
  156. package/core/server/data/migrations/versions/4.22/01-add-is-launch-complete-setting.js +1 -1
  157. package/core/server/data/migrations/versions/4.22/02-update-launch-complete-setting-from-user-data.js +1 -1
  158. package/core/server/data/migrations/versions/4.35/2022-02-02-10-38-add-default-content-visibility-tiers-setting.js +1 -1
  159. package/core/server/data/migrations/versions/4.45/2022-04-21-02-55-add-notifications-key-entry-to-settings-table.js +1 -1
  160. package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +1 -1
  161. package/core/server/data/migrations/versions/4.7/03-add-labs-setting.js +1 -1
  162. package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +1 -1
  163. package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +1 -1
  164. package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +1 -1
  165. package/core/server/data/migrations/versions/5.0/2022-03-14-12-33-delete-duplicate-offer-redemptions.js +36 -0
  166. package/core/server/data/migrations/versions/5.0/2022-03-28-15-25-backfill-mrr-adjustments-for-offers.js +108 -0
  167. package/core/server/data/migrations/versions/5.0/2022-04-25-10-32-backfill-mrr-for-discounted-subscriptions.js +44 -0
  168. package/core/server/data/migrations/versions/5.0/2022-04-26-15-44-backfill-mrr-events-for-canceled-subscriptions.js +73 -0
  169. package/core/server/data/migrations/versions/5.0/2022-04-27-11-26-backfill-mrr-for-canceled-subscriptions.js +31 -0
  170. package/core/server/data/migrations/versions/5.0/2022-04-28-03-26-remove-author-id-column-from-posts-table.js +7 -0
  171. package/core/server/data/migrations/versions/5.0/2022-05-03-09-39-drop-nullable-subscribe-event-newsletter-id.js +4 -0
  172. package/core/server/data/migrations/versions/5.0/2022-05-04-15-24-map-existing-emails-to-default-newsletter.js +44 -0
  173. package/core/server/data/migrations/versions/5.0/2022-05-05-13-13-migrate-legacy-recipient-filters.js +30 -0
  174. package/core/server/data/migrations/versions/5.0/2022-05-05-13-29-add-newsletters-admin-integration-permission-roles.js +20 -0
  175. package/core/server/data/migrations/versions/5.0/2022-05-05-15-17-drop-oauth-table.js +3 -0
  176. package/core/server/data/migrations/versions/5.0/2022-05-06-08-16-cleanup-client-subscriber-permissions.js +68 -0
  177. package/core/server/data/migrations/versions/5.0/2022-05-06-13-22-add-frontend-integration.js +68 -0
  178. package/core/server/data/migrations/versions/5.0/2022-05-09-10-00-drop-members-subscribed-column.js +18 -0
  179. package/core/server/data/migrations/versions/5.0/2022-05-09-14-17-cleanup-invalid-users-status.js +17 -0
  180. package/core/server/data/migrations/versions/5.0/2022-05-10-08-33-drop-members-analytics-table.js +3 -0
  181. package/core/server/data/migrations/versions/5.0/2022-05-10-14-57-cleanup-invalid-posts-status.js +17 -0
  182. package/core/server/data/migrations/versions/5.0/2022-05-11-12-08-drop-webhooks-status-column.js +18 -0
  183. package/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js +51 -0
  184. package/core/server/data/migrations/versions/5.0/2022-05-11-16-36-remove-unused-settings.js +54 -0
  185. package/core/server/data/migrations/versions/5.0/2022-05-12-10-29-add-newsletter-permissions-for-editors-and-authors.js +20 -0
  186. package/core/server/data/migrations/versions/5.0/2022-05-12-13-51-add-label-permissions-for-authors.js +12 -0
  187. package/core/server/data/migrations/versions/5.0/2022-05-13-11-38-drop-none-email-recipient-filter.js +28 -0
  188. package/core/server/data/migrations/versions/5.0/2022-05-21-00-00-regenerate-posts-html.js +70 -0
  189. package/core/server/data/schema/commands.js +35 -3
  190. package/core/server/data/schema/default-settings/default-settings.json +2 -159
  191. package/core/server/data/schema/fixtures/fixture-manager.js +11 -2
  192. package/core/server/data/schema/fixtures/fixtures.json +16 -7
  193. package/core/server/data/schema/schema.js +26 -38
  194. package/core/server/data/schema/validator.js +2 -0
  195. package/core/server/ghost-server.js +34 -64
  196. package/core/server/lib/image/gravatar.js +25 -9
  197. package/core/server/models/api-key.js +3 -26
  198. package/core/server/models/base/plugins/bulk-operations.js +14 -6
  199. package/core/server/models/integration.js +17 -0
  200. package/core/server/models/member.js +8 -4
  201. package/core/server/models/newsletter.js +27 -0
  202. package/core/server/models/post.js +30 -32
  203. package/core/server/models/relations/authors.js +74 -100
  204. package/core/server/models/settings.js +6 -2
  205. package/core/server/models/webhook.js +2 -1
  206. package/core/server/run-update-check.js +1 -1
  207. package/core/server/services/api-version-compatibility/index.js +24 -18
  208. package/core/server/services/api-version-compatibility/legacy-api-path-match.js +23 -0
  209. package/core/server/services/api-version-compatibility/mw-version-rewrites.js +36 -0
  210. package/core/server/services/auth/api-key/admin.js +8 -7
  211. package/core/server/services/auth/passwordreset.js +3 -3
  212. package/core/server/services/auth/session/express-session.js +1 -1
  213. package/core/server/services/auth/session/index.js +1 -1
  214. package/core/server/services/auth/setup.js +8 -8
  215. package/core/server/services/bulk-email/bulk-email-processor.js +5 -1
  216. package/core/server/services/frontend-data-service/frontend-data-service.js +27 -0
  217. package/core/server/services/frontend-data-service/index.js +6 -0
  218. package/core/server/services/mail/index.js +14 -1
  219. package/core/server/services/mega/email-preview.js +14 -15
  220. package/core/server/services/mega/mega.js +37 -52
  221. package/core/server/services/mega/post-email-serializer.js +18 -28
  222. package/core/server/services/members/api.js +0 -3
  223. package/core/server/services/members/config.js +0 -49
  224. package/core/server/services/members/exporter/query.js +7 -7
  225. package/core/server/services/members/middleware.js +3 -135
  226. package/core/server/services/members/service.js +0 -27
  227. package/core/server/services/members/settings.js +3 -9
  228. package/core/server/services/newsletters/service.js +78 -10
  229. package/core/server/services/posts/post-scheduling-service.js +5 -17
  230. package/core/server/services/posts/posts-service.js +15 -62
  231. package/core/server/services/public-config/site.js +0 -6
  232. package/core/server/services/route-settings/index.js +0 -3
  233. package/core/server/services/route-settings/settings-loader.js +10 -34
  234. package/core/server/services/route-settings/validate.js +1 -7
  235. package/core/server/services/settings/index.js +1 -77
  236. package/core/server/services/settings/settings-service.js +184 -0
  237. package/core/server/services/themes/validate.js +1 -1
  238. package/core/server/services/url/Resources.js +1 -3
  239. package/core/server/services/url/UrlGenerator.js +1 -1
  240. package/core/server/services/url/UrlService.js +6 -20
  241. package/core/server/services/url/{configs/v2.js → config.js} +0 -0
  242. package/core/server/services/users.js +2 -2
  243. package/core/server/services/webhooks/listen.js +5 -2
  244. package/core/server/services/webhooks/serialize.js +6 -7
  245. package/core/server/services/webhooks/trigger.js +62 -47
  246. package/core/server/update-check.js +1 -1
  247. package/core/server/web/admin/app.js +1 -1
  248. package/core/server/web/admin/views/default-prod.html +4 -4
  249. package/core/server/web/admin/views/default.html +4 -4
  250. package/core/server/web/api/app.js +3 -15
  251. package/core/server/web/api/canary/admin/app.js +1 -1
  252. package/core/server/web/api/canary/admin/middleware.js +3 -1
  253. package/core/server/web/api/canary/admin/routes.js +7 -23
  254. package/core/server/web/api/canary/content/app.js +2 -3
  255. package/core/server/web/api/canary/content/routes.js +5 -4
  256. package/core/server/web/members/app.js +5 -4
  257. package/core/server/web/parent/backend.js +0 -1
  258. package/core/server/web/parent/frontend.js +5 -6
  259. package/core/server/web/parent/middleware/ghost-locals.js +0 -3
  260. package/core/shared/config/defaults.json +5 -2
  261. package/core/shared/config/overrides.json +1 -27
  262. package/core/shared/html-to-plaintext.js +74 -10
  263. package/core/shared/labs.js +4 -8
  264. package/core/shared/settings-cache/cache.js +38 -4
  265. package/core/shared/settings-cache/public.js +13 -7
  266. package/core/shared/url-utils.js +0 -2
  267. package/ghost.js +6 -0
  268. package/package.json +66 -64
  269. package/yarn.lock +751 -1295
  270. package/core/built/assets/ghost-dark-c94ae212747200ca4bafc37cfb0714d8.css +0 -1
  271. package/core/built/assets/ghost.min-4084931bc22e794fe3722139050a80b3.css +0 -1
  272. package/core/frontend/helpers/author.js +0 -41
  273. package/core/frontend/helpers/products.js +0 -65
  274. package/core/frontend/services/rendering/secure.js +0 -19
  275. package/core/frontend/services/routing/config/canary.js +0 -61
  276. package/core/frontend/services/routing/config/v2.js +0 -54
  277. package/core/frontend/services/routing/config/v3.js +0 -54
  278. package/core/frontend/services/theme-engine/engines/create.js +0 -45
  279. package/core/frontend/services/theme-engine/engines/index.js +0 -5
  280. package/core/frontend/services/theme-engine/middleware/update-local-template-data.js +0 -9
  281. package/core/server/api/canary/products-public.js +0 -34
  282. package/core/server/api/canary/products.js +0 -116
  283. package/core/server/api/canary/utils/serializers/input/products.js +0 -28
  284. package/core/server/api/canary/utils/serializers/output/email-previews.js +0 -7
  285. package/core/server/api/canary/utils/serializers/output/products.js +0 -213
  286. package/core/server/api/v2/actions.js +0 -38
  287. package/core/server/api/v2/authentication.js +0 -191
  288. package/core/server/api/v2/authors-public.js +0 -69
  289. package/core/server/api/v2/config.js +0 -12
  290. package/core/server/api/v2/db.js +0 -120
  291. package/core/server/api/v2/images.js +0 -20
  292. package/core/server/api/v2/index.js +0 -147
  293. package/core/server/api/v2/integrations.js +0 -144
  294. package/core/server/api/v2/invites.js +0 -126
  295. package/core/server/api/v2/mail.js +0 -66
  296. package/core/server/api/v2/notifications.js +0 -96
  297. package/core/server/api/v2/oembed.js +0 -186
  298. package/core/server/api/v2/pages-public.js +0 -78
  299. package/core/server/api/v2/pages.js +0 -197
  300. package/core/server/api/v2/posts-public.js +0 -78
  301. package/core/server/api/v2/posts.js +0 -192
  302. package/core/server/api/v2/preview.js +0 -46
  303. package/core/server/api/v2/redirects.js +0 -28
  304. package/core/server/api/v2/roles.js +0 -19
  305. package/core/server/api/v2/schedules.js +0 -77
  306. package/core/server/api/v2/session.js +0 -70
  307. package/core/server/api/v2/settings-public.js +0 -17
  308. package/core/server/api/v2/settings.js +0 -195
  309. package/core/server/api/v2/site.js +0 -14
  310. package/core/server/api/v2/slack.js +0 -12
  311. package/core/server/api/v2/slugs.js +0 -51
  312. package/core/server/api/v2/tags-public.js +0 -71
  313. package/core/server/api/v2/tags.js +0 -159
  314. package/core/server/api/v2/themes.js +0 -133
  315. package/core/server/api/v2/users.js +0 -179
  316. package/core/server/api/v2/utils/index.js +0 -34
  317. package/core/server/api/v2/utils/permissions.js +0 -112
  318. package/core/server/api/v2/utils/serializers/index.js +0 -9
  319. package/core/server/api/v2/utils/serializers/input/db.js +0 -20
  320. package/core/server/api/v2/utils/serializers/input/index.js +0 -33
  321. package/core/server/api/v2/utils/serializers/input/integrations.js +0 -33
  322. package/core/server/api/v2/utils/serializers/input/pages.js +0 -203
  323. package/core/server/api/v2/utils/serializers/input/posts.js +0 -218
  324. package/core/server/api/v2/utils/serializers/input/settings.js +0 -152
  325. package/core/server/api/v2/utils/serializers/input/tags.js +0 -35
  326. package/core/server/api/v2/utils/serializers/input/users.js +0 -26
  327. package/core/server/api/v2/utils/serializers/input/utils/url.js +0 -71
  328. package/core/server/api/v2/utils/serializers/input/webhooks.js +0 -12
  329. package/core/server/api/v2/utils/serializers/output/actions.js +0 -13
  330. package/core/server/api/v2/utils/serializers/output/all.js +0 -25
  331. package/core/server/api/v2/utils/serializers/output/authentication.js +0 -68
  332. package/core/server/api/v2/utils/serializers/output/authors.js +0 -21
  333. package/core/server/api/v2/utils/serializers/output/config.js +0 -21
  334. package/core/server/api/v2/utils/serializers/output/db.js +0 -40
  335. package/core/server/api/v2/utils/serializers/output/images.js +0 -19
  336. package/core/server/api/v2/utils/serializers/output/index.js +0 -107
  337. package/core/server/api/v2/utils/serializers/output/integrations.js +0 -35
  338. package/core/server/api/v2/utils/serializers/output/invites.js +0 -24
  339. package/core/server/api/v2/utils/serializers/output/mail.js +0 -19
  340. package/core/server/api/v2/utils/serializers/output/notifications.js +0 -29
  341. package/core/server/api/v2/utils/serializers/output/oembed.js +0 -8
  342. package/core/server/api/v2/utils/serializers/output/pages.js +0 -26
  343. package/core/server/api/v2/utils/serializers/output/posts.js +0 -26
  344. package/core/server/api/v2/utils/serializers/output/preview.js +0 -9
  345. package/core/server/api/v2/utils/serializers/output/redirects.js +0 -5
  346. package/core/server/api/v2/utils/serializers/output/roles.js +0 -29
  347. package/core/server/api/v2/utils/serializers/output/schedules.js +0 -5
  348. package/core/server/api/v2/utils/serializers/output/settings.js +0 -61
  349. package/core/server/api/v2/utils/serializers/output/site.js +0 -16
  350. package/core/server/api/v2/utils/serializers/output/slugs.js +0 -11
  351. package/core/server/api/v2/utils/serializers/output/tags.js +0 -25
  352. package/core/server/api/v2/utils/serializers/output/themes.js +0 -25
  353. package/core/server/api/v2/utils/serializers/output/users.js +0 -45
  354. package/core/server/api/v2/utils/serializers/output/utils/clean.js +0 -174
  355. package/core/server/api/v2/utils/serializers/output/utils/date.js +0 -21
  356. package/core/server/api/v2/utils/serializers/output/utils/extra-attrs.js +0 -161
  357. package/core/server/api/v2/utils/serializers/output/utils/mapper.js +0 -136
  358. package/core/server/api/v2/utils/serializers/output/utils/post-gating.js +0 -29
  359. package/core/server/api/v2/utils/serializers/output/utils/settings-type-group-mapper.js +0 -24
  360. package/core/server/api/v2/utils/serializers/output/utils/url.js +0 -67
  361. package/core/server/api/v2/utils/serializers/output/webhooks.js +0 -15
  362. package/core/server/api/v2/utils/validators/index.js +0 -9
  363. package/core/server/api/v2/utils/validators/input/images.js +0 -85
  364. package/core/server/api/v2/utils/validators/input/index.js +0 -45
  365. package/core/server/api/v2/utils/validators/input/invitations.js +0 -49
  366. package/core/server/api/v2/utils/validators/input/invites.js +0 -21
  367. package/core/server/api/v2/utils/validators/input/oembed.js +0 -17
  368. package/core/server/api/v2/utils/validators/input/pages.js +0 -46
  369. package/core/server/api/v2/utils/validators/input/passwordreset.js +0 -36
  370. package/core/server/api/v2/utils/validators/input/posts.js +0 -46
  371. package/core/server/api/v2/utils/validators/input/settings.js +0 -79
  372. package/core/server/api/v2/utils/validators/input/setup.js +0 -17
  373. package/core/server/api/v2/utils/validators/input/tags.js +0 -6
  374. package/core/server/api/v2/utils/validators/input/users.js +0 -21
  375. package/core/server/api/v2/utils/validators/output/index.js +0 -1
  376. package/core/server/api/v2/utils/validators/utils/json-schema.js +0 -17
  377. package/core/server/api/v2/webhooks.js +0 -163
  378. package/core/server/api/v3/authentication.js +0 -192
  379. package/core/server/api/v3/authors-public.js +0 -69
  380. package/core/server/api/v3/config.js +0 -12
  381. package/core/server/api/v3/db.js +0 -131
  382. package/core/server/api/v3/email-preview.js +0 -74
  383. package/core/server/api/v3/email.js +0 -65
  384. package/core/server/api/v3/identities.js +0 -36
  385. package/core/server/api/v3/images.js +0 -20
  386. package/core/server/api/v3/index.js +0 -179
  387. package/core/server/api/v3/integrations.js +0 -150
  388. package/core/server/api/v3/invites.js +0 -125
  389. package/core/server/api/v3/labels.js +0 -162
  390. package/core/server/api/v3/mail.js +0 -66
  391. package/core/server/api/v3/memberSigninUrls.js +0 -33
  392. package/core/server/api/v3/members.js +0 -412
  393. package/core/server/api/v3/membersStripeConnect.js +0 -29
  394. package/core/server/api/v3/notifications.js +0 -96
  395. package/core/server/api/v3/oembed.js +0 -23
  396. package/core/server/api/v3/pages-public.js +0 -77
  397. package/core/server/api/v3/pages.js +0 -199
  398. package/core/server/api/v3/posts-public.js +0 -76
  399. package/core/server/api/v3/posts.js +0 -200
  400. package/core/server/api/v3/preview.js +0 -44
  401. package/core/server/api/v3/redirects.js +0 -47
  402. package/core/server/api/v3/roles.js +0 -19
  403. package/core/server/api/v3/schedules.js +0 -77
  404. package/core/server/api/v3/session.js +0 -70
  405. package/core/server/api/v3/settings-public.js +0 -17
  406. package/core/server/api/v3/settings.js +0 -224
  407. package/core/server/api/v3/site.js +0 -14
  408. package/core/server/api/v3/slack.js +0 -12
  409. package/core/server/api/v3/slugs.js +0 -48
  410. package/core/server/api/v3/snippets.js +0 -115
  411. package/core/server/api/v3/tags-public.js +0 -71
  412. package/core/server/api/v3/tags.js +0 -159
  413. package/core/server/api/v3/themes.js +0 -131
  414. package/core/server/api/v3/users.js +0 -242
  415. package/core/server/api/v3/utils/index.js +0 -34
  416. package/core/server/api/v3/utils/permissions.js +0 -116
  417. package/core/server/api/v3/utils/serializers/index.js +0 -9
  418. package/core/server/api/v3/utils/serializers/input/authors.js +0 -31
  419. package/core/server/api/v3/utils/serializers/input/db.js +0 -20
  420. package/core/server/api/v3/utils/serializers/input/index.js +0 -41
  421. package/core/server/api/v3/utils/serializers/input/integrations.js +0 -33
  422. package/core/server/api/v3/utils/serializers/input/members.js +0 -62
  423. package/core/server/api/v3/utils/serializers/input/pages.js +0 -208
  424. package/core/server/api/v3/utils/serializers/input/posts.js +0 -242
  425. package/core/server/api/v3/utils/serializers/input/settings.js +0 -168
  426. package/core/server/api/v3/utils/serializers/input/tags.js +0 -42
  427. package/core/server/api/v3/utils/serializers/input/users.js +0 -26
  428. package/core/server/api/v3/utils/serializers/input/utils/slug-filter-order.js +0 -18
  429. package/core/server/api/v3/utils/serializers/input/utils/url.js +0 -71
  430. package/core/server/api/v3/utils/serializers/input/webhooks.js +0 -12
  431. package/core/server/api/v3/utils/serializers/output/actions.js +0 -13
  432. package/core/server/api/v3/utils/serializers/output/all.js +0 -25
  433. package/core/server/api/v3/utils/serializers/output/authentication.js +0 -69
  434. package/core/server/api/v3/utils/serializers/output/authors.js +0 -21
  435. package/core/server/api/v3/utils/serializers/output/config.js +0 -25
  436. package/core/server/api/v3/utils/serializers/output/db.js +0 -40
  437. package/core/server/api/v3/utils/serializers/output/email-preview.js +0 -7
  438. package/core/server/api/v3/utils/serializers/output/emails.js +0 -13
  439. package/core/server/api/v3/utils/serializers/output/identities.js +0 -7
  440. package/core/server/api/v3/utils/serializers/output/images.js +0 -19
  441. package/core/server/api/v3/utils/serializers/output/index.js +0 -135
  442. package/core/server/api/v3/utils/serializers/output/integrations.js +0 -35
  443. package/core/server/api/v3/utils/serializers/output/invites.js +0 -24
  444. package/core/server/api/v3/utils/serializers/output/labels.js +0 -25
  445. package/core/server/api/v3/utils/serializers/output/mail.js +0 -19
  446. package/core/server/api/v3/utils/serializers/output/member-signin_urls.js +0 -7
  447. package/core/server/api/v3/utils/serializers/output/members.js +0 -228
  448. package/core/server/api/v3/utils/serializers/output/notifications.js +0 -29
  449. package/core/server/api/v3/utils/serializers/output/oembed.js +0 -8
  450. package/core/server/api/v3/utils/serializers/output/pages.js +0 -26
  451. package/core/server/api/v3/utils/serializers/output/posts.js +0 -26
  452. package/core/server/api/v3/utils/serializers/output/preview.js +0 -10
  453. package/core/server/api/v3/utils/serializers/output/redirects.js +0 -5
  454. package/core/server/api/v3/utils/serializers/output/roles.js +0 -29
  455. package/core/server/api/v3/utils/serializers/output/schedules.js +0 -5
  456. package/core/server/api/v3/utils/serializers/output/settings.js +0 -65
  457. package/core/server/api/v3/utils/serializers/output/site.js +0 -19
  458. package/core/server/api/v3/utils/serializers/output/slugs.js +0 -11
  459. package/core/server/api/v3/utils/serializers/output/snippets.js +0 -97
  460. package/core/server/api/v3/utils/serializers/output/tags.js +0 -25
  461. package/core/server/api/v3/utils/serializers/output/themes.js +0 -25
  462. package/core/server/api/v3/utils/serializers/output/users.js +0 -74
  463. package/core/server/api/v3/utils/serializers/output/utils/clean.js +0 -166
  464. package/core/server/api/v3/utils/serializers/output/utils/date.js +0 -21
  465. package/core/server/api/v3/utils/serializers/output/utils/extra-attrs.js +0 -174
  466. package/core/server/api/v3/utils/serializers/output/utils/mapper.js +0 -197
  467. package/core/server/api/v3/utils/serializers/output/utils/post-gating.js +0 -39
  468. package/core/server/api/v3/utils/serializers/output/utils/settings-type-group-mapper.js +0 -24
  469. package/core/server/api/v3/utils/serializers/output/utils/url.js +0 -67
  470. package/core/server/api/v3/utils/serializers/output/webhooks.js +0 -15
  471. package/core/server/api/v3/utils/validators/index.js +0 -9
  472. package/core/server/api/v3/utils/validators/input/images.js +0 -85
  473. package/core/server/api/v3/utils/validators/input/index.js +0 -61
  474. package/core/server/api/v3/utils/validators/input/invitations.js +0 -49
  475. package/core/server/api/v3/utils/validators/input/invites.js +0 -21
  476. package/core/server/api/v3/utils/validators/input/labels.js +0 -6
  477. package/core/server/api/v3/utils/validators/input/members.js +0 -6
  478. package/core/server/api/v3/utils/validators/input/oembed.js +0 -17
  479. package/core/server/api/v3/utils/validators/input/pages.js +0 -46
  480. package/core/server/api/v3/utils/validators/input/passwordreset.js +0 -36
  481. package/core/server/api/v3/utils/validators/input/posts.js +0 -46
  482. package/core/server/api/v3/utils/validators/input/settings.js +0 -89
  483. package/core/server/api/v3/utils/validators/input/setup.js +0 -17
  484. package/core/server/api/v3/utils/validators/input/snippets.js +0 -6
  485. package/core/server/api/v3/utils/validators/input/tags.js +0 -6
  486. package/core/server/api/v3/utils/validators/input/users.js +0 -22
  487. package/core/server/api/v3/utils/validators/input/webhooks.js +0 -27
  488. package/core/server/api/v3/utils/validators/output/index.js +0 -1
  489. package/core/server/api/v3/utils/validators/utils/json-schema.js +0 -17
  490. package/core/server/api/v3/webhooks.js +0 -130
  491. package/core/server/data/migrations/utils.js +0 -571
  492. package/core/server/data/migrations/versions/1.13/1-custom-template-post.js +0 -7
  493. package/core/server/data/migrations/versions/1.13/2-theme-permissions.js +0 -58
  494. package/core/server/data/migrations/versions/1.18/1-add-webhooks-table.js +0 -2
  495. package/core/server/data/migrations/versions/1.19/1-webhook-permissions.js +0 -31
  496. package/core/server/data/migrations/versions/1.20/1-remove-settings-keys.js +0 -65
  497. package/core/server/data/migrations/versions/1.21/1-add-contributor-role.js +0 -58
  498. package/core/server/data/migrations/versions/1.22/1-multiple-authors-DDL.js +0 -2
  499. package/core/server/data/migrations/versions/1.22/1-multiple-authors-DML.js +0 -63
  500. package/core/server/data/migrations/versions/1.25/1-update-koenig-beta-html.js +0 -70
  501. package/core/server/data/migrations/versions/1.25/2-demo-post.js +0 -55
  502. package/core/server/data/migrations/versions/1.3/1-post-excerpt.js +0 -7
  503. package/core/server/data/migrations/versions/1.4/1-codeinjection-post.js +0 -14
  504. package/core/server/data/migrations/versions/1.5/1-og-twitter-post.js +0 -34
  505. package/core/server/data/migrations/versions/1.7/1-add-backup-client.js +0 -10
  506. package/core/server/data/migrations/versions/1.9/1-add-permissions-redirect.js +0 -23
  507. package/core/server/data/migrations/versions/2.0/1-rename-amp-column.js +0 -44
  508. package/core/server/data/migrations/versions/2.0/2-update-posts.js +0 -7
  509. package/core/server/data/migrations/versions/2.0/3-remove-koenig-labs.js +0 -42
  510. package/core/server/data/migrations/versions/2.0/4-permalink-setting.js +0 -85
  511. package/core/server/data/migrations/versions/2.0/5-remove-demo-post.js +0 -85
  512. package/core/server/data/migrations/versions/2.0/6-replace-fixture-posts.js +0 -10
  513. package/core/server/data/migrations/versions/2.13/1-remove-empty-strings.js +0 -5
  514. package/core/server/data/migrations/versions/2.14/1-add-actions-table.js +0 -2
  515. package/core/server/data/migrations/versions/2.14/2-add-actions-permissions.js +0 -12
  516. package/core/server/data/migrations/versions/2.15/1-add-type-column-to-integrations.js +0 -8
  517. package/core/server/data/migrations/versions/2.15/2-insert-zapier-integration.js +0 -69
  518. package/core/server/data/migrations/versions/2.16/1-add-members-perrmissions.js +0 -1
  519. package/core/server/data/migrations/versions/2.17/1-normalize-settings.js +0 -74
  520. package/core/server/data/migrations/versions/2.17/2-posts-add-canonical-url.js +0 -7
  521. package/core/server/data/migrations/versions/2.18/1-restore-settings-from-backup.js +0 -134
  522. package/core/server/data/migrations/versions/2.2/1-add-sessions-table.js +0 -2
  523. package/core/server/data/migrations/versions/2.2/2-add-integrations-and-api-key-tables.js +0 -6
  524. package/core/server/data/migrations/versions/2.2/3-insert-admin-integration-role.js +0 -83
  525. package/core/server/data/migrations/versions/2.2/4-insert-integration-and-api-key-permissions.js +0 -77
  526. package/core/server/data/migrations/versions/2.2/5-add-mobiledoc-revisions-table.js +0 -2
  527. package/core/server/data/migrations/versions/2.21/1-update-editor-permissions.js +0 -28
  528. package/core/server/data/migrations/versions/2.22/1-add-member-permissions-to-roles.js +0 -47
  529. package/core/server/data/migrations/versions/2.27/1-insert-ghost-db-backup-role.js +0 -83
  530. package/core/server/data/migrations/versions/2.27/2-insert-db-backup-integration.js +0 -69
  531. package/core/server/data/migrations/versions/2.27/3-add-subdirectory-to-relative-canonical-urls.js +0 -100
  532. package/core/server/data/migrations/versions/2.28/1-add-db-backup-content-permission.js +0 -9
  533. package/core/server/data/migrations/versions/2.28/2-add-db-backup-content-permission-to-roles.js +0 -15
  534. package/core/server/data/migrations/versions/2.28/3-insert-ghost-scheduler-role.js +0 -84
  535. package/core/server/data/migrations/versions/2.28/4-insert-scheduler-integration.js +0 -69
  536. package/core/server/data/migrations/versions/2.28/5-add-scheduler-permission-to-roles.js +0 -23
  537. package/core/server/data/migrations/versions/2.28/6-add-type-column.js +0 -6
  538. package/core/server/data/migrations/versions/2.28/7-populate-type-column.js +0 -6
  539. package/core/server/data/migrations/versions/2.28/8-remove-page-column.js +0 -6
  540. package/core/server/data/migrations/versions/2.29/1-add-post-page-column.js +0 -20
  541. package/core/server/data/migrations/versions/2.29/2-populate-post-page-column.js +0 -98
  542. package/core/server/data/migrations/versions/2.29/3-remove-page-type-column.js +0 -15
  543. package/core/server/data/migrations/versions/2.3/1-add-webhook-columns.js +0 -45
  544. package/core/server/data/migrations/versions/2.3/2-add-webhook-edit-permission.js +0 -9
  545. package/core/server/data/migrations/versions/2.31/1-remove-name-and-password-from-members-table.js +0 -15
  546. package/core/server/data/migrations/versions/2.32/01-add-members-stripe-customers-table.js +0 -4
  547. package/core/server/data/migrations/versions/2.32/02-add-name-to-members-table.js +0 -7
  548. package/core/server/data/migrations/versions/2.33/01-correct-members-stripe-customers-table.js +0 -37
  549. package/core/server/data/migrations/versions/2.34/01-add-stripe-customers-subscriptions-table.js +0 -2
  550. package/core/server/data/migrations/versions/2.34/02-add-email-to-members-stripe-customers-table.js +0 -7
  551. package/core/server/data/migrations/versions/2.34/03-add-name-to-members-stripe-customers-table.js +0 -7
  552. package/core/server/data/migrations/versions/2.35/01-add-note-to-members-table.js +0 -7
  553. package/core/server/data/migrations/versions/2.37/01-add-self-signup-and-from address-to-members-settings.js +0 -67
  554. package/core/server/data/migrations/versions/2.6/1-add-webhook-permission-roles.js +0 -31
  555. package/core/server/data/migrations/versions/2.8/1-add-members-table.js +0 -2
  556. package/core/server/data/migrations/versions/3.0/01-remove-user-ghost-auth-columns.js +0 -14
  557. package/core/server/data/migrations/versions/3.0/02-drop-token-auth-tables.js +0 -31
  558. package/core/server/data/migrations/versions/3.0/03-drop-client-auth-tables.js +0 -35
  559. package/core/server/data/migrations/versions/3.0/04-add-posts-meta-table.js +0 -2
  560. package/core/server/data/migrations/versions/3.0/05-populate-posts-meta-table.js +0 -83
  561. package/core/server/data/migrations/versions/3.0/06-remove-posts-meta-columns.js +0 -44
  562. package/core/server/data/migrations/versions/3.0/07-add-posts-type-column.js +0 -8
  563. package/core/server/data/migrations/versions/3.0/08-populate-posts-type-column.js +0 -94
  564. package/core/server/data/migrations/versions/3.0/09-remove-posts-page-column.js +0 -7
  565. package/core/server/data/migrations/versions/3.0/10-remove-empty-strings.js +0 -81
  566. package/core/server/data/migrations/versions/3.0/11-update-posts-html.js +0 -7
  567. package/core/server/data/migrations/versions/3.0/12-populate-members-table-from-subscribers.js +0 -54
  568. package/core/server/data/migrations/versions/3.0/13-drop-subscribers-table.js +0 -34
  569. package/core/server/data/migrations/versions/3.0/14-remove-subscribers-flag.js +0 -24
  570. package/core/server/data/migrations/versions/3.1/01-add-send-email-when-published-to-posts.js +0 -7
  571. package/core/server/data/migrations/versions/3.1/02-add-email-subject-to-posts-meta.js +0 -7
  572. package/core/server/data/migrations/versions/3.1/03-add-email-preview-permissions.js +0 -18
  573. package/core/server/data/migrations/versions/3.1/04-add-subscribed-flag-to-members.js +0 -7
  574. package/core/server/data/migrations/versions/3.1/05-add-emails-table.js +0 -2
  575. package/core/server/data/migrations/versions/3.1/06-add-email-permissions.js +0 -15
  576. package/core/server/data/migrations/versions/3.1/07-add-uuid-field-to-members.js +0 -8
  577. package/core/server/data/migrations/versions/3.1/08-add-uuid-values-to-members.js +0 -23
  578. package/core/server/data/migrations/versions/3.1/09-add-further-email-permissions.js +0 -25
  579. package/core/server/data/migrations/versions/3.1/10-add-email-error-data-column.js +0 -8
  580. package/core/server/data/migrations/versions/3.11/01-remove-broken-complimentary-plan-from-members-settings.js +0 -68
  581. package/core/server/data/migrations/versions/3.12/01-add-identity-permission.js +0 -7
  582. package/core/server/data/migrations/versions/3.12/02-remove-legacy-is-paid-flag-from-settings.js +0 -93
  583. package/core/server/data/migrations/versions/3.18/01-add-email-preview-permissions-to-roles.js +0 -39
  584. package/core/server/data/migrations/versions/3.18/02-add-members_stripe_connect-auth-permissions.js +0 -7
  585. package/core/server/data/migrations/versions/3.19/01-update-member-from-email-address.js +0 -91
  586. package/core/server/data/migrations/versions/3.2/01-add-cancel-at-period-end-to-subscriptions.js +0 -7
  587. package/core/server/data/migrations/versions/3.22/01-removed-legacy-values-from-settings-table.js +0 -65
  588. package/core/server/data/migrations/versions/3.22/02-settings-key-renames.js +0 -90
  589. package/core/server/data/migrations/versions/3.22/03-add-group-and-flags-to-settings.js +0 -15
  590. package/core/server/data/migrations/versions/3.22/04-populate-settings-groups-and-flags.js +0 -194
  591. package/core/server/data/migrations/versions/3.22/05-migrate-members-subscription-settings.js +0 -182
  592. package/core/server/data/migrations/versions/3.22/06-migrate-stripe-connect-settings.js +0 -132
  593. package/core/server/data/migrations/versions/3.22/07-update-type-for-settings.js +0 -137
  594. package/core/server/data/migrations/versions/3.23/01-migrate-bulk-email-settings.js +0 -65
  595. package/core/server/data/migrations/versions/3.23/02-remove-bulk-email-settings.js +0 -48
  596. package/core/server/data/migrations/versions/3.23/03-update-portal-button-setting.js +0 -24
  597. package/core/server/data/migrations/versions/3.23/04-add-meta-columns-to-tags-table.js +0 -54
  598. package/core/server/data/migrations/versions/3.24/01-populate-group-for-new-portal-settings.js +0 -38
  599. package/core/server/data/migrations/versions/3.25/01-add-members-stripe-webhook-settings.js +0 -22
  600. package/core/server/data/migrations/versions/3.26/01-add-amp-gtag-id-setting.js +0 -20
  601. package/core/server/data/migrations/versions/3.29/01-remove-duplicate-subscriptions.js +0 -53
  602. package/core/server/data/migrations/versions/3.29/02-remove-duplicate-customers.js +0 -53
  603. package/core/server/data/migrations/versions/3.29/03-remove-orphaned-customers.js +0 -35
  604. package/core/server/data/migrations/versions/3.29/04-remove-orphaned-subscriptions.js +0 -35
  605. package/core/server/data/migrations/versions/3.29/05-add-member-constraints.js +0 -177
  606. package/core/server/data/migrations/versions/3.30/01-add-member-signin-url-permission-roles.js +0 -8
  607. package/core/server/data/migrations/versions/3.32/01-add-member-support-address-setting.js +0 -27
  608. package/core/server/data/migrations/versions/3.32/02-add-member-reply-address-setting.js +0 -20
  609. package/core/server/data/migrations/versions/3.32/03-add-routes-hash-setting.js +0 -20
  610. package/core/server/data/migrations/versions/3.33/01-add-email-recipients-tables.js +0 -8
  611. package/core/server/data/migrations/versions/3.34/01-add-tokens-table.js +0 -2
  612. package/core/server/data/migrations/versions/3.35/01-add-address-columns-to-emails-table.js +0 -14
  613. package/core/server/data/migrations/versions/3.36/01-add-snippets-table.js +0 -2
  614. package/core/server/data/migrations/versions/3.36/02-add-snippets-permissions.js +0 -56
  615. package/core/server/data/migrations/versions/3.37/01-update-portal-button-setting.js +0 -30
  616. package/core/server/data/migrations/versions/3.38/01-add-email-recipient-filter-column.js +0 -8
  617. package/core/server/data/migrations/versions/3.38/02-populate-email-recipient-filter-column.js +0 -34
  618. package/core/server/data/migrations/versions/3.38/03-add-recipient-filter-column.js +0 -8
  619. package/core/server/data/migrations/versions/3.38/04-populate-recipient-filter-column.js +0 -49
  620. package/core/server/data/migrations/versions/3.38/05-add-emails-track-opens-column.js +0 -7
  621. package/core/server/data/migrations/versions/3.38/06-add-newsletter-settings.js +0 -16
  622. package/core/server/data/migrations/versions/3.38/07-migrate-newsletter-settings-from-config.js +0 -48
  623. package/core/server/data/migrations/versions/3.38/08-repopulate-send-email-when-published-down-migration.js +0 -25
  624. package/core/server/data/migrations/versions/3.38/09-remove-send-email-when-published-column.js +0 -7
  625. package/core/server/data/migrations/versions/3.39/01-add-members-signup-redirect-settings.js +0 -16
  626. package/core/server/data/migrations/versions/3.39/02-add-user-id-to-api-keys-table.js +0 -7
  627. package/core/server/data/migrations/versions/3.39/03-add-email-track-opens-setting.js +0 -16
  628. package/core/server/data/migrations/versions/3.39/04-add-cancellation-reason-column.js +0 -7
  629. package/core/server/data/migrations/versions/3.39/05-remove-unused-columns-on-emails.js +0 -14
  630. package/core/server/data/migrations/versions/3.39/06-add-email-recipient-index.js +0 -58
  631. package/core/server/data/migrations/versions/3.39/07-add-email-recipients-event-timestamps.js +0 -19
  632. package/core/server/data/migrations/versions/3.39/08-add-email-stats-columns.js +0 -22
  633. package/core/server/data/migrations/versions/3.40/01-add-members-email-open-rate-column.js +0 -8
  634. package/core/server/data/migrations/versions/3.40/02-add members-email-aggregation-columns.js +0 -16
  635. package/core/server/data/migrations/versions/3.40/03-populate-members-email-counts.js +0 -15
  636. package/core/server/data/migrations/versions/3.41/01-add-firstpromoter-settings.js +0 -16
  637. package/core/server/data/migrations/versions/3.6/1-add-labels-table.js +0 -2
  638. package/core/server/data/migrations/versions/3.6/2-add-members-labels-table.js +0 -2
  639. package/core/server/data/migrations/versions/3.6/3-add-labels-permissions.js +0 -47
  640. package/core/server/data/migrations/versions/3.7/01-fix-incorrect-member-labels-foreign-keys.js +0 -46
  641. package/core/server/data/migrations/versions/3.8/01-add-geolocation-to-members.js +0 -7
  642. package/core/server/data/migrations/versions/3.9/01-add-member-sigin-url-permissions.js +0 -7
  643. package/core/server/services/mail/utils.js +0 -34
  644. package/core/server/services/url/configs/canary.js +0 -143
  645. package/core/server/services/url/configs/v3.js +0 -141
  646. package/core/server/services/url/configs/v4.js +0 -143
  647. package/core/server/web/api/v2/admin/app.js +0 -43
  648. package/core/server/web/api/v2/admin/middleware.js +0 -85
  649. package/core/server/web/api/v2/admin/routes.js +0 -200
  650. package/core/server/web/api/v2/content/app.js +0 -38
  651. package/core/server/web/api/v2/content/middleware.js +0 -23
  652. package/core/server/web/api/v2/content/routes.js +0 -37
  653. package/core/server/web/api/v3/admin/app.js +0 -43
  654. package/core/server/web/api/v3/admin/middleware.js +0 -89
  655. package/core/server/web/api/v3/admin/routes.js +0 -267
  656. package/core/server/web/api/v3/content/app.js +0 -38
  657. package/core/server/web/api/v3/content/middleware.js +0 -23
  658. package/core/server/web/api/v3/content/routes.js +0 -37
  659. package/core/server/web/oauth/app.js +0 -153
  660. package/core/server/web/oauth/index.js +0 -1
@@ -108,8 +108,8 @@ async function doSettings(data, settingsAPI) {
108
108
  }
109
109
 
110
110
  // Update names for default product and newsletter to site title
111
- async function doProductAndNewsletter(data, api) {
112
- const {products: productsAPI, newsletters: newslettersAPI} = api;
111
+ async function doTiersAndNewsletter(data, api) {
112
+ const {tiers: tiersAPI, newsletters: newslettersAPI} = api;
113
113
  const context = {context: {user: data.user.id}};
114
114
  const user = data.user;
115
115
  const blogTitle = data.userData.blogTitle;
@@ -118,16 +118,16 @@ async function doProductAndNewsletter(data, api) {
118
118
  return user;
119
119
  }
120
120
  try {
121
- const productPage = await productsAPI.browse({limit: 'all'});
121
+ const tierPage = await tiersAPI.browse({limit: 'all'});
122
122
  const newsletterPage = await newslettersAPI.browse({limit: 'all'});
123
123
 
124
- const defaultProduct = productPage.products.find(p => p.slug === 'default-product');
124
+ const defaultTier = tierPage.tiers.find(p => p.slug === 'default-product');
125
125
  const defaultNewsletter = newsletterPage.newsletters.find(p => p.slug === 'default-newsletter');
126
126
 
127
- if (defaultProduct) {
128
- await productsAPI.edit({products: [{
127
+ if (defaultTier) {
128
+ await tiersAPI.edit({tiers: [{
129
129
  name: blogTitle.trim()
130
- }]}, {context: context.context, id: defaultProduct.id});
130
+ }]}, {context: context.context, id: defaultTier.id});
131
131
  }
132
132
 
133
133
  if (defaultNewsletter) {
@@ -231,7 +231,7 @@ module.exports = {
231
231
  assertSetupCompleted: assertSetupCompleted,
232
232
  setupUser: setupUser,
233
233
  doSettings: doSettings,
234
- doProductAndNewsletter: doProductAndNewsletter,
234
+ doProductAndNewsletter: doTiersAndNewsletter,
235
235
  installTheme: installTheme,
236
236
  doFixtures: doFixtures,
237
237
  sendWelcomeEmail: sendWelcomeEmail
@@ -167,6 +167,9 @@ module.exports = {
167
167
  await emailBatchModel.save({status: 'submitting'}, knexOptions);
168
168
 
169
169
  try {
170
+ // Load newsletter data on email
171
+ await emailBatchModel.relations.email.related('newsletter').fetch(Object.assign({}, {require: false}, knexOptions));
172
+
170
173
  // send the email
171
174
  const sendResponse = await this.send(emailBatchModel.relations.email.toJSON(), recipientRows, memberSegment);
172
175
 
@@ -217,11 +220,12 @@ module.exports = {
217
220
 
218
221
  // collate static and dynamic data for each recipient ready for provider
219
222
  const recipientData = {};
223
+ const newsletterUuid = emailData.newsletter ? emailData.newsletter.uuid : null;
220
224
  recipients.forEach((recipient) => {
221
225
  // static data for every recipient
222
226
  const data = {
223
227
  unique_id: recipient.member_uuid,
224
- unsubscribe_url: postEmailSerializer.createUnsubscribeUrl(recipient.member_uuid)
228
+ unsubscribe_url: postEmailSerializer.createUnsubscribeUrl(recipient.member_uuid, newsletterUuid)
225
229
  };
226
230
 
227
231
  // computed properties on recipients - TODO: better way of handling these
@@ -0,0 +1,27 @@
1
+ const errors = require('@tryghost/errors');
2
+ const logging = require('@tryghost/logging');
3
+
4
+ class FrontendDataService {
5
+ constructor({IntegrationModel}) {
6
+ this.IntegrationModel = IntegrationModel;
7
+ this.frontendKey = null;
8
+ }
9
+
10
+ async getFrontendKey() {
11
+ if (this.frontendKey) {
12
+ return this.frontendKey;
13
+ }
14
+
15
+ try {
16
+ const key = await this.IntegrationModel.getInternalFrontendKey();
17
+ this.frontendKey = key.toJSON().api_keys[0].secret;
18
+ } catch (error) {
19
+ this.frontendKey = null;
20
+ logging.error(new errors.InternalServerError({message: 'Unable to find the internal frontend key', err: error}));
21
+ }
22
+
23
+ return this.frontendKey;
24
+ }
25
+ }
26
+
27
+ module.exports = FrontendDataService;
@@ -0,0 +1,6 @@
1
+ const models = require('../../models');
2
+ const FrontendDataService = require('./frontend-data-service');
3
+
4
+ module.exports.init = () => {
5
+ return new FrontendDataService({IntegrationModel: models.Integration});
6
+ };
@@ -1,2 +1,15 @@
1
+ const path = require('path');
2
+ const urlUtils = require('../../../shared/url-utils');
3
+ const settingsCache = require('../../../shared/settings-cache');
4
+ const EmailContentGenerator = require('@tryghost/email-content-generator');
5
+
6
+ const emailContentGenerator = new EmailContentGenerator({
7
+ getSiteUrl: () => urlUtils.urlFor('home', true),
8
+ getSiteTitle: () => settingsCache.get('title'),
9
+ templatesDir: path.resolve(__dirname, '..', 'mail', 'templates')
10
+ });
11
+
1
12
  exports.GhostMailer = require('./GhostMailer');
2
- exports.utils = require('./utils');
13
+ exports.utils = {
14
+ generateContent: emailContentGenerator.getContent.bind(emailContentGenerator)
15
+ };
@@ -2,26 +2,25 @@ const postEmailSerializer = require('./post-email-serializer');
2
2
  const models = require('../../models');
3
3
 
4
4
  class EmailPreview {
5
- /**
6
- * @constructor
7
- * @param {Object} options
8
- * @param {String} options.apiVersion
9
- */
10
- constructor({apiVersion}) {
11
- this.apiVersion = apiVersion;
12
- }
13
-
14
5
  /**
15
6
  * @param {Object} post - Post model object instance
16
- * @param {String} memberSegment - member segment filter
7
+ * @param {Object} options
8
+ * @param {String} options.newsletter - newsletter slug
9
+ * @param {String} options.memberSegment - member segment filter
17
10
  * @returns {Promise<Object>}
18
11
  */
19
- async generateEmailContent(post, memberSegment) {
20
- const newsletter = await models.Newsletter.getDefaultNewsletter();
12
+ async generateEmailContent(post, {newsletter, memberSegment} = {}) {
13
+ let newsletterModel = post.relations.newsletter ?? await post.related('newsletter').fetch();
14
+ if (!newsletterModel) {
15
+ if (newsletter) {
16
+ newsletterModel = await models.Newsletter.findOne({slug: newsletter});
17
+ } else {
18
+ newsletterModel = await models.Newsletter.getDefaultNewsletter();
19
+ }
20
+ }
21
21
 
22
- let emailContent = await postEmailSerializer.serialize(post, newsletter, {
23
- isBrowserPreview: true,
24
- apiVersion: this.apiVersion
22
+ let emailContent = await postEmailSerializer.serialize(post, newsletterModel, {
23
+ isBrowserPreview: true
25
24
  });
26
25
 
27
26
  if (memberSegment) {
@@ -17,7 +17,6 @@ const models = require('../../models');
17
17
  const postEmailSerializer = require('./post-email-serializer');
18
18
  const labs = require('../../../shared/labs');
19
19
  const {getSegmentsFromHtml} = require('./segment-parser');
20
- const labsService = require('../../../shared/labs');
21
20
 
22
21
  // Used to listen to email.added and email.edited model events originally, I think to offload this - ideally would just use jobs now if possible
23
22
  const events = require('../../lib/common/events');
@@ -28,6 +27,7 @@ const messages = {
28
27
  noneFilterError: 'Cannot send email to "none" {property}',
29
28
  emailSendingDisabled: `Email sending is temporarily disabled because your account is currently in review. You should have an email about this from us already, but you can also reach us any time at support@ghost.org`,
30
29
  sendEmailRequestFailed: 'The email service was unable to send an email batch.',
30
+ archivedNewsletterError: 'Cannot send email to archived newsletters',
31
31
  newsletterVisibilityError: 'Unexpected visibility value "{value}". Use one of the valid: "members", "paid".'
32
32
  };
33
33
 
@@ -51,11 +51,11 @@ const getReplyToAddress = (fromAddress, replyAddressOption) => {
51
51
  *
52
52
  * @param {Object} postModel - post model instance
53
53
  * @param {Object} options
54
- * @param {ValidAPIVersion} options.apiVersion - api version to be used when serializing email data
55
54
  */
56
55
  const getEmailData = async (postModel, options) => {
57
- let newsletter = postModel.relations.newsletter ? postModel.relations.newsletter : (await postModel.related('newsletter').fetch());
56
+ let newsletter = postModel.relations.newsletter ?? await postModel.related('newsletter').fetch();
58
57
  if (!newsletter) {
58
+ // The postModel doesn't have a newsletter in test emails
59
59
  newsletter = await models.Newsletter.getDefaultNewsletter();
60
60
  }
61
61
  const {subject, html, plaintext} = await postEmailSerializer.serialize(postModel, newsletter, options);
@@ -83,11 +83,10 @@ const getEmailData = async (postModel, options) => {
83
83
  *
84
84
  * @param {Object} postModel - post model instance
85
85
  * @param {[string]} toEmails - member email addresses to send email to
86
- * @param {ValidAPIVersion} apiVersion - api version to be used when serializing email data
87
86
  * @param {ValidMemberSegment} [memberSegment]
88
87
  */
89
- const sendTestEmail = async (postModel, toEmails, apiVersion, memberSegment) => {
90
- let emailData = await getEmailData(postModel, {apiVersion});
88
+ const sendTestEmail = async (postModel, toEmails, memberSegment) => {
89
+ let emailData = await getEmailData(postModel);
91
90
  emailData.subject = `[Test] ${emailData.subject}`;
92
91
 
93
92
  if (memberSegment) {
@@ -134,28 +133,14 @@ const sendTestEmail = async (postModel, toEmails, apiVersion, memberSegment) =>
134
133
  *
135
134
  * Accepts a filter string, errors on unexpected legacy filter syntax and enforces subscribed:true
136
135
  *
136
+ * @param {Object} newsletter
137
137
  * @param {string} emailRecipientFilter NQL filter for members
138
- * @param {object} options
138
+ * @param {string} errorProperty
139
139
  */
140
- const transformEmailRecipientFilter = (emailRecipientFilter, {errorProperty = 'email_recipient_filter'} = {}, newsletter = null) => {
141
- let filter = [];
142
-
143
- if (!newsletter) {
144
- filter.push(`subscribed:true`);
145
- } else {
146
- filter.push(`newsletters.id:${newsletter.id}`);
147
- }
140
+ const transformEmailRecipientFilter = (newsletter, emailRecipientFilter, errorProperty) => {
141
+ const filter = [`newsletters.id:${newsletter.id}`];
148
142
 
149
143
  switch (emailRecipientFilter) {
150
- // `paid` and `free` were swapped out for NQL filters in 4.5.0, we shouldn't see them here now
151
- case 'paid':
152
- case 'free':
153
- throw new errors.InternalServerError({
154
- message: tpl(messages.unexpectedFilterError, {
155
- property: errorProperty,
156
- value: emailRecipientFilter
157
- })
158
- });
159
144
  case 'all':
160
145
  break;
161
146
  case 'none':
@@ -169,22 +154,20 @@ const transformEmailRecipientFilter = (emailRecipientFilter, {errorProperty = 'e
169
154
  break;
170
155
  }
171
156
 
172
- if (newsletter) {
173
- const visibility = newsletter.get('visibility');
174
- switch (visibility) {
175
- case 'members':
176
- // No need to add a member status filter as the email is available to all members
177
- break;
178
- case 'paid':
179
- filter.push(`status:-free`);
180
- break;
181
- default:
182
- throw new errors.InternalServerError({
183
- message: tpl(messages.newsletterVisibilityError, {
184
- value: visibility
185
- })
186
- });
187
- }
157
+ const visibility = newsletter.get('visibility');
158
+ switch (visibility) {
159
+ case 'members':
160
+ // No need to add a member status filter as the email is available to all members
161
+ break;
162
+ case 'paid':
163
+ filter.push(`status:-free`);
164
+ break;
165
+ default:
166
+ throw new errors.InternalServerError({
167
+ message: tpl(messages.newsletterVisibilityError, {
168
+ value: visibility
169
+ })
170
+ });
188
171
  }
189
172
 
190
173
  return filter.join('+');
@@ -198,8 +181,6 @@ const transformEmailRecipientFilter = (emailRecipientFilter, {errorProperty = 'e
198
181
  *
199
182
  * @param {object} postModel Post Model Object
200
183
  * @param {object} options
201
- * @param {ValidAPIVersion} options.apiVersion - api version to be used when serializing email data
202
- * @param {string} options.newsletter_id - the newsletter_id to send the email to
203
184
  */
204
185
 
205
186
  const addEmail = async (postModel, options) => {
@@ -216,10 +197,19 @@ const addEmail = async (postModel, options) => {
216
197
  const knexOptions = _.pick(options, ['transacting', 'forUpdate']);
217
198
  const filterOptions = {...knexOptions, limit: 1};
218
199
 
219
- const newsletter = postModel.relations.newsletter ? postModel.relations.newsletter : (await postModel.related('newsletter').fetch({require: true, ..._.pick(options, ['transacting'])}));
200
+ // TODO: this is a hack for https://github.com/TryGhost/Team/issues/1626
201
+ const newsletter = postModel.relations.newsletter ?? await postModel.related('newsletter').fetch({require: true, ..._.pick(options, ['transacting'])});
202
+
203
+ if (newsletter.get('status') !== 'active') {
204
+ // A post might have been scheduled to an archived newsletter.
205
+ // Don't send it (people can't unsubscribe any longer).
206
+ throw new errors.EmailError({
207
+ message: tpl(messages.archivedNewsletterError)
208
+ });
209
+ }
220
210
 
221
211
  const emailRecipientFilter = postModel.get('email_recipient_filter');
222
- filterOptions.filter = transformEmailRecipientFilter(emailRecipientFilter, {errorProperty: 'email_recipient_filter'}, newsletter);
212
+ filterOptions.filter = transformEmailRecipientFilter(newsletter, emailRecipientFilter, 'email_segment');
223
213
 
224
214
  const startRetrieve = Date.now();
225
215
  debug('addEmail: retrieving members count');
@@ -426,11 +416,8 @@ async function getEmailMemberRows({emailModel, memberSegment, options}) {
426
416
  const knexOptions = _.pick(options, ['transacting', 'forUpdate']);
427
417
  const filterOptions = Object.assign({}, knexOptions);
428
418
 
429
- let newsletter = null;
430
- if (labsService.isSet('multipleNewsletters')) {
431
- newsletter = emailModel.relations.newsletter ? emailModel.relations.newsletter : (await emailModel.related('newsletter').fetch(Object.assign({}, {require: false}, _.pick(options, ['transacting']))));
432
- }
433
- const recipientFilter = transformEmailRecipientFilter(emailModel.get('recipient_filter'), {errorProperty: 'recipient_filter'}, newsletter);
419
+ const newsletter = emailModel.relations.newsletter ?? await emailModel.related('newsletter').fetch(Object.assign({}, {require: true}, _.pick(options, ['transacting'])));
420
+ const recipientFilter = transformEmailRecipientFilter(newsletter, emailModel.get('recipient_filter'), 'recipient_filter');
434
421
  filterOptions.filter = recipientFilter;
435
422
 
436
423
  if (memberSegment) {
@@ -609,11 +596,9 @@ module.exports = {
609
596
  _partitionMembersBySegment: partitionMembersBySegment,
610
597
  _getEmailMemberRows: getEmailMemberRows,
611
598
  _getFromAddress: getFromAddress,
612
- _getReplyToAddress: getReplyToAddress,
613
- _sendEmailJob: sendEmailJob
599
+ _getReplyToAddress: getReplyToAddress
614
600
  };
615
601
 
616
602
  /**
617
- * @typedef {'v2' | 'v3' | 'v4' | 'canary' } ValidAPIVersion
618
603
  * @typedef {'status:free' | 'status:-free'} ValidMemberSegment
619
604
  */
@@ -3,10 +3,11 @@ const template = require('./template');
3
3
  const settingsCache = require('../../../shared/settings-cache');
4
4
  const urlUtils = require('../../../shared/url-utils');
5
5
  const moment = require('moment-timezone');
6
- const api = require('../../api');
6
+ const api = require('../../api').endpoints;
7
+ const apiShared = require('../../api').shared;
7
8
  const {URL} = require('url');
8
9
  const mobiledocLib = require('../../lib/mobiledoc');
9
- const htmlToText = require('html-to-text');
10
+ const htmlToPlaintext = require('../../../shared/html-to-plaintext');
10
11
  const {isUnsplashImage, isLocalContentImage} = require('@tryghost/kg-default-cards/lib/utils');
11
12
  const {textColorForBackgroundColor, darkenToContrastThreshold} = require('@tryghost/color-utils');
12
13
  const logging = require('@tryghost/logging');
@@ -48,29 +49,16 @@ const getSite = () => {
48
49
  });
49
50
  };
50
51
 
51
- const htmlToPlaintext = (html) => {
52
- // same options as used in Post model for generating plaintext but without `wordwrap: 80`
53
- // to avoid replacement strings being split across lines and for mail clients to handle
54
- // word wrapping based on user preferences
55
- return htmlToText.fromString(html, {
56
- wordwrap: false,
57
- ignoreImage: true,
58
- hideLinkHrefIfSameAsText: true,
59
- preserveNewlines: true,
60
- returnDomByDefault: true,
61
- uppercaseHeadings: false
62
- });
63
- };
64
-
65
52
  /**
66
53
  * createUnsubscribeUrl
67
54
  *
68
- * Takes a member uuid and returns the url that should be used to unsubscribe
55
+ * Takes a member and newsletter uuid. Returns the url that should be used to unsubscribe
69
56
  * In case of no member uuid, generates the preview unsubscribe url - `?preview=1`
70
57
  *
71
- * @param {string} uuid
58
+ * @param {string} uuid post uuid
59
+ * @param {string} newsletterUuid newsletter uuid
72
60
  */
73
- const createUnsubscribeUrl = (uuid) => {
61
+ const createUnsubscribeUrl = (uuid, newsletterUuid) => {
74
62
  const siteUrl = urlUtils.getSiteUrl();
75
63
  const unsubscribeUrl = new URL(siteUrl);
76
64
  unsubscribeUrl.pathname = `${unsubscribeUrl.pathname}/unsubscribe/`.replace('//', '/');
@@ -79,21 +67,23 @@ const createUnsubscribeUrl = (uuid) => {
79
67
  } else {
80
68
  unsubscribeUrl.searchParams.set('preview', '1');
81
69
  }
70
+ if (newsletterUuid) {
71
+ unsubscribeUrl.searchParams.set('newsletter', newsletterUuid);
72
+ }
82
73
 
83
74
  return unsubscribeUrl.href;
84
75
  };
85
76
 
86
- // NOTE: serialization is needed to make sure we are using current API and do post transformations
87
- // such as image URL transformation from relative to absolute
88
- const serializePostModel = async (model, apiVersion = 'v4') => {
77
+ // NOTE: serialization is needed to make sure we do post transformations such as image URL transformation from relative to absolute
78
+ const serializePostModel = async (model) => {
89
79
  // fetch mobiledoc rather than html and plaintext so we can render email-specific contents
90
80
  const frame = {options: {context: {user: true}, formats: 'mobiledoc'}};
91
81
  const docName = 'posts';
92
82
 
93
- await api.shared
83
+ await apiShared
94
84
  .serializers
95
85
  .handle
96
- .output(model, {docName: docName, method: 'read'}, api[apiVersion].serializers.output, frame);
86
+ .output(model, {docName: docName, method: 'read'}, api.serializers.output, frame);
97
87
 
98
88
  return frame.response[docName][0];
99
89
  };
@@ -222,8 +212,8 @@ const getTemplateSettings = async (newsletter) => {
222
212
  return templateSettings;
223
213
  };
224
214
 
225
- const serialize = async (postModel, newsletter, options = {isBrowserPreview: false, apiVersion: 'v4'}) => {
226
- const post = await serializePostModel(postModel, options.apiVersion);
215
+ const serialize = async (postModel, newsletter, options = {isBrowserPreview: false}) => {
216
+ const post = await serializePostModel(postModel);
227
217
 
228
218
  const timezone = settingsCache.get('timezone');
229
219
  const momentDate = post.published_at ? moment(post.published_at) : moment();
@@ -258,7 +248,7 @@ const serialize = async (postModel, newsletter, options = {isBrowserPreview: fal
258
248
  `).remove();
259
249
  post.html = _cheerio('body').html();
260
250
 
261
- post.plaintext = htmlToPlaintext(post.html);
251
+ post.plaintext = htmlToPlaintext.email(post.html);
262
252
 
263
253
  // Outlook will render feature images at full-size breaking the layout.
264
254
  // Content images fix this by rendering max 600px images - do the same for feature image here
@@ -331,7 +321,7 @@ function renderEmailForSegment(email, memberSegment) {
331
321
  });
332
322
 
333
323
  result.html = formatHtmlForEmail($.html());
334
- result.plaintext = htmlToPlaintext(result.html);
324
+ result.plaintext = htmlToPlaintext.email(result.html);
335
325
 
336
326
  return result;
337
327
  }
@@ -170,9 +170,6 @@ function createApiInstance(config) {
170
170
  }
171
171
  }
172
172
  },
173
- paymentConfig: {
174
- stripe: config.getStripePaymentConfig()
175
- },
176
173
  models: {
177
174
  EmailRecipient: models.EmailRecipient,
178
175
  StripeCustomer: models.MemberStripeCustomer,
@@ -53,36 +53,6 @@ class MembersConfigProvider {
53
53
  return this.getEmailSupportAddress() || this.getEmailFromAddress();
54
54
  }
55
55
 
56
- getPublicPlans() {
57
- const defaultPriceData = {
58
- monthly: 0,
59
- yearly: 0,
60
- currency: 'USD'
61
- };
62
-
63
- try {
64
- const plans = this._settingsCache.get('stripe_plans') || [];
65
-
66
- const priceData = plans.reduce((prices, plan) => {
67
- const numberAmount = 0 + plan.amount;
68
- const dollarAmount = numberAmount ? Math.round(numberAmount / 100) : 0;
69
- return Object.assign(prices, {
70
- [plan.name.toLowerCase()]: dollarAmount
71
- });
72
- }, {});
73
-
74
- priceData.currency = plans[0].currency || 'USD';
75
-
76
- if (Number.isInteger(priceData.monthly) && Number.isInteger(priceData.yearly)) {
77
- return priceData;
78
- }
79
-
80
- return defaultPriceData;
81
- } catch (err) {
82
- return defaultPriceData;
83
- }
84
- }
85
-
86
56
  /**
87
57
  * @param {'direct' | 'connect'} type - The "type" of keys to fetch from settings
88
58
  * @returns {{publicKey: string, secretKey: string} | null}
@@ -128,25 +98,6 @@ class MembersConfigProvider {
128
98
  return this.getActiveStripeKeys() !== null;
129
99
  }
130
100
 
131
- getStripePaymentConfig() {
132
- if (!this.isStripeConnected()) {
133
- return null;
134
- }
135
-
136
- const stripeApiKeys = this.getActiveStripeKeys();
137
-
138
- if (!stripeApiKeys) {
139
- return null;
140
- }
141
-
142
- return {
143
- product: {
144
- name: this._settingsCache.get('stripe_product_name')
145
- },
146
- plans: this._settingsCache.get('stripe_plans') || []
147
- };
148
- }
149
-
150
101
  getAuthSecret() {
151
102
  const hexSecret = this._settingsCache.get('members_email_auth_secret');
152
103
  if (!hexSecret) {
@@ -22,7 +22,7 @@ module.exports = async function (options) {
22
22
  // Include mongoTransformer to apply subscribed:{true|false} => newsletter relation mapping
23
23
  Object.assign(filterOptions, _.pick(options, ['filter', 'search', 'mongoTransformer']));
24
24
  }
25
-
25
+
26
26
  const memberRows = await models.Member.getFilteredCollectionQuery(filterOptions)
27
27
  .select('members.id')
28
28
  .distinct();
@@ -42,7 +42,7 @@ module.exports = async function (options) {
42
42
  END) as subscribed
43
43
  `))
44
44
  .select(knex.raw(`
45
- (SELECT GROUP_CONCAT(product_id) FROM members_products f WHERE f.member_id = members.id) as products
45
+ (SELECT GROUP_CONCAT(product_id) FROM members_products f WHERE f.member_id = members.id) as tiers
46
46
  `))
47
47
  .select(knex.raw(`
48
48
  (SELECT GROUP_CONCAT(label_id) FROM members_labels f WHERE f.member_id = members.id) as labels
@@ -57,14 +57,14 @@ module.exports = async function (options) {
57
57
 
58
58
  const rows = await query;
59
59
  for (const row of rows) {
60
- const productIds = row.products ? row.products.split(',') : [];
61
- const products = productIds.map((id) => {
62
- const product = allProducts.find(p => p.id === id);
60
+ const tierIds = row.tiers ? row.tiers.split(',') : [];
61
+ const tiers = tierIds.map((id) => {
62
+ const tier = allProducts.find(p => p.id === id);
63
63
  return {
64
- name: product.get('name')
64
+ name: tier.get('name')
65
65
  };
66
66
  });
67
- row.products = products;
67
+ row.tiers = tiers;
68
68
 
69
69
  const labelIds = row.labels ? row.labels.split(',') : [];
70
70
  const labels = labelIds.map((id) => {