serverless-utilities
Version:
Handy 🛠️ utility functions for Vercel ⚡ serverless functions.
88 lines (87 loc) • 3.11 kB
JavaScript
/*
* Contains a serverless function wrapper that makes
* it easy to be used.
* Created On 30 April 2023
*/
import { notFound } from './notFound.js';
async function validate(req, res, route) {
// validate route
if (route.validation) {
if (route.validation.query) {
try {
req.query = await route.validation.query.parse(req.query);
}
catch (err) {
console.log(err);
res.status(400).json({
error: true,
message: err.issues[0].message,
data: {}
});
return false;
}
}
if (route.validation.body) {
try {
req.body = route.validation.body.parse(req.body);
}
catch (err) {
console.log(err);
res.status(400).json({
error: true,
message: err.issues[0].message,
data: {}
});
return false;
}
}
}
return true;
}
/** A helpful utility function that wraps around your
* serverless function to make it easy to use.
*/
export function func(config) {
return async (req, res) => {
// get current request method
const method = req.method.toLowerCase();
if (config.cors) {
if (config.cors.allowCredentials == true) {
res.setHeader('Access-Control-Allow-Credentials', 'true');
}
if (config.cors.allowedHeaders) {
res.setHeader('Access-Control-Allow-Headers', config.cors.allowedHeaders.join(', '));
}
if (config.cors.allowedMethods) {
res.setHeader('Access-Control-Allow-Methods', config.cors.allowedMethods.join(',').toUpperCase());
}
if (config.cors.allowedOrigin) {
res.setHeader('Access-Control-Allow-Origin', config.cors.allowedOrigin);
}
if (config.cors.exposeHeaders) {
res.setHeader('Access-Control-Expose-Headers', config.cors.exposeHeaders.join(', '));
}
}
// handle responding to OPTIONS request for CORS globally
if (method == 'options' && config.cors) {
return res.status(200).send('');
}
// handle caching
if (config.caching) {
if (config.caching.sharedCacheSeconds) {
res.setHeader('Cache-Control', `max-age=0, s-maxage=${config.caching.sharedCacheSeconds}, stale-while-revalidate`);
}
}
// grab the function that has been mapped to
// the user sent request method
const route = config.methods[method];
// handle when no method has been defined
if (!route)
return notFound(req, res);
// validate all the different parameters
if (await validate(req, res, route)) {
// finally execute the handler function
return route.handler(req, res);
}
};
}