mikro-orm-interactive-generator
Version:
MikroORM + knexJS interactive migration generator
150 lines (128 loc) • 4.72 kB
text/typescript
import {FieldFactor} from "../builder/migration/factor/field.factor";
import * as inquirer from "inquirer";
import {DBEngineTypes} from "../type/db-engine.type";
export class CreateMigrationDefinitionQuestionFlow {
async execute(types: DBEngineTypes) : Promise<{tableName: string, fields: FieldFactor[]}> {
const fields : FieldFactor[] = []
const tableName = await inquirer.prompt([{
message: 'Table name',
type: 'input',
name: 'table_name'
}])
while (true) {
let autoincrement = null
const fieldType = await inquirer.prompt([{
message: 'Field type',
type: 'autocomplete',
name: 'field_type',
source: (answers : any, input : string) => {
if(!input || input === '') {
return types.types
}
const suggestedTypes = types.types.filter(type => {
return type.startsWith(input)
})
return [input, ...suggestedTypes]
}
}])
if(fieldType['field_type'].includes(types.autoincrementKey)) {
autoincrement = await inquirer.prompt([{
message: 'Is autoincrement?',
type: 'list',
name: 'is_autoincrement',
choices: [{
name: 'yes',
value: true,
key: 'Yes'
},{
name: 'no',
value: false,
key: 'No'
}]
}])
}
const fieldName = await inquirer.prompt([{
message: 'Field name',
type: 'input',
name: 'field_name'
}])
const defaultFieldValue = await inquirer.prompt([{
message: 'Default value for field',
type: 'input',
name: 'field_default_value'
}])
const isUnique = await inquirer.prompt([{
message: 'Is unique?',
type: 'list',
name: 'is_unique',
choices: [{
name: 'yes',
value: true,
key: 'Yes'
},{
name: 'no',
value: false,
key: 'No'
}]
}])
const isNotNullable = await inquirer.prompt([{
message: 'Is nullable?',
type: 'list',
name: 'is_nullable',
choices: [{
name: 'yes',
value: true,
key: 'Yes'
},{
name: 'no',
value: false,
key: 'No'
}]
}])
const isPrimaryKey = await inquirer.prompt([{
message: 'Is primary key?',
type: 'list',
name: 'is_primary_key',
choices: [{
name: 'yes',
value: true,
key: 'Yes'
},{
name: 'no',
value: false,
key: 'No'
}]
}])
fields.push({
defaultValue: defaultFieldValue ? defaultFieldValue[Object.keys(defaultFieldValue)[0]] : null,
type: fieldType[Object.keys(fieldType)[0]],
name: fieldName[Object.keys(fieldName)[0]],
primary: isPrimaryKey[Object.keys(isPrimaryKey)[0]],
isUnique: isUnique[Object.keys(isUnique)[0]],
autoincrement: autoincrement ? fieldType[Object.keys(autoincrement)[0]] : null,
isNotNullable: isNotNullable[Object.keys(isNotNullable)[0]],
})
const isActionFinished = await inquirer.prompt([{
message: 'Add another field?',
type: 'list',
name: 'is_action_finished',
choices: [{
name: 'yes',
value: true,
key: 'Yes'
},{
name: 'no',
value: false,
key: 'No'
}]
}])
if(!isActionFinished['is_action_finished']) {
break;
}
}
return {
tableName: tableName['table_name'],
fields: fields
}
}
}