exit on interrupt
This commit is contained in:
		| @@ -19,7 +19,7 @@ const { InteractiveOptions } = require ('./dist/lib/index.js'); | ||||
|     { name: 'num', type: 'number', env: 'TEST_NUM' }, | ||||
|     { name: 'arr', type: 'array', env: 'TEST_ARR' }, | ||||
|     { name: 'fld', type: 'folder', env: 'TEST_FOLDER' } | ||||
|   ]); | ||||
|   ], { exit_on_interrupt: true }); | ||||
|   await reader.parse (); | ||||
|   console.log (reader.serialize (true)); | ||||
| }) (); | ||||
|   | ||||
							
								
								
									
										2
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							| @@ -5,7 +5,7 @@ pipeline { | ||||
|       VERSION = VersionNumber([ | ||||
|           versionNumberString: | ||||
|               '${BUILDS_ALL_TIME}', | ||||
|           versionPrefix: '1.3.', | ||||
|           versionPrefix: '1.4.', | ||||
|           worstResultForIncrement: 'SUCCESS' | ||||
|       ]) | ||||
|   } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| # @sapphirecode/console-app | ||||
|  | ||||
| version: 1.3.x | ||||
| version: 1.4.x | ||||
|  | ||||
| read parameters from env, console args or interactively | ||||
|  | ||||
| @@ -56,12 +56,15 @@ the console reader automatically adds the options --help (-h) and --quiet (-q) | ||||
| the reader can also be constructed with additional options that specify which | ||||
| sources should be used. It reads from all, except config files by default | ||||
|  | ||||
| the option exit_on_interrupt determines whether an error should be thrown or the process should exit when the user presses control + c in an interactive prompt. | ||||
|  | ||||
| ```js | ||||
| const reader = new InteractiveOptions([], { | ||||
|   args: true, | ||||
|   env: true, | ||||
|   interactive: true, | ||||
|   configs: ['json files to search for options'] | ||||
|   configs: ['json files to search for options'], | ||||
|   exit_on_interrupt: true | ||||
| }); | ||||
| ``` | ||||
|  | ||||
|   | ||||
| @@ -31,6 +31,7 @@ interface SourceConfig { | ||||
|   args?: boolean; | ||||
|   interactive?: boolean; | ||||
|   configs?: string[]; | ||||
|   exit_on_interrupt?: boolean; | ||||
| } | ||||
|  | ||||
| export class InteractiveOptions extends Persistent { | ||||
| @@ -62,6 +63,11 @@ export class InteractiveOptions extends Persistent { | ||||
|       this.properties[option.name] = option.type_validation.persistent_type; | ||||
|     } | ||||
|  | ||||
|     const exit_on_interrupt | ||||
|       = typeof source_config.exit_on_interrupt === 'boolean' | ||||
|         ? source_config.exit_on_interrupt | ||||
|         : false; | ||||
|  | ||||
|     if ( | ||||
|       typeof source_config.configs !== 'undefined' | ||||
|       && Array.isArray (source_config.configs) | ||||
| @@ -72,7 +78,7 @@ export class InteractiveOptions extends Persistent { | ||||
|     if (source_config.args !== false) | ||||
|       this.sources.push (new ArgSource); | ||||
|     if (source_config.interactive !== false) | ||||
|       this.sources.push (new InteractiveSource); | ||||
|       this.sources.push (new InteractiveSource (exit_on_interrupt)); | ||||
|   } | ||||
|  | ||||
|   public async parse (): Promise<Record<string, unknown>> { | ||||
|   | ||||
| @@ -12,6 +12,13 @@ import { OptionProcess, Option } from '../Option'; | ||||
| import { OptionSource } from './OptionSource'; | ||||
|  | ||||
| export class InteractiveSource extends OptionSource { | ||||
|   private _exit_on_interrupt: boolean; | ||||
|  | ||||
|   public constructor (exit_on_interrupt: boolean) { | ||||
|     super (); | ||||
|     this._exit_on_interrupt = exit_on_interrupt; | ||||
|   } | ||||
|  | ||||
|   private get_message (opt: Option): string { | ||||
|     return typeof opt.message === 'undefined' | ||||
|       ? `input ${opt.name}` | ||||
| @@ -72,7 +79,12 @@ export class InteractiveSource extends OptionSource { | ||||
|     for (const opt of options) { | ||||
|       while (!opt.filled) { | ||||
|         // eslint-disable-next-line no-await-in-loop | ||||
|         await this.prompt (opt); | ||||
|         await this.prompt (opt) | ||||
|           .catch ((e) => { | ||||
|             if (this._exit_on_interrupt) | ||||
|               process.exit (0); | ||||
|             throw e; | ||||
|           }); | ||||
|         if (!opt.filled) | ||||
|           console.log ('input was invalid'); | ||||
|       } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user