Skip to content

Commit

Permalink
Add support for default value
Browse files Browse the repository at this point in the history
  • Loading branch information
SBoudrias committed Oct 1, 2018
1 parent ef26dca commit f5a982d
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 13 deletions.
12 changes: 10 additions & 2 deletions packages/core/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class StateManager {
}

this.setState({ value: this.rl.line, error: null });
onKeypress(value, key, this.getState(), this.setState);
onKeypress(this.rl.line, key, this.getState(), this.setState);
}

startLoading() {
Expand All @@ -95,7 +95,15 @@ class StateManager {
}

async onSubmit() {
const { validate, filter, value } = this.getState();
const state = this.getState();
const { validate, filter, default: defaultValue } = state;

// If no answer was provided, use default value.
let { value } = state;
if (!value) {
value = defaultValue;
}

const showLoader = setTimeout(this.startLoading, 500);
this.rl.pause();
try {
Expand Down
2 changes: 1 addition & 1 deletion packages/core/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ describe('createPrompt()', () => {
rl.input.emit('keypress', 'a value', { name: 'foo' });
expect(onKeypress).toHaveBeenCalledTimes(1);
expect(onKeypress).toHaveBeenLastCalledWith(
'a value',
'new value',
{ name: 'foo' },
expect.objectContaining({
message: 'Question',
Expand Down
6 changes: 6 additions & 0 deletions packages/input/__snapshots__/test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,9 @@
exports[`Input prompt renders in done state 1`] = `"? Question: answer"`;

exports[`Input prompt renders in idle state 1`] = `"? Question: answer"`;

exports[`Input prompt supports defaults 1`] = `"? Question: (foo) "`;

exports[`Input prompt supports defaults 2`] = `"? Question: "`;

exports[`Input prompt supports defaults 3`] = `"? Question: bar"`;
12 changes: 9 additions & 3 deletions packages/input/demo.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const isHex = value =>
},
validate: value => isHex(value) || 'Pass a valid hex value'
});
console.log('Answer: ', answer);
console.log('Answer:', answer);

answer = await input({
message: '(Slow validation) provide a number:',
Expand All @@ -33,13 +33,19 @@ const isHex = value =>
);
})
});
console.log('Answer: ', answer);
console.log('Answer:', answer);

answer = await input({
message: () =>
new Promise(resolve => {
setTimeout(() => resolve('(Slow message) Input any value:'), 3000);
})
});
console.log('Answer: ', answer);
console.log('Answer:', answer);

answer = await input({
message: "What's your favorite food?",
default: 'Croissant'
});
console.log('Answer:', answer);
})();
34 changes: 27 additions & 7 deletions packages/input/index.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,31 @@
const { createPrompt } = require('@inquirer/core');
const chalk = require('chalk');

module.exports = createPrompt({}, state => {
const { prefix, message, value, status } = state;
let formattedValue = value;
if (status === 'done') {
formattedValue = chalk.cyan(value);
module.exports = createPrompt(
{
canRemoveDefault: true,
onKeypress: (value, key, { canRemoveDefault }, setState) => {
const newState = { canRemoveDefault: !value };

// Allow user to remove the default value by pressing backspace
if (canRemoveDefault && key.name === 'backspace') {
newState.default = undefined;
}
setState(newState);
}
},
state => {
const { prefix, message, value = '', status } = state;
let formattedValue = value;
if (status === 'done') {
formattedValue = chalk.cyan(value);
}

let defaultValue = '';
if (state.default && status !== 'done' && !value) {
defaultValue = chalk.dim(` (${state.default})`);
}

return `${prefix} ${message}${defaultValue} ${formattedValue}`;
}
return `${prefix} ${message} ${formattedValue}`;
});
);
54 changes: 54 additions & 0 deletions packages/input/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,58 @@ describe('Input prompt', () => {
});
expect(output).toMatchSnapshot();
});

it('supports defaults', () => {
const withDefault = Input.render({
prefix: '?',
message: 'Question:',
default: 'foo',
status: 'idle'
});
expect(withDefault).toMatchSnapshot();
expect(withDefault).toContain('foo');

const whenDone = Input.render({
prefix: '?',
message: 'Question:',
default: 'foo',
status: 'done'
});
expect(whenDone).toMatchSnapshot();
expect(whenDone).not.toContain('foo');

const withAnswer = Input.render({
prefix: '?',
message: 'Question:',
default: 'foo',
value: 'bar',
status: 'done'
});
expect(withAnswer).toMatchSnapshot();
expect(withAnswer).toContain('bar');
expect(withAnswer).not.toContain('foo');
});

it('handles keypress', () => {
const setState = jest.fn();
const backspace = { name: 'backspace' };

// Allow removing the default value
Input.config.onKeypress('', backspace, { canRemoveDefault: true }, setState);
expect(setState).toHaveBeenLastCalledWith({
default: undefined,
canRemoveDefault: true
});

// Doesn't allow removing if there's a value
Input.config.onKeypress('a', backspace, { canRemoveDefault: true }, setState);
expect(setState).toHaveBeenLastCalledWith({
canRemoveDefault: false
});

Input.config.onKeypress('', backspace, { canRemoveDefault: false }, setState);
expect(setState).toHaveBeenLastCalledWith({
canRemoveDefault: true
});
});
});

0 comments on commit f5a982d

Please sign in to comment.