UNPKG

@apistudio/apim-cli

Version:

CLI for API Management Products

92 lines (91 loc) 3.7 kB
import AdmZip from "adm-zip"; import path from "path"; import { KindEnums } from "@apic/api-model/common/StudioEnums.js"; import { equalsIgnoreCase } from "../common/data-helper.js"; import { isYamlFile } from "../common/fs-helper.js"; import { convertParsedYmlToString, parseYamlContent } from "../common/yaml-helper.js"; import { FAILED_TO_PROCESS_ENTRY, INVALID_ENV_VARIABLE_FORMAT, KEY_MISSING, NO_ENV_FILE, VALUE_MISSING, } from "../../constants/message-constants.js"; import { EQUAL } from "../../constants/app-constants.js"; import { showError } from "../common/message-helper.js"; const parseEnvInput = (input) => { const result = {}; if (!input.trim()) { return result; } const pairs = input.split(/,(?=(?:[^'"]*['"][^'"]*['"])*[^'"]*$)/); pairs.forEach((pair) => { if (!pair.trim()) { return; } const [key, ...valueParts] = pair.split(EQUAL); if (!key || !key.trim()) { throw new Error(`${INVALID_ENV_VARIABLE_FORMAT} ${KEY_MISSING}` + pair); } const value = valueParts.join(EQUAL).trim(); if (!value) { throw new Error(`${INVALID_ENV_VARIABLE_FORMAT} ${VALUE_MISSING}` + key.trim()); } const finalKey = key.replace(/^['"]|['"]$/g, "").trim(); const finalValue = value.replace(/^['"]|['"]$/g, "").trim(); result[finalKey] = finalValue; }); return result; }; const updateEnvironmentAssets = (yamlContent, envMap) => { if (!equalsIgnoreCase(yamlContent.kind || "", KindEnums.Environment)) { return yamlContent; } if (!yamlContent.spec) { yamlContent.spec = { variables: [] }; } const variables = yamlContent.spec.variables || []; Object.keys(envMap).forEach((key) => { const existingVar = variables.find((v) => v.key && equalsIgnoreCase(v.key, key)); if (!existingVar) { variables.push({ key, value: envMap[key] }); } else { existingVar.value = envMap[key]; } }); yamlContent.spec.variables = variables; return yamlContent; }; const updateZipBuffer = (entries, inputMap, zip) => { entries.forEach((entry) => { try { const content = entry.getData().toString('utf-8'); const yamlContent = parseYamlContent(content); if (!yamlContent) { return; } const updatedEnvironmentContent = updateEnvironmentAssets(yamlContent.toJS(), inputMap); if (yamlContent.hasIn(['spec', 'variables'])) { yamlContent.setIn(['spec', 'variables'], updatedEnvironmentContent.spec.variables); } const updatedContent = convertParsedYmlToString(yamlContent); if (content !== updatedContent) { zip.updateFile(entry.entryName, Buffer.from(updatedContent, 'utf-8')); } } catch (error) { showError(`${FAILED_TO_PROCESS_ENTRY} ${entry.entryName}: ${error.message}`); } }); }; const updateEnvironmentAssetInZip = async (zipBuffer, envMap, directory) => { const zip = new AdmZip(zipBuffer); const entries = zip.getEntries(); const yamlEntries = entries.filter((entry) => { const entryName = entry.entryName; const normalizedPath = path.normalize(entryName); return (normalizedPath.startsWith(path.normalize(directory)) && isYamlFile(normalizedPath)); }); if (yamlEntries.length === 0) { throw new Error(`${NO_ENV_FILE} ${directory}`); } updateZipBuffer(yamlEntries, envMap, zip); return zip.toBuffer(); }; export { parseEnvInput, updateEnvironmentAssetInZip };