From b76db63886919397a33c226c092ef99dac565695 Mon Sep 17 00:00:00 2001 From: Luk Lu Date: Sun, 16 Apr 2023 20:27:36 +0800 Subject: [PATCH] add get_envar_chame/sesame/basic --- envar-tool.js | 106 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 86 insertions(+), 20 deletions(-) diff --git a/envar-tool.js b/envar-tool.js index f78233f..76eadb1 100644 --- a/envar-tool.js +++ b/envar-tool.js @@ -2,6 +2,8 @@ const fs = require('fs') const path = require('path') const deepmerge = require('deepmerge') +const my = { envar: {} } + module.exports = { /** 合并 envar files 和 commander parameters 中的环境变量。 * @param envarFiles: @@ -52,25 +54,22 @@ module.exports = { console.warn(` - unrecognized envarFiles!`) } - if (withCmd) { + if (withCmd && Array.isArray(global.envar.commanderOptions)) { + console.info('- Loading Command Line Parameters (载入命令行参数)') const commander = require('commander') - if (Array.isArray(global.envar.commanderOptions)) { - console.info('- Loading Command Line Parameters (载入命令行参数)') - commander.version(global.envar.Base_Version || '0.0.1', '-v, --version') // 默认是 -V。如果要 -v,就要加 '-v --version' - for (let [key, param, desc] of global.envar.commanderOptions || []) { - commander.option(param, `${desc} Default = "${global.envar[key]}"`) - } - commander.parse(process.argv) - delete global.envar.commanderOptions - - // console.log('- Merging Command Line Parameters into Configuration (把命令行参数值合并入配置)') - for (let key in commander) { - if (!/^_/.test(key) && typeof commander[key] === 'string') { - // commander 自带了一批 _开头的属性,过滤掉 - global.envar[key] = commander[key] - } + commander.version(global.envar.Base_Version || '0.0.1', '-v, --version') // 默认是 -V。如果要 -v,就要加 '-v --version' + for (let [key, param, desc] of global.envar.commanderOptions || []) { + commander.option(param, `${desc} Default = "${global.envar[key]}"`) + } + commander.parse(process.argv) + // console.log('- Merging Command Line Parameters into Configuration (把命令行参数值合并入配置)') + for (let key in commander) { + if (!/^_/.test(key) && typeof commander[key] === 'string') { + // commander 自带了一批 _开头的属性,过滤掉 + global.envar[key] = commander[key] } } + delete global.envar.commanderOptions } console.log(`>>>>>>>> Configured [${process.env.NODE_ENV}] Environment >>>>>>>>`) @@ -87,6 +86,7 @@ module.exports = { let dynamicEnvar = {} if (typeof dynamicEnvarFiles === 'string') { + // a file containing more files if (fs.existsSync(path.resolve(dynamicEnvarFiles))) { dynamicEnvarFiles = require(path.resolve(dynamicEnvarFiles)) } else { @@ -100,9 +100,9 @@ module.exports = { if (fs.existsSync(path.resolve(dynamicFile))) { delete require.cache[require.resolve(path.resolve(dynamicFile))] // delete require.cache[fullpath] 不起作用,必须要加 require.resolve dynamicEnvar = deepmerge(dynamicEnvar, require(path.resolve(dynamicFile))) // 在这里其实不需要 deepmerge - console.info(` - ${dynamicFile} for dynamics is parsed.`) + console.info(` - ${dynamicFile} is parsed.`) } else { - console.warn(` - ${dynamicFile} for dynamics is missing.`) + console.warn(` - ${dynamicFile} is missing.`) } } } else if (typeof dynamicEnvarFiles === 'object') { @@ -136,9 +136,9 @@ module.exports = { for (let secretFile of secretEnvarFiles) { if (fs.existsSync(path.resolve(secretFile))) { secretEnvar = deepmerge(secretEnvar, require(path.resolve(secretFile))) // 在这里其实不需要 deepmerge - console.info(` - ${secretFile} for secrets is parsed.`) + console.info(` - ${secretFile} is parsed.`) } else { - console.warn(` - ${secretFile} for secrets is missing.`) + console.warn(` - ${secretFile} is missing.`) } } } else if (typeof secretEnvarFiles === 'object') { @@ -153,4 +153,70 @@ module.exports = { return envar }, + + // 预制方法 + get_envar_allinone ({ + files = [ + './envar-base-basic.js', + './envar-base-basic.gitignore.js', + './envar-base-dynamic.js', + './envar-base-dynamic.gitignore.js', + './envar-base-secret.js', + './envar-base-secret.gitignore.js', + ], + } = {}) { + return this.get_envar({ inProcess: false, inCache: true, cachename: 'basic', refresh: false, files }) + }, + get_envar_basic ({ envarKey, files = ['./envar-base-basic.js', './envar-base-basic.gitignore.js'] } = {}) { + return (my['basic'] = this.get_envar({ envarKey, inProcess: false, inCache: true, cachename: 'basic', refresh: false, files })) + }, + get_envar_chame ({ envarKey, files = ['./envar-base-dynamic.js', './envar-base-dynamic.gitignore.js'] } = {}) { + return this.get_envar({ envarKey, inProcess: true, inCache: false, refresh: true, files }) + }, + get_envar_sesame ({ envarKey, files = ['./envar-base-secret.js', './envar-base-secret.gitignore.js'] } = {}) { + return (my['sesame'] = this.get_envar({ envarKey, inProcess: true, inCache: true, cachename: 'sesame', refresh: false, files })) + }, + // 可定制的通用方法 + get_envar ({ envarKey, inProcess, inCache, cachename, files, refresh } = {}) { + if (envarKey) + return ( + (inProcess && process.env[envarKey]) || + (inCache && my[cachename || 'envar']?.[envarKey]) || + (files && this.merge_envar_files({ refresh, files })[envarKey]) + ) + else return (inCache && my[cachename || 'envar']) || (files && this.merge_envar_files({ refresh, files })) + }, + merge_envar_files ({ refresh = false, files } = {}) { + let envar = {} + + if (typeof files === 'string') { + // a file containing more files + if (fs.existsSync(path.resolve(files))) { + files = require(path.resolve(files)) + } else { + console.warn(` - ${files} is missing.`) + files = undefined + } + } + + if (Array.isArray(files)) { + for (let envarFile of files) { + if (fs.existsSync(path.resolve(envarFile))) { + if (refresh) { + delete require.cache[require.resolve(path.resolve(envarFile))] // delete require.cache[fullpath] 不起作用,必须要加 require.resolve + } + envar = deepmerge(envar, require(path.resolve(envarFile))) + console.info(` - ${envarFile} is parsed.`) + } else { + console.warn(` - ${envarFile} is missing.`) + } + } + } else if (typeof files === 'object') { + envar = files + } else { + console.warn(` - unrecognized files!`) + } + + return envar + }, }