Files
payload/src/utilities/sanitizeConfig.ts
2020-11-20 13:39:18 -05:00

81 lines
3.6 KiB
TypeScript

const defaultUser = require('../auth/default');
const sanitizeCollection = require('../collections/sanitize');
const { InvalidConfiguration } = require('../errors');
const sanitizeGlobals = require('../globals/sanitize');
const validateSchema = require('../schema/validateSchema');
const checkDuplicateCollections = require('./checkDuplicateCollections');
const sanitizeConfig = (config) => {
const sanitizedConfig = validateSchema({ ...config });
// TODO: remove default values from sanitize in favor of assigning in the schema within validateSchema and use https://www.npmjs.com/package/ajv#coercing-data-types where needed
if (sanitizedConfig.publicENV === undefined) sanitizedConfig.publicENV = {};
if (sanitizedConfig.defaultDepth === undefined) sanitizedConfig.defaultDepth = 2;
if (sanitizedConfig.maxDepth === undefined) sanitizedConfig.maxDepth = 10;
sanitizedConfig.collections = sanitizedConfig.collections.map((collection) => sanitizeCollection(sanitizedConfig.collections, collection));
checkDuplicateCollections(sanitizedConfig.collections);
if (sanitizedConfig.globals) {
sanitizedConfig.globals = sanitizeGlobals(sanitizedConfig.collections, sanitizedConfig.globals);
} else {
sanitizedConfig.globals = [];
}
if (!sanitizedConfig.cookiePrefix) sanitizedConfig.cookiePrefix = 'payload';
sanitizedConfig.csrf = [
...(Array.isArray(config.csrf) ? config.csrf : []),
config.serverURL,
];
sanitizedConfig.admin = config.admin || {};
sanitizedConfig.upload = config.upload || {};
if (!sanitizedConfig.admin.user) {
sanitizedConfig.admin.user = 'users';
sanitizedConfig.collections.push(defaultUser);
} else if (!sanitizedConfig.collections.find((c) => c.slug === sanitizedConfig.admin.user)) {
throw new InvalidConfiguration(`${sanitizedConfig.admin.user} is not a valid admin user collection`);
}
sanitizedConfig.email = config.email || {};
// TODO: This should likely be moved to the payload.schema.json
if (sanitizedConfig.email.transports) {
if (!sanitizedConfig.email.email.fromName || !sanitizedConfig.email.email.fromAddress) {
throw new InvalidConfiguration('Email fromName and fromAddress must be configured when transport is configured');
}
}
sanitizedConfig.graphQL = config.graphQL || {};
sanitizedConfig.graphQL.maxComplexity = (sanitizedConfig.graphQL && sanitizedConfig.graphQL.maxComplexity) ? sanitizedConfig.graphQL.maxComplexity : 1000;
sanitizedConfig.graphQL.disablePlaygroundInProduction = (sanitizedConfig.graphQL && sanitizedConfig.graphQL.disablePlaygroundInProduction !== undefined) ? sanitizedConfig.graphQL.disablePlaygroundInProduction : true;
sanitizedConfig.routes = {
admin: (config.routes && config.routes.admin) ? config.routes.admin : '/admin',
api: (config.routes && config.routes.api) ? config.routes.api : '/api',
graphQL: (config.routes && config.routes.graphQL) ? config.routes.graphQL : '/graphql',
graphQLPlayground: (config.routes && config.routes.graphQLPlayground) ? config.routes.graphQLPlayground : '/graphql-playground',
};
sanitizedConfig.rateLimit = config.rateLimit || {};
sanitizedConfig.rateLimit.window = sanitizedConfig.rateLimit.window || 15 * 60 * 100; // 15min default
sanitizedConfig.rateLimit.max = sanitizedConfig.rateLimit.max || 500;
if (!sanitizedConfig.express) {
sanitizedConfig.express = {
json: {},
};
}
sanitizedConfig.components = { ...(config.components || {}) };
sanitizedConfig.hooks = { ...(config.hooks || {}) };
sanitizedConfig.admin = { ...(config.admin || {}) };
return sanitizedConfig;
};
module.exports = sanitizeConfig;