@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.
Files changed (125) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +163 -0
  3. package/bin/strapi.js +239 -0
  4. package/index.d.ts +13 -0
  5. package/lib/Strapi.js +498 -0
  6. package/lib/commands/admin-reset.js +51 -0
  7. package/lib/commands/build.js +47 -0
  8. package/lib/commands/configurationDump.js +50 -0
  9. package/lib/commands/configurationRestore.js +160 -0
  10. package/lib/commands/console.js +26 -0
  11. package/lib/commands/develop.js +155 -0
  12. package/lib/commands/generate-template.js +97 -0
  13. package/lib/commands/generate.js +66 -0
  14. package/lib/commands/install.js +48 -0
  15. package/lib/commands/new.js +11 -0
  16. package/lib/commands/start.js +8 -0
  17. package/lib/commands/uninstall.js +68 -0
  18. package/lib/commands/watchAdmin.js +35 -0
  19. package/lib/core/app-configuration/config-loader.js +56 -0
  20. package/lib/core/app-configuration/config-provider.js +28 -0
  21. package/lib/core/app-configuration/index.js +99 -0
  22. package/lib/core/bootstrap.js +166 -0
  23. package/lib/core/fs.js +52 -0
  24. package/lib/core/index.js +21 -0
  25. package/lib/core/load-admin.js +36 -0
  26. package/lib/core/load-apis.js +22 -0
  27. package/lib/core/load-components.js +43 -0
  28. package/lib/core/load-extensions.js +71 -0
  29. package/lib/core/load-functions.js +21 -0
  30. package/lib/core/load-hooks.js +117 -0
  31. package/lib/core/load-middlewares.js +130 -0
  32. package/lib/core/load-modules.js +61 -0
  33. package/lib/core/load-plugins.js +68 -0
  34. package/lib/core/load-policies.js +36 -0
  35. package/lib/core/walk.js +27 -0
  36. package/lib/core-api/controller.js +158 -0
  37. package/lib/core-api/index.js +33 -0
  38. package/lib/core-api/service/collection-type.js +122 -0
  39. package/lib/core-api/service/index.js +81 -0
  40. package/lib/core-api/service/single-type.js +68 -0
  41. package/lib/hooks/index.js +97 -0
  42. package/lib/index.js +3 -0
  43. package/lib/load/check-reserved-filename.js +18 -0
  44. package/lib/load/filepath-to-prop-path.js +22 -0
  45. package/lib/load/glob.js +15 -0
  46. package/lib/load/index.js +9 -0
  47. package/lib/load/load-config-files.js +22 -0
  48. package/lib/load/load-files.js +56 -0
  49. package/lib/load/package-path.js +9 -0
  50. package/lib/load/require-file-parse.js +15 -0
  51. package/lib/middlewares/boom/defaults.json +5 -0
  52. package/lib/middlewares/boom/index.js +147 -0
  53. package/lib/middlewares/cors/index.js +66 -0
  54. package/lib/middlewares/cron/defaults.json +5 -0
  55. package/lib/middlewares/cron/index.js +43 -0
  56. package/lib/middlewares/csp/defaults.json +5 -0
  57. package/lib/middlewares/csp/index.js +26 -0
  58. package/lib/middlewares/favicon/defaults.json +7 -0
  59. package/lib/middlewares/favicon/index.js +35 -0
  60. package/lib/middlewares/gzip/defaults.json +6 -0
  61. package/lib/middlewares/gzip/index.js +19 -0
  62. package/lib/middlewares/hsts/defaults.json +7 -0
  63. package/lib/middlewares/hsts/index.js +30 -0
  64. package/lib/middlewares/index.js +120 -0
  65. package/lib/middlewares/ip/defaults.json +7 -0
  66. package/lib/middlewares/ip/index.js +25 -0
  67. package/lib/middlewares/language/defaults.json +9 -0
  68. package/lib/middlewares/language/index.js +40 -0
  69. package/lib/middlewares/logger/defaults.json +8 -0
  70. package/lib/middlewares/logger/index.js +63 -0
  71. package/lib/middlewares/p3p/defaults.json +6 -0
  72. package/lib/middlewares/p3p/index.js +29 -0
  73. package/lib/middlewares/parser/defaults.json +10 -0
  74. package/lib/middlewares/parser/index.js +71 -0
  75. package/lib/middlewares/poweredBy/defaults.json +5 -0
  76. package/lib/middlewares/poweredBy/index.js +16 -0
  77. package/lib/middlewares/public/assets/images/group_people_1.png +0 -0
  78. package/lib/middlewares/public/assets/images/group_people_2.png +0 -0
  79. package/lib/middlewares/public/assets/images/group_people_3.png +0 -0
  80. package/lib/middlewares/public/assets/images/logo_login.png +0 -0
  81. package/lib/middlewares/public/defaults.json +8 -0
  82. package/lib/middlewares/public/index.html +66 -0
  83. package/lib/middlewares/public/index.js +98 -0
  84. package/lib/middlewares/public/serve-static.js +23 -0
  85. package/lib/middlewares/responseTime/defaults.json +5 -0
  86. package/lib/middlewares/responseTime/index.js +25 -0
  87. package/lib/middlewares/responses/defaults.json +5 -0
  88. package/lib/middlewares/responses/index.js +18 -0
  89. package/lib/middlewares/router/defaults.json +7 -0
  90. package/lib/middlewares/router/index.js +64 -0
  91. package/lib/middlewares/router/utils/composeEndpoint.js +25 -0
  92. package/lib/middlewares/router/utils/routerChecker.js +92 -0
  93. package/lib/middlewares/session/defaults.json +18 -0
  94. package/lib/middlewares/session/index.js +140 -0
  95. package/lib/middlewares/xframe/defaults.json +6 -0
  96. package/lib/middlewares/xframe/index.js +33 -0
  97. package/lib/middlewares/xss/defaults.json +6 -0
  98. package/lib/middlewares/xss/index.js +30 -0
  99. package/lib/services/core-store.js +144 -0
  100. package/lib/services/entity-service.js +260 -0
  101. package/lib/services/entity-validator/index.js +199 -0
  102. package/lib/services/entity-validator/validators.js +125 -0
  103. package/lib/services/event-hub.js +15 -0
  104. package/lib/services/metrics/index.js +103 -0
  105. package/lib/services/metrics/is-truthy.js +9 -0
  106. package/lib/services/metrics/middleware.js +33 -0
  107. package/lib/services/metrics/rate-limiter.js +27 -0
  108. package/lib/services/metrics/sender.js +76 -0
  109. package/lib/services/metrics/stringify-deep.js +22 -0
  110. package/lib/services/utils/upload-files.js +70 -0
  111. package/lib/services/webhook-runner.js +159 -0
  112. package/lib/services/webhook-store.js +97 -0
  113. package/lib/services/worker-queue.js +58 -0
  114. package/lib/utils/addSlash.js +10 -0
  115. package/lib/utils/ee.js +123 -0
  116. package/lib/utils/get-prefixed-dependencies.js +7 -0
  117. package/lib/utils/index.js +25 -0
  118. package/lib/utils/openBrowser.js +145 -0
  119. package/lib/utils/resources/key.pub +9 -0
  120. package/lib/utils/resources/openChrome.applescript +83 -0
  121. package/lib/utils/run-checks.js +37 -0
  122. package/lib/utils/success.js +31 -0
  123. package/lib/utils/update-notifier/index.js +96 -0
  124. package/lib/utils/url-from-segments.js +13 -0
  125. 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,5 @@
