ghost 4.33.2 → 4.34.3

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 (41) hide show
  1. package/core/built/assets/ghost-dark-2de4c728f3d2deae25e45092ea0e811f.css +1 -0
  2. package/core/built/assets/{ghost.min-501554f903f29164473a5dc620caaddb.js → ghost.min-4886fb099a526cb6ca5b733bbfbb5d3a.js} +670 -590
  3. package/core/built/assets/ghost.min-b1d3e45166f2023dd56b35f720636979.css +1 -0
  4. package/core/built/assets/icons/event-canceled-subscription.svg +6 -0
  5. package/core/built/assets/icons/event-email-delivery-failed.svg +6 -0
  6. package/core/built/assets/icons/event-filter-email-delivered.svg +5 -0
  7. package/core/built/assets/icons/event-filter-email-failed.svg +6 -0
  8. package/core/built/assets/icons/event-filter-email-opened.svg +4 -0
  9. package/core/built/assets/icons/event-filter-login.svg +5 -0
  10. package/core/built/assets/icons/event-filter-newsletter.svg +4 -0
  11. package/core/built/assets/icons/event-filter-payment.svg +5 -0
  12. package/core/built/assets/icons/event-filter-signup.svg +4 -0
  13. package/core/built/assets/icons/event-filter-subscription.svg +7 -0
  14. package/core/built/assets/icons/event-logged-in.svg +5 -0
  15. package/core/built/assets/icons/event-made-a-payment.svg +7 -0
  16. package/core/built/assets/icons/event-opened-email.svg +6 -0
  17. package/core/built/assets/icons/event-received-email.svg +5 -0
  18. package/core/built/assets/icons/event-signed-up.svg +6 -0
  19. package/core/built/assets/icons/event-started-subscription.svg +6 -0
  20. package/core/built/assets/icons/event-subscribed-to-email.svg +8 -0
  21. package/core/built/assets/icons/event-unsubscribed-from-email.svg +5 -0
  22. package/core/built/assets/icons/members-post.svg +5 -0
  23. package/core/built/assets/icons/no-email.svg +5 -0
  24. package/core/built/assets/icons/selected.svg +3 -0
  25. package/core/built/assets/{vendor.min-d43620e98444a46441495445f4c155f8.js → vendor.min-079fa61c64e24f0984f2cd7d2ebbf3c3.js} +3044 -2992
  26. package/core/frontend/services/routing/helpers/fetch-data.js +0 -2
  27. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +3 -2
  28. package/core/server/api/canary/members.js +2 -1
  29. package/core/server/api/canary/products-public.js +1 -1
  30. package/core/server/api/canary/products.js +2 -2
  31. package/core/server/data/migrations/versions/4.34/2022-01-25-13-53-add-welcome-page-url-column-to-products.js +7 -0
  32. package/core/server/data/schema/schema.js +1 -0
  33. package/core/server/services/members/service.js +43 -61
  34. package/core/server/services/members/settings.js +7 -1
  35. package/core/server/web/admin/views/default-prod.html +4 -4
  36. package/core/server/web/admin/views/default.html +4 -4
  37. package/core/shared/labs.js +2 -1
  38. package/package.json +21 -21
  39. package/yarn.lock +449 -365
  40. package/core/built/assets/ghost-dark-661a50922267648a0362c3d367a22013.css +0 -1
  41. package/core/built/assets/ghost.min-1f0218f33e08f8d69b2159977d0c9318.css +0 -1
@@ -113,8 +113,6 @@ function fetchData(pathOptions, routerOptions, locals) {
113
113
 
114
114
  if (config.type === 'browse') {
115
115
  response.data[name].meta = results[name].meta;
116
- // @TODO remove in v3
117
- response.data[name][config.resource] = results[name][config.resource];
118
116
  }
119
117
  });
120
118
  }
