ghost 4.19.1 → 4.20.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 (139) hide show
  1. package/.eslintrc.js +9 -8
  2. package/Gruntfile.js +1 -1
  3. package/PRIVACY.md +3 -0
  4. package/content/adapters/README.md +2 -2
  5. package/core/boot.js +4 -4
  6. package/core/bridge.js +9 -1
  7. package/core/built/assets/{chunk.3.0778d8e4d707d2a625f1.js → chunk.3.777d43e2ce954ba8b2f5.js} +1 -1
  8. package/core/built/assets/codemirror/{codemirror-21a09582262987037db73b152fb35f7c.js → codemirror-d25c379b87ec8b33d54ac7149bc0b6ae.js} +14 -14
  9. package/core/built/assets/ghost-dark-20e2892d4f30d0d1183c9ac725ea37d0.css +1 -0
  10. package/core/built/assets/{ghost.min-102753ec485602c8fe80d60a1750bf84.js → ghost.min-07b6a50c54b3e2e190332c28c7255d2f.js} +525 -340
  11. package/core/built/assets/ghost.min-57e46fd3b1145ecf2cbd185a13611f3b.css +1 -0
  12. package/core/built/assets/icons/arrow-left-small.svg +0 -4
  13. package/core/built/assets/img/footer-marketplace-bg-572b6c6486a7e26316954d599eaa9f30.png +0 -0
  14. package/core/built/assets/img/marketing/offers-1-f2e1b653c4d5bb90eea9d7a2862530f9.jpg +0 -0
  15. package/core/built/assets/img/marketing/offers-2-28a225d34cc39d133748431536961d00.jpg +0 -0
  16. package/core/built/assets/img/marketing/offers-3-2094c91ab21a16c37fbe6ec16c140160.jpg +0 -0
  17. package/core/built/assets/img/themes/Casper-c7e784d7188cc5d7f097d9b6c97b0263.jpg +0 -0
  18. package/core/built/assets/simplemde/{simplemde-232f69d126310434489071a1891e6d8b.js → simplemde-3ffc0ec9e9fecf29b9a499db678c9e65.js} +14 -14
  19. package/core/built/assets/{vendor.min-0916203b598271a795909e8e0b1c16c2.js → vendor.min-af502ac4142871500fc424f6a5a254ec.js} +1046 -1043
  20. package/core/frontend/apps/amp/lib/router.js +1 -1
  21. package/core/frontend/meta/author-url.js +1 -1
  22. package/core/frontend/meta/url.js +1 -1
  23. package/core/{server → frontend}/public/favicon.ico +0 -0
  24. package/core/{server → frontend}/public/ghost.css +0 -0
  25. package/core/{server → frontend}/public/ghost.min.css +0 -0
  26. package/core/{server → frontend}/public/robots.txt +0 -0
  27. package/core/{server → frontend}/public/sitemap.xsl +0 -0
  28. package/core/frontend/services/proxy.js +1 -1
  29. package/core/frontend/services/routing/CollectionRouter.js +3 -49
  30. package/core/frontend/services/routing/ParentRouter.js +1 -4
  31. package/core/frontend/services/routing/StaticPagesRouter.js +3 -5
  32. package/core/frontend/services/routing/StaticRoutesRouter.js +4 -6
  33. package/core/frontend/services/routing/TaxonomyRouter.js +4 -5
  34. package/core/frontend/services/routing/controllers/collection.js +2 -2
  35. package/core/frontend/services/routing/controllers/email-post.js +2 -2
  36. package/core/frontend/services/routing/controllers/entry.js +2 -2
  37. package/core/frontend/services/routing/controllers/preview.js +2 -2
  38. package/core/frontend/services/routing/index.js +6 -12
  39. package/core/frontend/services/routing/registry.js +13 -0
  40. package/core/frontend/services/routing/router-manager.js +185 -0
  41. package/core/frontend/services/rss/generate-feed.js +2 -2
  42. package/core/frontend/services/theme-engine/i18n/i18n.js +267 -28
  43. package/core/frontend/services/theme-engine/i18n/index.js +1 -1
  44. package/core/frontend/services/theme-engine/i18n/theme-i18n.js +73 -0
  45. package/core/frontend/web/index.js +1 -0
  46. package/core/{server/web/site → frontend/web}/middleware/handle-image-sizes.js +4 -4
  47. package/core/{server/web/site → frontend/web}/middleware/index.js +0 -0
  48. package/core/{server/web/site → frontend/web}/middleware/redirect-ghost-to-admin.js +3 -3
  49. package/core/{server/web/site → frontend/web}/middleware/serve-favicon.js +6 -6
  50. package/core/{server/web/site → frontend/web}/middleware/serve-public-file.js +2 -2
  51. package/core/{server/web/site → frontend/web}/middleware/static-theme.js +3 -3
  52. package/core/{server/web/site → frontend/web}/routes.js +5 -4
  53. package/core/{server/web/site/app.js → frontend/web/site.js} +12 -16
  54. package/core/server/adapters/storage/LocalFileStorage.js +35 -39
  55. package/core/server/adapters/storage/index.js +12 -2
  56. package/core/server/api/canary/images.js +1 -1
  57. package/core/server/api/canary/offers.js +19 -0
  58. package/core/server/api/canary/utils/serializers/output/settings.js +2 -3
  59. package/core/server/api/canary/utils/serializers/output/utils/url.js +1 -1
  60. package/core/server/api/v2/images.js +1 -1
  61. package/core/server/api/v2/utils/serializers/output/utils/url.js +1 -1
  62. package/core/server/api/v3/images.js +1 -1
  63. package/core/server/api/v3/utils/serializers/output/settings.js +2 -3
  64. package/core/server/api/v3/utils/serializers/output/utils/url.js +1 -1
  65. package/core/server/data/importer/handlers/image.js +1 -1
  66. package/core/server/data/importer/importers/image.js +1 -1
  67. package/core/server/data/migrations/init/1-create-tables.js +7 -8
  68. package/core/server/data/migrations/init/2-create-fixtures.js +8 -8
  69. package/core/server/data/migrations/versions/4.20/01-remove-offer-redemptions-table.js +19 -0
  70. package/core/server/data/migrations/versions/4.20/02-remove-offers-table.js +30 -0
  71. package/core/server/data/migrations/versions/4.20/03-add-offers-table.js +21 -0
  72. package/core/server/data/migrations/versions/4.20/04-add-offer-redemptions-table.js +9 -0
  73. package/core/server/data/migrations/versions/4.20/05-remove-not-null-constraint-from-portal-title.js +41 -0
  74. package/core/server/data/schema/fixtures/utils.js +150 -143
  75. package/core/server/data/schema/schema.js +4 -3
  76. package/core/server/frontend/ghost.min.css +1 -0
  77. package/core/server/lib/image/image-size.js +2 -2
  78. package/core/server/lib/mobiledoc.js +3 -2
  79. package/core/server/models/action.js +7 -4
  80. package/core/server/models/base/plugins/overrides.js +19 -6
  81. package/core/server/models/index.js +4 -46
  82. package/core/server/models/member.js +5 -0
  83. package/core/server/models/user.js +2 -1
  84. package/core/server/overrides.js +6 -2
  85. package/core/server/services/adapter-manager/config.js +1 -0
  86. package/core/server/services/adapter-manager/index.js +9 -5
  87. package/core/server/services/adapter-manager/options-resolver.js +18 -0
  88. package/core/server/services/bulk-email/mailgun.js +1 -1
  89. package/core/server/services/mega/post-email-serializer.js +2 -2
  90. package/core/server/services/members/api.js +1 -3
  91. package/core/server/services/members/emails/signin.js +1 -1
  92. package/core/server/services/members/emails/signup.js +1 -1
  93. package/core/server/services/members/emails/subscribe.js +1 -1
  94. package/core/server/services/members/service.js +2 -1
  95. package/core/server/services/offers/service.js +1 -1
  96. package/core/server/services/route-settings/route-settings.js +1 -1
  97. package/core/server/services/settings/index.js +3 -1
  98. package/core/server/services/settings/settings-bread-service.js +42 -20
  99. package/core/server/services/slack.js +1 -1
  100. package/core/server/services/themes/activate.js +2 -2
  101. package/core/server/services/themes/activation-bridge.js +6 -6
  102. package/core/server/services/themes/storage.js +1 -1
  103. package/core/{frontend → server}/services/url/Queue.js +0 -0
  104. package/core/{frontend → server}/services/url/Resource.js +0 -0
  105. package/core/{frontend → server}/services/url/Resources.js +2 -2
  106. package/core/{frontend → server}/services/url/UrlGenerator.js +14 -14
  107. package/core/{frontend → server}/services/url/UrlService.js +12 -15
  108. package/core/{frontend → server}/services/url/Urls.js +1 -1
  109. package/core/{frontend → server}/services/url/configs/canary.js +0 -0
  110. package/core/{frontend → server}/services/url/configs/v2.js +0 -0
  111. package/core/{frontend → server}/services/url/configs/v3.js +0 -0
  112. package/core/{frontend → server}/services/url/configs/v4.js +0 -0
  113. package/core/{frontend → server}/services/url/index.js +0 -0
  114. package/core/server/services/xmlrpc.js +1 -1
  115. package/core/server/update-check.js +3 -3
  116. package/core/server/web/admin/controller.js +11 -0
  117. package/core/server/web/admin/views/default-prod.html +4 -4
  118. package/core/server/web/admin/views/default.html +4 -4
  119. package/core/server/web/api/app.js +8 -9
  120. package/core/server/web/oauth/app.js +4 -2
  121. package/core/server/web/parent/backend.js +3 -3
  122. package/core/server/web/parent/frontend.js +2 -2
  123. package/core/server/web/shared/middlewares/custom-redirects.js +0 -8
  124. package/core/server/web/shared/middlewares/maintenance.js +1 -1
  125. package/core/server/web/well-known.js +10 -10
  126. package/core/shared/config/overrides.json +1 -1
  127. package/core/shared/express.js +10 -0
  128. package/core/shared/html-to-plaintext.js +2 -2
  129. package/core/shared/labs.js +14 -5
  130. package/package.json +45 -43
  131. package/yarn.lock +649 -284
  132. package/core/built/assets/ghost-dark-da8e8eba130fb52f97494e51850d1045.css +0 -1
  133. package/core/built/assets/ghost.min-0d8f19623e9f077351bce453034daf4d.css +0 -1
  134. package/core/frontend/services/routing/bootstrap.js +0 -134
  135. package/core/server/public/404-ghost.png +0 -0
  136. package/core/server/public/404-ghost@2x.png +0 -0
  137. package/core/server/web/site/index.js +0 -1
  138. package/core/shared/i18n/i18n.js +0 -312
  139. package/core/shared/i18n/index.js +0 -6
