config source

This commit is contained in:
Timo Hocker 2020-05-18 19:18:02 +02:00
parent 71d4858189
commit 3766958b20
4 changed files with 61 additions and 10 deletions

2
Jenkinsfile vendored
View File

@ -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'
]) ])
} }

View File

@ -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']
}); });
``` ```

View File

@ -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);
} }

View 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]);
}));
}
}