diff --git a/.changeset/password-empty-submit.md b/.changeset/password-empty-submit.md new file mode 100644 index 00000000..967e323d --- /dev/null +++ b/.changeset/password-empty-submit.md @@ -0,0 +1,5 @@ +--- +"@clack/core": patch +--- + +Fix `password` prompt resolving to `undefined` on empty submit. It now normalizes an empty submission to `""`, matching the `text` prompt behavior and the documented `Promise` return type. diff --git a/packages/core/src/prompts/password.ts b/packages/core/src/prompts/password.ts index 949239d1..738d973b 100644 --- a/packages/core/src/prompts/password.ts +++ b/packages/core/src/prompts/password.ts @@ -34,5 +34,10 @@ export default class PasswordPrompt extends Prompt { this.on('userInput', (input) => { this._setValue(input); }); + this.on('finalize', () => { + if (this.value === undefined) { + this.value = ''; + } + }); } } diff --git a/packages/core/test/prompts/password.test.ts b/packages/core/test/prompts/password.test.ts index 3b37e9d3..1142ca9c 100644 --- a/packages/core/test/prompts/password.test.ts +++ b/packages/core/test/prompts/password.test.ts @@ -29,6 +29,18 @@ describe('PasswordPrompt', () => { expect(output.buffer).to.deep.equal([cursor.hide, 'foo']); }); + test('returns empty string on empty submit', async () => { + const instance = new PasswordPrompt({ + input, + output, + render: () => 'foo', + }); + const resultPromise = instance.prompt(); + input.emit('keypress', '', { name: 'return' }); + const result = await resultPromise; + expect(result).to.equal(''); + }); + describe('cursor', () => { test('can get cursor', () => { const instance = new PasswordPrompt({