add get_envar_chame/sesame/basic
This commit is contained in:
		
							parent
							
								
									b99a7b06a2
								
							
						
					
					
						commit
						b76db63886
					
				
							
								
								
									
										106
									
								
								envar-tool.js
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								envar-tool.js
									
									
									
									
									
								
							@ -2,6 +2,8 @@ const fs = require('fs')
 | 
				
			|||||||
const path = require('path')
 | 
					const path = require('path')
 | 
				
			||||||
const deepmerge = require('deepmerge')
 | 
					const deepmerge = require('deepmerge')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const my = { envar: {} }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
  /** 合并 envar files 和 commander parameters 中的环境变量。
 | 
					  /** 合并 envar files 和 commander parameters 中的环境变量。
 | 
				
			||||||
   * @param envarFiles:
 | 
					   * @param envarFiles:
 | 
				
			||||||
@ -52,25 +54,22 @@ module.exports = {
 | 
				
			|||||||
        console.warn(`  - unrecognized envarFiles!`)
 | 
					        console.warn(`  - unrecognized envarFiles!`)
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (withCmd) {
 | 
					      if (withCmd && Array.isArray(global.envar.commanderOptions)) {
 | 
				
			||||||
 | 
					        console.info('- Loading Command Line Parameters (载入命令行参数)')
 | 
				
			||||||
        const commander = require('commander')
 | 
					        const commander = require('commander')
 | 
				
			||||||
        if (Array.isArray(global.envar.commanderOptions)) {
 | 
					        commander.version(global.envar.Base_Version || '0.0.1', '-v, --version') // 默认是 -V。如果要 -v,就要加 '-v --version'
 | 
				
			||||||
          console.info('- Loading Command Line Parameters (载入命令行参数)')
 | 
					        for (let [key, param, desc] of global.envar.commanderOptions || []) {
 | 
				
			||||||
          commander.version(global.envar.Base_Version || '0.0.1', '-v, --version') // 默认是 -V。如果要 -v,就要加 '-v --version'
 | 
					          commander.option(param, `${desc} Default = "${global.envar[key]}"`)
 | 
				
			||||||
          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 (把命令行参数值合并入配置)')
 | 
				
			||||||
          commander.parse(process.argv)
 | 
					        for (let key in commander) {
 | 
				
			||||||
          delete global.envar.commanderOptions
 | 
					          if (!/^_/.test(key) && typeof commander[key] === 'string') {
 | 
				
			||||||
 | 
					            // commander 自带了一批 _开头的属性,过滤掉
 | 
				
			||||||
          // console.log('- Merging Command Line Parameters into Configuration (把命令行参数值合并入配置)')
 | 
					            global.envar[key] = commander[key]
 | 
				
			||||||
          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 >>>>>>>>`)
 | 
					      console.log(`>>>>>>>> Configured [${process.env.NODE_ENV}] Environment >>>>>>>>`)
 | 
				
			||||||
@ -87,6 +86,7 @@ module.exports = {
 | 
				
			|||||||
    let dynamicEnvar = {}
 | 
					    let dynamicEnvar = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (typeof dynamicEnvarFiles === 'string') {
 | 
					    if (typeof dynamicEnvarFiles === 'string') {
 | 
				
			||||||
 | 
					      // a file containing more files
 | 
				
			||||||
      if (fs.existsSync(path.resolve(dynamicEnvarFiles))) {
 | 
					      if (fs.existsSync(path.resolve(dynamicEnvarFiles))) {
 | 
				
			||||||
        dynamicEnvarFiles = require(path.resolve(dynamicEnvarFiles))
 | 
					        dynamicEnvarFiles = require(path.resolve(dynamicEnvarFiles))
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
@ -100,9 +100,9 @@ module.exports = {
 | 
				
			|||||||
        if (fs.existsSync(path.resolve(dynamicFile))) {
 | 
					        if (fs.existsSync(path.resolve(dynamicFile))) {
 | 
				
			||||||
          delete require.cache[require.resolve(path.resolve(dynamicFile))] // delete require.cache[fullpath] 不起作用,必须要加 require.resolve
 | 
					          delete require.cache[require.resolve(path.resolve(dynamicFile))] // delete require.cache[fullpath] 不起作用,必须要加 require.resolve
 | 
				
			||||||
          dynamicEnvar = deepmerge(dynamicEnvar, require(path.resolve(dynamicFile))) // 在这里其实不需要 deepmerge
 | 
					          dynamicEnvar = deepmerge(dynamicEnvar, require(path.resolve(dynamicFile))) // 在这里其实不需要 deepmerge
 | 
				
			||||||
          console.info(`  - ${dynamicFile} for dynamics is parsed.`)
 | 
					          console.info(`  - ${dynamicFile} is parsed.`)
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          console.warn(`  - ${dynamicFile} for dynamics is missing.`)
 | 
					          console.warn(`  - ${dynamicFile} is missing.`)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else if (typeof dynamicEnvarFiles === 'object') {
 | 
					    } else if (typeof dynamicEnvarFiles === 'object') {
 | 
				
			||||||
@ -136,9 +136,9 @@ module.exports = {
 | 
				
			|||||||
      for (let secretFile of secretEnvarFiles) {
 | 
					      for (let secretFile of secretEnvarFiles) {
 | 
				
			||||||
        if (fs.existsSync(path.resolve(secretFile))) {
 | 
					        if (fs.existsSync(path.resolve(secretFile))) {
 | 
				
			||||||
          secretEnvar = deepmerge(secretEnvar, require(path.resolve(secretFile))) // 在这里其实不需要 deepmerge
 | 
					          secretEnvar = deepmerge(secretEnvar, require(path.resolve(secretFile))) // 在这里其实不需要 deepmerge
 | 
				
			||||||
          console.info(`  - ${secretFile} for secrets is parsed.`)
 | 
					          console.info(`  - ${secretFile} is parsed.`)
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          console.warn(`  - ${secretFile} for secrets is missing.`)
 | 
					          console.warn(`  - ${secretFile} is missing.`)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else if (typeof secretEnvarFiles === 'object') {
 | 
					    } else if (typeof secretEnvarFiles === 'object') {
 | 
				
			||||||
@ -153,4 +153,70 @@ module.exports = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return envar
 | 
					    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
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user