@mondaycom/apps-cli
Version:
A cli tool to manage apps (and monday-code projects) in monday.com
95 lines (94 loc) • 3.87 kB
JavaScript
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
import { join } from 'node:path';
import { BadConfigError } from '../errors/bad-config-error.js';
import { getCurrentWorkingDirectory } from './env-service.js';
import logger from '../utils/logger.js';
export const CONFIG_NAME = '.mappsrc';
const ENCODING = 'utf8';
const CONFIG_PROCESS_ENV_DOMAIN = 'MONDAY_CODE';
let configExists = false;
const checkConfigExists = (directoryPath, fileName = CONFIG_NAME) => {
if (configExists)
return configExists;
const filePath = join(directoryPath, fileName);
configExists = existsSync(filePath);
return configExists;
};
const checkLocalConfigExists = (fileName = CONFIG_NAME) => {
const filePath = join(getCurrentWorkingDirectory(), fileName);
const localConfigExists = existsSync(filePath);
if (!configExists)
configExists = localConfigExists;
return localConfigExists;
};
const camelToUpperSnakeCase = (str) => str.replaceAll(/[A-Z]/g, letter => `_${letter}`).toUpperCase();
const generateConfigKeyInProcessEnv = (configKey) => {
const keyInSnakeCase = camelToUpperSnakeCase(configKey);
const configKeyInProcessEnv = `${CONFIG_PROCESS_ENV_DOMAIN}_${keyInSnakeCase}`;
return configKeyInProcessEnv;
};
const setConfigDataInProcessEnv = (data) => {
for (const [key, value] of Object.entries(data)) {
const configKeyInProcessEnv = generateConfigKeyInProcessEnv(key);
process.env[configKeyInProcessEnv] = value;
}
};
const readConfig = (directoryPath, fileName = CONFIG_NAME) => {
if (!checkConfigExists(directoryPath, fileName)) {
throw new BadConfigError(`the file: ${fileName} is not found in ${directoryPath}`);
}
const filePath = join(directoryPath, fileName);
const stringifiedData = readFileSync(filePath, { encoding: ENCODING });
const data = JSON.parse(stringifiedData);
return data;
};
const writeConfig = (data, directoryPath, fileName = CONFIG_NAME) => {
const filePath = join(directoryPath, fileName);
const stringifiedData = JSON.stringify(data);
writeFileSync(filePath, stringifiedData, { encoding: ENCODING });
return data;
};
export const ConfigService = {
checkConfigExists,
checkLocalConfigExists,
getConfigDataByKey(key) {
const configKeyInProcessEnv = generateConfigKeyInProcessEnv(key);
return process.env[configKeyInProcessEnv];
},
loadConfigToProcessEnv(directoryPath, fileName = CONFIG_NAME) {
const data = readConfig(directoryPath, fileName);
setConfigDataInProcessEnv(data);
return data;
},
removeConfig(directoryPath, fileName = CONFIG_NAME) {
const filePath = join(directoryPath, fileName);
if (checkConfigExists(directoryPath, fileName)) {
unlinkSync(filePath);
configExists = false;
}
return true;
},
init(data, directoryPath, options = {}) {
const fileName = options.fileName || CONFIG_NAME;
const filePath = join(directoryPath, fileName);
if (!existsSync(directoryPath)) {
mkdirSync(directoryPath, { recursive: true });
}
try {
if (!existsSync(filePath)) {
writeConfig(data, directoryPath, fileName);
}
else if (options.override) {
const configDataToOverride = readConfig(directoryPath, fileName);
const mergedData = { ...configDataToOverride, ...data };
writeConfig(mergedData, directoryPath, fileName);
}
if (options.setInProcessEnv)
setConfigDataInProcessEnv(data);
return data;
}
catch (error) {
logger.debug('An error has occurred while creating .mappsrc config file', error.message);
}
},
};