@akemona-org/strapi 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +163 -0
- package/bin/strapi.js +239 -0
- package/index.d.ts +13 -0
- package/lib/Strapi.js +498 -0
- package/lib/commands/admin-reset.js +51 -0
- package/lib/commands/build.js +47 -0
- package/lib/commands/configurationDump.js +50 -0
- package/lib/commands/configurationRestore.js +160 -0
- package/lib/commands/console.js +26 -0
- package/lib/commands/develop.js +155 -0
- package/lib/commands/generate-template.js +97 -0
- package/lib/commands/generate.js +66 -0
- package/lib/commands/install.js +48 -0
- package/lib/commands/new.js +11 -0
- package/lib/commands/start.js +8 -0
- package/lib/commands/uninstall.js +68 -0
- package/lib/commands/watchAdmin.js +35 -0
- package/lib/core/app-configuration/config-loader.js +56 -0
- package/lib/core/app-configuration/config-provider.js +28 -0
- package/lib/core/app-configuration/index.js +99 -0
- package/lib/core/bootstrap.js +166 -0
- package/lib/core/fs.js +52 -0
- package/lib/core/index.js +21 -0
- package/lib/core/load-admin.js +36 -0
- package/lib/core/load-apis.js +22 -0
- package/lib/core/load-components.js +43 -0
- package/lib/core/load-extensions.js +71 -0
- package/lib/core/load-functions.js +21 -0
- package/lib/core/load-hooks.js +117 -0
- package/lib/core/load-middlewares.js +130 -0
- package/lib/core/load-modules.js +61 -0
- package/lib/core/load-plugins.js +68 -0
- package/lib/core/load-policies.js +36 -0
- package/lib/core/walk.js +27 -0
- package/lib/core-api/controller.js +158 -0
- package/lib/core-api/index.js +33 -0
- package/lib/core-api/service/collection-type.js +122 -0
- package/lib/core-api/service/index.js +81 -0
- package/lib/core-api/service/single-type.js +68 -0
- package/lib/hooks/index.js +97 -0
- package/lib/index.js +3 -0
- package/lib/load/check-reserved-filename.js +18 -0
- package/lib/load/filepath-to-prop-path.js +22 -0
- package/lib/load/glob.js +15 -0
- package/lib/load/index.js +9 -0
- package/lib/load/load-config-files.js +22 -0
- package/lib/load/load-files.js +56 -0
- package/lib/load/package-path.js +9 -0
- package/lib/load/require-file-parse.js +15 -0
- package/lib/middlewares/boom/defaults.json +5 -0
- package/lib/middlewares/boom/index.js +147 -0
- package/lib/middlewares/cors/index.js +66 -0
- package/lib/middlewares/cron/defaults.json +5 -0
- package/lib/middlewares/cron/index.js +43 -0
- package/lib/middlewares/csp/defaults.json +5 -0
- package/lib/middlewares/csp/index.js +26 -0
- package/lib/middlewares/favicon/defaults.json +7 -0
- package/lib/middlewares/favicon/index.js +35 -0
- package/lib/middlewares/gzip/defaults.json +6 -0
- package/lib/middlewares/gzip/index.js +19 -0
- package/lib/middlewares/hsts/defaults.json +7 -0
- package/lib/middlewares/hsts/index.js +30 -0
- package/lib/middlewares/index.js +120 -0
- package/lib/middlewares/ip/defaults.json +7 -0
- package/lib/middlewares/ip/index.js +25 -0
- package/lib/middlewares/language/defaults.json +9 -0
- package/lib/middlewares/language/index.js +40 -0
- package/lib/middlewares/logger/defaults.json +8 -0
- package/lib/middlewares/logger/index.js +63 -0
- package/lib/middlewares/p3p/defaults.json +6 -0
- package/lib/middlewares/p3p/index.js +29 -0
- package/lib/middlewares/parser/defaults.json +10 -0
- package/lib/middlewares/parser/index.js +71 -0
- package/lib/middlewares/poweredBy/defaults.json +5 -0
- package/lib/middlewares/poweredBy/index.js +16 -0
- package/lib/middlewares/public/assets/images/group_people_1.png +0 -0
- package/lib/middlewares/public/assets/images/group_people_2.png +0 -0
- package/lib/middlewares/public/assets/images/group_people_3.png +0 -0
- package/lib/middlewares/public/assets/images/logo_login.png +0 -0
- package/lib/middlewares/public/defaults.json +8 -0
- package/lib/middlewares/public/index.html +66 -0
- package/lib/middlewares/public/index.js +98 -0
- package/lib/middlewares/public/serve-static.js +23 -0
- package/lib/middlewares/responseTime/defaults.json +5 -0
- package/lib/middlewares/responseTime/index.js +25 -0
- package/lib/middlewares/responses/defaults.json +5 -0
- package/lib/middlewares/responses/index.js +18 -0
- package/lib/middlewares/router/defaults.json +7 -0
- package/lib/middlewares/router/index.js +64 -0
- package/lib/middlewares/router/utils/composeEndpoint.js +25 -0
- package/lib/middlewares/router/utils/routerChecker.js +92 -0
- package/lib/middlewares/session/defaults.json +18 -0
- package/lib/middlewares/session/index.js +140 -0
- package/lib/middlewares/xframe/defaults.json +6 -0
- package/lib/middlewares/xframe/index.js +33 -0
- package/lib/middlewares/xss/defaults.json +6 -0
- package/lib/middlewares/xss/index.js +30 -0
- package/lib/services/core-store.js +144 -0
- package/lib/services/entity-service.js +260 -0
- package/lib/services/entity-validator/index.js +199 -0
- package/lib/services/entity-validator/validators.js +125 -0
- package/lib/services/event-hub.js +15 -0
- package/lib/services/metrics/index.js +103 -0
- package/lib/services/metrics/is-truthy.js +9 -0
- package/lib/services/metrics/middleware.js +33 -0
- package/lib/services/metrics/rate-limiter.js +27 -0
- package/lib/services/metrics/sender.js +76 -0
- package/lib/services/metrics/stringify-deep.js +22 -0
- package/lib/services/utils/upload-files.js +70 -0
- package/lib/services/webhook-runner.js +159 -0
- package/lib/services/webhook-store.js +97 -0
- package/lib/services/worker-queue.js +58 -0
- package/lib/utils/addSlash.js +10 -0
- package/lib/utils/ee.js +123 -0
- package/lib/utils/get-prefixed-dependencies.js +7 -0
- package/lib/utils/index.js +25 -0
- package/lib/utils/openBrowser.js +145 -0
- package/lib/utils/resources/key.pub +9 -0
- package/lib/utils/resources/openChrome.applescript +83 -0
- package/lib/utils/run-checks.js +37 -0
- package/lib/utils/success.js +31 -0
- package/lib/utils/update-notifier/index.js +96 -0
- package/lib/utils/url-from-segments.js +13 -0
- package/package.json +143 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Module dependencies
|
|
5
|
+
*/
|
|
6
|
+
const cors = require('@koa/cors');
|
|
7
|
+
|
|
8
|
+
const defaults = {
|
|
9
|
+
origin: '*',
|
|
10
|
+
maxAge: 31536000,
|
|
11
|
+
credentials: true,
|
|
12
|
+
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
|
|
13
|
+
headers: ['Content-Type', 'Authorization', 'Origin', 'Accept'],
|
|
14
|
+
keepHeadersOnError: false,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
module.exports = strapi => {
|
|
18
|
+
return {
|
|
19
|
+
/**
|
|
20
|
+
* Initialize the hook
|
|
21
|
+
*/
|
|
22
|
+
initialize() {
|
|
23
|
+
const {
|
|
24
|
+
origin,
|
|
25
|
+
expose,
|
|
26
|
+
maxAge,
|
|
27
|
+
credentials,
|
|
28
|
+
methods,
|
|
29
|
+
headers,
|
|
30
|
+
keepHeadersOnError,
|
|
31
|
+
} = Object.assign({}, defaults, strapi.config.get('middleware.settings.cors'));
|
|
32
|
+
|
|
33
|
+
strapi.app.use(
|
|
34
|
+
cors({
|
|
35
|
+
origin: async function(ctx) {
|
|
36
|
+
let originList;
|
|
37
|
+
|
|
38
|
+
if (typeof origin === 'function') {
|
|
39
|
+
originList = await origin(ctx);
|
|
40
|
+
} else {
|
|
41
|
+
originList = origin;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const whitelist = Array.isArray(originList) ? originList : originList.split(/\s*,\s*/);
|
|
45
|
+
|
|
46
|
+
const requestOrigin = ctx.accept.headers.origin;
|
|
47
|
+
if (whitelist.includes('*')) {
|
|
48
|
+
return '*';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!whitelist.includes(requestOrigin)) {
|
|
52
|
+
return ctx.throw(`${requestOrigin} is not a valid origin`);
|
|
53
|
+
}
|
|
54
|
+
return requestOrigin;
|
|
55
|
+
},
|
|
56
|
+
exposeHeaders: expose,
|
|
57
|
+
maxAge,
|
|
58
|
+
credentials,
|
|
59
|
+
allowMethods: methods,
|
|
60
|
+
allowHeaders: headers,
|
|
61
|
+
keepHeadersOnError,
|
|
62
|
+
})
|
|
63
|
+
);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Module dependencies
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Public node modules.
|
|
8
|
+
const _ = require('lodash');
|
|
9
|
+
const cron = require('node-schedule');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* CRON hook
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
module.exports = strapi => {
|
|
16
|
+
return {
|
|
17
|
+
/**
|
|
18
|
+
* Initialize the hook
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
initialize() {
|
|
22
|
+
if (strapi.config.get('server.cron.enabled', false) === true) {
|
|
23
|
+
_.forEach(_.keys(strapi.config.get('functions.cron', {})), taskExpression => {
|
|
24
|
+
const taskValue = strapi.config.functions.cron[taskExpression];
|
|
25
|
+
|
|
26
|
+
if (_.isFunction(taskValue)) {
|
|
27
|
+
return cron.scheduleJob(taskExpression, taskValue);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const options = _.get(taskValue, 'options', {});
|
|
31
|
+
|
|
32
|
+
cron.scheduleJob(
|
|
33
|
+
{
|
|
34
|
+
rule: taskExpression,
|
|
35
|
+
...options,
|
|
36
|
+
},
|
|
37
|
+
taskValue.task
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const convert = require('koa-convert');
|
|
4
|
+
const { csp } = require('koa-lusca');
|
|
5
|
+
/**
|
|
6
|
+
* CSP hook
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
module.exports = strapi => {
|
|
10
|
+
return {
|
|
11
|
+
/**
|
|
12
|
+
* Initialize the hook
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
initialize() {
|
|
16
|
+
strapi.app.use(async (ctx, next) => {
|
|
17
|
+
if (ctx.request.admin) return await next();
|
|
18
|
+
|
|
19
|
+
return await convert(csp(strapi.config.middleware.settings.csp))(
|
|
20
|
+
ctx,
|
|
21
|
+
next
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Module dependencies
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Node.js core.
|
|
8
|
+
const { resolve } = require('path');
|
|
9
|
+
const favicon = require('koa-favicon');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Favicon hook
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
module.exports = strapi => {
|
|
16
|
+
return {
|
|
17
|
+
/**
|
|
18
|
+
* Initialize the hook
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
initialize() {
|
|
22
|
+
const { dir } = strapi;
|
|
23
|
+
const {
|
|
24
|
+
maxAge,
|
|
25
|
+
path: faviconPath,
|
|
26
|
+
} = strapi.config.middleware.settings.favicon;
|
|
27
|
+
|
|
28
|
+
strapi.app.use(
|
|
29
|
+
favicon(resolve(dir, faviconPath), {
|
|
30
|
+
maxAge,
|
|
31
|
+
})
|
|
32
|
+
);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Gzip hook
|
|
5
|
+
*/
|
|
6
|
+
const compress = require('koa-compress');
|
|
7
|
+
|
|
8
|
+
module.exports = strapi => {
|
|
9
|
+
return {
|
|
10
|
+
/**
|
|
11
|
+
* Initialize the hook
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
initialize() {
|
|
15
|
+
const { options = {} } = strapi.config.middleware.settings.gzip;
|
|
16
|
+
strapi.app.use(compress(options));
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Module dependencies
|
|
5
|
+
*/
|
|
6
|
+
const convert = require('koa-convert');
|
|
7
|
+
const { hsts } = require('koa-lusca');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* HSTS hook
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
module.exports = strapi => {
|
|
14
|
+
return {
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the hook
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
initialize() {
|
|
20
|
+
strapi.app.use(async (ctx, next) => {
|
|
21
|
+
if (ctx.request.admin) return next();
|
|
22
|
+
|
|
23
|
+
return await convert(hsts(strapi.config.middleware.settings.hsts))(
|
|
24
|
+
ctx,
|
|
25
|
+
next
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { uniq, difference, get, isUndefined, merge } = require('lodash');
|
|
4
|
+
|
|
5
|
+
const requiredMiddlewares = [
|
|
6
|
+
'responses',
|
|
7
|
+
'router',
|
|
8
|
+
'logger',
|
|
9
|
+
'boom',
|
|
10
|
+
'cors',
|
|
11
|
+
'cron',
|
|
12
|
+
'xframe',
|
|
13
|
+
'xss',
|
|
14
|
+
'public',
|
|
15
|
+
'favicon',
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
module.exports = async function() {
|
|
19
|
+
/** Utils */
|
|
20
|
+
const middlewareConfig = this.config.middleware;
|
|
21
|
+
|
|
22
|
+
// check if a middleware exists
|
|
23
|
+
const middlewareExists = key => {
|
|
24
|
+
return !isUndefined(this.middleware[key]);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// check if a middleware is enabled
|
|
28
|
+
const middlewareEnabled = key => {
|
|
29
|
+
return (
|
|
30
|
+
requiredMiddlewares.includes(key) ||
|
|
31
|
+
get(middlewareConfig, ['settings', key, 'enabled'], false) === true
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// list of enabled middlewares
|
|
36
|
+
const enabledMiddlewares = Object.keys(this.middleware).filter(middlewareEnabled);
|
|
37
|
+
|
|
38
|
+
// Method to initialize middlewares and emit an event.
|
|
39
|
+
const initialize = middlewareKey => {
|
|
40
|
+
if (this.middleware[middlewareKey].loaded === true) return;
|
|
41
|
+
|
|
42
|
+
const module = this.middleware[middlewareKey].load;
|
|
43
|
+
|
|
44
|
+
return new Promise((resolve, reject) => {
|
|
45
|
+
const timeout = setTimeout(
|
|
46
|
+
() => reject(`(middleware: ${middlewareKey}) is taking too long to load.`),
|
|
47
|
+
middlewareConfig.timeout || 1000
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
this.middleware[middlewareKey] = merge(this.middleware[middlewareKey], module);
|
|
51
|
+
|
|
52
|
+
Promise.resolve()
|
|
53
|
+
.then(() => module.initialize())
|
|
54
|
+
.then(() => {
|
|
55
|
+
clearTimeout(timeout);
|
|
56
|
+
this.middleware[middlewareKey].loaded = true;
|
|
57
|
+
resolve();
|
|
58
|
+
})
|
|
59
|
+
.catch(err => {
|
|
60
|
+
clearTimeout(timeout);
|
|
61
|
+
|
|
62
|
+
if (err) {
|
|
63
|
+
return reject(err);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Run init functions
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
// Run beforeInitialize of every middleware
|
|
74
|
+
await Promise.all(
|
|
75
|
+
enabledMiddlewares.map(key => {
|
|
76
|
+
const { beforeInitialize } = this.middleware[key].load;
|
|
77
|
+
if (typeof beforeInitialize === 'function') {
|
|
78
|
+
return beforeInitialize();
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
// run the initialization of an array of middlewares sequentially
|
|
84
|
+
const initMiddlewaresSeq = async middlewareArr => {
|
|
85
|
+
for (let key of uniq(middlewareArr)) {
|
|
86
|
+
await initialize(key);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const middlewaresBefore = get(middlewareConfig, 'load.before', [])
|
|
91
|
+
.filter(middlewareExists)
|
|
92
|
+
.filter(middlewareEnabled);
|
|
93
|
+
|
|
94
|
+
const middlewaresAfter = get(middlewareConfig, 'load.after', [])
|
|
95
|
+
.filter(middlewareExists)
|
|
96
|
+
.filter(middlewareEnabled);
|
|
97
|
+
|
|
98
|
+
const middlewaresOrder = get(middlewareConfig, 'load.order', [])
|
|
99
|
+
.filter(middlewareExists)
|
|
100
|
+
.filter(middlewareEnabled);
|
|
101
|
+
|
|
102
|
+
const unspecifiedMiddlewares = difference(
|
|
103
|
+
enabledMiddlewares,
|
|
104
|
+
middlewaresBefore,
|
|
105
|
+
middlewaresOrder,
|
|
106
|
+
middlewaresAfter
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
// before
|
|
110
|
+
await initMiddlewaresSeq(middlewaresBefore);
|
|
111
|
+
|
|
112
|
+
// ordered // rest of middlewares
|
|
113
|
+
await Promise.all([
|
|
114
|
+
initMiddlewaresSeq(middlewaresOrder),
|
|
115
|
+
Promise.all(unspecifiedMiddlewares.map(initialize)),
|
|
116
|
+
]);
|
|
117
|
+
|
|
118
|
+
// after
|
|
119
|
+
await initMiddlewaresSeq(middlewaresAfter);
|
|
120
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ip = require('koa-ip');
|
|
4
|
+
/**
|
|
5
|
+
* IP filter hook
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
module.exports = strapi => {
|
|
9
|
+
return {
|
|
10
|
+
/**
|
|
11
|
+
* Initialize the hook
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
initialize() {
|
|
15
|
+
const { whiteList, blackList } = strapi.config.middleware.settings.ip;
|
|
16
|
+
|
|
17
|
+
strapi.app.use(
|
|
18
|
+
ip({
|
|
19
|
+
whitelist: whiteList,
|
|
20
|
+
blacklist: blackList,
|
|
21
|
+
})
|
|
22
|
+
);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Module dependencies
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Node.js core.
|
|
8
|
+
const { resolve } = require('path');
|
|
9
|
+
const locale = require('koa-locale');
|
|
10
|
+
const i18n = require('koa-i18n');
|
|
11
|
+
/**
|
|
12
|
+
* Language hook
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
module.exports = strapi => {
|
|
16
|
+
return {
|
|
17
|
+
/**
|
|
18
|
+
* Initialize the hook
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
initialize() {
|
|
22
|
+
locale(strapi.app);
|
|
23
|
+
|
|
24
|
+
const { defaultLocale, modes, cookieName } = strapi.config.middleware.settings.language;
|
|
25
|
+
|
|
26
|
+
const directory = resolve(strapi.config.appPath, strapi.config.paths.config, 'locales');
|
|
27
|
+
|
|
28
|
+
strapi.app.use(
|
|
29
|
+
i18n(strapi.app, {
|
|
30
|
+
directory,
|
|
31
|
+
locales: strapi.config.get('middleware.settings.language.locales', []),
|
|
32
|
+
defaultLocale,
|
|
33
|
+
modes,
|
|
34
|
+
cookieName,
|
|
35
|
+
extension: '.json',
|
|
36
|
+
})
|
|
37
|
+
);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const chalk = require('chalk');
|
|
3
|
+
const _ = require('lodash');
|
|
4
|
+
|
|
5
|
+
const codeToColor = code => {
|
|
6
|
+
return code >= 500
|
|
7
|
+
? chalk.red(code)
|
|
8
|
+
: code >= 400
|
|
9
|
+
? chalk.yellow(code)
|
|
10
|
+
: code >= 300
|
|
11
|
+
? chalk.cyan(code)
|
|
12
|
+
: code >= 200
|
|
13
|
+
? chalk.green(code)
|
|
14
|
+
: code;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Logger hook
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
module.exports = strapi => {
|
|
22
|
+
return {
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the hook
|
|
25
|
+
*/
|
|
26
|
+
initialize() {
|
|
27
|
+
const { level, exposeInContext, requests } = strapi.config.middleware.settings.logger;
|
|
28
|
+
|
|
29
|
+
const logLevels = Object.keys(strapi.log.levels.values);
|
|
30
|
+
|
|
31
|
+
if (!_.includes(logLevels, level)) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
"Invalid log level set in middleware configuration. Accepted values are: '" +
|
|
34
|
+
logLevels.join("', '") +
|
|
35
|
+
"'."
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
strapi.log.level = level;
|
|
40
|
+
|
|
41
|
+
if (exposeInContext) {
|
|
42
|
+
strapi.app.context.log = strapi.log;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const isLogLevelEnvVariableSet = _.isString(process.env.STRAPI_LOG_LEVEL);
|
|
46
|
+
|
|
47
|
+
if (isLogLevelEnvVariableSet && strapi.log.levelVal <= 20) {
|
|
48
|
+
strapi.log.debug(
|
|
49
|
+
`STRAPI_LOG_LEVEL environment variable is overridden by logger middleware. It only applies outside Strapi's middleware context.`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (requests && strapi.log.levelVal <= 20) {
|
|
54
|
+
strapi.app.use(async (ctx, next) => {
|
|
55
|
+
const start = Date.now();
|
|
56
|
+
await next();
|
|
57
|
+
const delta = Math.ceil(Date.now() - start);
|
|
58
|
+
strapi.log.debug(`${ctx.method} ${ctx.url} (${delta} ms) ${codeToColor(ctx.status)}`);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Module dependencies
|
|
5
|
+
*/
|
|
6
|
+
const convert = require('koa-convert');
|
|
7
|
+
const { p3p } = require('koa-lusca');
|
|
8
|
+
/**
|
|
9
|
+
* P3P hook
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
module.exports = strapi => {
|
|
13
|
+
return {
|
|
14
|
+
/**
|
|
15
|
+
* Initialize the hook
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
initialize() {
|
|
19
|
+
strapi.app.use(async (ctx, next) => {
|
|
20
|
+
if (ctx.request.admin) return next();
|
|
21
|
+
|
|
22
|
+
return await convert(p3p(strapi.config.middleware.settings.p3p))(
|
|
23
|
+
ctx,
|
|
24
|
+
next
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const body = require('koa-body');
|
|
4
|
+
const qs = require('qs');
|
|
5
|
+
const { omit } = require('lodash');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Body parser hook
|
|
9
|
+
*/
|
|
10
|
+
const addQsParser = (app, settings) => {
|
|
11
|
+
Object.defineProperty(app.request, 'query', {
|
|
12
|
+
configurable: false,
|
|
13
|
+
enumerable: true,
|
|
14
|
+
/*
|
|
15
|
+
* Get parsed query-string.
|
|
16
|
+
*/
|
|
17
|
+
get() {
|
|
18
|
+
const qstr = this.querystring;
|
|
19
|
+
const cache = (this._querycache = this._querycache || {});
|
|
20
|
+
return cache[qstr] || (cache[qstr] = qs.parse(qstr, settings));
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* Set query-string as an object.
|
|
25
|
+
*/
|
|
26
|
+
set(obj) {
|
|
27
|
+
this.querystring = qs.stringify(obj);
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
return app;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
module.exports = strapi => {
|
|
35
|
+
return {
|
|
36
|
+
/**
|
|
37
|
+
* Initialize the hook
|
|
38
|
+
*/
|
|
39
|
+
initialize() {
|
|
40
|
+
strapi.app.use(async (ctx, next) => {
|
|
41
|
+
// disable for graphql
|
|
42
|
+
// TODO: find a better way later
|
|
43
|
+
if (ctx.url === '/graphql') {
|
|
44
|
+
return next();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
const res = await body({
|
|
49
|
+
patchKoa: true,
|
|
50
|
+
...omit(strapi.config.middleware.settings.parser, 'queryStringParser'),
|
|
51
|
+
})(ctx, next);
|
|
52
|
+
return res;
|
|
53
|
+
} catch (e) {
|
|
54
|
+
if ((e || {}).message && e.message.includes('maxFileSize exceeded')) {
|
|
55
|
+
throw strapi.errors.entityTooLarge('FileTooBig', {
|
|
56
|
+
errors: [
|
|
57
|
+
{
|
|
58
|
+
id: 'Upload.status.sizeLimit',
|
|
59
|
+
message: `file is bigger than the limit size!`,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
throw e;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
addQsParser(strapi.app, strapi.config.get('middleware.settings.parser.queryStringParser'));
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = strapi => {
|
|
4
|
+
return {
|
|
5
|
+
initialize() {
|
|
6
|
+
strapi.app.use(async (ctx, next) => {
|
|
7
|
+
await next();
|
|
8
|
+
|
|
9
|
+
ctx.set(
|
|
10
|
+
'X-Powered-By',
|
|
11
|
+
strapi.config.get('middleware.settings.poweredBy.value', 'Strapi <strapi.io>')
|
|
12
|
+
);
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|