@@ -12,18 +12,17 @@ module.exports = function setupApiApp() {
12
12
  apiApp.use(require('./testmode')());
13
13
  }
14
14
 
15
- // Mount different API versions
16
- apiApp.use(urlUtils.getVersionPath({version: 'v2', type: 'content'}), require('./v2/content/app')());
17
- apiApp.use(urlUtils.getVersionPath({version: 'v2', type: 'admin'}), require('./v2/admin/app')());
15
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'v2', type: 'content'}), require('./v2/content/app'));
16
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'v2', type: 'admin'}), require('./v2/admin/app'));
18
17
 
19
- apiApp.use(urlUtils.getVersionPath({version: 'v3', type: 'content'}), require('./v3/content/app')());
20
- apiApp.use(urlUtils.getVersionPath({version: 'v3', type: 'admin'}), require('./v3/admin/app')());
18
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'v3', type: 'content'}), require('./v3/content/app'));
19
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'v3', type: 'admin'}), require('./v3/admin/app'));
21
20
 
22
- apiApp.use(urlUtils.getVersionPath({version: 'v4', type: 'content'}), require('./canary/content/app')());
23
- apiApp.use(urlUtils.getVersionPath({version: 'v4', type: 'admin'}), require('./canary/admin/app')());
21
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'v4', type: 'content'}), require('./canary/content/app'));
22
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'v4', type: 'admin'}), require('./canary/admin/app'));
24
23
 