@@ -48,8 +48,9 @@ function calculateLegacyPriceData(products) {
48
48
  async function getProductAndPricesData() {
49
49
  try {
50
50
  const page = await api.canary.productsPublic.browse({
51
- include: ['monthly_price', 'yearly_price'],
52
- limit: 'all'
51
+ include: ['monthly_price', 'yearly_price', 'benefits'],
52
+ limit: 'all',
53
+ filter: 'active:true'
53
54
  });
54
55
 
55
56
  return page.products;
@@ -497,7 +497,8 @@ module.exports = {
497
497
 
498
498
  activityFeed: {
499
499
  options: [
500
- 'limit'
500
+ 'limit',
501
+ 'filter'
501
502
  ],
502
503
  permissions: {
503
504
  method: 'browse'
@@ -2,7 +2,7 @@
2
2
  // as it is a getter and may change during runtime.
3
3
  const membersService = require('../../services/members');
4
4
 
5
- const allowedIncludes = ['stripe_prices', 'monthly_price', 'yearly_price'];
5
+ const allowedIncludes = ['stripe_prices', 'monthly_price', 'yearly_price', 'benefits'];
6
6
 
7
7
  module.exports = {
8
8
  docName: 'products',
@@ -78,7 +78,7 @@ module.exports = {
78
78
  name: {required: true}
79
79
  }
80
80
  },
81
- permissions: false,
81
+ permissions: true,
82
82
  async query(frame) {
83
83
  const model = await membersService.api.productRepository.create(
84
84
  frame.data,
@@ -101,7 +101,7 @@ module.exports = {
101
101
  }
102
102
  }
103
103
  },
104
- permissions: false,
104
+ permissions: true,
105
105
  async query(frame) {
106
106
  const model = await membersService.api.productRepository.update(
107
107
  frame.data,
@@ -0,0 +1,7 @@
1
+ const {createAddColumnMigration} = require('../../utils');
2
+
3
+ module.exports = createAddColumnMigration('products', 'welcome_page_url', {
4
+ type: 'string',
5
+ maxlength: 2000,
6
+ nullable: true
7
+ });
@@ -379,6 +379,7 @@ module.exports = {
379
379
  name: {type: 'string', maxlength: 191, nullable: false},
380
380
  slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
381
381
  active: {type: 'boolean', nullable: false, defaultTo: true},
382
+ welcome_page_url: {type: 'string', maxlength: 2000, nullable: true},
382
383
  monthly_price_id: {type: 'string', maxlength: 24, nullable: true},
383
384
  yearly_price_id: {type: 'string', maxlength: 24, nullable: true},
384
385
  description: {type: 'string', maxlength: 191, nullable: true},
@@ -1,3 +1,4 @@
1
+ const _ = require('lodash');
1
2
  const errors = require('@tryghost/errors');
2
3
  const tpl = require('@tryghost/tpl');
3
4
  const MembersSSR = require('@tryghost/members-ssr');
@@ -12,9 +13,9 @@ const labsService = require('../../../shared/labs');
12
13
  const settingsCache = require('../../../shared/settings-cache');
13
14
  const config = require('../../../shared/config');
14
15
  const models = require('../../models');
15
- const _ = require('lodash');
16
16
  const {GhostMailer} = require('../mail');
17
17
  const jobsService = require('../jobs');
18
+ const VerificationTrigger = require('@tryghost/verification-trigger');
18
19
 
19
20
  const messages = {
20
21
  noLiveKeysInDevelopment: 'Cannot use live stripe keys in development. Please restart in production mode.',
@@ -32,23 +33,15 @@ const membersConfig = new MembersConfigProvider({
32
33
  urlUtils
33
34
  });
34
35
 
36
+ const membersStats = new MembersStats({
37
+ db: db,
38
+ settingsCache: settingsCache,
39
+ isSQLite: config.get('database:client') === 'sqlite3'
40
+ });
41
+
35
42
  let membersApi;
36
43
  let membersSettings;
37
-
38
- /**
39
- * @description Calculates threshold based on following formula
40
- * Threshold = max{[current number of members], [volume threshold]}
41
- *
42
- * @returns {Promise<number>}
43
- */
44
- const fetchImportThreshold = async () => {
45
- const membersTotal = await module.exports.stats.getTotalMembers();
46
- const configThreshold = _.get(config.get('hostSettings'), 'emailVerification.importThreshold');
47
- const volumeThreshold = (configThreshold === undefined) ? Infinity : configThreshold;
48
- const threshold = Math.max(membersTotal, volumeThreshold);
49
-
50
- return threshold;
51
- };
44
+ let verificationTrigger;
52
45
 
53
46
  const membersImporter = new MembersCSVImporter({
54
47
  storagePath: config.getContentPath('data'),
@@ -58,53 +51,20 @@ const membersImporter = new MembersCSVImporter({
58
51
  isSet: labsService.isSet.bind(labsService),
59
52
  addJob: jobsService.addJob.bind(jobsService),
60
53
  knex: db.knex,
61
- urlFor: urlUtils.urlFor.bind(urlUtils),
62
- fetchThreshold: fetchImportThreshold
54
+ urlFor: urlUtils.urlFor.bind(urlUtils)
63
55
  });
64
56
 
65
- const startEmailVerification = async (importedNumber) => {
66
- const isVerifiedEmail = config.get('hostSettings:emailVerification:verified') === true;
67
-
68
- if ((!isVerifiedEmail)) {
69
- // Only trigger flag change and escalation email the first time
70
- if (settingsCache.get('email_verification_required') !== true) {
71
- await models.Settings.edit([{
72
- key: 'email_verification_required',
73
- value: true
74
- }], {context: {internal: true}});
75
-
76
- const escalationAddress = config.get('hostSettings:emailVerification:escalationAddress');
77
- const fromAddress = config.get('user_email');
78
-
79
- if (escalationAddress) {
80
- ghostMailer.send({
81
- subject: 'Email needs verification',
82
- html: tpl(messages.emailVerificationEmailMessage, {
83
- importedNumber,
84
- siteUrl: urlUtils.getSiteUrl()
85
- }),
86
- forceTextContent: true,
87
- from: fromAddress,
88
- to: escalationAddress
89
- });
90
- }
91
- }
92
-
93
- throw new errors.ValidationError({
94
- message: tpl(messages.emailVerificationNeeded)
95
- });
96
- }
97
- };
98
-
99
57
  const processImport = async (options) => {
100
58
  const result = await membersImporter.process(options);
101
- const freezeTriggered = result.meta.freeze;
102
59
  const importSize = result.meta.originalImportSize;
103
- delete result.meta.freeze;
104
60
  delete result.meta.originalImportSize;
105
61
 
106
- if (freezeTriggered) {
107
- await startEmailVerification(importSize);
62
+ const importThreshold = await verificationTrigger.getImportThreshold();
63
+ if (importSize > importThreshold) {
64
+ await verificationTrigger.startVerificationProcess({
65
+ amountImported: importSize,
66
+ throwOnTrigger: true
67
+ });
108
68
  }
109
69
 
110
70
  return result;
@@ -139,6 +99,32 @@ module.exports = {
139
99
  });
140
100
  }
141
101
 
102
+ verificationTrigger = new VerificationTrigger({
103
+ configThreshold: _.get(config.get('hostSettings'), 'emailVerification.importThreshold'),
104
+ isVerified: () => config.get('hostSettings:emailVerification:verified') === true,
105
+ isVerificationRequired: () => settingsCache.get('email_verification_required') === true,
106
+ sendVerificationEmail: ({subject, message, amountImported}) => {
107
+ const escalationAddress = config.get('hostSettings:emailVerification:escalationAddress');
108
+ const fromAddress = config.get('user_email');
109
+
110
+ if (escalationAddress) {
111
+ ghostMailer.send({
112
+ subject,
113
+ html: tpl(message, {
114
+ importedNumber: amountImported,
115
+ siteUrl: urlUtils.getSiteUrl()
116
+ }),
117
+ forceTextContent: true,
118
+ from: fromAddress,
119
+ to: escalationAddress
120
+ });
121
+ }
122
+ },
123
+ membersStats,
124
+ Settings: models.Settings,
125
+ eventRepository: membersApi.events
126
+ });
127
+
142
128
  (async () => {
143
129
  try {
144
130
  const collection = await models.SingleUseToken.fetchAll();
@@ -181,11 +167,7 @@ module.exports = {
181
167
 
182
168
  processImport: processImport,
183
169
 
184
- stats: new MembersStats({
185
- db: db,
186
- settingsCache: settingsCache,
187
- isSQLite: config.get('database:client') === 'sqlite3'
188
- })
170
+ stats: membersStats
189
171
 
190
172
  };
191
173
  module.exports.middleware = require('./middleware');
@@ -103,7 +103,13 @@ function createSettingsInstance(config) {
103
103
 
104
104
  const getAdminRedirectLink = ({type}) => {
105
105
  const adminUrl = urlUtils.urlFor('admin', true);
106
- return urlUtils.urlJoin(adminUrl, `#/settings/members-email/?${type}=success`);
106
+ if (type === 'fromAddressUpdate') {
107
+ return urlUtils.urlJoin(adminUrl, `#/settings/members-email/?${type}=success`);
108
+ } else if (type === 'supportAddressUpdate') {
109
+ return urlUtils.urlJoin(adminUrl, `#/settings/members/?${type}=success`);
110
+ } else {
111
+ return urlUtils.urlJoin(adminUrl, `#/site/`);
112
+ }
107
113
  };
108
114
 
109
115
  return {
@@ -8,7 +8,7 @@
8
8
  <title>Ghost Admin</title>
9
9
 
10
10
 
11
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%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%224.33%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%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%7D" />
11
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%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%224.34%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%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%7D" />
12
12
 
13
13
  <meta name="HandheldFriendly" content="True" />
14
14
  <meta name="MobileOptimized" content="320" />
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
  <link rel="stylesheet" href="assets/vendor.min-2c8ad32b7960bb605ebc20097fee5ebd.css">
41
- <link rel="stylesheet" href="assets/ghost.min-1f0218f33e08f8d69b2159977d0c9318.css" title="light">
41
+ <link rel="stylesheet" href="assets/ghost.min-b1d3e45166f2023dd56b35f720636979.css" title="light">
42
42
 
43
43
 
44
44
 
@@ -56,8 +56,8 @@
56
56
  <div id="ember-basic-dropdown-wormhole"></div>
57
57
 
58
58
 
59
- <script src="assets/vendor.min-d43620e98444a46441495445f4c155f8.js"></script>
60
- <script src="assets/ghost.min-501554f903f29164473a5dc620caaddb.js"></script>
59
+ <script src="assets/vendor.min-079fa61c64e24f0984f2cd7d2ebbf3c3.js"></script>
60
+ <script src="assets/ghost.min-4886fb099a526cb6ca5b733bbfbb5d3a.js"></script>
61
61
 
62
62
  </body>
63
63
  </html>
@@ -8,7 +8,7 @@
8
8
  <title>Ghost Admin</title>
9
9
 
10
10
 
11
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%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%224.33%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%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%7D" />
11
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%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%224.34%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22moment%22%3A%7B%22includeTimezone%22%3A%22all%22%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%7D" />
12
12
 
13
13
  <meta name="HandheldFriendly" content="True" />
14
14
  <meta name="MobileOptimized" content="320" />
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
  <link rel="stylesheet" href="assets/vendor.min-2c8ad32b7960bb605ebc20097fee5ebd.css">
41
- <link rel="stylesheet" href="assets/ghost.min-1f0218f33e08f8d69b2159977d0c9318.css" title="light">
41
+ <link rel="stylesheet" href="assets/ghost.min-b1d3e45166f2023dd56b35f720636979.css" title="light">
42
42
 
43
43
 
44
44
 
@@ -56,8 +56,8 @@
56
56
  <div id="ember-basic-dropdown-wormhole"></div>
57
57
 
58
58
 
59
- <script src="assets/vendor.min-d43620e98444a46441495445f4c155f8.js"></script>
60
- <script src="assets/ghost.min-501554f903f29164473a5dc620caaddb.js"></script>
59
+ <script src="assets/vendor.min-079fa61c64e24f0984f2cd7d2ebbf3c3.js"></script>
60
+ <script src="assets/ghost.min-4886fb099a526cb6ca5b733bbfbb5d3a.js"></script>
61
61
 
62
62
  </body>
63
63
  </html>
@@ -31,7 +31,8 @@ const ALPHA_FEATURES = [
31
31
  'urlCache',
32
32
  'beforeAfterCard',
33
33
  'tweetGridCard',
34
- 'membersActivityFeed'
34
+ 'membersActivityFeed',
35
+ 'tierWelcomePages'
35
36
  ];
36
37
 
37
38
  module.exports.GA_KEYS = [...GA_FEATURES];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "4.33.2",
3
+ "version": "4.34.3",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -54,17 +54,17 @@
54
54
  },
55
55
  "dependencies": {
56
56
  "@nexes/nql": "0.6.0",
57
- "@sentry/node": "6.16.1",
57
+ "@sentry/node": "6.17.2",
58
58
  "@tryghost/adapter-manager": "0.2.27",
59
59
  "@tryghost/admin-api-schema": "2.7.0",
60
- "@tryghost/bookshelf-plugins": "0.3.6",
60
+ "@tryghost/bookshelf-plugins": "0.3.7",
61
61
  "@tryghost/bootstrap-socket": "0.2.16",
62
62
  "@tryghost/color-utils": "0.1.6",
63
63
  "@tryghost/config-url-helpers": "0.1.4",
64
64
  "@tryghost/constants": "1.0.1",
65
65
  "@tryghost/custom-theme-settings-service": "0.3.1",
66
66
  "@tryghost/database-info": "0.1.0",
67
- "@tryghost/debug": "0.1.10",
67
+ "@tryghost/debug": "0.1.11",
68
68
  "@tryghost/email-analytics-provider-mailgun": "1.0.7",
69
69
  "@tryghost/email-analytics-service": "1.0.5",
70
70
  "@tryghost/errors": "1.2.1",
@@ -78,33 +78,33 @@
78
78
  "@tryghost/kg-markdown-html-renderer": "5.1.1",
79
79
  "@tryghost/kg-mobiledoc-html-renderer": "5.3.2",
80
80
  "@tryghost/limit-service": "1.0.9",
81
- "@tryghost/logging": "2.0.1",
81
+ "@tryghost/logging": "2.0.2",
82
82
  "@tryghost/magic-link": "1.0.17",
83
- "@tryghost/members-api": "4.4.1",
84
- "@tryghost/members-csv": "1.2.3",
85
- "@tryghost/members-importer": "0.4.1",
86
- "@tryghost/members-offers": "0.10.5",
87
- "@tryghost/members-ssr": "1.0.18",
83
+ "@tryghost/members-api": "4.8.4",
84
+ "@tryghost/members-importer": "0.5.0",
85
+ "@tryghost/members-offers": "0.10.6",
86
+ "@tryghost/members-ssr": "1.0.19",
88
87
  "@tryghost/members-stripe-service": "0.6.5",
89
- "@tryghost/metrics": "1.0.2",
88
+ "@tryghost/metrics": "1.0.3",
90
89
  "@tryghost/minifier": "0.1.10",
91
90
  "@tryghost/mw-error-handler": "0.1.2",
92
91
  "@tryghost/mw-session-from-token": "0.1.27",
93
- "@tryghost/nodemailer": "0.3.9",
92
+ "@tryghost/nodemailer": "0.3.10",
94
93
  "@tryghost/package-json": "1.0.15",
95
94
  "@tryghost/promise": "0.1.14",
96
- "@tryghost/request": "0.1.11",
97
- "@tryghost/root-utils": "0.3.8",
95
+ "@tryghost/request": "0.1.12",
96
+ "@tryghost/root-utils": "0.3.9",
98
97
  "@tryghost/security": "0.2.14",
99
98
  "@tryghost/session-service": "0.1.37",
100
99
  "@tryghost/settings-path-manager": "0.1.3",
101
100
  "@tryghost/social-urls": "0.1.28",
102
101
  "@tryghost/string": "0.1.22",
103
- "@tryghost/tpl": "0.1.9",
102
+ "@tryghost/tpl": "0.1.10",
104
103
  "@tryghost/update-check-service": "0.3.0",
105
104
  "@tryghost/url-utils": "2.0.5",
106
- "@tryghost/validator": "0.1.10",
107
- "@tryghost/version": "0.1.8",
105
+ "@tryghost/validator": "0.1.11",
106
+ "@tryghost/verification-trigger": "0.1.1",
107
+ "@tryghost/version": "0.1.9",
108
108
  "@tryghost/vhost-middleware": "1.0.20",
109
109
  "@tryghost/zip": "1.1.19",
110
110
  "amperize": "0.6.1",
@@ -184,9 +184,9 @@
184
184
  "@ethanresnick/chai-jest-snapshot": "3.0.0",
185
185
  "@lodder/grunt-postcss": "3.1.1",
186
186
  "c8": "7.11.0",
187
- "chai": "4.3.4",
187
+ "chai": "4.3.6",
188
188
  "coffeescript": "2.6.1",
189
- "cssnano": "5.0.15",
189
+ "cssnano": "5.0.16",
190
190
  "eslint": "7.32.0",
191
191
  "eslint-plugin-ghost": "2.12.0",
192
192
  "expect": "27.4.6",
@@ -202,7 +202,7 @@
202
202
  "grunt-subgrunt": "1.3.0",
203
203
  "grunt-update-submodules": "0.4.1",
204
204
  "jwks-rsa": "2.0.5",
205
- "mocha": "9.1.4",
205
+ "mocha": "9.2.0",
206
206
  "mocha-slow-test-reporter": "0.1.2",
207
207
  "mock-knex": "0.4.10",
208
208
  "nock": "13.2.2",
@@ -215,7 +215,7 @@
215
215
  "tmp": "0.2.1"
216
216
  },
217
217
  "resolutions": {
218
- "@tryghost/logging": "2.0.1",
218
+ "@tryghost/logging": "2.0.2",
219
219
  "moment": "2.24.0",
220
220
  "moment-timezone": "0.5.23"
221
221
  }