diff --git a/settings.js b/settings.js new file mode 100644 index 0000000..41f0582 --- /dev/null +++ b/settings.js @@ -0,0 +1,120 @@ +import { execSync } from 'child_process' +import fs from 'fs' +import { parse, stringify } from 'envfile' + +export const AO_ENV_FILE_PATH = process.env.HOME + '/.ao/.env' + +function createAoFolderIfDoesNotExist() { + +} + +// Check for an AO env file at ~/.ao/.env and returns true if it exists +export function checkAoEnvFile() { + try { + execSync(`[ -f "${AO_ENV_FILE_PATH}" ]`) + return true + } catch(err) { + return false + } +} + +export function aoEnv(variable) { + let envFileContents = {} + try { + envFileContents = fs.readFileSync(AO_ENV_FILE_PATH) + } catch(err) { + if(err.code === 'ENOENT') { + //console.log('The .env file does not exist, so the requested value', variable, 'is empty.') + } else { + console.log('Unknown error loading .env file in aoEnv, aborting.') + } + return null + } + const parsedFile = parse(envFileContents) + + if(!parsedFile.hasOwnProperty(variable)) { + return null + } + + // Convert ENV idiom to programmatic types + switch(parsedFile[variable]) { + case '1': + case 'true': + case 'TRUE': + case 'yes': + case 'YES': + return true + case '0': + case 'false': + case 'FALSE': + case 'no': + case 'NO': + return false + } + + return parsedFile[variable] +} + +// Sets and saves the given ENV=value to the global ~/.ao/.env file +// If value is null, the env variable will be deleted +// Returns true if a change was made, false if no change was made or if it failed +export function setAoEnv(variable, value) { + createAoFolderIfDoesNotExist() + if(typeof variable !== 'string') { + console.log('ENV variable name must be a string for setAoEnv') + return false + } + + // Convert types to standard ENV file idiom + switch(value) { + case true: + case 'TRUE': + case 'yes': + case 'YES': + value = '1' + break + case false: + case 'FALSE': + case 'no': + case 'NO': + value = '0' + } + + let envFileContents = {} + try { + envFileContents = fs.readFileSync(AO_ENV_FILE_PATH) + } catch(err) { + if(err.code === 'ENOENT') { + console.log('The .env file hasn\'t been created yet, creating.') + } else { + console.log('Unknown error loading .env file in setAoEnv, aborting. Error:', err) + return false + } + } + + const parsedFile = parse(envFileContents) + if(parsedFile[variable] == value) { + console.log(variable, 'is already', value, 'so no change was made.') + return false + } + + if(value === null) { + delete parsedFile[variable] + } else { + parsedFile[variable] = value + } + + const stringified = stringify(parsedFile) + fs.writeFileSync(AO_ENV_FILE_PATH, stringified) + + // Confirm the variable was set in the .env file correctly + if(aoEnv(variable) != value) { + console.log('Value was not saved correctly, sorry.') + return false + } + return true +} + +function setAndSaveEnvironmentVariable(variable, value, path) { + +}