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.
- package/.c8rc.json +24 -0
- package/.eslintrc.js +6 -0
- package/Gruntfile.js +1 -1
- package/content/public/README.md +3 -0
- package/core/boot.js +20 -12
- package/core/built/assets/{chunk.3.1148677ff3b78e5aeaee.js → chunk.3.8f95b516d88ff4eec64c.js} +18 -18
- package/core/built/assets/{ghost-dark-684ad238e1a858c7cb5be6988de7c6f5.css → ghost-dark-42cf6e0c730578940ec069bda45aea41.css} +1 -1
- package/core/built/assets/{ghost.min-efbfb823467b66f4acc66537d033aa55.js → ghost.min-2e3e64eb258cf424c59c3e308b4bc6e6.js} +215 -155
- package/core/built/assets/{ghost.min-66e08535f8bb797a8c40e0a2b31f1e9e.css → ghost.min-fcf6a0738421f86c47c55f20d00c5ba9.css} +1 -1
- package/core/built/assets/icons/powered-by-tenor.svg +35 -0
- package/core/built/assets/icons/tenor.svg +7 -0
- package/core/built/assets/{vendor.min-7c8fdd90f7ecd2e94328a07ea3b64608.js → vendor.min-c9002845b6c30ac978abdadde9f33d7c.js} +8189 -7601
- package/core/frontend/apps/amp/lib/views/amp.hbs +104 -0
- package/core/frontend/apps/private-blogging/lib/router.js +1 -1
- package/core/frontend/services/card-assets/service.js +21 -13
- package/core/frontend/services/routing/CollectionRouter.js +4 -5
- package/core/frontend/services/routing/EmailRouter.js +1 -1
- package/core/frontend/services/routing/ParentRouter.js +0 -8
- package/core/frontend/services/routing/PreviewRouter.js +1 -1
- package/core/frontend/services/routing/StaticPagesRouter.js +1 -1
- package/core/frontend/services/routing/StaticRoutesRouter.js +4 -4
- package/core/frontend/services/routing/TaxonomyRouter.js +3 -3
- package/core/frontend/services/routing/{middlewares → middleware}/index.js +0 -0
- package/core/frontend/services/routing/{middlewares → middleware}/page-param.js +0 -0
- package/core/frontend/services/routing/router-manager.js +7 -2
- package/core/frontend/services/rss/generate-feed.js +2 -1
- package/core/frontend/src/cards/css/bookmark.css +66 -48
- package/core/frontend/src/cards/css/button.css +30 -0
- package/core/frontend/src/cards/css/callout.css +50 -0
- package/core/frontend/src/cards/css/gallery.css +8 -13
- package/core/frontend/src/cards/css/nft.css +94 -0
- package/core/frontend/src/cards/css/toggle.css +47 -0
- package/core/frontend/src/cards/js/toggle.js +16 -0
- package/core/frontend/web/middleware/serve-public-file.js +14 -8
- package/core/frontend/web/routes.js +0 -1
- package/core/frontend/web/site.js +15 -12
- package/core/server/adapters/storage/LocalFilesStorage.js +17 -0
- package/core/server/adapters/storage/LocalImagesStorage.js +1 -0
- package/core/server/adapters/storage/LocalMediaStorage.js +2 -1
- package/core/server/adapters/storage/LocalStorageBase.js +30 -5
- package/core/server/api/canary/authentication.js +1 -1
- package/core/server/api/canary/files.js +19 -0
- package/core/server/api/canary/index.js +4 -0
- package/core/server/api/canary/media.js +25 -5
- package/core/server/api/canary/oembed.js +3 -0
- package/core/server/api/canary/utils/serializers/input/index.js +4 -0
- package/core/server/api/canary/utils/serializers/input/media.js +8 -0
- package/core/server/api/canary/utils/serializers/output/config.js +21 -14
- package/core/server/api/canary/utils/serializers/output/files.js +27 -0
- package/core/server/api/canary/utils/serializers/output/index.js +4 -0
- package/core/server/api/canary/utils/serializers/output/media.js +9 -0
- package/core/server/api/canary/utils/validators/input/files.js +7 -0
- package/core/server/api/canary/utils/validators/input/index.js +4 -0
- package/core/server/api/canary/utils/validators/input/media.js +4 -0
- package/core/server/api/v2/authentication.js +1 -1
- package/core/server/api/v3/authentication.js +1 -1
- package/core/server/data/db/connection.js +7 -0
- package/core/server/data/importer/importers/data/data-importer.js +3 -3
- package/core/server/data/migrations/init/2-create-fixtures.js +3 -20
- package/core/server/data/migrations/versions/1.21/1-add-contributor-role.js +5 -5
- package/core/server/data/migrations/versions/2.15/2-insert-zapier-integration.js +3 -3
- package/core/server/data/migrations/versions/2.2/3-insert-admin-integration-role.js +5 -5
- package/core/server/data/migrations/versions/2.27/1-insert-ghost-db-backup-role.js +5 -6
- package/core/server/data/migrations/versions/2.27/2-insert-db-backup-integration.js +3 -4
- package/core/server/data/migrations/versions/2.28/3-insert-ghost-scheduler-role.js +7 -7
- package/core/server/data/migrations/versions/2.28/4-insert-scheduler-integration.js +3 -3
- package/core/server/data/schema/fixtures/fixture-manager.js +340 -0
- package/core/server/data/schema/fixtures/index.js +8 -2
- package/core/server/services/mega/post-email-serializer.js +5 -1
- package/core/server/services/mega/segment-parser.js +1 -2
- package/core/server/services/mega/template.js +69 -1
- package/core/server/services/nft-oembed.js +57 -0
- package/core/server/services/oembed.js +149 -110
- package/core/server/services/public-config/config.js +2 -1
- package/core/server/services/stripe/index.js +4 -2
- package/core/server/services/url/Resource.js +1 -1
- package/core/server/services/url/Resources.js +36 -23
- package/core/server/services/url/UrlGenerator.js +23 -20
- package/core/server/services/url/UrlService.js +123 -21
- package/core/server/services/url/Urls.js +7 -2
- package/core/server/services/url/index.js +9 -1
- package/core/server/web/admin/app.js +6 -6
- package/core/server/web/admin/views/default-prod.html +3 -3
- package/core/server/web/admin/views/default.html +3 -3
- package/core/server/web/api/app.js +1 -1
- package/core/server/web/api/canary/admin/app.js +4 -4
- package/core/server/web/api/canary/admin/middleware.js +6 -6
- package/core/server/web/api/canary/admin/routes.js +20 -5
- package/core/server/web/api/canary/content/app.js +4 -4
- package/core/server/web/api/canary/content/middleware.js +3 -3
- package/core/server/web/api/middleware/cors.js +7 -7
- package/core/server/web/api/v2/admin/app.js +4 -4
- package/core/server/web/api/v2/admin/middleware.js +6 -6
- package/core/server/web/api/v2/admin/routes.js +5 -5
- package/core/server/web/api/v2/content/app.js +4 -4
- package/core/server/web/api/v2/content/middleware.js +3 -3
- package/core/server/web/api/v3/admin/app.js +4 -4
- package/core/server/web/api/v3/admin/middleware.js +6 -6
- package/core/server/web/api/v3/admin/routes.js +5 -5
- package/core/server/web/api/v3/content/app.js +4 -4
- package/core/server/web/api/v3/content/middleware.js +3 -3
- package/core/server/web/members/app.js +7 -7
- package/core/server/web/oauth/app.js +1 -1
- package/core/server/web/parent/app.js +2 -3
- package/core/server/web/parent/frontend.js +1 -1
- package/core/server/web/shared/index.js +2 -2
- package/core/server/web/shared/{middlewares → middleware}/api/index.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/api/spam-prevention.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/brute.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/cache-control.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/error-handler.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/index.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/maintenance.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/pretty-urls.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/uncapitalise.js +0 -0
- package/core/server/web/shared/{middlewares → middleware}/url-redirects.js +0 -0
- package/core/shared/config/defaults.json +10 -2
- package/core/shared/config/helpers.js +44 -0
- package/core/shared/config/loader.js +1 -1
- package/core/shared/config/overrides.json +2 -2
- package/core/shared/labs.js +8 -1
- package/loggingrc.js +19 -20
- package/package.json +36 -36
- package/urls.json +597 -0
- package/yarn.lock +666 -354
- package/core/server/data/schema/fixtures/utils.js +0 -321
- 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.
|
|
63
|
-
shared.
|
|
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.
|
|
77
|
-
shared.
|
|
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.
|
|
87
|
-
shared.
|
|
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.
|
|
186
|
-
shared.
|
|
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.
|
|
197
|
-
shared.
|
|
196
|
+
shared.middleware.brute.globalReset,
|
|
197
|
+
shared.middleware.brute.userReset,
|
|
198
198
|
http(api.authentication.generateResetToken)
|
|
199
199
|
);
|
|
200
|
-
router.put('/authentication/passwordreset', shared.
|
|
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.
|
|
21
|
+
apiApp.use(shared.middleware.maintenance);
|
|
22
22
|
|
|
23
23
|
// API shouldn't be cached
|
|
24
|
-
apiApp.use(shared.
|
|
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.
|
|
31
|
-
apiApp.use(shared.
|
|
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.
|
|
17
|
+
shared.middleware.brute.contentApiKey,
|
|
18
18
|
auth.authenticate.authenticateContentApi,
|
|
19
19
|
auth.authorize.authorizeContentApi,
|
|
20
20
|
cors(),
|
|
21
|
-
shared.
|
|
22
|
-
shared.
|
|
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.
|
|
17
|
+
membersApp.use(shared.middleware.maintenance);
|
|
18
18
|
|
|
19
19
|
// Members API shouldn't be cached
|
|
20
|
-
membersApp.use(shared.
|
|
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.
|
|
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.
|
|
53
|
-
membersApp.use('/api', shared.
|
|
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.
|
|
57
|
-
membersApp.use('/webhooks', shared.
|
|
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.
|
|
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(
|
|
31
|
+
parentApp.use(vhost(config.getBackendMountPath(), backendApp));
|
|
33
32
|
|
|
34
33
|
// SITE + MEMBERS
|
|
35
34
|
const frontendApp = require('./frontend')(options);
|
|
36
|
-
parentApp.use(vhost(
|
|
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.
|
|
19
|
+
frontendApp.use(shared.middleware.urlRedirects.frontendSSLRedirect);
|
|
20
20
|
|
|
21
21
|
frontendApp.lazyUse('/members', require('../members'));
|
|
22
22
|
frontendApp.use('/', require('../../../frontend/web')(options));
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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
|
-
"
|
|
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
|
};
|
|
@@ -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"],
|
package/core/shared/labs.js
CHANGED
|
@@ -29,8 +29,15 @@ const ALPHA_FEATURES = [
|
|
|
29
29
|
'oauthLogin',
|
|
30
30
|
'membersActivity',
|
|
31
31
|
'cardSettingsPanel',
|
|
32
|
+
'urlCache',
|
|
32
33
|
'mediaAPI',
|
|
33
|
-
'
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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.
|
|
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 --
|
|
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 --
|
|
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.
|
|
57
|
+
"@sentry/node": "6.15.0",
|
|
58
58
|
"@tryghost/adapter-manager": "0.2.18",
|
|
59
|
-
"@tryghost/admin-api-schema": "2.6.
|
|
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.
|
|
62
|
+
"@tryghost/color-utils": "0.1.5",
|
|
63
63
|
"@tryghost/config-url-helpers": "0.1.3",
|
|
64
|
-
"@tryghost/constants": "0.
|
|
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.
|
|
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.
|
|
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.
|
|
80
|
+
"@tryghost/logging": "1.0.1",
|
|
81
81
|
"@tryghost/magic-link": "1.0.14",
|
|
82
|
-
"@tryghost/members-api": "2.7.
|
|
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.
|
|
85
|
+
"@tryghost/members-offers": "0.10.2",
|
|
86
86
|
"@tryghost/members-ssr": "1.0.15",
|
|
87
|
-
"@tryghost/metrics": "1.0.
|
|
88
|
-
"@tryghost/minifier": "0.1.
|
|
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.
|
|
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.
|
|
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.
|
|
98
|
-
"@tryghost/string": "0.1.
|
|
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.
|
|
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
|
|
129
|
+
"ghost-storage-base": "1.0.0",
|
|
130
130
|
"glob": "7.2.0",
|
|
131
131
|
"got": "9.6.0",
|
|
132
|
-
"gscan": "4.
|
|
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.
|
|
143
|
+
"knex-migrator": "4.1.3",
|
|
144
144
|
"lodash": "4.17.21",
|
|
145
|
-
"luxon": "2.
|
|
145
|
+
"luxon": "2.1.1",
|
|
146
146
|
"mailgun-js": "0.22.0",
|
|
147
|
-
"metascraper": "5.25.
|
|
148
|
-
"metascraper-author": "5.25.
|
|
149
|
-
"metascraper-description": "5.25.
|
|
150
|
-
"metascraper-image": "5.25.
|
|
151
|
-
"metascraper-logo": "5.25.
|
|
152
|
-
"metascraper-logo-favicon": "5.25.
|
|
153
|
-
"metascraper-publisher": "5.25.
|
|
154
|
-
"metascraper-title": "5.25.
|
|
155
|
-
"metascraper-url": "5.25.
|
|
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.
|
|
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": "
|
|
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.
|
|
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
|
|
201
|
+
"nock": "13.2.1",
|
|
202
202
|
"papaparse": "5.3.1",
|
|
203
203
|
"postcss": "8.3.11",
|
|
204
204
|
"rewire": "5.0.0",
|