ghost 4.22.0 → 4.22.4

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 (127) hide show
  1. package/.c8rc.json +24 -0
  2. package/.eslintrc.js +6 -0
  3. package/Gruntfile.js +1 -1
  4. package/content/public/README.md +3 -0
  5. package/core/boot.js +20 -12
  6. package/core/built/assets/{chunk.3.1148677ff3b78e5aeaee.js → chunk.3.8f95b516d88ff4eec64c.js} +18 -18
  7. package/core/built/assets/{ghost-dark-684ad238e1a858c7cb5be6988de7c6f5.css → ghost-dark-42cf6e0c730578940ec069bda45aea41.css} +1 -1
  8. package/core/built/assets/{ghost.min-efbfb823467b66f4acc66537d033aa55.js → ghost.min-2e3e64eb258cf424c59c3e308b4bc6e6.js} +215 -155
  9. package/core/built/assets/{ghost.min-66e08535f8bb797a8c40e0a2b31f1e9e.css → ghost.min-fcf6a0738421f86c47c55f20d00c5ba9.css} +1 -1
  10. package/core/built/assets/icons/powered-by-tenor.svg +35 -0
  11. package/core/built/assets/icons/tenor.svg +7 -0
  12. package/core/built/assets/{vendor.min-7c8fdd90f7ecd2e94328a07ea3b64608.js → vendor.min-c9002845b6c30ac978abdadde9f33d7c.js} +8189 -7601
  13. package/core/frontend/apps/amp/lib/views/amp.hbs +104 -0
  14. package/core/frontend/apps/private-blogging/lib/router.js +1 -1
  15. package/core/frontend/services/card-assets/service.js +21 -13
  16. package/core/frontend/services/routing/CollectionRouter.js +4 -5
  17. package/core/frontend/services/routing/EmailRouter.js +1 -1
  18. package/core/frontend/services/routing/ParentRouter.js +0 -8
  19. package/core/frontend/services/routing/PreviewRouter.js +1 -1
  20. package/core/frontend/services/routing/StaticPagesRouter.js +1 -1
  21. package/core/frontend/services/routing/StaticRoutesRouter.js +4 -4
  22. package/core/frontend/services/routing/TaxonomyRouter.js +3 -3
  23. package/core/frontend/services/routing/{middlewares → middleware}/index.js +0 -0
  24. package/core/frontend/services/routing/{middlewares → middleware}/page-param.js +0 -0
  25. package/core/frontend/services/routing/router-manager.js +7 -2
  26. package/core/frontend/services/rss/generate-feed.js +2 -1
  27. package/core/frontend/src/cards/css/bookmark.css +66 -48
  28. package/core/frontend/src/cards/css/button.css +30 -0
  29. package/core/frontend/src/cards/css/callout.css +50 -0
  30. package/core/frontend/src/cards/css/gallery.css +8 -13
  31. package/core/frontend/src/cards/css/nft.css +94 -0
  32. package/core/frontend/src/cards/css/toggle.css +47 -0
  33. package/core/frontend/src/cards/js/toggle.js +16 -0
  34. package/core/frontend/web/middleware/serve-public-file.js +14 -8
  35. package/core/frontend/web/routes.js +0 -1
  36. package/core/frontend/web/site.js +15 -12
  37. package/core/server/adapters/storage/LocalFilesStorage.js +17 -0
  38. package/core/server/adapters/storage/LocalImagesStorage.js +1 -0
  39. package/core/server/adapters/storage/LocalMediaStorage.js +2 -1
  40. package/core/server/adapters/storage/LocalStorageBase.js +30 -5
  41. package/core/server/api/canary/authentication.js +1 -1
  42. package/core/server/api/canary/files.js +19 -0
  43. package/core/server/api/canary/index.js +4 -0
  44. package/core/server/api/canary/media.js +25 -5
  45. package/core/server/api/canary/oembed.js +3 -0
  46. package/core/server/api/canary/utils/serializers/input/index.js +4 -0
  47. package/core/server/api/canary/utils/serializers/input/media.js +8 -0
  48. package/core/server/api/canary/utils/serializers/output/config.js +21 -14
  49. package/core/server/api/canary/utils/serializers/output/files.js +27 -0
  50. package/core/server/api/canary/utils/serializers/output/index.js +4 -0
  51. package/core/server/api/canary/utils/serializers/output/media.js +9 -0
  52. package/core/server/api/canary/utils/validators/input/files.js +7 -0
  53. package/core/server/api/canary/utils/validators/input/index.js +4 -0
  54. package/core/server/api/canary/utils/validators/input/media.js +4 -0
  55. package/core/server/api/v2/authentication.js +1 -1
  56. package/core/server/api/v3/authentication.js +1 -1
  57. package/core/server/data/db/connection.js +7 -0
  58. package/core/server/data/importer/importers/data/data-importer.js +3 -3
  59. package/core/server/data/migrations/init/2-create-fixtures.js +3 -20
  60. package/core/server/data/migrations/versions/1.21/1-add-contributor-role.js +5 -5
  61. package/core/server/data/migrations/versions/2.15/2-insert-zapier-integration.js +3 -3
  62. package/core/server/data/migrations/versions/2.2/3-insert-admin-integration-role.js +5 -5
  63. package/core/server/data/migrations/versions/2.27/1-insert-ghost-db-backup-role.js +5 -6
  64. package/core/server/data/migrations/versions/2.27/2-insert-db-backup-integration.js +3 -4
  65. package/core/server/data/migrations/versions/2.28/3-insert-ghost-scheduler-role.js +7 -7
  66. package/core/server/data/migrations/versions/2.28/4-insert-scheduler-integration.js +3 -3
  67. package/core/server/data/schema/fixtures/fixture-manager.js +340 -0
  68. package/core/server/data/schema/fixtures/index.js +8 -2
  69. package/core/server/services/mega/post-email-serializer.js +5 -1
  70. package/core/server/services/mega/segment-parser.js +1 -2
  71. package/core/server/services/mega/template.js +69 -1
  72. package/core/server/services/nft-oembed.js +57 -0
  73. package/core/server/services/oembed.js +149 -110
  74. package/core/server/services/public-config/config.js +2 -1
  75. package/core/server/services/stripe/index.js +4 -2
  76. package/core/server/services/url/Resource.js +1 -1
  77. package/core/server/services/url/Resources.js +36 -23
  78. package/core/server/services/url/UrlGenerator.js +23 -20
  79. package/core/server/services/url/UrlService.js +123 -21
  80. package/core/server/services/url/Urls.js +7 -2
  81. package/core/server/services/url/index.js +9 -1
  82. package/core/server/web/admin/app.js +6 -6
  83. package/core/server/web/admin/views/default-prod.html +3 -3
  84. package/core/server/web/admin/views/default.html +3 -3
  85. package/core/server/web/api/app.js +1 -1
  86. package/core/server/web/api/canary/admin/app.js +4 -4
  87. package/core/server/web/api/canary/admin/middleware.js +6 -6
  88. package/core/server/web/api/canary/admin/routes.js +20 -5
  89. package/core/server/web/api/canary/content/app.js +4 -4
  90. package/core/server/web/api/canary/content/middleware.js +3 -3
  91. package/core/server/web/api/middleware/cors.js +7 -7
  92. package/core/server/web/api/v2/admin/app.js +4 -4
  93. package/core/server/web/api/v2/admin/middleware.js +6 -6
  94. package/core/server/web/api/v2/admin/routes.js +5 -5
  95. package/core/server/web/api/v2/content/app.js +4 -4
  96. package/core/server/web/api/v2/content/middleware.js +3 -3
  97. package/core/server/web/api/v3/admin/app.js +4 -4
  98. package/core/server/web/api/v3/admin/middleware.js +6 -6
  99. package/core/server/web/api/v3/admin/routes.js +5 -5
  100. package/core/server/web/api/v3/content/app.js +4 -4
  101. package/core/server/web/api/v3/content/middleware.js +3 -3
  102. package/core/server/web/members/app.js +7 -7
  103. package/core/server/web/oauth/app.js +1 -1
  104. package/core/server/web/parent/app.js +2 -3
  105. package/core/server/web/parent/frontend.js +1 -1
  106. package/core/server/web/shared/index.js +2 -2
  107. package/core/server/web/shared/{middlewares → middleware}/api/index.js +0 -0
  108. package/core/server/web/shared/{middlewares → middleware}/api/spam-prevention.js +0 -0
  109. package/core/server/web/shared/{middlewares → middleware}/brute.js +0 -0
  110. package/core/server/web/shared/{middlewares → middleware}/cache-control.js +0 -0
  111. package/core/server/web/shared/{middlewares → middleware}/error-handler.js +0 -0
  112. package/core/server/web/shared/{middlewares → middleware}/index.js +0 -0
  113. package/core/server/web/shared/{middlewares → middleware}/maintenance.js +0 -0
  114. package/core/server/web/shared/{middlewares → middleware}/pretty-urls.js +0 -0
  115. package/core/server/web/shared/{middlewares → middleware}/uncapitalise.js +0 -0
  116. package/core/server/web/shared/{middlewares → middleware}/url-redirects.js +0 -0
  117. package/core/shared/config/defaults.json +10 -2
  118. package/core/shared/config/helpers.js +44 -0
  119. package/core/shared/config/loader.js +1 -1
  120. package/core/shared/config/overrides.json +2 -2
  121. package/core/shared/labs.js +8 -1
  122. package/loggingrc.js +19 -20
  123. package/package.json +36 -36
  124. package/urls.json +597 -0
  125. package/yarn.lock +666 -354
  126. package/core/server/data/schema/fixtures/utils.js +0 -321
  127. package/core/server/web/parent/vhost-utils.js +0 -39
