config source
This commit is contained in:
		
							
								
								
									
										2
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							| @@ -5,7 +5,7 @@ pipeline { | |||||||
|       VERSION = VersionNumber([ |       VERSION = VersionNumber([ | ||||||
|           versionNumberString: |           versionNumberString: | ||||||
|               '${BUILDS_ALL_TIME}', |               '${BUILDS_ALL_TIME}', | ||||||
|           versionPrefix: '1.2.', |           versionPrefix: '1.3.', | ||||||
|           worstResultForIncrement: 'SUCCESS' |           worstResultForIncrement: 'SUCCESS' | ||||||
|       ]) |       ]) | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| # @sapphirecode/console-app | # @sapphirecode/console-app | ||||||
|  |  | ||||||
| version: 1.2.x | version: 1.3.x | ||||||
|  |  | ||||||
| read parameters from env, console args or interactively | read parameters from env, console args or interactively | ||||||
|  |  | ||||||
| @@ -54,13 +54,14 @@ the console reader automatically adds the options --help (-h) and --quiet (-q) | |||||||
|   parameters are specified |   parameters are specified | ||||||
|  |  | ||||||
| the reader can also be constructed with additional options that specify which | the reader can also be constructed with additional options that specify which | ||||||
| sources should be used. It reads from all by default | sources should be used. It reads from all, except config files by default | ||||||
|  |  | ||||||
| ```js | ```js | ||||||
| const reader = new InteractiveOptions([], { | const reader = new InteractiveOptions([], { | ||||||
|   args: true, |   args: true, | ||||||
|   env: true, |   env: true, | ||||||
|   interactive: true, |   interactive: true, | ||||||
|  |   configs: ['json files to search for options'] | ||||||
| }); | }); | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ import { OptionType } from './OptionType'; | |||||||
| import { OptionSource } from './Sources/OptionSource'; | import { OptionSource } from './Sources/OptionSource'; | ||||||
| import { EnvSource } from './Sources/EnvSource'; | import { EnvSource } from './Sources/EnvSource'; | ||||||
| import { ArgSource } from './Sources/ArgSource'; | import { ArgSource } from './Sources/ArgSource'; | ||||||
|  | import { ConfigSource } from './Sources/ConfigSource'; | ||||||
| import { InteractiveSource } from './Sources/InteractiveSource'; | import { InteractiveSource } from './Sources/InteractiveSource'; | ||||||
| import { Option, OptionProcess } from './Option'; | import { Option, OptionProcess } from './Option'; | ||||||
|  |  | ||||||
| @@ -26,9 +27,10 @@ const types: Record<OptionType, TypeValidation> = { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| interface SourceConfig { | interface SourceConfig { | ||||||
|   env: boolean; |   env?: boolean; | ||||||
|   args: boolean; |   args?: boolean; | ||||||
|   interactive: boolean; |   interactive?: boolean; | ||||||
|  |   configs?: string[]; | ||||||
| } | } | ||||||
|  |  | ||||||
| export class InteractiveOptions extends Persistent { | export class InteractiveOptions extends Persistent { | ||||||
| @@ -38,7 +40,7 @@ export class InteractiveOptions extends Persistent { | |||||||
|  |  | ||||||
|   public constructor ( |   public constructor ( | ||||||
|     options: Array<Option>, |     options: Array<Option>, | ||||||
|     source_config: SourceConfig = { args: true, env: true, interactive: true } |     source_config: SourceConfig = {} | ||||||
|   ) { |   ) { | ||||||
|     super (); |     super (); | ||||||
|     this.options = options |     this.options = options | ||||||
| @@ -60,11 +62,16 @@ export class InteractiveOptions extends Persistent { | |||||||
|       this.properties[option.name] = option.type_validation.persistent_type; |       this.properties[option.name] = option.type_validation.persistent_type; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (source_config.env) |     if ( | ||||||
|  |       typeof source_config.configs !== 'undefined' | ||||||
|  |       && Array.isArray (source_config.configs) | ||||||
|  |     ) | ||||||
|  |       this.sources.push (new ConfigSource (source_config.configs)); | ||||||
|  |     if (source_config.env !== false) | ||||||
|       this.sources.push (new EnvSource); |       this.sources.push (new EnvSource); | ||||||
|     if (source_config.args) |     if (source_config.args !== false) | ||||||
|       this.sources.push (new ArgSource); |       this.sources.push (new ArgSource); | ||||||
|     if (source_config.interactive) |     if (source_config.interactive !== false) | ||||||
|       this.sources.push (new InteractiveSource); |       this.sources.push (new InteractiveSource); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										43
									
								
								lib/Sources/ConfigSource.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								lib/Sources/ConfigSource.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) Sapphirecode - All Rights Reserved | ||||||
|  |  * This file is part of console-app which is released under MIT. | ||||||
|  |  * See file 'LICENSE' for full license details. | ||||||
|  |  * Created by Timo Hocker <timo@scode.ovh>, May 2020 | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* eslint-disable no-await-in-loop */ | ||||||
|  | import fs from 'fs-extra'; | ||||||
|  | import { OptionProcess } from '../Option'; | ||||||
|  | import { OptionSource } from './OptionSource'; | ||||||
|  |  | ||||||
|  | export class ConfigSource extends OptionSource { | ||||||
|  |   private _config_files: string[]; | ||||||
|  |  | ||||||
|  |   public constructor (config_files: string[]) { | ||||||
|  |     super (); | ||||||
|  |     this._config_files = config_files; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public async parse (options: OptionProcess[]): Promise<void> { | ||||||
|  |     const data: Record<string, unknown> = {}; | ||||||
|  |     for (const f of this._config_files) { | ||||||
|  |       if (await fs.pathExists (f)) { | ||||||
|  |         try { | ||||||
|  |           const json = JSON.parse (await fs.readFile (f, 'utf-8')); | ||||||
|  |           for (const key of Object.keys (json)) | ||||||
|  |             data[key] = json[key]; | ||||||
|  |         } | ||||||
|  |         catch { | ||||||
|  |           continue; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const keys = Object.keys (data); | ||||||
|  |  | ||||||
|  |     await Promise.all (options.map (async (opt) => { | ||||||
|  |       if (keys.includes (opt.name)) | ||||||
|  |         await this.assign_arg (opt, data[opt.name]); | ||||||
|  |     })); | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user