1
+ {
2
+ "cron": {
3
+ "enabled": true
4
+ }
5
+ }
@@ -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,5 @@
1
+ {
2
+ "csp": {
3
+ "enabled": false
4
+ }
5
+ }
@@ -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,7 @@
1
+ {
2
+ "favicon": {
3
+ "enabled": true,
4
+ "path": "favicon.ico",
5
+ "maxAge": 86400000
6
+ }
7
+ }
@@ -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,6 @@
1
+ {
2
+ "gzip": {
3
+ "enabled": false,
4
+ "options": {}
5
+ }
6
+ }
@@ -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,7 @@
1
+ {
2
+ "hsts": {
3
+ "enabled": true,
4
+ "maxAge": 31536000,
5
+ "includeSubDomains": true
6
+ }
7
+ }
@@ -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,7 @@
1
+ {
2
+ "ip": {
3
+ "enabled": false,
4
+ "whiteList": [],
5
+ "blackList": []
6
+ }
7
+ }
@@ -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,9 @@
1
+ {
2
+ "language": {
3
+ "enabled": false,
4
+ "defaultLocale": "en_us",
5
+ "locales": ["en_us"],
6
+ "modes": ["query", "subdomain", "cookie", "header", "url", "tld"],
7
+ "cookieName": "locale"
8
+ }
9
+ }
@@ -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,8 @@
1
+ {
2
+ "logger": {
3
+ "enabled": true,
4
+ "level": "debug",
5
+ "exposeInContext": true,
6
+ "requests": true
7
+ }
8
+ }
@@ -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,6 @@
1
+ {
2
+ "p3p": {
3
+ "enabled": false,
4
+ "value": ""
5
+ }
6
+ }
@@ -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,10 @@
1
+ {
2
+ "parser": {
3
+ "enabled": true,
4
+ "multipart": true,
5
+ "queryStringParser": {
6
+ "arrayLimit": 100,
7
+ "depth": 20
8
+ }
9
+ }
10
+ }
@@ -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,5 @@
1
+ {
2
+ "poweredBy": {
3
+ "enabled": true
4
+ }
5
+ }
@@ -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
+ };