fh-serverless
Version:
A Node.js CLI for optimizing and generating configuration files for Serverless projects
62 lines (61 loc) • 2.94 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generate = void 0;
const path_1 = __importDefault(require("path"));
const files_1 = require("./lib/files");
const deepmerge_1 = __importDefault(require("deepmerge"));
function filterFileType(files, types) {
return files.filter((pathName) => types.includes(path_1.default.extname(pathName)));
}
function getConfigs(files, folderName) {
const hasScriptFile = filterFileType(files, ['.js', '.ts']);
const hasMetadataFile = filterFileType(files, ['.yml']);
if (hasScriptFile.length > 1) {
console.warn(`The ${folderName} folder has two files that can be a function`);
return undefined;
}
if (hasMetadataFile.length > 1) {
console.warn(`The ${folderName} folder has two files that can be a metadata function`);
return undefined;
}
return { hasScriptFile: hasScriptFile[0], hasMetadataFile: hasMetadataFile[0] };
}
function getFunctionsConfig(projectPath, project, functionPrefix) {
const scriptsFolder = (0, files_1.listRecursiveSync)(path_1.default.join(projectPath, 'scripts'));
return scriptsFolder.folders.reduce((carry, item) => {
const configs = getConfigs(item.files, item.folderName);
if (!configs?.hasMetadataFile || !configs?.hasScriptFile)
return carry;
const { hasScriptFile, hasMetadataFile } = configs;
const metadata = (0, files_1.getYml)(hasMetadataFile);
const handler = path_1.default.join('scripts', item.folderName, path_1.default.basename(hasScriptFile, path_1.default.extname(hasScriptFile)) + '.handler');
const functionName = project?.prefix ? `${functionPrefix}-${item.folderName}` : item.folderName;
const configFunction = (0, deepmerge_1.default)(metadata, (project?.functions || {})[functionName] instanceof Object ? project?.functions[functionName] : {});
return {
...carry,
[functionName]: {
...configFunction,
...(project?.globalFunctionsConfig || {}),
handler,
},
};
}, {});
}
async function generate(projectPath) {
const serverlessPath = path_1.default.join(projectPath, 'serverless.yml');
(0, files_1.cleanFiles)(serverlessPath);
const project = (0, files_1.getJson)(path_1.default.join(projectPath, 'project.json'));
if (!project)
return;
const functionPrefix = project?.prefix || '';
const functions = getFunctionsConfig(projectPath, project, functionPrefix);
delete project.globalFunctionsConfig;
delete project.functions;
delete project.prefix;
const serverlessConfig = { ...project, functions };
(0, files_1.saveYml)(serverlessPath, serverlessConfig);
}
exports.generate = generate;