I am creating a Yeoman Generator to automate creation of few database tables. I need to provide users with a prompt to add multiple columns (combination of ColumnName and DataType below).
I have a template saved in my disk where I bind the dynamic names from the user inputs and based upon this template, the final script is generated by the Yeoman Generator. Can you suggest how to prompt user to enter repetitive combinations of ColumnName/DataType he wants to enter?
var prompts = [{
type: 'input',
name: 'name',
message: 'The Table Name?'
}, {
type: 'input',
name: 'attributeName',
message: 'Define your Schema - ColumnName?',
default: 'ID'
},{
type: 'input',
name: 'attributeType',
message: 'Define your Schema - DataType?',
default: 'S'
}
];
return this.prompt(prompts).then(function (props) {
this.props = props;
}.bind(this));
Template content -- User can enter details of 1/2/3/4 or more columns and once he does that the template below should be intelligent enough to create that many column key combinations.
{
"Type" : "AWS::Table",
"Properties" : {
"AttributeDefinitions" :
{
"AttributeName" : "<%= attributeName %>",
"AttributeType" : "<%= attributeType %>"
},
{
"AttributeName" : "<%= attributeName %>",
"AttributeType" : "<%= attributeType %>"
},
"TableName" : <%= name %>,
}
}
You can add a recursive function inside the
prompting()
hook. It has to be made sure that the recursive function returnsthis.prompts
else the execution might stop.My strategy works like below
Declare a recursive function that repeats based on one of the input
Populate the props as you recurse through in
this.columns
Pass this instance variable to the template in
writing()
hookIterate over the
this.columns
in the template and populate your columnsFirst entry in
this.columns
will have the table name and the first column detailsCheck the code below, you can tweak this to your needs as long as the recursive function is invoked as expected.
There is an extra prompt that asks whether to repeat or not. It can also be discarded with some logic but that is up to you.
prompting()
And then in the
writing()
hook pass thecolumns
instance variable that you populated earlier.writing()
TEMPLATE
SAMPLE INPUT
OUTPUT