@@ -59,8 +59,8 @@ module.exports.authAdminApi = [
59
59
  auth.authorize.authorizeAdminApi,
60
60
  apiMw.updateUserLastSeen,
61
61
  apiMw.cors,
62
- shared.middlewares.urlRedirects.adminSSLAndHostRedirect,
63
- shared.middlewares.prettyUrls,
62
+ shared.middleware.urlRedirects.adminSSLAndHostRedirect,
63
+ shared.middleware.prettyUrls,
64
64
  notImplemented
65
65
  ];
66
66
 
@@ -73,8 +73,8 @@ module.exports.authAdminApiWithUrl = [
73
73
  auth.authorize.authorizeAdminApi,
74
74
  apiMw.updateUserLastSeen,
75
75
  apiMw.cors,
76
- shared.middlewares.urlRedirects.adminSSLAndHostRedirect,
77
- shared.middlewares.prettyUrls,
76
+ shared.middleware.urlRedirects.adminSSLAndHostRedirect,
77
+ shared.middleware.prettyUrls,
78
78
  notImplemented
79
79
  ];
80
80
 
@@ -83,7 +83,7 @@ module.exports.authAdminApiWithUrl = [
83
83
  */
84
84
  module.exports.publicAdminApi = [
85
85
  apiMw.cors,
86
- shared.middlewares.urlRedirects.adminSSLAndHostRedirect,
87
- shared.middlewares.prettyUrls,
86
+ shared.middleware.urlRedirects.adminSSLAndHostRedirect,
87
+ shared.middleware.prettyUrls,
88
88
  notImplemented
89
89
  ];
@@ -182,8 +182,8 @@ module.exports = function apiRoutes() {
182
182
  router.get('/session', mw.authAdminApi, http(api.session.read));
183
183
  // We don't need auth when creating a new session (logging in)
184
184
  router.post('/session',
185
- shared.middlewares.brute.globalBlock,
186
- shared.middlewares.brute.userLogin,
185
+ shared.middleware.brute.globalBlock,
186
+ shared.middleware.brute.userLogin,
187
187
  http(api.session.add)
188
188
  );
189
189
  router.del('/session', mw.authAdminApi, http(api.session.delete));
@@ -193,11 +193,11 @@ module.exports = function apiRoutes() {
193
193
 
194
194
  // ## Authentication
195
195
  router.post('/authentication/passwordreset',
196
- shared.middlewares.brute.globalReset,
197
- shared.middlewares.brute.userReset,
196
+ shared.middleware.brute.globalReset,
197
+ shared.middleware.brute.userReset,
198
198
  http(api.authentication.generateResetToken)
199
199
  );
200
- router.put('/authentication/passwordreset', shared.middlewares.brute.globalBlock, http(api.authentication.resetPassword));
200
+ router.put('/authentication/passwordreset', shared.middleware.brute.globalBlock, http(api.authentication.resetPassword));
201
201
  router.post('/authentication/invitation', http(api.authentication.acceptInvitation));
202
202
  router.get('/authentication/invitation', http(api.authentication.isInvitation));
203
203
  router.post('/authentication/setup', http(api.authentication.setup));
@@ -18,17 +18,17 @@ module.exports = function setupApiApp() {
18
18
  apiApp.use(boolParser());
19
19
 
20
20
  // send 503 json response in case of maintenance
21
- apiApp.use(shared.middlewares.maintenance);
21
+ apiApp.use(shared.middleware.maintenance);
22
22
 
23
23
  // API shouldn't be cached
24
- apiApp.use(shared.middlewares.cacheControl('private'));
24
+ apiApp.use(shared.middleware.cacheControl('private'));
25
25
 
26
26
  // Routing
27
27
  apiApp.use(routes());
28
28
 
29
29
  // API error handling
30
- apiApp.use(shared.middlewares.errorHandler.resourceNotFound);
31
- apiApp.use(shared.middlewares.errorHandler.handleJSONResponse);
30
+ apiApp.use(shared.middleware.errorHandler.resourceNotFound);
31
+ apiApp.use(shared.middleware.errorHandler.handleJSONResponse);
32
32
 
33
33
  debug('Content API v3 setup end');
34
34
 
@@ -14,10 +14,10 @@ const shared = require('../../../shared');
14
14
  * Authentication for public endpoints
15
15
  */
16
16
  module.exports.authenticatePublic = [
17
- shared.middlewares.brute.contentApiKey,
17
+ shared.middleware.brute.contentApiKey,
18
18
  auth.authenticate.authenticateContentApi,
19
19
  auth.authorize.authorizeContentApi,
20
20
  cors(),
21
- shared.middlewares.urlRedirects.adminSSLAndHostRedirect,
22
- shared.middlewares.prettyUrls
21
+ shared.middleware.urlRedirects.adminSSLAndHostRedirect,
22
+ shared.middleware.prettyUrls
23
23
  ];
@@ -14,10 +14,10 @@ module.exports = function setupMembersApp() {
14
14
  const membersApp = express('members');
15
15
 
16
16
  // send 503 json response in case of maintenance
17
- membersApp.use(shared.middlewares.maintenance);
17
+ membersApp.use(shared.middleware.maintenance);
18
18
 
19
19
  // Members API shouldn't be cached
20
- membersApp.use(shared.middlewares.cacheControl('private'));
20
+ membersApp.use(shared.middleware.cacheControl('private'));
21
21
 
22
22
  // Support CORS for requests from the frontend
23
23
  const siteUrl = new URL(urlUtils.getSiteUrl());
@@ -42,19 +42,19 @@ module.exports = function setupMembersApp() {
42
42
  membersApp.get('/api/site', middleware.getMemberSiteData);
43
43
 
44
44
  // NOTE: this is wrapped in a function to ensure we always go via the getter
45
- membersApp.post('/api/send-magic-link', bodyParser.json(), shared.middlewares.brute.membersAuth, (req, res, next) => membersService.api.middleware.sendMagicLink(req, res, next));
45
+ membersApp.post('/api/send-magic-link', bodyParser.json(), shared.middleware.brute.membersAuth, (req, res, next) => membersService.api.middleware.sendMagicLink(req, res, next));
46
46
  membersApp.post('/api/create-stripe-checkout-session', (req, res, next) => membersService.api.middleware.createCheckoutSession(req, res, next));
47
47
  membersApp.post('/api/create-stripe-update-session', (req, res, next) => membersService.api.middleware.createCheckoutSetupSession(req, res, next));
48
48
  membersApp.put('/api/subscriptions/:id', (req, res, next) => membersService.api.middleware.updateSubscription(req, res, next));
49
49
  membersApp.post('/api/events', labs.enabledMiddleware('membersActivity'), middleware.loadMemberSession, (req, res, next) => membersService.api.middleware.createEvents(req, res, next));
50
50
 
51
51
  // API error handling
52
- membersApp.use('/api', shared.middlewares.errorHandler.resourceNotFound);
53
- membersApp.use('/api', shared.middlewares.errorHandler.handleJSONResponseV2);
52
+ membersApp.use('/api', shared.middleware.errorHandler.resourceNotFound);
53
+ membersApp.use('/api', shared.middleware.errorHandler.handleJSONResponseV2);
54
54
 
55
55
  // Webhook error handling
56
- membersApp.use('/webhooks', shared.middlewares.errorHandler.resourceNotFound);
57
- membersApp.use('/webhooks', shared.middlewares.errorHandler.handleJSONResponseV2);
56
+ membersApp.use('/webhooks', shared.middleware.errorHandler.resourceNotFound);
57
+ membersApp.use('/webhooks', shared.middleware.errorHandler.handleJSONResponseV2);
58
58
 
59
59
  debug('Members App setup end');
60
60
 
@@ -25,7 +25,7 @@ module.exports = function setupOAuthApp() {
25
25
  oauthApp.use(labsMiddleware);
26
26
 
27
27
  // send 503 json response in case of maintenance
28
- oauthApp.use(shared.middlewares.maintenance);
28
+ oauthApp.use(shared.middleware.maintenance);
29
29
 
30
30
  /**
31
31
  * Configure the passport.authenticate middleware
@@ -4,7 +4,6 @@ const express = require('../../../shared/express');
4
4
  const compress = require('compression');
5
5
  const mw = require('./middleware');
6
6
  const vhost = require('@tryghost/vhost-middleware');
7
- const vhostUtils = require('./vhost-utils');
8
7
 
9
8
  module.exports = function setupParentApp(options = {}) {
10
9
  debug('ParentApp setup start');
@@ -29,11 +28,11 @@ module.exports = function setupParentApp(options = {}) {
29
28
 
30
29
  // ADMIN + API
31
30
  const backendApp = require('./backend')();
32
- parentApp.use(vhost(vhostUtils.getBackendHostArg(), backendApp));
31
+ parentApp.use(vhost(config.getBackendMountPath(), backendApp));
33
32
 
34
33
  // SITE + MEMBERS
35
34
  const frontendApp = require('./frontend')(options);
36
- parentApp.use(vhost(vhostUtils.getFrontendHostArg(), frontendApp));
35
+ parentApp.use(vhost(config.getFrontendMountPath(), frontendApp));
37
36
 
38
37
  debug('ParentApp setup end');
39
38
 
@@ -16,7 +16,7 @@ module.exports = (options) => {
16
16
 
17
17
  // Force SSL if blog url is set to https. The redirects handling must happen before asset and page routing,
18
18
  // otherwise we serve assets/pages with http. This can cause mixed content warnings in the admin client.
19
- frontendApp.use(shared.middlewares.urlRedirects.frontendSSLRedirect);
19
+ frontendApp.use(shared.middleware.urlRedirects.frontendSSLRedirect);
20
20
 
21
21
  frontendApp.lazyUse('/members', require('../members'));
22
22
  frontendApp.use('/', require('../../../frontend/web')(options));
@@ -1,5 +1,5 @@
1
1
  module.exports = {
2
- get middlewares() {
3
- return require('./middlewares');
2
+ get middleware() {
3
+ return require('./middleware');
4
4
  }
5
5
  };
@@ -15,7 +15,9 @@
15
15
  "privacy": false,
16
16
  "useMinFiles": true,
17
17
  "paths": {
18
- "contentPath": "content/"
18
+ "contentPath": "content/",
19
+ "fixtures": "core/server/data/schema/fixtures/fixtures",
20
+ "assetSrc": "core/frontend/src"
19
21
  },
20
22
  "adapters": {
21
23
  "sso": {
@@ -25,7 +27,9 @@
25
27
  "storage": {
26
28
  "active": "LocalImagesStorage",
27
29
  "media": "LocalMediaStorage",
28
- "LocalMediaStorage": {}
30
+ "files": "LocalFilesStorage",
31
+ "LocalMediaStorage": {},
32
+ "LocalFilesStorage": {}
29
33
  },
30
34
  "scheduling": {
31
35
  "active": "SchedulingDefault"
@@ -125,5 +129,9 @@
125
129
  "portal": {
126
130
  "url": "https://unpkg.com/@tryghost/portal@~1.12.0/umd/portal.min.js",
127
131
  "version": "1.12"
132
+ },
133
+ "tenor": {
134
+ "apiKey": null,
135
+ "contentFilter": "off"
128
136
  }
129
137
  }
@@ -1,4 +1,42 @@
1
1
  const path = require('path');
2
+ const escapeRegExp = require('lodash/escapeRegExp');
3
+ const {URL} = require('url');
4
+
5
+ const DEFAULT_HOST_ARG = /.*/;
6
+
7
+ const getHostInfo = (config) => {
8
+ const frontendHost = new URL(config.getSiteUrl()).hostname;
9
+
10
+ const backendHost = config.getAdminUrl() ? (new URL(config.getAdminUrl()).hostname) : '';
11
+ const hasSeparateBackendHost = backendHost && backendHost !== frontendHost;
12
+
13
+ return {
14
+ backendHost,
15
+ hasSeparateBackendHost
16
+ };
17
+ };
18
+
19
+ /**
20
+ *
21
+ * @returns {string|RegExp}
22
+ */
23
+ const getBackendMountPath = function getFrontendMountPath() {
24
+ const {backendHost, hasSeparateBackendHost} = getHostInfo(this);
25
+
26
+ // with a separate admin url only serve on that host, otherwise serve on all hosts
27
+ return (hasSeparateBackendHost) && backendHost ? backendHost : DEFAULT_HOST_ARG;
28
+ };
29
+
30
+ /**
31
+ *
32
+ * @returns {string|RegExp}
33
+ */
34
+ const getFrontendMountPath = function getFrontendMountPath() {
35
+ const {backendHost, hasSeparateBackendHost} = getHostInfo(this);
36
+
37
+ // with a separate admin url we adjust the frontend vhost to exclude requests to that host, otherwise serve on all hosts
38
+ return (hasSeparateBackendHost && backendHost) ? new RegExp(`^(?!${escapeRegExp(backendHost)}).*`) : DEFAULT_HOST_ARG;
39
+ };
2
40
 
3
41
  /**
4
42
  * @callback isPrivacyDisabledFn
@@ -34,6 +72,8 @@ const getContentPath = function getContentPath(type) {
34
72
  return path.join(this.get('paths:contentPath'), 'images/');
35
73
  case 'media':
36
74
  return path.join(this.get('paths:contentPath'), 'media/');
75
+ case 'files':
76
+ return path.join(this.get('paths:contentPath'), 'files/');
37
77
  case 'themes':
38
78
  return path.join(this.get('paths:contentPath'), 'themes/');
39
79
  case 'adapters':
@@ -44,6 +84,8 @@ const getContentPath = function getContentPath(type) {
44
84
  return path.join(this.get('paths:contentPath'), 'data/');
45
85
  case 'settings':
46
86
  return path.join(this.get('paths:contentPath'), 'settings/');
87
+ case 'public':
88
+ return path.join(this.get('paths:contentPath'), 'public/');
47
89
  default:
48
90
  // new Error is allowed here, as we do not want config to depend on @tryghost/error
49
91
  // @TODO: revisit this decision when @tryghost/error is no longer dependent on all of ghost-ignition
@@ -60,4 +102,6 @@ const getContentPath = function getContentPath(type) {
60
102
  module.exports.bindAll = (nconf) => {
61
103
  nconf.isPrivacyDisabled = isPrivacyDisabled.bind(nconf);
62
104
  nconf.getContentPath = getContentPath.bind(nconf);
105
+ nconf.getBackendMountPath = getBackendMountPath.bind(nconf);
106
+ nconf.getFrontendMountPath = getFrontendMountPath.bind(nconf);
63
107
  };
@@ -41,8 +41,8 @@ function loadNconf(options) {
41
41
  // ## Config Methods
42
42
 
43
43
  // Expose dynamic utility methods
44
- helpers.bindAll(nconf);
45
44
  urlHelpers.bindAll(nconf);
45
+ helpers.bindAll(nconf);
46
46
 
47
47
  // ## Sanitization
48
48
 
@@ -31,8 +31,8 @@
31
31
  "contentTypes": ["image/jpeg", "image/png", "image/gif", "image/svg+xml", "image/x-icon", "image/vnd.microsoft.icon", "image/webp"]
32
32
  },
33
33
  "media": {
34
- "extensions": [".mp4",".webm", ".ogv"],
35
- "contentTypes": ["video/mp4", "video/webm", "video/ogg"]
34
+ "extensions": [".mp4",".webm", ".ogv", ".mp3", ".wav", ".ogg"],
35
+ "contentTypes": ["video/mp4", "video/webm", "video/ogg", "audio/mpeg", "audio/vnd.wav", "audio/ogg"]
36
36
  },
37
37
  "thumbnails": {
38
38
  "extensions": [".jpg", ".jpeg", ".gif", ".png", ".svg", ".svgz", ".ico", ".webp"],
@@ -29,8 +29,15 @@ const ALPHA_FEATURES = [
29
29
  'oauthLogin',
30
30
  'membersActivity',
31
31
  'cardSettingsPanel',
32
+ 'urlCache',
32
33
  'mediaAPI',
33
- 'membersAutoLogin'
34
+ 'filesAPI',
35
+ 'membersAutoLogin',
36
+ 'buttonCard',
37
+ 'calloutCard',
38
+ 'nftCard',
39
+ 'accordionCard',
40
+ 'gifsCard'
34
41
  ];
35
42
 
36
43
  module.exports.GA_KEYS = [...GA_FEATURES];
package/loggingrc.js CHANGED
@@ -1,25 +1,24 @@
1
1
  const config = require('./core/shared/config');
2
2
  const ghostVersion = require('@tryghost/version');
3
3
 
4
- module.exports = {
5
- name: config.get('logging:name'),
6
- env: config.get('env'),
7
- path: config.get('logging:path') || config.getContentPath('logs'),
4
+ // Config for logging
5
+ const loggingConfig = config.get('logging') || {};
6
+
7
+ if (!loggingConfig.path) {
8
+ loggingConfig.path = config.getContentPath('logs');
9
+ }
10
+
11
+ // Additional values used by logging
12
+ loggingConfig.env = config.get('env');
13
+ loggingConfig.domain = config.get('url');
14
+
15
+ // Config for metrics
16
+ loggingConfig.metrics = config.get('logging:metrics') || {};
17
+ loggingConfig.metrics.metadata = {
18
+ // Undefined if unavailable
19
+ siteId: config.get('hostSettings:siteId'),
8
20
  domain: config.get('url'),
9
- mode: config.get('logging:mode'),
10
- level: config.get('logging:level'),
11
- transports: config.get('logging:transports'),
12
- metrics: {
13
- transports: config.get('logging:metrics:transports'),
14
- metadata: {
15
- // Undefined if unavailable
16
- siteId: config.get('hostSettings:siteId'),
17
- domain: config.get('url'),
18
- version: ghostVersion.safe
19
- }
20
- },
21
- gelf: config.get('logging:gelf'),
22
- loggly: config.get('logging:loggly'),
23
- elasticsearch: config.get('logging:elasticsearch'),
24
- rotation: config.get('logging:rotation')
21
+ version: ghostVersion.safe
25
22
  };
23
+
24
+ module.exports = loggingConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "4.22.0",
3
+ "version": "4.22.4",
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 --reporter cobertura mocha --require=./test/utils/overrides.js --exit --trace-warnings --recursive --extension=test.js './test/unit' --timeout=2000",
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",
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",
@@ -37,7 +37,7 @@
37
37
  "test:int:slow": "yarn test:integration --reporter=mocha-slow-test-reporter",
38
38
  "test:e2e:slow": "yarn test:e2e --reporter=mocha-slow-test-reporter",
39
39
  "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 --all -n 'core/{*.js,frontend,server,shared}' -x 'core/frontend/public' --reporter text --reporter html",
40
+ "cov:unit": "c8 report --reporter text --reporter html",
41
41
  "lint:server": "eslint --ignore-path .eslintignore 'core/server/**/*.js' 'core/*.js' '*.js'",
42
42
  "lint:shared": "eslint --ignore-path .eslintignore 'core/shared/**/*.js'",
43
43
  "lint:frontend": "eslint --ignore-path .eslintignore 'core/frontend/**/*.js'",
@@ -54,51 +54,51 @@
54
54
  },
55
55
  "dependencies": {
56
56
  "@nexes/nql": "0.6.0",
57
- "@sentry/node": "6.14.0",
57
+ "@sentry/node": "6.15.0",
58
58
  "@tryghost/adapter-manager": "0.2.18",
59
- "@tryghost/admin-api-schema": "2.6.0",
59
+ "@tryghost/admin-api-schema": "2.6.1",
60
60
  "@tryghost/bookshelf-plugins": "0.3.4",
61
61
  "@tryghost/bootstrap-socket": "0.2.13",
62
- "@tryghost/color-utils": "0.1.2",
62
+ "@tryghost/color-utils": "0.1.5",
63
63
  "@tryghost/config-url-helpers": "0.1.3",
64
- "@tryghost/constants": "0.1.12",
64
+ "@tryghost/constants": "1.0.0",
65
65
  "@tryghost/custom-theme-settings-service": "0.3.1",
66
66
  "@tryghost/debug": "0.1.9",
67
67
  "@tryghost/email-analytics-provider-mailgun": "1.0.5",
68
68
  "@tryghost/email-analytics-service": "1.0.4",
69
69
  "@tryghost/errors": "0.2.17",
70
70
  "@tryghost/express-dynamic-redirects": "0.2.1",
71
- "@tryghost/helpers": "1.1.52",
71
+ "@tryghost/helpers": "1.1.54",
72
72
  "@tryghost/image-transform": "1.0.18",
73
73
  "@tryghost/job-manager": "0.8.12",
74
74
  "@tryghost/kg-card-factory": "3.1.0",
75
75
  "@tryghost/kg-default-atoms": "3.1.0",
76
- "@tryghost/kg-default-cards": "5.1.0",
76
+ "@tryghost/kg-default-cards": "5.8.3",
77
77
  "@tryghost/kg-markdown-html-renderer": "5.1.0",
78
78
  "@tryghost/kg-mobiledoc-html-renderer": "5.2.0",
79
79
  "@tryghost/limit-service": "1.0.0",
80
- "@tryghost/logging": "1.0.0",
80
+ "@tryghost/logging": "1.0.1",
81
81
  "@tryghost/magic-link": "1.0.14",
82
- "@tryghost/members-api": "2.7.2",
82
+ "@tryghost/members-api": "2.7.4",
83
83
  "@tryghost/members-csv": "1.1.8",
84
84
  "@tryghost/members-importer": "0.3.4",
85
- "@tryghost/members-offers": "0.10.1",
85
+ "@tryghost/members-offers": "0.10.2",
86
86
  "@tryghost/members-ssr": "1.0.15",
87
- "@tryghost/metrics": "1.0.0",
88
- "@tryghost/minifier": "0.1.0",
87
+ "@tryghost/metrics": "1.0.1",
88
+ "@tryghost/minifier": "0.1.1",
89
89
  "@tryghost/mw-session-from-token": "0.1.26",
90
- "@tryghost/nodemailer": "0.3.6",
90
+ "@tryghost/nodemailer": "0.3.7",
91
91
  "@tryghost/package-json": "1.0.6",
92
92
  "@tryghost/promise": "0.1.13",
93
- "@tryghost/request": "0.1.8",
93
+ "@tryghost/request": "0.1.9",
94
94
  "@tryghost/root-utils": "0.3.7",
95
95
  "@tryghost/security": "0.2.13",
96
96
  "@tryghost/session-service": "0.1.28",
97
- "@tryghost/social-urls": "0.1.26",
98
- "@tryghost/string": "0.1.20",
97
+ "@tryghost/social-urls": "0.1.27",
98
+ "@tryghost/string": "0.1.21",
99
99
  "@tryghost/tpl": "0.1.8",
100
100
  "@tryghost/update-check-service": "0.2.5",
101
- "@tryghost/url-utils": "2.0.2",
101
+ "@tryghost/url-utils": "2.0.4",
102
102
  "@tryghost/validator": "0.1.8",
103
103
  "@tryghost/version": "0.1.7",
104
104
  "@tryghost/vhost-middleware": "1.0.19",
@@ -126,10 +126,10 @@
126
126
  "express-query-boolean": "2.0.0",
127
127
  "express-session": "1.17.2",
128
128
  "fs-extra": "10.0.0",
129
- "ghost-storage-base": "0.0.6",
129
+ "ghost-storage-base": "1.0.0",
130
130
  "glob": "7.2.0",
131
131
  "got": "9.6.0",
132
- "gscan": "4.10.1",
132
+ "gscan": "4.11.0",
133
133
  "html-to-text": "5.1.1",
134
134
  "image-size": "1.0.0",
135
135
  "intl": "1.2.5",
@@ -140,26 +140,26 @@
140
140
  "juice": "8.0.0",
141
141
  "keypair": "1.0.4",
142
142
  "knex": "0.21.21",
143
- "knex-migrator": "4.1.1",
143
+ "knex-migrator": "4.1.3",
144
144
  "lodash": "4.17.21",
145
- "luxon": "2.0.2",
145
+ "luxon": "2.1.1",
146
146
  "mailgun-js": "0.22.0",
147
- "metascraper": "5.25.0",
148
- "metascraper-author": "5.25.0",
149
- "metascraper-description": "5.25.0",
150
- "metascraper-image": "5.25.0",
151
- "metascraper-logo": "5.25.0",
152
- "metascraper-logo-favicon": "5.25.0",
153
- "metascraper-publisher": "5.25.0",
154
- "metascraper-title": "5.25.0",
155
- "metascraper-url": "5.25.0",
147
+ "metascraper": "5.25.1",
148
+ "metascraper-author": "5.25.1",
149
+ "metascraper-description": "5.25.1",
150
+ "metascraper-image": "5.25.1",
151
+ "metascraper-logo": "5.25.1",
152
+ "metascraper-logo-favicon": "5.25.1",
153
+ "metascraper-publisher": "5.25.1",
154
+ "metascraper-title": "5.25.1",
155
+ "metascraper-url": "5.25.1",
156
156
  "moment": "2.24.0",
157
157
  "moment-timezone": "0.5.23",
158
158
  "multer": "1.4.3",
159
159
  "mysql": "2.18.1",
160
160
  "nconf": "0.11.3",
161
161
  "node-jose": "2.0.0",
162
- "oembed-parser": "1.4.9",
162
+ "oembed-parser": "1.5.2",
163
163
  "passport": "0.5.0",
164
164
  "passport-google-oauth": "2.0.0",
165
165
  "path-match": "1.2.4",
@@ -173,14 +173,14 @@
173
173
  "xml": "1.0.1"
174
174
  },
175
175
  "optionalDependencies": {
176
- "@tryghost/html-to-mobiledoc": "0.7.17",
176
+ "@tryghost/html-to-mobiledoc": "1.3.2",
177
177
  "sqlite3": "5.0.2"
178
178
  },
179
179
  "devDependencies": {
180
180
  "@lodder/grunt-postcss": "3.1.1",
181
181
  "c8": "7.10.0",
182
182
  "coffeescript": "2.6.1",
183
- "cssnano": "5.0.9",
183
+ "cssnano": "5.0.11",
184
184
  "eslint": "7.32.0",
185
185
  "eslint-plugin-ghost": "2.7.0",
186
186
  "grunt": "1.4.1",
@@ -198,7 +198,7 @@
198
198
  "mocha": "9.1.3",
199
199
  "mocha-slow-test-reporter": "0.1.2",
200
200
  "mock-knex": "0.4.10",
201
- "nock": "13.1.4",
201
+ "nock": "13.2.1",
202
202
  "papaparse": "5.3.1",
203
203
  "postcss": "8.3.11",
204
204
  "rewire": "5.0.0",