diff --git a/packages/io-utils/README.md b/packages/io-utils/README.md index 11a8fdc68..e1cbe1c75 100644 --- a/packages/io-utils/README.md +++ b/packages/io-utils/README.md @@ -45,3 +45,19 @@ Returns `true` if specified filesystem `path` points to a file, `false` otherwis #### isReadable(path) Returns `true` if specified filesystem `path` can be read by the current user, `false` otherwise. Does not throw if `path` does not exist on the filesystem, instead returns `false` + +### Standdard input/output utilities + +#### promptToContinue([message, defaultValue]) + +Asks the user whether they want to continue and reads the input from the CLI standard input. By default the question displayed is `Do you want to continue?` and the default response is `yes` + +```typescript +const goahead = await promptToContinue(); + +// To ask a different question +const goahead = await promptToContinue("Are you sure?"); + +// To default the response to false, good for important and unsafe decisions +const goahead = await promptToContinue("Are you sure?", false); +``` diff --git a/packages/io-utils/package.json b/packages/io-utils/package.json index 6423fb388..cb2598d77 100644 --- a/packages/io-utils/package.json +++ b/packages/io-utils/package.json @@ -33,6 +33,7 @@ "@types/jest": "^29.5.10", "fast-check": "^3.14.0", "jest": "^29.7.0", + "prompts": "^2.4.2", "ts-jest": "^29.1.1", "ts-node": "^10.9.1", "tslib": "~2.6.2", diff --git a/packages/io-utils/src/index.ts b/packages/io-utils/src/index.ts index b0899e4ef..0f39ca5b6 100644 --- a/packages/io-utils/src/index.ts +++ b/packages/io-utils/src/index.ts @@ -1 +1,2 @@ export * from './filesystem' +export * from './stdio' diff --git a/packages/io-utils/src/stdio/index.ts b/packages/io-utils/src/stdio/index.ts new file mode 100644 index 000000000..ba85b76eb --- /dev/null +++ b/packages/io-utils/src/stdio/index.ts @@ -0,0 +1 @@ +export * from './prompts' diff --git a/packages/io-utils/src/stdio/prompts.ts b/packages/io-utils/src/stdio/prompts.ts new file mode 100644 index 000000000..3e323a896 --- /dev/null +++ b/packages/io-utils/src/stdio/prompts.ts @@ -0,0 +1,18 @@ +import assert from 'assert' +import prompts from 'prompts' + +export const promptToContinue = async ( + message: string = 'Do you want to continue?', + defaultValue = true +): Promise => { + const { value } = await prompts({ + type: 'confirm', + name: 'value', + message, + initial: defaultValue, + }) + + assert(typeof value === 'boolean', `Invariant error: Expected a boolean response, got ${value}`) + + return value +}