@strapi/strapi 4.0.0-next.9 → 4.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -14
- package/bin/strapi.js +37 -6
- package/lib/Strapi.js +140 -72
- package/lib/commands/build.js +21 -11
- package/lib/commands/console.js +1 -1
- package/lib/commands/content-types/list.js +22 -0
- package/lib/commands/controllers/list.js +22 -0
- package/lib/commands/develop.js +24 -27
- package/lib/commands/generate-template.js +4 -5
- package/lib/commands/hooks/list.js +22 -0
- package/lib/commands/middlewares/list.js +22 -0
- package/lib/commands/new.js +3 -1
- package/lib/commands/policies/list.js +22 -0
- package/lib/commands/routes/list.js +28 -0
- package/lib/commands/services/list.js +22 -0
- package/lib/commands/watchAdmin.js +18 -9
- package/lib/core/app-configuration/index.js +3 -19
- package/lib/core/bootstrap.js +3 -34
- package/lib/core/domain/content-type/index.js +3 -7
- package/lib/core/domain/module/index.js +8 -6
- package/lib/core/domain/module/validation.js +1 -4
- package/lib/core/loaders/admin.js +2 -2
- package/lib/core/loaders/apis.js +7 -7
- package/lib/core/loaders/components.js +3 -5
- package/lib/core/loaders/index.js +1 -0
- package/lib/core/loaders/middlewares.js +23 -123
- package/lib/core/loaders/plugins/get-enabled-plugins.js +55 -19
- package/lib/core/loaders/plugins/get-user-plugins-config.js +37 -0
- package/lib/core/loaders/plugins/index.js +30 -16
- package/lib/core/loaders/policies.js +1 -1
- package/lib/core/loaders/src-index.js +39 -0
- package/lib/core/registries/apis.js +2 -16
- package/lib/core/registries/content-types.js +50 -6
- package/lib/core/registries/controllers.d.ts +7 -0
- package/lib/core/registries/controllers.js +74 -3
- package/lib/core/registries/hooks.d.ts +20 -0
- package/lib/core/registries/hooks.js +87 -0
- package/lib/core/registries/middlewares.d.ts +5 -0
- package/lib/core/registries/middlewares.js +61 -2
- package/lib/core/registries/modules.js +3 -3
- package/lib/core/registries/plugins.js +2 -2
- package/lib/core/registries/policies.d.ts +9 -0
- package/lib/core/registries/policies.js +57 -6
- package/lib/core/registries/services.d.ts +7 -0
- package/lib/core/registries/services.js +71 -15
- package/lib/core-api/controller/collection-type.js +38 -11
- package/lib/core-api/controller/index.d.ts +25 -0
- package/lib/core-api/controller/index.js +30 -11
- package/lib/core-api/controller/single-type.js +26 -7
- package/lib/core-api/controller/transform.js +28 -3
- package/lib/core-api/routes/index.js +71 -0
- package/lib/core-api/service/collection-type.js +22 -27
- package/lib/core-api/service/index.d.ts +21 -0
- package/lib/core-api/service/index.js +9 -19
- package/lib/core-api/service/pagination.js +16 -16
- package/lib/core-api/service/single-type.js +17 -20
- package/lib/factories.d.ts +48 -0
- package/lib/factories.js +84 -0
- package/lib/index.d.ts +10 -31
- package/lib/index.js +5 -1
- package/lib/middlewares/body.js +33 -0
- package/lib/middlewares/compression.js +8 -0
- package/lib/middlewares/cors.js +58 -0
- package/lib/middlewares/errors.js +40 -0
- package/lib/middlewares/favicon.js +19 -0
- package/lib/middlewares/index.d.ts +5 -0
- package/lib/middlewares/index.js +30 -116
- package/lib/middlewares/ip.js +8 -0
- package/lib/middlewares/logger.js +27 -0
- package/lib/middlewares/powered-by.js +20 -0
- package/lib/middlewares/public/index.js +72 -77
- package/lib/middlewares/query.js +46 -0
- package/lib/middlewares/response-time.js +15 -0
- package/lib/middlewares/responses.js +19 -0
- package/lib/middlewares/security.js +51 -0
- package/lib/middlewares/session/index.js +6 -6
- package/lib/migrations/draft-publish.js +57 -0
- package/lib/services/auth/index.js +87 -0
- package/lib/services/core-store.js +64 -49
- package/lib/services/cron.js +54 -0
- package/lib/services/entity-service/attributes/index.js +31 -0
- package/lib/services/entity-service/attributes/transforms.js +20 -0
- package/lib/services/entity-service/components.js +39 -15
- package/lib/services/entity-service/index.d.ts +91 -0
- package/lib/services/entity-service/index.js +118 -60
- package/lib/services/entity-service/params.js +48 -81
- package/lib/services/entity-validator/index.js +76 -43
- package/lib/services/entity-validator/validators.js +131 -43
- package/lib/services/errors.js +77 -0
- package/lib/services/fs.js +1 -1
- package/lib/services/metrics/index.js +38 -36
- package/lib/services/server/admin-api.js +14 -0
- package/lib/services/server/api.js +36 -0
- package/lib/services/server/compose-endpoint.js +141 -0
- package/lib/services/server/content-api.js +16 -0
- package/lib/{server.js → services/server/http-server.js} +0 -0
- package/lib/services/server/index.js +127 -0
- package/lib/services/server/koa.js +64 -0
- package/lib/services/server/middleware.js +122 -0
- package/lib/services/server/policy.js +32 -0
- package/lib/services/server/register-middlewares.js +110 -0
- package/lib/services/server/register-routes.js +106 -0
- package/lib/services/server/routing.js +120 -0
- package/lib/services/webhook-runner.js +1 -1
- package/lib/utils/ee.js +3 -3
- package/lib/utils/get-dirs.js +17 -0
- package/lib/utils/index.js +2 -0
- package/lib/utils/signals.js +24 -0
- package/lib/utils/update-notifier/index.js +2 -1
- package/package.json +94 -93
- package/lib/core/app-configuration/load-functions.js +0 -28
- package/lib/core-api/index.js +0 -39
- package/lib/middlewares/boom/defaults.json +0 -5
- package/lib/middlewares/boom/index.js +0 -147
- package/lib/middlewares/cors/index.js +0 -66
- package/lib/middlewares/cron/defaults.json +0 -5
- package/lib/middlewares/cron/index.js +0 -43
- package/lib/middlewares/favicon/defaults.json +0 -7
- package/lib/middlewares/favicon/index.js +0 -32
- package/lib/middlewares/gzip/defaults.json +0 -6
- package/lib/middlewares/gzip/index.js +0 -19
- package/lib/middlewares/helmet/defaults.json +0 -18
- package/lib/middlewares/helmet/index.js +0 -9
- package/lib/middlewares/ip/defaults.json +0 -7
- package/lib/middlewares/ip/index.js +0 -25
- package/lib/middlewares/language/defaults.json +0 -9
- package/lib/middlewares/language/index.js +0 -40
- package/lib/middlewares/logger/defaults.json +0 -5
- package/lib/middlewares/logger/index.js +0 -37
- package/lib/middlewares/parser/defaults.json +0 -11
- package/lib/middlewares/parser/index.js +0 -72
- package/lib/middlewares/poweredBy/defaults.json +0 -5
- package/lib/middlewares/poweredBy/index.js +0 -16
- package/lib/middlewares/public/defaults.json +0 -8
- package/lib/middlewares/responseTime/defaults.json +0 -5
- package/lib/middlewares/responseTime/index.js +0 -25
- package/lib/middlewares/responses/defaults.json +0 -5
- package/lib/middlewares/responses/index.js +0 -18
- package/lib/middlewares/router/defaults.json +0 -7
- package/lib/middlewares/router/index.js +0 -72
- package/lib/middlewares/router/utils/compose-endpoint.js +0 -169
- package/lib/utils/get-prefixed-dependencies.js +0 -7
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Module dependencies
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// Public node modules.
|
|
8
|
-
const _ = require('lodash');
|
|
9
|
-
const Router = require('koa-router');
|
|
10
|
-
const createEndpointComposer = require('./utils/compose-endpoint');
|
|
11
|
-
|
|
12
|
-
module.exports = strapi => {
|
|
13
|
-
const composeEndpoint = createEndpointComposer(strapi);
|
|
14
|
-
|
|
15
|
-
const registerAdminRoutes = () => {
|
|
16
|
-
const router = new Router({ prefix: '/admin' });
|
|
17
|
-
|
|
18
|
-
for (const route of strapi.admin.routes) {
|
|
19
|
-
composeEndpoint(route, { pluginName: 'admin', router });
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
strapi.app.use(router.routes()).use(router.allowedMethods());
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const registerPluginRoutes = () => {
|
|
26
|
-
for (const pluginName in strapi.plugins) {
|
|
27
|
-
const plugin = strapi.plugins[pluginName];
|
|
28
|
-
|
|
29
|
-
const router = new Router({ prefix: `/${pluginName}` });
|
|
30
|
-
|
|
31
|
-
for (const route of plugin.routes || []) {
|
|
32
|
-
const hasPrefix = _.has(route.config, 'prefix');
|
|
33
|
-
composeEndpoint(route, {
|
|
34
|
-
pluginName,
|
|
35
|
-
router: hasPrefix ? strapi.router : router,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
strapi.app.use(router.routes()).use(router.allowedMethods());
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const registerAPIRoutes = () => {
|
|
44
|
-
for (const apiName in strapi.api) {
|
|
45
|
-
const api = strapi.api[apiName];
|
|
46
|
-
|
|
47
|
-
_.forEach(api.routes, routeInfo => {
|
|
48
|
-
// nested router
|
|
49
|
-
if (_.has(routeInfo, 'routes')) {
|
|
50
|
-
const router = new Router({ prefix: routeInfo.prefix });
|
|
51
|
-
|
|
52
|
-
for (const route of routeInfo.routes || []) {
|
|
53
|
-
composeEndpoint(route, { apiName, router });
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
strapi.router.use(router.routes()).use(router.allowedMethods());
|
|
57
|
-
} else {
|
|
58
|
-
composeEndpoint(routeInfo, { apiName, router: strapi.router });
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
return {
|
|
65
|
-
initialize() {
|
|
66
|
-
strapi.router.prefix(strapi.config.get('middleware.settings.router.prefix', ''));
|
|
67
|
-
registerAPIRoutes();
|
|
68
|
-
registerAdminRoutes();
|
|
69
|
-
registerPluginRoutes();
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
};
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const _ = require('lodash');
|
|
4
|
-
const compose = require('koa-compose');
|
|
5
|
-
const { yup, policy: policyUtils } = require('@strapi/utils');
|
|
6
|
-
|
|
7
|
-
const policyOrMiddlewareSchema = yup.lazy(value => {
|
|
8
|
-
if (typeof value === 'string') {
|
|
9
|
-
return yup.string().required();
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
if (typeof value === 'function') {
|
|
13
|
-
return yup.mixed().isFunction();
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return yup.object({
|
|
17
|
-
name: yup.string().required(),
|
|
18
|
-
options: yup.object().notRequired(), // any options
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
const routeSchema = yup.object({
|
|
23
|
-
method: yup
|
|
24
|
-
.string()
|
|
25
|
-
.oneOf(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'ALL'])
|
|
26
|
-
.required(),
|
|
27
|
-
path: yup.string().required(),
|
|
28
|
-
handler: yup.lazy(value => {
|
|
29
|
-
if (typeof value === 'string') {
|
|
30
|
-
return yup.string().required();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return yup
|
|
34
|
-
.mixed()
|
|
35
|
-
.isFunction()
|
|
36
|
-
.required();
|
|
37
|
-
}),
|
|
38
|
-
config: yup
|
|
39
|
-
.object({
|
|
40
|
-
policies: yup
|
|
41
|
-
.array()
|
|
42
|
-
.of(policyOrMiddlewareSchema)
|
|
43
|
-
.notRequired(),
|
|
44
|
-
middlwares: yup
|
|
45
|
-
.array()
|
|
46
|
-
.of(policyOrMiddlewareSchema)
|
|
47
|
-
.notRequired(),
|
|
48
|
-
})
|
|
49
|
-
.notRequired(),
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
const validateRouteConfig = routeConfig => {
|
|
53
|
-
try {
|
|
54
|
-
return routeSchema.validateSync(routeConfig, {
|
|
55
|
-
strict: true,
|
|
56
|
-
abortEarly: false,
|
|
57
|
-
stripUnknown: true,
|
|
58
|
-
});
|
|
59
|
-
} catch (error) {
|
|
60
|
-
console.error(error);
|
|
61
|
-
throw new Error('Invalid route config');
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
module.exports = strapi => {
|
|
66
|
-
const routerChecker = createRouteChecker(strapi);
|
|
67
|
-
|
|
68
|
-
return (routeConfig, { pluginName, router, apiName }) => {
|
|
69
|
-
validateRouteConfig(routeConfig);
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
const middlewares = resolveMiddlewares(routeConfig);
|
|
73
|
-
|
|
74
|
-
const { method, endpoint, policies, action } = routerChecker(routeConfig, {
|
|
75
|
-
pluginName,
|
|
76
|
-
apiName,
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
if (_.isUndefined(action) || !_.isFunction(action)) {
|
|
80
|
-
return strapi.log.warn(
|
|
81
|
-
`Ignored attempt to bind route '${routeConfig.method} ${routeConfig.path}' to unknown controller/action.`
|
|
82
|
-
);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
router[method](endpoint, compose([...policies, ...middlewares, action]));
|
|
86
|
-
} catch (error) {
|
|
87
|
-
throw new Error(
|
|
88
|
-
`Error creating endpoint ${routeConfig.method} ${routeConfig.path}: ${error.message}`
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
const resolveMiddlewares = route => {
|
|
95
|
-
const middlewaresConfig = _.get(route, 'config.middlewares', []);
|
|
96
|
-
|
|
97
|
-
return middlewaresConfig.map(middlewareConfig => {
|
|
98
|
-
if (typeof middlewareConfig === 'function') {
|
|
99
|
-
return middlewareConfig;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const middleware = strapi.middleware(middlewareConfig);
|
|
103
|
-
|
|
104
|
-
if (!middleware) {
|
|
105
|
-
throw new Error(`Middleware ${middlewareConfig} not found.`);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return middleware;
|
|
109
|
-
});
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
const getMethod = route => _.trim(_.toLower(route.method));
|
|
113
|
-
const getEndpoint = route => _.trim(route.path);
|
|
114
|
-
|
|
115
|
-
const createRouteChecker = strapi => {
|
|
116
|
-
return (value, { pluginName, apiName }) => {
|
|
117
|
-
const method = getMethod(value);
|
|
118
|
-
const endpoint = getEndpoint(value);
|
|
119
|
-
|
|
120
|
-
// Define controller and action names.
|
|
121
|
-
const [controllerName, actionName] = _.trim(value.handler).split('.');
|
|
122
|
-
const controllerKey = _.toLower(controllerName);
|
|
123
|
-
|
|
124
|
-
let controller;
|
|
125
|
-
|
|
126
|
-
if (pluginName) {
|
|
127
|
-
if (pluginName === 'admin') {
|
|
128
|
-
controller = strapi.admin.controllers[controllerKey];
|
|
129
|
-
} else {
|
|
130
|
-
controller = strapi.plugin(pluginName).controller(controllerKey);
|
|
131
|
-
}
|
|
132
|
-
} else {
|
|
133
|
-
controller = strapi.container.get('controllers').get(`api::${apiName}.${controllerKey}`);
|
|
134
|
-
}
|
|
135
|
-
if (!_.isFunction(controller[actionName])) {
|
|
136
|
-
strapi.stopWithError(
|
|
137
|
-
`Error creating endpoint ${method} ${endpoint}: handler not found "${controllerKey}.${actionName}"`
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const action = controller[actionName].bind(controller);
|
|
142
|
-
|
|
143
|
-
const { bodyPolicy } = policyUtils;
|
|
144
|
-
|
|
145
|
-
const globalPolicy = policyUtils.globalPolicy({
|
|
146
|
-
controller: controllerKey,
|
|
147
|
-
action: actionName,
|
|
148
|
-
method,
|
|
149
|
-
endpoint,
|
|
150
|
-
plugin: pluginName,
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
const policyOption = _.get(value, 'config.policies', []);
|
|
154
|
-
|
|
155
|
-
const routePolicies = policyOption.map(policyConfig => {
|
|
156
|
-
return policyUtils.get(policyConfig, { pluginName, apiName });
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
// Init policies array.
|
|
160
|
-
const policies = [globalPolicy, ...routePolicies, bodyPolicy];
|
|
161
|
-
|
|
162
|
-
return {
|
|
163
|
-
method,
|
|
164
|
-
endpoint,
|
|
165
|
-
policies,
|
|
166
|
-
action,
|
|
167
|
-
};
|
|
168
|
-
};
|
|
169
|
-
};
|