window.ENTITIES={'/api/snippets/javascript/node.js%20-%20custom%20simple%20solution%20to%20read%20.env%20file':[{"result":true,"message":null,"batch":{"type":"javascript","name":"node.js - custom simple solution to read .env file","items":[{"id":"1Ae4Z1","type":"javascript","name":"Node.js - custom simple solution to read .env file","content":"// ---------------------------------------------------------\n// index.js file:\n// ---------------------------------------------------------\n\nconst {initializeVariables, ENV_PATH} = require('./env');\n\nconst ENV_CONSTANTS = exports.ENV_CONSTANTS = {\n __dirname: () => __dirname, // use it in `.env` file as %__dirname%\n __filename: () => __filename // use it in `.env` file as %__filename%\n};\n\ninitializeVariables(ENV_PATH, ENV_CONSTANTS); // ENV_CONSTANTS enables constant values injection (we can use e.g. VARIABLE_NAME=%CONSTANT_NAME%)\n\nconsole.log(process.env.BACKEND_PATH);\nconsole.log(process.env.FRONTEND_PATH);\n\n\n// Example output:\n//\n// /opt/my-website/backend\n// /opt/my-website/frontend\n\n\n\n// ---------------------------------------------------------\n// .env file:\n// ---------------------------------------------------------\n\nAPPLICATION_PATH=%__dirname%\n\nBACKEND_PATH=$APPLICATION_PATH$/backend\nFRONTEND_PATH=$APPLICATION_PATH$/frontend\n\n\n\n// ---------------------------------------------------------\n// env.js file:\n// ---------------------------------------------------------\n\nconst fs = require('fs');\n\n\nconst NEWLINE_EXPRESSION = /\\r?\\n/g;\n\n// Syntax:\n//\n// %NODE_CONSTANT_NAME% - constant defined in application source code\n// $LOCAL_VARIABLE_NAME$ - variable defined in `.env` file\n// *GLOBAL_VARIABLE_NAME* - variable defined in `process.env` object\n//\nconst REFERENCE_EXPRESSION = /%%|%([^%*$]+)%|%|\\*\\*|\\*([^%*$]+)\\*|\\*|\\$\\$|\\$([^%*$]+)\\$|\\$/g;\n\nconst ENV_PATH = exports.ENV_PATH = '.env';\n\n\nconst iterateVariables = exports.iterateVariables = (text, callback) => {\n const lines = text.split(NEWLINE_EXPRESSION);\n for (let i = 0; i < lines.length; ++i) {\n const line = lines[i];\n if (line) {\n const index = line.indexOf('=');\n if (index !== -1) {\n const name = line.substring(0, index);\n if (name) {\n const value = line.substring(index + 1);\n callback(name, value, i);\n }\n }\n }\n }\n};\n\nconst readVariables = exports.readVariables = (path = ENV_PATH, constants = {}) => {\n const text = fs.readFileSync(path, 'utf-8');\n const variables = [];\n const environment = process.env;\n iterateVariables(text, (name, value, index) => {\n const action = (match, group1, group2, group3) => {\n switch (match) {\n case '%': throw new Error(`Incorrect '%' character usage in 'name=${value}' line (line number: ${index + 1}).`);\n case '*': throw new Error(`Incorrect '*' character usage in 'name=${value}' line (line number: ${index + 1}).`);\n case '$': throw new Error(`Incorrect '$' character usage in 'name=${value}' line (line number: ${index + 1}).`);\n case '%%': return '%';\n case '**': return '*';\n case '$$': return '$';\n default:\n switch (match[0]) {\n case '%':\n {\n const constant = constants[group1];\n if (constant) {\n return constant();\n }\n throw new Error(`Unknown '%${group1}%' environment constant.`);\n }\n case '*':\n {\n const variable = environment[group2];\n if (variable == null) { // null or undefined\n throw new Error(`Unknown '%${group2}%' environment variable.`);\n }\n return variable;\n }\n case '$':\n {\n const variable = variables[group3];\n if (variable == null) { // null or undefined\n throw new Error(`Unknown '$${group3}$' environment variable.`);\n }\n return variable;\n }\n default:\n throw new Error(`Unknown constant/variable type.`);\n }\n }\n };\n variables[name] = value.replace(REFERENCE_EXPRESSION, action);\n });\n return variables;\n};\n\nconst initializeVariables = exports.initializeVariables = (path = ENV_PATH, constants = null) => {\n const variables = readVariables(path, constants);\n const keys = Object.keys(variables);\n for (const key of keys) {\n process.env[key] = variables[key];\n }\n};","source":"https://dirask.com/posts/Node-js-read-env-file-custom-solution-D7oyOD","author":{"id":"ZDxWG0","name":"Hayley-Mooney","avatar":"1629030405629__ZDxWG0__w40px_h40px.png","points":677,"role":"BASIC"},"creationTime":1676151471000,"updateTime":1676260526000,"removalTime":null}]}}]};