UNPKG

fh-serverless

Version:

A Node.js CLI for optimizing and generating configuration files for Serverless projects

62 lines (61 loc) 2.94 kB
"use strict"; 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;