ghost 4.36.1 → 4.37.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 (52) hide show
  1. package/.c8rc.json +10 -0
  2. package/core/boot.js +7 -0
  3. package/core/bridge.js +2 -6
  4. package/core/built/assets/{ghost-dark-abde961aa8d00ab2696e3ceb0a2ca24b.css → ghost-dark-d54723f7267e66fa2595f897076e86c2.css} +1 -1
  5. package/core/built/assets/{ghost.min-46e075517808b53170b8d9ab0b96d796.css → ghost.min-02a5f8954bd85fe28817b8c8b111b8aa.css} +1 -1
  6. package/core/built/assets/{ghost.min-f10401ea8fdfee5dcc88cf4dff785a88.js → ghost.min-c1938f6ee696bf08bd6bf93cac341ea2.js} +196 -192
  7. package/core/built/assets/icons/event-changed-subscription.svg +6 -0
  8. package/core/built/assets/icons/get-started-import.svg +13 -0
  9. package/core/built/assets/icons/get-started-members.svg +5 -5
  10. package/core/built/assets/img/get-started-995c36b9ede90bb3777c83751e798ef7.jpg +0 -0
  11. package/core/built/assets/{vendor.min-3aa87b4d7b43675386a96b869ed00493.js → vendor.min-6dc30be68238b5c55df0cdc1f2dc8b8d.js} +63 -73
  12. package/core/frontend/helpers/excerpt.js +7 -4
  13. package/core/server/api/canary/authentication.js +2 -0
  14. package/core/server/api/canary/index.js +4 -0
  15. package/core/server/api/canary/tiers.js +123 -0
  16. package/core/server/api/canary/utils/serializers/input/index.js +4 -0
  17. package/core/server/api/canary/utils/serializers/input/tiers.js +36 -0
  18. package/core/server/api/canary/utils/serializers/output/index.js +4 -0
  19. package/core/server/api/canary/utils/serializers/output/members.js +5 -0
  20. package/core/server/api/canary/utils/serializers/output/tiers.js +210 -0
  21. package/core/server/api/canary/utils/validators/input/index.js +4 -0
  22. package/core/server/api/canary/utils/validators/input/tiers.js +6 -0
  23. package/core/server/api/v2/settings.js +2 -1
  24. package/core/server/data/migrations/init/1-create-tables.js +4 -1
  25. package/core/server/data/migrations/versions/4.37/2022-02-21-09-53-backfill-members-last-seen-at-column.js +31 -0
  26. package/core/server/data/schema/commands.js +19 -20
  27. package/core/server/data/schema/{default-settings.json → default-settings/default-settings.json} +0 -0
  28. package/core/server/data/schema/default-settings/index.js +6 -0
  29. package/core/server/services/auth/setup.js +12 -3
  30. package/core/server/services/members/config.js +0 -26
  31. package/core/server/services/members/middleware.js +1 -1
  32. package/core/server/services/members/service.js +8 -7
  33. package/core/server/services/route-settings/index.js +1 -1
  34. package/core/server/services/settings/index.js +2 -2
  35. package/core/server/services/stripe/config.js +37 -2
  36. package/core/server/web/admin/views/default-prod.html +4 -4
  37. package/core/server/web/admin/views/default.html +4 -4
  38. package/core/server/web/api/canary/admin/routes.js +7 -0
  39. package/core/shared/config/defaults.json +1 -0
  40. package/core/shared/config/overrides.json +1 -1
  41. package/core/shared/labs.js +4 -1
  42. package/package.json +35 -34
  43. package/yarn.lock +1039 -311
  44. package/core/built/assets/icons/event-filter-email-delivered.svg +0 -5
  45. package/core/built/assets/icons/event-filter-email-failed.svg +0 -6
  46. package/core/built/assets/icons/event-filter-email-opened.svg +0 -4
  47. package/core/built/assets/icons/event-filter-login.svg +0 -5
  48. package/core/built/assets/icons/event-filter-newsletter.svg +0 -4
  49. package/core/built/assets/icons/event-filter-payment.svg +0 -5
  50. package/core/built/assets/icons/event-filter-signup.svg +0 -4
  51. package/core/built/assets/icons/event-filter-subscription.svg +0 -7
  52. package/core/built/assets/icons/selected.svg +0 -3
