ghost 4.15.0 → 4.17.1

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 (137) hide show
  1. package/.eslintrc.js +7 -1
  2. package/content/themes/casper/assets/built/screen.css +1 -1
  3. package/content/themes/casper/assets/built/screen.css.map +1 -1
  4. package/content/themes/casper/assets/css/screen.css +1 -1
  5. package/content/themes/casper/default.hbs +2 -2
  6. package/content/themes/casper/package.json +1 -1
  7. package/content/themes/casper/page.hbs +28 -26
  8. package/content/themes/casper/partials/post-card.hbs +2 -2
  9. package/content/themes/casper/post.hbs +67 -65
  10. package/content/themes/casper/tag.hbs +2 -2
  11. package/core/boot.js +7 -7
  12. package/core/bridge.js +4 -3
  13. package/core/built/assets/{chunk.3.4b1d9e20e57164ac9c29.js → chunk.3.b80d3e1e6b8556aaff3c.js} +72 -71
  14. package/core/built/assets/ghost-dark-f7bf2dd8d8c702716f75bfa4ccd92df2.css +1 -0
  15. package/core/built/assets/{ghost.min-e35cfee26d942c364166f57f3dcc9e75.js → ghost.min-52a5420ffcea6bf17761b5c59cf020e2.js} +979 -908
  16. package/core/built/assets/ghost.min-741246f42f000c073999a5363434ea2c.css +1 -0
  17. package/core/built/assets/icons/discount-bubble.svg +1 -0
  18. package/core/built/assets/{vendor.min-ca33abc718f21a51327841d58f8875d0.js → vendor.min-1bfc9d56d27508db88ef417deb55f16f.js} +454 -434
  19. package/core/frontend/apps/amp/lib/helpers/amp_analytics.js +2 -2
  20. package/core/frontend/apps/amp/lib/helpers/amp_components.js +2 -1
  21. package/core/frontend/apps/amp/lib/helpers/amp_content.js +5 -1
  22. package/core/frontend/apps/amp/lib/helpers/amp_style.js +1 -1
  23. package/core/frontend/apps/amp/lib/router.js +8 -4
  24. package/core/frontend/apps/private-blogging/index.js +13 -5
  25. package/core/frontend/apps/private-blogging/lib/helpers/input_password.js +1 -1
  26. package/core/frontend/apps/private-blogging/lib/middleware.js +8 -3
  27. package/core/frontend/helpers/asset.js +10 -2
  28. package/core/frontend/helpers/author.js +5 -3
  29. package/core/frontend/helpers/authors.js +4 -3
  30. package/core/frontend/helpers/body_class.js +1 -1
  31. package/core/frontend/helpers/cancel_link.js +9 -2
  32. package/core/frontend/helpers/concat.js +1 -1
  33. package/core/frontend/helpers/content.js +1 -1
  34. package/core/frontend/helpers/date.js +1 -1
  35. package/core/frontend/helpers/encode.js +1 -1
  36. package/core/frontend/helpers/excerpt.js +2 -1
  37. package/core/frontend/helpers/facebook_url.js +2 -1
  38. package/core/frontend/helpers/foreach.js +11 -2
  39. package/core/frontend/helpers/get.js +14 -3
  40. package/core/frontend/helpers/ghost_foot.js +2 -1
  41. package/core/frontend/helpers/ghost_head.js +10 -1
  42. package/core/frontend/helpers/has.js +8 -3
  43. package/core/frontend/helpers/img_url.js +9 -3
  44. package/core/frontend/helpers/is.js +7 -2
  45. package/core/frontend/helpers/lang.js +1 -1
  46. package/core/frontend/helpers/link.js +11 -2
  47. package/core/frontend/helpers/link_class.js +11 -2
  48. package/core/frontend/helpers/match.js +12 -3
  49. package/core/frontend/helpers/navigation.js +13 -4
  50. package/core/frontend/helpers/pagination.js +15 -5
  51. package/core/frontend/helpers/plural.js +8 -2
  52. package/core/frontend/helpers/post_class.js +1 -1
  53. package/core/frontend/helpers/prev_post.js +9 -2
  54. package/core/frontend/helpers/price.js +11 -6
  55. package/core/frontend/helpers/products.js +2 -1
  56. package/core/frontend/helpers/reading_time.js +4 -2
  57. package/core/frontend/helpers/t.js +1 -1
  58. package/core/frontend/helpers/tags.js +3 -1
  59. package/core/frontend/helpers/title.js +1 -1
  60. package/core/frontend/helpers/twitter_url.js +2 -1
  61. package/core/frontend/helpers/url.js +3 -1
  62. package/core/frontend/services/proxy.js +34 -57
  63. package/core/frontend/services/rendering.js +24 -0
  64. package/core/frontend/services/routing/controllers/channel.js +6 -2
  65. package/core/frontend/services/routing/controllers/collection.js +6 -2
  66. package/core/frontend/services/routing/middlewares/page-param.js +6 -2
  67. package/core/frontend/services/theme-engine/middleware.js +23 -6
  68. package/core/frontend/services/theme-engine/preview.js +31 -8
  69. package/core/server/adapters/scheduling/post-scheduling/scheduler-intergation.js +6 -4
  70. package/core/server/adapters/storage/LocalFileStorage.js +10 -4
  71. package/core/server/api/canary/custom-theme-settings.js +22 -0
  72. package/core/server/api/canary/index.js +4 -0
  73. package/core/server/api/canary/members.js +1 -1
  74. package/core/server/api/canary/redirects.js +5 -5
  75. package/core/server/api/canary/settings.js +16 -148
  76. package/core/server/api/canary/utils/serializers/output/custom-theme-settings.js +13 -0
  77. package/core/server/api/canary/utils/serializers/output/index.js +4 -0
  78. package/core/server/api/canary/utils/validators/input/settings.js +23 -1
  79. package/core/server/api/v2/redirects.js +3 -3
  80. package/core/server/api/v2/settings.js +3 -4
  81. package/core/server/api/v3/redirects.js +5 -5
  82. package/core/server/api/v3/settings.js +16 -136
  83. package/core/server/api/v3/utils/validators/input/settings.js +23 -1
  84. package/core/server/data/db/state-manager.js +1 -1
  85. package/core/server/data/exporter/table-lists.js +3 -1
  86. package/core/server/data/importer/import-manager.js +398 -0
  87. package/core/server/data/importer/importers/data/data-importer.js +162 -0
  88. package/core/server/data/importer/importers/data/index.js +1 -162
  89. package/core/server/data/importer/index.js +1 -379
  90. package/core/server/data/migrations/versions/4.16/01-add-custom-theme-settings-table.js +9 -0
  91. package/core/server/data/migrations/versions/4.17/01-add-custom-theme-settings-permissions.js +21 -0
  92. package/core/server/data/migrations/versions/4.17/02-add-offers-table.js +19 -0
  93. package/core/server/data/migrations/versions/4.17/03-add-offers-permissions.js +35 -0
  94. package/core/server/data/schema/fixtures/fixtures.json +32 -0
  95. package/core/server/data/schema/schema.js +33 -0
  96. package/core/server/models/custom-theme-setting.js +9 -0
  97. package/core/server/models/index.js +2 -0
  98. package/core/server/services/custom-theme-settings.js +8 -0
  99. package/core/server/services/members/api.js +4 -1
  100. package/core/server/services/redirects/index.js +15 -0
  101. package/core/{frontend → server}/services/redirects/settings.js +13 -6
  102. package/core/server/services/redirects/validation.js +44 -0
  103. package/core/{frontend/services/settings → server/services/route-settings}/default-routes.yaml +0 -0
  104. package/core/server/services/route-settings/default-settings-manager.js +62 -0
  105. package/core/server/services/route-settings/index.js +32 -1
  106. package/core/server/services/route-settings/route-settings.js +38 -12
  107. package/core/server/services/route-settings/settings-loader.js +102 -0
  108. package/core/{frontend/services/settings → server/services/route-settings}/validate.js +38 -28
  109. package/core/server/services/route-settings/yaml-parser.js +53 -0
  110. package/core/server/services/settings/index.js +13 -16
  111. package/core/server/services/settings/settings-bread-service.js +188 -0
  112. package/core/server/services/settings/settings-utils.js +32 -0
  113. package/core/server/services/themes/ThemeStorage.js +5 -4
  114. package/core/server/services/themes/activation-bridge.js +14 -0
  115. package/core/server/services/themes/validate.js +5 -2
  116. package/core/server/web/admin/views/default-prod.html +4 -4
  117. package/core/server/web/admin/views/default.html +4 -4
  118. package/core/server/web/api/canary/admin/routes.js +5 -1
  119. package/core/server/web/members/app.js +3 -0
  120. package/core/server/web/oauth/app.js +7 -8
  121. package/core/server/web/shared/middlewares/custom-redirects.js +82 -59
  122. package/core/server/web/site/routes.js +2 -2
  123. package/core/shared/config/defaults.json +2 -2
  124. package/core/shared/config/overrides.json +1 -1
  125. package/core/shared/custom-theme-settings-cache.js +3 -0
  126. package/core/shared/i18n/translations/en.json +2 -13
  127. package/core/shared/labs.js +2 -2
  128. package/package.json +42 -41
  129. package/yarn.lock +916 -901
  130. package/core/built/assets/ghost-dark-faf931d90e92535e6c03ca16793cbe7b.css +0 -1
  131. package/core/built/assets/ghost.min-7aa074ad556a8455155ac88ceaca03ab.css +0 -1
  132. package/core/frontend/services/redirects/index.js +0 -9
  133. package/core/frontend/services/redirects/validation.js +0 -28
  134. package/core/frontend/services/settings/ensure-settings.js +0 -47
  135. package/core/frontend/services/settings/index.js +0 -104
  136. package/core/frontend/services/settings/loader.js +0 -89
  137. package/core/frontend/services/settings/yaml-parser.js +0 -31