25
- apiApp.use(urlUtils.getVersionPath({version: 'canary', type: 'content'}), require('./canary/content/app')());
26
- apiApp.use(urlUtils.getVersionPath({version: 'canary', type: 'admin'}), require('./canary/admin/app')());
24
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'canary', type: 'content'}), require('./canary/content/app'));
25
+ apiApp.lazyUse(urlUtils.getVersionPath({version: 'canary', type: 'admin'}), require('./canary/admin/app'));
27
26
 
28
27
  // Error handling for requests to non-existent API versions
29
28
  apiApp.use(errorHandler.resourceNotFound);
@@ -1,7 +1,5 @@
1
1
  const debug = require('@tryghost/debug')('web:oauth:app');
2
2
  const {URL} = require('url');
3
- const passport = require('passport');
4
- const GoogleStrategy = require('passport-google-oauth20').Strategy;
5
3
  const express = require('../../../shared/express');
6
4
  const urlUtils = require('../../../shared/url-utils');
7
5
  const shared = require('../shared');
@@ -36,6 +34,10 @@ module.exports = function setupOAuthApp() {
36
34
  */
37
35
  function googleOAuthMiddleware(clientId, secret) {
38
36
  return (req, res, next) => {
37
+ // Lazy-required to save boot time
38
+ const passport = require('passport');
39
+ const GoogleStrategy = require('passport-google-oauth20').Strategy;
40
+
39
41
  const adminURL = urlUtils.urlFor('admin', true);
40
42
 
41
43
  //Create the callback url to be sent to Google
@@ -10,9 +10,9 @@ module.exports = () => {
10
10
  // BACKEND
11
11
  // Wrap the admin and API apps into a single express app for use with vhost
12
12
  const backendApp = express('backend');
13
- backendApp.use('/ghost/api', require('../api')());
14
- backendApp.use('/ghost/oauth', require('../oauth')());
15
- backendApp.use('/ghost/.well-known', require('../well-known')());
13
+ backendApp.lazyUse('/ghost/api', require('../api'));
14
+ backendApp.lazyUse('/ghost/oauth', require('../oauth'));
15
+ backendApp.lazyUse('/ghost/.well-known', require('../well-known'));
16
16
  backendApp.use('/ghost', require('../../services/auth/session').createSessionFromToken, require('../admin')());
17
17
 
18
18
  return backendApp;
@@ -18,8 +18,8 @@ module.exports = (options) => {
18
18
  // otherwise we serve assets/pages with http. This can cause mixed content warnings in the admin client.
19
19
  frontendApp.use(shared.middlewares.urlRedirects.frontendSSLRedirect);
20
20
 
21
- frontendApp.use('/members', require('../members')());
22
- frontendApp.use('/', require('../site')(options));
21
+ frontendApp.lazyUse('/members', require('../members'));
22
+ frontendApp.use('/', require('../../../frontend/web')(options));
23
23
 
24
24
  return frontendApp;
25
25
  };
@@ -7,7 +7,6 @@ const urlUtils = require('../../../../shared/url-utils');
7
7
  const errors = require('@tryghost/errors');
8
8
  const logging = require('@tryghost/logging');
9
9
  const redirectsService = require('../../../services/redirects');
10
- const labsService = require('../../../../shared/labs');
11
10
 
12
11
  const messages = {
13
12
  customRedirectsRegistrationFailure: 'Could not register custom redirects.'
@@ -27,13 +26,6 @@ let customRedirectsRouter;
27
26
  _private.registerRoutes = (router, redirects) => {
28
27
  debug('redirects loading');
29
28
 
30
- if (labsService.isSet('offers')) {
31
- redirects.unshift({
32
- from: '/zimo50',
33
- to: '/#/portal/offers/abcdefuckoff'
34
- });
35
- }
36
-
37
29
  redirects.forEach((redirect) => {
38
30
  /**
39
31
  * Detect case insensitive modifier when regex is enclosed by
@@ -1,7 +1,7 @@
1
1
  const errors = require('@tryghost/errors');
2
2
  const config = require('../../../../shared/config');
3
3
  const tpl = require('@tryghost/tpl');
4
- const urlService = require('../../../../frontend/services/url');
4
+ const urlService = require('../../../services/url');
5
5
 
6
6
  const messages = {
7
7
  maintenance: 'Site is currently undergoing maintenance, please wait a moment then retry.',
@@ -1,19 +1,19 @@
1
1
  const express = require('../../shared/express');
2
2
  const settings = require('../../shared/settings-cache');
3
- const jose = require('node-jose');
4
-
5
- const dangerousPrivateKey = settings.get('ghost_private_key');
6
- const keyStore = jose.JWK.createKeyStore();
7
- const keyStoreReady = keyStore.add(dangerousPrivateKey, 'pem');
8
-
9
- const getSafePublicJWKS = async () => {
10
- await keyStoreReady;
11
- return keyStore.toJSON();
12
- };
13
3
 
14
4
  module.exports = function setupWellKnownApp() {
15
5
  const wellKnownApp = express('well-known');
16
6
 
7
+ const jose = require('node-jose');
8
+ const dangerousPrivateKey = settings.get('ghost_private_key');
9
+ const keyStore = jose.JWK.createKeyStore();
10
+ const keyStoreReady = keyStore.add(dangerousPrivateKey, 'pem');
11
+
12
+ const getSafePublicJWKS = async () => {
13
+ await keyStoreReady;
14
+ return keyStore.toJSON();
15
+ };
16
+
17
17
  wellKnownApp.get('/jwks.json', async (req, res) => {
18
18
  const jwks = await getSafePublicJWKS();
19
19
  res.json(jwks);
@@ -10,7 +10,7 @@
10
10
  "internalAppPath": "core/frontend/apps/",
11
11
  "internalAdaptersPath": "core/server/adapters/",
12
12
  "migrationPath": "core/server/data/migrations",
13
- "publicFilePath": "core/server/public"
13
+ "publicFilePath": "core/frontend/public"
14
14
  },
15
15
  "apps": {
16
16
  "internal": [
@@ -1,7 +1,10 @@
1
1
  const debug = require('@tryghost/debug')('shared:express');
2
2
  const express = require('express');
3
+ const {createLazyRouter} = require('express-lazy-router');
3
4
  const sentry = require('./sentry');
4
5
 
6
+ const lazyLoad = createLazyRouter();
7
+
5
8
  module.exports = (name) => {
6
9
  debug('new app start', name);
7
10
  const app = express();
@@ -14,6 +17,13 @@ module.exports = (name) => {
14
17
  // Sentry must be our first error handler. Mounting it here means all custom error handlers will come after
15
18
  app.use(sentry.errorHandler);
16
19
 
20
+ app.lazyUse = function lazyUse(mountPath, requireFn) {
21
+ app.use(mountPath, lazyLoad(() => {
22
+ debug(`lazy-loading on ${mountPath}`);
23
+ return Promise.resolve(requireFn());
24
+ }));
25
+ };
26
+
17
27
  debug('new app end', name);
18
28
  return app;
19
29
  };
@@ -1,6 +1,6 @@
1
- const htmlToText = require('html-to-text');
2
-
3
1
  module.exports = function htmlToPlaintext(html) {
2
+ const htmlToText = require('html-to-text');
3
+
4
4
  return htmlToText.fromString(html, {
5
5
  wordwrap: 80,
6
6
  ignoreImage: true,
@@ -1,6 +1,5 @@
1
1
  const _ = require('lodash');
2
2
  const Promise = require('bluebird');
3
- const SafeString = require('express-hbs').SafeString;
4
3
  const errors = require('@tryghost/errors');
5
4
  const logging = require('@tryghost/logging');
6
5
  const tpl = require('@tryghost/tpl');
@@ -14,6 +13,12 @@ const messages = {
14
13
  errorHelp: 'See {url}'
15
14
  };
16
15
 
16
+ // flags in this list always return `true`, allows quick global enable prior to full flag removal
17
+ const GA_FEATURES = [
18
+ 'customThemeSettings',
19
+ 'offers'
20
+ ];
21
+
17
22
  // NOTE: this allowlist is meant to be used to filter out any unexpected
18
23
  // input for the "labs" setting value
19
24
  const BETA_FEATURES = [
@@ -23,11 +28,10 @@ const BETA_FEATURES = [
23
28
 
24
29
  const ALPHA_FEATURES = [
25
30
  'oauthLogin',
26
- 'customThemeSettings',
27
- 'membersActivity',
28
- 'offers'
31
+ 'membersActivity'
29
32
  ];
30
33
 
34
+ module.exports.GA_KEYS = [...GA_FEATURES];
31
35
  module.exports.WRITABLE_KEYS_ALLOWLIST = [...BETA_FEATURES, ...ALPHA_FEATURES];
32
36
 
33
37
  module.exports.getAll = () => {
@@ -39,6 +43,10 @@ module.exports.getAll = () => {
39
43
  }
40
44
  });
41
45
 
46
+ GA_FEATURES.forEach((gaKey) => {
47
+ labs[gaKey] = true;
48
+ });
49
+
42
50
  labs.members = settingsCache.get('members_signup_access') !== 'none';
43
51
 
44
52
  return labs;
@@ -78,7 +86,7 @@ module.exports.enabledHelper = function enabledHelper(options, callback) {
78
86
  }
79
87
 
80
88
  // Else, the helper is not active and we need to handle this as an error
81
- errDetails.message = tpl(options.errorMessage || messages.errorMessage, {helperName: options.helperName}),
89
+ errDetails.message = tpl(options.errorMessage || messages.errorMessage, {helperName: options.helperName});
82
90
  errDetails.context = tpl(options.errorContext || messages.errorContext, {
83
91
  helperName: options.helperName,
84
92
  flagName: options.flagName
@@ -87,6 +95,7 @@ module.exports.enabledHelper = function enabledHelper(options, callback) {
87
95
 
88
96
  logging.error(new errors.DisabledFeatureError(errDetails));
89
97
 
98
+ const {SafeString} = require('express-hbs');
90
99
  errString = new SafeString(`<script>console.error("${_.values(errDetails).join(' ')}");</script>`);
91
100
 
92
101
  if (options.async) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "4.19.1",
3
+ "version": "4.20.3",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -29,7 +29,7 @@
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 --all -n 'core/{*.js,frontend,server,shared}' --reporter text-summary mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/unit' --timeout=2000",
32
+ "test:unit": "c8 --all -n 'core/{*.js,frontend,server,shared}' --reporter text-summary --reporter cobertura 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",
@@ -55,55 +55,55 @@
55
55
  "dependencies": {
56
56
  "@nexes/nql": "0.6.0",
57
57
  "@sentry/node": "6.13.3",
58
- "@tryghost/adapter-manager": "0.2.17",
58
+ "@tryghost/adapter-manager": "0.2.18",
59
59
  "@tryghost/admin-api-schema": "2.6.0",
60
- "@tryghost/bookshelf-plugins": "0.3.3",
61
- "@tryghost/bootstrap-socket": "0.2.12",
60
+ "@tryghost/bookshelf-plugins": "0.3.4",
61
+ "@tryghost/bootstrap-socket": "0.2.13",
62
62
  "@tryghost/color-utils": "0.1.2",
63
- "@tryghost/config-url-helpers": "0.1.2",
64
- "@tryghost/constants": "0.1.11",
65
- "@tryghost/custom-theme-settings-service": "0.1.2",
66
- "@tryghost/debug": "0.1.8",
67
- "@tryghost/email-analytics-provider-mailgun": "1.0.3",
68
- "@tryghost/email-analytics-service": "1.0.2",
69
- "@tryghost/errors": "0.2.16",
70
- "@tryghost/express-dynamic-redirects": "0.2.0",
63
+ "@tryghost/config-url-helpers": "0.1.3",
64
+ "@tryghost/constants": "0.1.12",
65
+ "@tryghost/custom-theme-settings-service": "0.3.0",
66
+ "@tryghost/debug": "0.1.9",
67
+ "@tryghost/email-analytics-provider-mailgun": "1.0.4",
68
+ "@tryghost/email-analytics-service": "1.0.3",
69
+ "@tryghost/errors": "0.2.17",
70
+ "@tryghost/express-dynamic-redirects": "0.2.1",
71
71
  "@tryghost/helpers": "1.1.52",
72
- "@tryghost/image-transform": "1.0.16",
73
- "@tryghost/job-manager": "0.8.10",
72
+ "@tryghost/image-transform": "1.0.17",
73
+ "@tryghost/job-manager": "0.8.11",
74
74
  "@tryghost/kg-card-factory": "3.0.4",
75
75
  "@tryghost/kg-default-atoms": "3.0.0",
76
76
  "@tryghost/kg-default-cards": "5.0.7",
77
77
  "@tryghost/kg-markdown-html-renderer": "5.0.5",
78
78
  "@tryghost/kg-mobiledoc-html-renderer": "5.1.1",
79
- "@tryghost/limit-service": "0.6.4",
79
+ "@tryghost/limit-service": "0.6.5",
80
80
  "@tryghost/logging": "0.2.2",
81
- "@tryghost/magic-link": "1.0.13",
82
- "@tryghost/members-api": "2.2.3",
83
- "@tryghost/members-csv": "1.1.7",
84
- "@tryghost/members-importer": "0.3.3",
85
- "@tryghost/members-offers": "0.6.1",
86
- "@tryghost/members-ssr": "1.0.14",
87
- "@tryghost/metrics": "0.2.4",
88
- "@tryghost/mw-session-from-token": "0.1.25",
89
- "@tryghost/nodemailer": "0.3.5",
90
- "@tryghost/package-json": "1.0.5",
91
- "@tryghost/promise": "0.1.12",
92
- "@tryghost/request": "0.1.7",
93
- "@tryghost/root-utils": "0.3.6",
94
- "@tryghost/security": "0.2.12",
95
- "@tryghost/session-service": "0.1.27",
81
+ "@tryghost/magic-link": "1.0.14",
82
+ "@tryghost/members-api": "2.4.1",
83
+ "@tryghost/members-csv": "1.1.8",
84
+ "@tryghost/members-importer": "0.3.4",
85
+ "@tryghost/members-offers": "0.10.1",
86
+ "@tryghost/members-ssr": "1.0.15",
87
+ "@tryghost/metrics": "0.2.6",
88
+ "@tryghost/mw-session-from-token": "0.1.26",
89
+ "@tryghost/nodemailer": "0.3.6",
90
+ "@tryghost/package-json": "1.0.6",
91
+ "@tryghost/promise": "0.1.13",
92
+ "@tryghost/request": "0.1.8",
93
+ "@tryghost/root-utils": "0.3.7",
94
+ "@tryghost/security": "0.2.13",
95
+ "@tryghost/session-service": "0.1.28",
96
96
  "@tryghost/social-urls": "0.1.26",
97
97
  "@tryghost/string": "0.1.20",
98
- "@tryghost/tpl": "0.1.7",
98
+ "@tryghost/tpl": "0.1.8",
99
99
  "@tryghost/update-check-service": "0.2.4",
100
100
  "@tryghost/url-utils": "2.0.2",
101
- "@tryghost/validator": "0.1.7",
102
- "@tryghost/version": "0.1.6",
103
- "@tryghost/vhost-middleware": "1.0.18",
104
- "@tryghost/zip": "1.1.17",
101
+ "@tryghost/validator": "0.1.8",
102
+ "@tryghost/version": "0.1.7",
103
+ "@tryghost/vhost-middleware": "1.0.19",
104
+ "@tryghost/zip": "1.1.18",
105
105
  "amperize": "0.6.1",
106
- "analytics-node": "5.1.0",
106
+ "analytics-node": "5.1.2",
107
107
  "bluebird": "3.7.2",
108
108
  "body-parser": "1.19.0",
109
109
  "bookshelf": "1.2.0",
@@ -121,13 +121,14 @@
121
121
  "express-brute": "1.0.1",
122
122
  "express-hbs": "2.4.0",
123
123
  "express-jwt": "6.1.0",
124
+ "express-lazy-router": "1.0.4",
124
125
  "express-query-boolean": "2.0.0",
125
126
  "express-session": "1.17.2",
126
127
  "fs-extra": "10.0.0",
127
128
  "ghost-storage-base": "0.0.6",
128
129
  "glob": "7.2.0",
129
130
  "got": "9.6.0",
130
- "gscan": "4.8.1",
131
+ "gscan": "4.9.1",
131
132
  "html-to-text": "5.1.1",
132
133
  "image-size": "1.0.0",
133
134
  "intl": "1.2.5",
@@ -140,6 +141,7 @@
140
141
  "knex": "0.21.21",
141
142
  "knex-migrator": "4.0.5",
142
143
  "lodash": "4.17.21",
144
+ "luxon": "2.0.2",
143
145
  "mailgun-js": "0.22.0",
144
146
  "metascraper": "5.24.9",
145
147
  "metascraper-author": "5.24.9",
@@ -156,7 +158,7 @@
156
158
  "mysql": "2.18.1",
157
159
  "nconf": "0.11.3",
158
160
  "node-jose": "2.0.0",
159
- "oembed-parser": "1.4.8",
161
+ "oembed-parser": "1.4.9",
160
162
  "passport": "0.5.0",
161
163
  "passport-google-oauth": "2.0.0",
162
164
  "path-match": "1.2.4",
@@ -179,7 +181,7 @@
179
181
  "coffeescript": "2.6.1",
180
182
  "cssnano": "5.0.8",
181
183
  "eslint": "7.32.0",
182
- "eslint-plugin-ghost": "2.6.0",
184
+ "eslint-plugin-ghost": "2.7.0",
183
185
  "grunt": "1.4.1",
184
186
  "grunt-bg-shell": "2.3.3",
185
187
  "grunt-contrib-clean": "2.0.0",
@@ -191,13 +193,13 @@
191
193
  "grunt-shell": "3.0.1",
192
194
  "grunt-subgrunt": "1.3.0",
193
195
  "grunt-update-submodules": "0.4.1",
194
- "jwks-rsa": "2.0.4",
196
+ "jwks-rsa": "2.0.5",
195
197
  "mocha": "9.1.3",
196
198
  "mocha-slow-test-reporter": "0.1.2",
197
199
  "mock-knex": "0.4.10",
198
- "nock": "13.1.3",
200
+ "nock": "13.1.4",
199
201
  "papaparse": "5.3.1",
200
- "postcss": "8.3.9",
202
+ "postcss": "8.3.11",
201
203
  "rewire": "5.0.0",
202
204
  "should": "13.2.3",
203
205
  "sinon": "11.1.2",