@@ -198,7 +198,7 @@ const createSessionFromMagicLink = async function (req, res, next) {
198
198
 
199
199
  const action = req.query.action;
200
200
 
201
- if (action === 'signup' || action === 'signup-paid') {
201
+ if (action === 'signup' || action === 'signup-paid' || action === 'subscribe') {
202
202
  let customRedirect = '';
203
203
  const mostRecentActiveSubscription = subscriptions
204
204
  .sort((a, b) => {
@@ -125,6 +125,13 @@ module.exports = {
125
125
  });
126
126
  }
127
127
 
128
+ module.exports.ssr = MembersSSR({
129
+ cookieSecure: urlUtils.isSSL(urlUtils.getSiteUrl()),
130
+ cookieKeys: [settingsCache.get('theme_session_secret')],
131
+ cookieName: 'ghost-members-ssr',
132
+ getMembersApi: () => module.exports.api
133
+ });
134
+
128
135
  verificationTrigger = new VerificationTrigger({
129
136
  configThreshold: _.get(config.get('hostSettings'), 'emailVerification.importThreshold'),
130
137
  isVerified: () => config.get('hostSettings:emailVerification:verified') === true,
@@ -181,13 +188,7 @@ module.exports = {
181
188
  return membersSettings;
182
189
  },
183
190
 
184
- ssr: MembersSSR({
185
- cookieSecure: urlUtils.isSSL(urlUtils.getSiteUrl()),
186
- cookieKeys: [settingsCache.get('theme_session_secret')],
187
- cookieName: 'ghost-members-ssr',
188
- cookieCacheName: 'ghost-members-ssr-cache',
189
- getMembersApi: () => module.exports.api
190
- }),
191
+ ssr: null,
191
192
 
192
193
  stripeConnect: require('./stripe-connect'),
193
194
 
@@ -22,7 +22,7 @@ module.exports = {
22
22
  type: 'routes',
23
23
  extension: '.yaml',
24
24
  destinationFolderPath: config.getContentPath('settings'),
25
- sourceFolderPath: config.get('paths').defaultSettings
25
+ sourceFolderPath: config.get('paths').defaultRouteSettings
26
26
  });
27
27
 
28
28
  return await defaultSettingsManager.ensureSettingsFileExists();
@@ -30,9 +30,9 @@ module.exports = {
30
30
  },
31
31
 
32
32
  /**
33
- * Shutdown the cache, used in force boot during testing
33
+ * Restore the cache, used during e2e testing only
34
34
  */
35
- shutdown() {
35
+ reset() {
36
36
  SettingsCache.reset(events);
37
37
  },
38
38
 
@@ -6,8 +6,41 @@ const messages = {
6
6
  };
7
7
 
8
8
  // @TODO Refactor to a class w/ constructor
9
+
10
+ /**
11
+ * @typedef {object} StripeURLConfig
12
+ * @prop {string} checkoutSessionSuccessUrl
13
+ * @prop {string} checkoutSessionCancelUrl
14
+ * @prop {string} checkoutSetupSessionSuccessUrl
15
+ * @prop {string} checkoutSetupSessionCancelUrl
16
+ */
17
+
9
18
  module.exports = {
10
19
  getConfig(settings, config, urlUtils) {
20
+ /**
21
+ * @returns {StripeURLConfig}
22
+ */
23
+ function getStripeUrlConfig() {
24
+ const siteUrl = urlUtils.getSiteUrl();
25
+
26
+ const checkoutSuccessUrl = new URL(siteUrl);
27
+ checkoutSuccessUrl.searchParams.set('stripe', 'success');
28
+ const checkoutCancelUrl = new URL(siteUrl);
29
+ checkoutCancelUrl.searchParams.set('stripe', 'cancel');
30
+
31
+ const billingSuccessUrl = new URL(siteUrl);
32
+ billingSuccessUrl.searchParams.set('stripe', 'billing-update-success');
33
+ const billingCancelUrl = new URL(siteUrl);
34
+ billingCancelUrl.searchParams.set('stripe', 'billing-update-cancel');
35
+
36
+ return {
37
+ checkoutSessionSuccessUrl: checkoutSuccessUrl.href,
38
+ checkoutSessionCancelUrl: checkoutCancelUrl.href,
39
+ checkoutSetupSessionSuccessUrl: billingSuccessUrl.href,
40
+ checkoutSetupSessionCancelUrl: billingCancelUrl.href
41
+ };
42
+ }
43
+
11
44
  /**
12
45
  * @param {'direct' | 'connect'} type - The "type" of keys to fetch from settings
13
46
  * @returns {{publicKey: string, secretKey: string} | null}
@@ -61,9 +94,11 @@ module.exports = {
61
94
 
62
95
  const webhookHandlerUrl = new URL('members/webhooks/stripe/', urlUtils.getSiteUrl());
63
96
 
97
+ const urls = getStripeUrlConfig();
98
+
64
99
  return {
65
- secretKey: keys.secretKey,
66
- publicKey: keys.publicKey,
100
+ ...keys,
101
+ ...urls,
67
102
  enablePromoCodes: config.get('enableStripePromoCodes'),
68
103
  webhookSecret: webhookSecret,
69
104
  webhookHandlerUrl: webhookHandlerUrl.href
@@ -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.36%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.37%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-46e075517808b53170b8d9ab0b96d796.css" title="light">
41
+ <link rel="stylesheet" href="assets/ghost.min-02a5f8954bd85fe28817b8c8b111b8aa.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-3aa87b4d7b43675386a96b869ed00493.js"></script>
60
- <script src="assets/ghost.min-f10401ea8fdfee5dcc88cf4dff785a88.js"></script>
59
+ <script src="assets/vendor.min-6dc30be68238b5c55df0cdc1f2dc8b8d.js"></script>
60
+ <script src="assets/ghost.min-c1938f6ee696bf08bd6bf93cac341ea2.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.36%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.37%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-46e075517808b53170b8d9ab0b96d796.css" title="light">
41
+ <link rel="stylesheet" href="assets/ghost.min-02a5f8954bd85fe28817b8c8b111b8aa.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-3aa87b4d7b43675386a96b869ed00493.js"></script>
60
- <script src="assets/ghost.min-f10401ea8fdfee5dcc88cf4dff785a88.js"></script>
59
+ <script src="assets/vendor.min-6dc30be68238b5c55df0cdc1f2dc8b8d.js"></script>
60
+ <script src="assets/ghost.min-c1938f6ee696bf08bd6bf93cac341ea2.js"></script>
61
61
 
62
62
  </body>
63
63
  </html>
@@ -88,11 +88,18 @@ module.exports = function apiRoutes() {
88
88
  router.del('/tags/:id', mw.authAdminApi, http(api.tags.destroy));
89
89
 
90
90
  // Products
91
+ // TODO Remove
91
92
  router.get('/products', mw.authAdminApi, http(api.products.browse));
92
93
  router.post('/products', mw.authAdminApi, http(api.products.add));
93
94
  router.get('/products/:id', mw.authAdminApi, http(api.products.read));
94
95
  router.put('/products/:id', mw.authAdminApi, http(api.products.edit));
95
96
 
97
+ // Tiers
98
+ router.get('/tiers', mw.authAdminApi, http(api.tiers.browse));
99
+ router.post('/tiers', mw.authAdminApi, http(api.tiers.add));
100
+ router.get('/tiers/:id', mw.authAdminApi, http(api.tiers.read));
101
+ router.put('/tiers/:id', mw.authAdminApi, http(api.tiers.edit));
102
+
96
103
  // ## Members
97
104
  router.get('/members', mw.authAdminApi, http(api.members.browse));
98
105
  router.post('/members', mw.authAdminApi, http(api.members.add));
@@ -17,6 +17,7 @@
17
17
  "paths": {
18
18
  "contentPath": "content/",
19
19
  "fixtures": "core/server/data/schema/fixtures/fixtures",
20
+ "defaultSettings": "core/server/data/schema/default-settings/default-settings",
20
21
  "assetSrc": "core/frontend/src"
21
22
  },
22
23
  "adapters": {
@@ -6,7 +6,7 @@
6
6
  "helperTemplates": "core/frontend/helpers/tpl/",
7
7
  "adminViews": "core/server/web/admin/views/",
8
8
  "defaultViews": "core/server/views/",
9
- "defaultSettings": "core/server/services/route-settings/",
9
+ "defaultRouteSettings": "core/server/services/route-settings/",
10
10
  "internalAppPath": "core/frontend/apps/",
11
11
  "internalAdaptersPath": "core/server/adapters/",
12
12
  "migrationPath": "core/server/data/migrations",
@@ -33,7 +33,10 @@ const ALPHA_FEATURES = [
33
33
  'membersActivityFeed',
34
34
  'improvedOnboarding',
35
35
  'tierWelcomePages',
36
- 'tierName'
36
+ 'tierName',
37
+ 'membersTableStatus',
38
+ 'membersLastSeenFilter',
39
+ 'selectablePortalLinks'
37
40
  ];
38
41
 
39
42
  module.exports.GA_KEYS = [...GA_FEATURES];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "4.36.1",
3
+ "version": "4.37.0",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -29,15 +29,16 @@
29
29
  "test": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js --timeout=60000",
30
30
  "test:all": "yarn test:unit && yarn test:integration && yarn test:e2e && yarn lint",
31
31
  "test:debug": "DEBUG=ghost:test* yarn test",
32
- "test:unit": "c8 --reporter text-summary --reporter cobertura mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/unit' --timeout=2000",
32
+ "test:unit": "c8 mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/unit' --timeout=2000",
33
33
  "test:integration": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/integration' --timeout=5000",
34
34
  "test:e2e": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/e2e-api' './test/e2e-frontend' './test/e2e-server' --timeout=10000",
35
35
  "test:regression": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/regression' --timeout=60000",
36
+ "test:browser": "playwright test --browser=all test/e2e-browser",
37
+ "test:ci": "yarn test:e2e -b && yarn test:integration -b && yarn test:regression -b",
36
38
  "test:unit:slow": "yarn test:unit --reporter=mocha-slow-test-reporter",
37
39
  "test:int:slow": "yarn test:integration --reporter=mocha-slow-test-reporter",
38
40
  "test:e2e:slow": "yarn test:e2e --reporter=mocha-slow-test-reporter",
39
41
  "test:reg:slow": "mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/regression' --timeout=60000 --reporter=mocha-slow-test-reporter",
40
- "cov:unit": "c8 report --reporter text --reporter html",
41
42
  "lint:server": "eslint --ignore-path .eslintignore 'core/server/**/*.js' 'core/*.js' '*.js'",
42
43
  "lint:shared": "eslint --ignore-path .eslintignore 'core/shared/**/*.js'",
43
44
  "lint:frontend": "eslint --ignore-path .eslintignore 'core/frontend/**/*.js'",
@@ -54,21 +55,21 @@
54
55
  },
55
56
  "dependencies": {
56
57
  "@nexes/nql": "0.6.0",
57
- "@sentry/node": "6.17.6",
58
+ "@sentry/node": "6.18.0",
58
59
  "@tryghost/adapter-manager": "0.2.27",
59
- "@tryghost/admin-api-schema": "2.9.0",
60
- "@tryghost/bookshelf-plugins": "0.3.8",
60
+ "@tryghost/admin-api-schema": "2.10.0",
61
+ "@tryghost/bookshelf-plugins": "0.3.9",
61
62
  "@tryghost/bootstrap-socket": "0.2.16",
62
63
  "@tryghost/color-utils": "0.1.7",
63
64
  "@tryghost/config-url-helpers": "0.1.4",
64
65
  "@tryghost/constants": "1.0.1",
65
66
  "@tryghost/custom-theme-settings-service": "0.3.1",
66
67
  "@tryghost/database-info": "0.1.0",
67
- "@tryghost/debug": "0.1.12",
68
+ "@tryghost/debug": "0.1.13",
68
69
  "@tryghost/email-analytics-provider-mailgun": "1.0.7",
69
70
  "@tryghost/email-analytics-service": "1.0.5",
70
- "@tryghost/errors": "1.2.1",
71
- "@tryghost/express-dynamic-redirects": "0.2.4",
71
+ "@tryghost/errors": "1.2.3",
72
+ "@tryghost/express-dynamic-redirects": "0.2.5",
72
73
  "@tryghost/helpers": "1.1.56",
73
74
  "@tryghost/image-transform": "1.0.27",
74
75
  "@tryghost/job-manager": "0.8.19",
@@ -78,39 +79,39 @@
78
79
  "@tryghost/kg-markdown-html-renderer": "5.1.4",
79
80
  "@tryghost/kg-mobiledoc-html-renderer": "5.3.4",
80
81
  "@tryghost/limit-service": "1.0.9",
81
- "@tryghost/logging": "2.0.3",
82
- "@tryghost/magic-link": "1.0.17",
83
- "@tryghost/members-api": "4.8.15",
84
- "@tryghost/members-importer": "0.5.0",
85
- "@tryghost/members-offers": "0.10.6",
86
- "@tryghost/members-ssr": "1.0.19",
87
- "@tryghost/members-stripe-service": "0.7.0",
82
+ "@tryghost/logging": "2.0.4",
83
+ "@tryghost/magic-link": "1.0.19",
84
+ "@tryghost/members-api": "5.0.3",
85
+ "@tryghost/members-importer": "0.5.2",
86
+ "@tryghost/members-offers": "0.10.7",
87
+ "@tryghost/members-ssr": "1.0.21",
88
+ "@tryghost/members-stripe-service": "0.8.3",
88
89
  "@tryghost/metrics": "1.0.5",
89
90
  "@tryghost/minifier": "0.1.10",
90
91
  "@tryghost/mw-error-handler": "0.1.2",
91
92
  "@tryghost/mw-session-from-token": "0.1.27",
92
- "@tryghost/nodemailer": "0.3.11",
93
+ "@tryghost/nodemailer": "0.3.13",
93
94
  "@tryghost/package-json": "1.0.15",
94
95
  "@tryghost/promise": "0.1.14",
95
- "@tryghost/request": "0.1.14",
96
+ "@tryghost/request": "0.1.15",
96
97
  "@tryghost/root-utils": "0.3.10",
97
98
  "@tryghost/security": "0.2.14",
98
99
  "@tryghost/session-service": "0.1.37",
99
100
  "@tryghost/settings-path-manager": "0.1.3",
100
101
  "@tryghost/social-urls": "0.1.28",
101
102
  "@tryghost/string": "0.1.22",
102
- "@tryghost/tpl": "0.1.11",
103
+ "@tryghost/tpl": "0.1.12",
103
104
  "@tryghost/update-check-service": "0.3.1",
104
105
  "@tryghost/url-utils": "2.0.5",
105
- "@tryghost/validator": "0.1.12",
106
- "@tryghost/verification-trigger": "0.1.3",
107
- "@tryghost/version": "0.1.10",
106
+ "@tryghost/validator": "0.1.13",
107
+ "@tryghost/verification-trigger": "0.1.4",
108
+ "@tryghost/version": "0.1.11",
108
109
  "@tryghost/vhost-middleware": "1.0.21",
109
110
  "@tryghost/zip": "1.1.19",
110
111
  "amperize": "0.6.1",
111
112
  "analytics-node": "6.0.0",
112
113
  "bluebird": "3.7.2",
113
- "body-parser": "1.19.1",
114
+ "body-parser": "1.19.2",
114
115
  "bookshelf": "1.2.0",
115
116
  "bookshelf-relations": "2.3.0",
116
117
  "brute-knex": "4.0.1",
@@ -122,14 +123,14 @@
122
123
  "cookie-session": "1.4.0",
123
124
  "cors": "2.8.5",
124
125
  "downsize": "0.0.8",
125
- "express": "4.17.2",
126
+ "express": "4.17.3",
126
127
  "express-brute": "1.0.1",
127
128
  "express-hbs": "2.4.0",
128
- "express-jwt": "6.1.0",
129
+ "express-jwt": "6.1.1",
129
130
  "express-lazy-router": "1.0.4",
130
131
  "express-query-boolean": "2.0.0",
131
132
  "express-session": "1.17.2",
132
- "fs-extra": "10.0.0",
133
+ "fs-extra": "10.0.1",
133
134
  "ghost-storage-base": "1.0.0",
134
135
  "glob": "7.2.0",
135
136
  "got": "9.6.0",
@@ -146,7 +147,7 @@
146
147
  "knex": "0.21.21",
147
148
  "knex-migrator": "4.1.3",
148
149
  "lodash": "4.17.21",
149
- "luxon": "2.3.0",
150
+ "luxon": "2.3.1",
150
151
  "mailgun-js": "0.22.0",
151
152
  "metascraper": "5.25.8",
152
153
  "metascraper-author": "5.25.8",
@@ -177,18 +178,18 @@
177
178
  "xml": "1.0.1"
178
179
  },
179
180
  "optionalDependencies": {
180
- "@tryghost/html-to-mobiledoc": "1.8.3",
181
+ "@tryghost/html-to-mobiledoc": "1.8.5",
181
182
  "sqlite3": "5.0.2"
182
183
  },
183
184
  "devDependencies": {
184
185
  "@lodder/grunt-postcss": "3.1.1",
185
- "@tryghost/express-test": "0.4.1",
186
- "@tryghost/jest-snapshot": "0.3.1",
186
+ "@playwright/test": "1.19.1",
187
+ "@tryghost/express-test": "0.6.0",
187
188
  "c8": "7.11.0",
188
189
  "coffeescript": "2.6.1",
189
190
  "cssnano": "5.0.17",
190
- "eslint": "8.8.0",
191
- "eslint-plugin-ghost": "2.12.0",
191
+ "eslint": "8.9.0",
192
+ "eslint-plugin-ghost": "2.13.0",
192
193
  "grunt": "1.4.1",
193
194
  "grunt-bg-shell": "2.3.3",
194
195
  "grunt-contrib-clean": "2.0.0",
@@ -201,7 +202,7 @@
201
202
  "grunt-subgrunt": "1.3.0",
202
203
  "grunt-update-submodules": "0.4.1",
203
204
  "jwks-rsa": "2.0.5",
204
- "mocha": "9.2.0",
205
+ "mocha": "9.2.1",
205
206
  "mocha-slow-test-reporter": "0.1.2",
206
207
  "mock-knex": "0.4.10",
207
208
  "nock": "13.2.4",
@@ -214,7 +215,7 @@
214
215
  "tmp": "0.2.1"
215
216
  },
216
217
  "resolutions": {
217
- "@tryghost/logging": "2.0.3",
218
+ "@tryghost/logging": "2.0.4",
218
219
  "moment": "2.24.0",
219
220
  "moment-timezone": "0.5.23"
220
221
  }