pesho hristov
pesho hristov

Reputation: 2060

Npm prompt - custom validation and multiline message?

I'm working on a CLI program, based on nodejs and the npm package "prompt". Let say I want to have this prompt, putting the input in a variable pet:

Choose a pet:
(1) - Cat
(2) - Dog
(3) - Fish
(4) - Rabbit
(5) - Rat
: > 

Basically I did the functionality, but I'm having the following problems:

  1. If I use the conform function for custom validation - then my custom message - the multiline text - never appears. The name of the variable - pet - only appears. But I want to have validation, cause I want to make sure the user won't enter 333 for example.

  2. If I remove the conform custom validation - I can have multiline text, but then something else happens: the blinking rectangle, where the entering happens, overlaps with the multiline text. And I can't make it blink after the last line of the multiline message.

(In the above example the blinking happens over the digit 5.)

Any idea how to resolve the two issues I have ? ... :)

================== EDIT: Added code samples ===================

This is how I generate the multiline text:

// generate the multiline text .. 
var petsMessage = 'Choose a pet: \n';
var pets = [...];
for(var i = 0, l = pets.length; i < l; i++) {
    petsMessage += ' (' + (i+1) + ') - ' + pets[i] + "\n";
}

This is how I generate the prompt with multiline text, but no validation:

// define the prompt stuff .. 
var promptInfo = {
    properties: {
        Pet: {
            message: petsMessage,
            required: true
        },
    }
};

And this is with validation, but multiline message not working:

// define the prompt stuff .. 
var promptInfo = [
    {
        name: 'Pet',
        message: petsMessage,
        required: true,
        conform: function(value) {

            value = parseInt(value);

            if(value > 0 && value < pets.length) {
                return true;
            } else {
                return false;
            }
        }
    }
];

Upvotes: 0

Views: 608

Answers (2)

pesho hristov
pesho hristov

Reputation: 2060

Actually, the solution from "alex-rokabills" is not perfect too :( ... It's definitely better, but I still see issues.

If I use small amount of items then it's OK:

Maximum five items

But if the number grows a little bit:

Six or more items

And for big prompts:

Over 10 items

Also - can I get rid of the "prompt:" at the begining ? ...

Upvotes: 0

Alex Michailidis
Alex Michailidis

Reputation: 4143

I believe the problem was that in the second snippet with the validation you assign the actual question in the message property, you should assign it in the description. The message property refers to error message. Try this please:

var petsMessage = 'Choose a pet: \n';
var pets = ["dog","cat","frog"];
for(var i = 0, l = pets.length; i < l; i++) {
    petsMessage += '\t (' + (i+1) + ') - ' + pets[i] + "\n";
}
var prompt = require('prompt');
var promptInfo = [
    {
        name: 'Pet',
        description: petsMessage,
        required: true,
        message: 'Options allowed:: 1'+'-'+pets.length,
        conform: function(value) {

            value = parseInt(value);

            return value > 0 && value <= pets.length

        }
    }
];

prompt.start();

prompt.get(promptInfo, function (err, result) {
    console.log('you Choose',result,'::::',pets[result.Pet-1])
});

Upvotes: 2

Related Questions