@@ -5,92 +5,115 @@ const debug = require('@tryghost/debug')('web:shared:mw:custom-redirects');
5
5
  const config = require('../../../../shared/config');
6
6
  const urlUtils = require('../../../../shared/url-utils');
7
7
  const errors = require('@tryghost/errors');
8
- const i18n = require('../../../../shared/i18n');
9
8
  const logging = require('@tryghost/logging');
10
- const redirectsService = require('../../../../frontend/services/redirects');
9
+ const redirectsService = require('../../../services/redirects');
10
+ const labsService = require('../../../../shared/labs');
11
+
12
+ const messages = {
13
+ customRedirectsRegistrationFailure: 'Could not register custom redirects.'
14
+ };
11
15
 
12
16
  const _private = {};
13
17
 
14
18
  let customRedirectsRouter;
15
19
 
16
- _private.registerRoutes = () => {
20
+ /**
21
+ *
22
+ * @param {Object} router instance of Express Router to decorate with redirects
23
+ * @param {Object} redirects valid redirects JSON
24
+ *
25
+ * @returns {Object} instance of express.Router express router handling redirects based on config
26
+ */
27
+ _private.registerRoutes = (router, redirects) => {
17
28
  debug('redirects loading');
18
29
 
19
- customRedirectsRouter = express.Router('redirects');
30
+ if (labsService.isSet('offers')) {
31
+ redirects.unshift({
32
+ from: '/zimo50',
33
+ to: '/#/portal/offers/abcdefuckoff'
34
+ });
35
+ }
20
36
 
21
- try {
22
- const redirects = redirectsService.settings.loadRedirectsFile();
37
+ redirects.forEach((redirect) => {
38
+ /**
39
+ * Detect case insensitive modifier when regex is enclosed by
40
+ * / ... /i
41
+ */
42
+ let options = '';
43
+ if (redirect.from.match(/^\/.*\/i$/)) {
44
+ redirect.from = redirect.from.slice(1, -2);
45
+ options = 'i';
46
+ }
23
47
 
24
- redirectsService.validation.validate(redirects);
48
+ /**
49
+ * always delete trailing slashes, doesn't matter if regex or not
50
+ * Example:
51
+ * - you define /my-blog-post-1/ as from property
52
+ * - /my-blog-post-1 or /my-blog-post-1/ should work
53
+ */
25
54
 
26
- redirects.forEach((redirect) => {
27
- /**
28
- * Detect case insensitive modifier when regex is enclosed by
29
- * / ... /i
30
- */
31
- let options = '';
32
- if (redirect.from.match(/^\/.*\/i$/)) {
33
- redirect.from = redirect.from.slice(1, -2);
34
- options = 'i';
35
- }
55
+ if (redirect.from.match(/\/$/)) {
56
+ redirect.from = redirect.from.slice(0, -1);
57
+ }
36
58
 
37
- /**
38
- * always delete trailing slashes, doesn't matter if regex or not
39
- * Example:
40
- * - you define /my-blog-post-1/ as from property
41
- * - /my-blog-post-1 or /my-blog-post-1/ should work
42
- */
59
+ if (redirect.from[redirect.from.length - 1] !== '$') {
60
+ redirect.from += '/?$';
61
+ }
43
62
 
44
- if (redirect.from.match(/\/$/)) {
45
- redirect.from = redirect.from.slice(0, -1);
46
- }
63
+ debug('register', redirect.from);
64
+ router.get(new RegExp(redirect.from, options), function (req, res) {
65
+ const maxAge = redirect.permanent ? config.get('caching:customRedirects:maxAge') : 0;
66
+ const toURL = url.parse(redirect.to);
67
+ const toURLParams = querystring.parse(toURL.query);
68
+ const currentURL = url.parse(req.url);
69
+ const currentURLParams = querystring.parse(currentURL.query);
70
+ const params = Object.assign({}, currentURLParams, toURLParams);
71
+ const search = querystring.stringify(params);
47
72
 
48
- if (redirect.from[redirect.from.length - 1] !== '$') {
49
- redirect.from += '/?$';
73
+ toURL.pathname = currentURL.pathname.replace(new RegExp(redirect.from, options), toURL.pathname);
74
+ toURL.search = search !== '' ? `?${search}` : null;
75
+
76
+ /**
77
+ * Only if the URL is internal should we prepend the Ghost subdirectory
78
+ * @see https://github.com/TryGhost/Ghost/issues/10776
79
+ */
80
+ if (!toURL.hostname) {
81
+ toURL.pathname = urlUtils.urlJoin(urlUtils.getSubdir(), toURL.pathname);
50
82
  }
51
83
 
52
- debug('register', redirect.from);
53
- customRedirectsRouter.get(new RegExp(redirect.from, options), function (req, res) {
54
- const maxAge = redirect.permanent ? config.get('caching:customRedirects:maxAge') : 0;
55
- const toURL = url.parse(redirect.to);
56
- const toURLParams = querystring.parse(toURL.query);
57
- const currentURL = url.parse(req.url);
58
- const currentURLParams = querystring.parse(currentURL.query);
59
- const params = Object.assign({}, currentURLParams, toURLParams);
60
- const search = querystring.stringify(params);
61
-
62
- toURL.pathname = currentURL.pathname.replace(new RegExp(redirect.from, options), toURL.pathname);
63
- toURL.search = search !== '' ? `?${search}` : null;
64
-
65
- /**
66
- * Only if the URL is internal should we prepend the Ghost subdirectory
67
- * @see https://github.com/TryGhost/Ghost/issues/10776
68
- */
69
- if (!toURL.hostname) {
70
- toURL.pathname = urlUtils.urlJoin(urlUtils.getSubdir(), toURL.pathname);
71
- }
72
-
73
- res.set({
74
- 'Cache-Control': `public, max-age=${maxAge}`
75
- });
76
-
77
- res.redirect(redirect.permanent ? 301 : 302, url.format(toURL));
84
+ res.set({
85
+ 'Cache-Control': `public, max-age=${maxAge}`
78
86
  });
87
+
88
+ res.redirect(redirect.permanent ? 301 : 302, url.format(toURL));
79
89
  });
90
+ });
91
+
92
+ debug('redirects loaded');
93
+
94
+ return router;
95
+ };
96
+
97
+ const loadRoutes = () => {
98
+ try {
99
+ customRedirectsRouter = express.Router('redirects');
100
+
101
+ const redirects = redirectsService.loadRedirectsFile();
102
+ redirectsService.validate(redirects);
103
+
104
+ _private.registerRoutes(customRedirectsRouter, redirects);
80
105
  } catch (err) {
81
106
  if (errors.utils.isIgnitionError(err)) {
82
107
  logging.error(err);
83
108
  } else {
84
109
  logging.error(new errors.IncorrectUsageError({
85
- message: i18n.t('errors.middleware.redirects.register'),
110
+ message: messages.customRedirectsRegistrationFailure,
86
111
  context: err.message,
87
112
  help: 'https://ghost.org/docs/themes/routing/#redirects',
88
113
  err
89
114
  }));
90
115
  }
91
116
  }
92
-
93
- debug('redirects loaded');
94
117
  };
95
118
 
96
119
  /**
@@ -99,7 +122,7 @@ _private.registerRoutes = () => {
99
122
  * - file loads synchronously, because we need to register the routes before anything else
100
123
  */
101
124
  exports.use = function use(siteApp) {
102
- _private.registerRoutes();
125
+ loadRoutes();
103
126
 
104
127
  // Recommended approach by express, see https://github.com/expressjs/express/issues/2596#issuecomment-81353034.
105
128
  // As soon as the express router get's re-instantiated, the old router instance is not used anymore.
@@ -109,5 +132,5 @@ exports.use = function use(siteApp) {
109
132
  };
110
133
 
111
134
  exports.reload = function reload() {
112
- _private.registerRoutes();
135
+ loadRoutes();
113
136
  };
@@ -1,9 +1,9 @@
1
1
  const debug = require('@tryghost/debug')('routing');
2
2
  const routing = require('../../../frontend/services/routing');
3
- const frontendSettings = require('../../../frontend/services/settings');
3
+ const routeSettings = require('../../services/route-settings');
4
4
 
5
5
  module.exports = function siteRoutes(options = {}) {
6
6
  debug('site Routes', options);
7
- options.routerSettings = frontendSettings.get('routes');
7
+ options.routerSettings = routeSettings.loadRouteSettingsSync();
8
8
  return routing.bootstrap.init(options);
9
9
  };
@@ -121,7 +121,7 @@
121
121
  "emailAnalytics": true
122
122
  },
123
123
  "portal": {
124
- "url": "https://unpkg.com/@tryghost/portal@~1.9.0/umd/portal.min.js",
125
- "version": "1.9"
124
+ "url": "https://unpkg.com/@tryghost/portal@~1.11.0/umd/portal.min.js",
125
+ "version": "1.11"
126
126
  }
127
127
  }
@@ -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/frontend/services/settings/",
9
+ "defaultSettings": "core/server/services/route-settings/",
10
10
  "internalAppPath": "core/frontend/apps/",
11
11
  "internalAdaptersPath": "core/server/adapters/",
12
12
  "migrationPath": "core/server/data/migrations",
@@ -0,0 +1,3 @@
1
+ const {Cache: CustomThemeSettingsCache} = require('@tryghost/custom-theme-settings-service');
2
+
3
+ module.exports = new CustomThemeSettingsCache();
@@ -106,8 +106,7 @@
106
106
  },
107
107
  "images": {
108
108
  "invalidDimensions": "Could not fetch image dimensions."
109
- },
110
- "redirectsWrongFormat": "Incorrect redirects file format."
109
+ }
111
110
  },
112
111
  "config": {
113
112
  "couldNotLocateConfigFile": {
@@ -157,8 +156,7 @@
157
156
  "maintenance": "Site is currently undergoing maintenance, please wait a moment then retry.",
158
157
  "maintenanceUrlService": "Site is starting up, please wait a moment then retry.",
159
158
  "requiredOnFuture": "This will be required in future. Please see {link}",
160
- "internalError": "Something went wrong.",
161
- "jsonParse": "Could not parse JSON: {context}."
159
+ "internalError": "Something went wrong."
162
160
  },
163
161
  "mail": {
164
162
  "incompleteMessageData": {
@@ -539,15 +537,6 @@
539
537
  }
540
538
  },
541
539
  "services": {
542
- "settings": {
543
- "yaml": {
544
- "error": "Could not parse {file}: {context}.",
545
- "help": "Check your {file} file for typos and fix the named issues.",
546
- "validate": "The following definition \"{at}\" is invalid: {reason}"
547
- },
548
- "loader": "Error trying to load YAML setting for {setting} from '{path}'.",
549
- "ensureSettings": "Error trying to access settings files in {path}."
550
- },
551
540
  "mega": {
552
541
  "requestFailed": {
553
542
  "error": "The email service was unable to send an email batch."
@@ -24,10 +24,10 @@ const BETA_FEATURES = [
24
24
 
25
25
  const ALPHA_FEATURES = [
26
26
  'oauthLogin',
27
- 'membersFiltering',
28
27
  'emailOnlyPosts',
29
28
  'customThemeSettings',
30
- 'membersActivity'
29
+ 'membersActivity',
30
+ 'offers'
31
31
  ];
32
32
 
33
33
  module.exports.WRITABLE_KEYS_ALLOWLIST = [...BETA_FEATURES, ...ALPHA_FEATURES];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "4.15.0",
3
+ "version": "4.17.1",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -51,50 +51,51 @@
51
51
  },
52
52
  "dependencies": {
53
53
  "@nexes/nql": "0.6.0",
54
- "@sentry/node": "6.12.0",
55
- "@tryghost/adapter-manager": "0.2.14",
54
+ "@sentry/node": "6.13.2",
55
+ "@tryghost/adapter-manager": "0.2.16",
56
56
  "@tryghost/admin-api-schema": "2.6.0",
57
57
  "@tryghost/bookshelf-plugins": "0.3.1",
58
- "@tryghost/bootstrap-socket": "0.2.9",
58
+ "@tryghost/bootstrap-socket": "0.2.11",
59
59
  "@tryghost/color-utils": "0.1.2",
60
- "@tryghost/config-url-helpers": "0.1.0",
61
- "@tryghost/constants": "0.1.8",
60
+ "@tryghost/config-url-helpers": "0.1.2",
61
+ "@tryghost/constants": "0.1.10",
62
+ "@tryghost/custom-theme-settings-service": "0.0.5",
62
63
  "@tryghost/debug": "0.1.5",
63
- "@tryghost/email-analytics-provider-mailgun": "1.0.0",
64
- "@tryghost/email-analytics-service": "1.0.0",
65
- "@tryghost/errors": "0.2.13",
64
+ "@tryghost/email-analytics-provider-mailgun": "1.0.2",
65
+ "@tryghost/email-analytics-service": "1.0.2",
66
+ "@tryghost/errors": "0.2.15",
66
67
  "@tryghost/helpers": "1.1.52",
67
- "@tryghost/image-transform": "1.0.13",
68
- "@tryghost/job-manager": "0.8.7",
68
+ "@tryghost/image-transform": "1.0.15",
69
+ "@tryghost/job-manager": "0.8.9",
69
70
  "@tryghost/kg-card-factory": "3.0.4",
70
71
  "@tryghost/kg-default-atoms": "3.0.0",
71
72
  "@tryghost/kg-default-cards": "5.0.7",
72
73
  "@tryghost/kg-markdown-html-renderer": "5.0.5",
73
74
  "@tryghost/kg-mobiledoc-html-renderer": "5.1.1",
74
- "@tryghost/limit-service": "0.6.1",
75
+ "@tryghost/limit-service": "0.6.3",
75
76
  "@tryghost/logging": "0.1.7",
76
- "@tryghost/magic-link": "1.0.11",
77
- "@tryghost/members-api": "1.32.1",
78
- "@tryghost/members-csv": "1.1.6",
79
- "@tryghost/members-importer": "0.3.2",
80
- "@tryghost/members-ssr": "1.0.12",
81
- "@tryghost/mw-session-from-token": "0.1.22",
82
- "@tryghost/nodemailer": "0.3.1",
83
- "@tryghost/package-json": "1.0.2",
84
- "@tryghost/promise": "0.1.9",
77
+ "@tryghost/magic-link": "1.0.13",
78
+ "@tryghost/members-api": "1.39.1",
79
+ "@tryghost/members-csv": "1.1.7",
80
+ "@tryghost/members-importer": "0.3.3",
81
+ "@tryghost/members-ssr": "1.0.14",
82
+ "@tryghost/mw-session-from-token": "0.1.24",
83
+ "@tryghost/nodemailer": "0.3.3",
84
+ "@tryghost/package-json": "1.0.4",
85
+ "@tryghost/promise": "0.1.11",
85
86
  "@tryghost/request": "0.1.5",
86
87
  "@tryghost/root-utils": "0.3.4",
87
- "@tryghost/security": "0.2.9",
88
- "@tryghost/session-service": "0.1.24",
88
+ "@tryghost/security": "0.2.11",
89
+ "@tryghost/session-service": "0.1.26",
89
90
  "@tryghost/social-urls": "0.1.26",
90
91
  "@tryghost/string": "0.1.20",
91
- "@tryghost/tpl": "0.1.3",
92
- "@tryghost/update-check-service": "0.2.0",
92
+ "@tryghost/tpl": "0.1.5",
93
+ "@tryghost/update-check-service": "0.2.2",
93
94
  "@tryghost/url-utils": "2.0.2",
94
95
  "@tryghost/validator": "0.1.5",
95
96
  "@tryghost/version": "0.1.4",
96
- "@tryghost/vhost-middleware": "1.0.15",
97
- "@tryghost/zip": "1.1.14",
97
+ "@tryghost/vhost-middleware": "1.0.17",
98
+ "@tryghost/zip": "1.1.16",
98
99
  "amperize": "0.6.1",
99
100
  "analytics-node": "5.1.0",
100
101
  "bluebird": "3.7.2",
@@ -118,9 +119,9 @@
118
119
  "express-session": "1.17.2",
119
120
  "fs-extra": "10.0.0",
120
121
  "ghost-storage-base": "0.0.6",
121
- "glob": "7.1.7",
122
+ "glob": "7.2.0",
122
123
  "got": "9.6.0",
123
- "gscan": "4.2.1",
124
+ "gscan": "4.3.1",
124
125
  "html-to-text": "5.1.1",
125
126
  "image-size": "1.0.0",
126
127
  "intl": "1.2.5",
@@ -134,15 +135,15 @@
134
135
  "knex-migrator": "4.0.4",
135
136
  "lodash": "4.17.21",
136
137
  "mailgun-js": "0.22.0",
137
- "metascraper": "5.24.6",
138
- "metascraper-author": "5.24.6",
139
- "metascraper-description": "5.24.6",
140
- "metascraper-image": "5.24.6",
141
- "metascraper-logo": "5.24.6",
142
- "metascraper-logo-favicon": "5.24.6",
143
- "metascraper-publisher": "5.24.6",
144
- "metascraper-title": "5.24.6",
145
- "metascraper-url": "5.24.6",
138
+ "metascraper": "5.24.7",
139
+ "metascraper-author": "5.24.7",
140
+ "metascraper-description": "5.24.7",
141
+ "metascraper-image": "5.24.7",
142
+ "metascraper-logo": "5.24.7",
143
+ "metascraper-logo-favicon": "5.24.7",
144
+ "metascraper-publisher": "5.24.7",
145
+ "metascraper-title": "5.24.7",
146
+ "metascraper-url": "5.24.7",
146
147
  "moment": "2.24.0",
147
148
  "moment-timezone": "0.5.23",
148
149
  "multer": "1.4.3",
@@ -169,7 +170,7 @@
169
170
  "devDependencies": {
170
171
  "@lodder/grunt-postcss": "3.0.1",
171
172
  "c8": "7.9.0",
172
- "coffeescript": "2.5.1",
173
+ "coffeescript": "2.6.0",
173
174
  "cssnano": "5.0.8",
174
175
  "eslint": "7.32.0",
175
176
  "eslint-plugin-ghost": "2.6.0",
@@ -185,12 +186,12 @@
185
186
  "grunt-subgrunt": "1.3.0",
186
187
  "grunt-update-submodules": "0.4.1",
187
188
  "jwks-rsa": "2.0.4",
188
- "mocha": "9.1.1",
189
+ "mocha": "9.1.2",
189
190
  "mocha-slow-test-reporter": "0.1.2",
190
191
  "mock-knex": "0.4.10",
191
192
  "nock": "13.1.3",
192
193
  "papaparse": "5.3.1",
193
- "postcss": "8.3.6",
194
+ "postcss": "8.3.8",
194
195
  "rewire": "5.0.0",
195
196
  "should": "13.2.3",
196
197
  "sinon": "11.1.2",