refactoring
This commit is contained in:
55
lib/Sources/ArgSource.ts
Normal file
55
lib/Sources/ArgSource.ts
Normal file
@ -0,0 +1,55 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-disable no-process-exit */
|
||||
import yargs, { Options } from 'yargs';
|
||||
import { OptionProcess } from '../Types';
|
||||
import { OptionSource } from './OptionSource';
|
||||
|
||||
export class ArgSource extends OptionSource {
|
||||
public async parse (options: OptionProcess[]): Promise<void> {
|
||||
const yargs_config: Record<string, Options> = {
|
||||
quiet: {
|
||||
alias: 'q',
|
||||
default: false,
|
||||
type: 'boolean',
|
||||
describe: 'do not ask for options interactively'
|
||||
},
|
||||
help: {
|
||||
alias: 'h',
|
||||
default: false,
|
||||
type: 'boolean',
|
||||
describe: ''
|
||||
}
|
||||
};
|
||||
for (const opt of options) {
|
||||
yargs_config[opt.name] = {
|
||||
alias: opt.alias,
|
||||
default: opt.default,
|
||||
type: opt.type_validation.string_type,
|
||||
describe: opt.description
|
||||
};
|
||||
}
|
||||
const argv = yargs.options (yargs_config)
|
||||
.parse ();
|
||||
if (argv.help) {
|
||||
yargs.options (yargs_config)
|
||||
.showHelp ();
|
||||
process.exit (0);
|
||||
}
|
||||
|
||||
await Promise.all (options.map ((opt) => {
|
||||
if (typeof argv[opt.name] !== 'undefined')
|
||||
return this.assign_arg (opt, argv[opt.name]);
|
||||
return Promise.resolve ();
|
||||
}));
|
||||
|
||||
if (argv.quiet) {
|
||||
const missing = options.filter ((o) => !o.filled && o.required)
|
||||
.map ((o) => o.name);
|
||||
if (missing.length > 0) {
|
||||
console.error ('missing arguments:');
|
||||
console.error (missing.join (', '));
|
||||
process.exit (0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
16
lib/Sources/EnvSource.ts
Normal file
16
lib/Sources/EnvSource.ts
Normal file
@ -0,0 +1,16 @@
|
||||
/* eslint-disable no-process-env */
|
||||
import { OptionProcess } from '../Types';
|
||||
import { OptionSource } from './OptionSource';
|
||||
|
||||
export class EnvSource extends OptionSource {
|
||||
public async parse (options: OptionProcess[]): Promise<void> {
|
||||
await Promise.all (options.map ((opt) => {
|
||||
if (
|
||||
typeof opt.env !== 'undefined'
|
||||
&& typeof process.env[opt.env] !== 'undefined'
|
||||
)
|
||||
return this.assign_arg (opt, process.env[opt.env]);
|
||||
return Promise.resolve ();
|
||||
}));
|
||||
}
|
||||
}
|
50
lib/Sources/InteractiveSource.ts
Normal file
50
lib/Sources/InteractiveSource.ts
Normal file
@ -0,0 +1,50 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-disable no-process-exit */
|
||||
import { Confirm, Input } from 'enquirer';
|
||||
import { OptionProcess } from '../Types';
|
||||
import { OptionSource } from './OptionSource';
|
||||
|
||||
export class InteractiveSource extends OptionSource {
|
||||
private async prompt (opt: OptionProcess): Promise<void> {
|
||||
if (opt.filled)
|
||||
return;
|
||||
if (
|
||||
opt.type === 'string'
|
||||
|| opt.type === 'file'
|
||||
|| opt.type === 'folder'
|
||||
|| opt.type === 'path'
|
||||
|| opt.type === 'number'
|
||||
) {
|
||||
const value = await new Input ({
|
||||
message: typeof opt.message === 'undefined'
|
||||
? `input ${opt.name}`
|
||||
: opt.message,
|
||||
default: opt.default
|
||||
})
|
||||
.run ();
|
||||
await this.assign_arg (opt, value);
|
||||
return;
|
||||
}
|
||||
if (
|
||||
opt.type === 'boolean'
|
||||
) {
|
||||
const value = await new Confirm ({
|
||||
message: opt.message,
|
||||
default: opt.default
|
||||
})
|
||||
.run ();
|
||||
await this.assign_arg (opt, value);
|
||||
}
|
||||
}
|
||||
|
||||
public async parse (options: OptionProcess[]): Promise<void> {
|
||||
for (const opt of options) {
|
||||
while (!opt.filled) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await this.prompt (opt);
|
||||
if (!opt.filled)
|
||||
console.log ('input was invalid');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
18
lib/Sources/OptionSource.ts
Normal file
18
lib/Sources/OptionSource.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { OptionProcess } from '../Types';
|
||||
|
||||
export abstract class OptionSource {
|
||||
public abstract async parse(opt: OptionProcess[]): Promise<void>;
|
||||
|
||||
protected async assign_arg (
|
||||
opt: OptionProcess,
|
||||
value: unknown
|
||||
): Promise<void> {
|
||||
try {
|
||||
opt.value = await opt.type_validation.to_type (value);
|
||||
opt.filled = true;
|
||||
}
|
||||
catch (e) {
|
||||
// could not assing
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user