230 lines
6.0 KiB
JavaScript
Raw Normal View History

2016-03-18 11:12:50 +01:00
'use strict';
/**
* Module dependencies
*/
// Node.js core.
const path = require('path');
const exec = require('child_process').exec;
const execSync = require('child_process').execSync;
2016-03-18 11:12:50 +01:00
// Public node modules.
const _ = require('lodash');
const fs = require('fs-extra');
2018-01-05 15:17:59 +01:00
const inquirer = require('inquirer');
2016-03-18 11:12:50 +01:00
2016-03-25 22:22:34 +01:00
// Logger.
const logger = require('strapi-utils').logger;
2016-03-18 11:12:50 +01:00
/**
* This `before` function is run before generating targets.
* Validate, configure defaults, get extra dependencies, etc.
*
* @param {Object} scope
* @param {Function} cb
*/
module.exports = (scope, cb) => {
2016-03-18 11:12:50 +01:00
// App info.
_.defaults(scope, {
2017-06-08 17:16:20 +01:00
name: scope.name === '.' || !scope.name ? scope.name : path.basename(process.cwd()),
2016-03-18 11:12:50 +01:00
author: process.env.USER || 'A Strapi developer',
email: process.env.EMAIL || '',
year: (new Date()).getFullYear(),
2016-03-25 22:22:34 +01:00
license: 'MIT'
2016-03-18 11:12:50 +01:00
});
// Make changes to the rootPath where the Strapi project will be created.
scope.rootPath = path.resolve(process.cwd(), scope.name || '');
// Ensure we aren't going to inadvertently delete any files.
try {
const files = fs.readdirSync(scope.rootPath);
if (files.length) {
2016-03-25 22:22:34 +01:00
return logger.error('`$ strapi new` can only be called in an empty directory.');
2016-03-18 11:12:50 +01:00
}
2016-03-25 22:22:34 +01:00
} catch (err) {
2016-03-18 11:12:50 +01:00
// ...
}
2018-01-05 15:17:59 +01:00
logger.info('Let\s configurate the connection to your database:');
2018-01-08 12:00:56 +01:00
const connectionValidation = () => {
let formSteps = new Promise(resolve => {
inquirer
.prompt([
{
type: 'list',
prefix: '',
name: 'client',
message: 'Choose your database:',
choices: [
{
name: 'MongoDB (highly recommended)',
value: {
database: 'mongo',
connector: 'strapi-mongoose'
}
},
{
name: 'Postgres',
value: {
database: 'postgres',
connector: 'strapi-bookshelf',
module: 'pg'
}
},
{
name: 'MySQL',
value: {
database: 'mysql',
connector: 'strapi-bookshelf',
module: 'mysql'
}
},
{
name: 'Sqlite3',
value: {
database: 'sqlite3',
connector: 'strapi-bookshelf',
module: 'sqlite3'
}
},
{
name: 'Redis',
value: {
database: 'redis',
connector: 'strapi-redis'
}
}
2018-01-08 12:00:56 +01:00
]
}
])
.then(answers => {
scope.client = answers.client;
scope.database = {
connector: answers.client.connector,
settings: {
client: answers.client.database
},
2018-01-08 12:00:56 +01:00
options: {}
};
resolve();
});
});
2018-01-08 12:00:56 +01:00
formSteps = formSteps.then(() => {
const asyncFn = [
new Promise(resolve => {
inquirer
.prompt([
{
type: 'input',
prefix: '',
name: 'name',
message: 'Database name:',
default: 'strapi'
},
{
type: 'input',
prefix: '',
name: 'host',
message: 'Host:',
default: 'localhost'
},
{
type: 'input',
prefix: '',
name: 'port',
message: 'Port:',
default: (answers) => {
const ports = {
mongo: 27017,
postgres: 5432,
mysql: 3306,
sqlite3: 1433,
redis: 6379
};
return ports[scope.client.database];
}
},
{
type: 'input',
prefix: '',
name: 'username',
message: 'Username:'
},
{
type: 'input',
prefix: '',
name: 'password',
message: 'Password:'
}
2018-01-08 12:00:56 +01:00
])
.then(answers => {
scope.database.host = answers.host;
scope.database.port = answers.port;
scope.database.database = answers.name;
scope.database.username = answers.username;
scope.database.password = answers.password;
resolve();
});
}),
new Promise(resolve => {
let cmd = `npm install --prefix ${scope.rootPath}_ ${scope.client.connector}@alpha`;
if (scope.client.module) {
2018-01-08 12:00:56 +01:00
cmd += ` ${scope.client.module}`;
}
2018-01-08 12:00:56 +01:00
exec(cmd, () => {
if (scope.client.module) {
const lock = require(`${scope.rootPath}_/node_modules/${scope.client.module}/package.json`);
scope.client.version = lock.version;
}
2018-01-08 12:00:56 +01:00
resolve();
});
})
];
Promise.all(asyncFn)
.then(() => {
if (scope.client.connector === 'strapi-bookshelf') {
const knex = require(`${scope.rootPath}_/node_modules/knex`)({
client: scope.client.module,
connection: scope.database
});
knex.raw('select 1+1 as result').then(() => {
console.log('Database connection is a success!');
knex.destroy();
execSync(`rm -r ${scope.rootPath}_`);
logger.info('Copying the dashboard...');
// Trigger callback with no error to proceed.
cb.success();
})
.catch(() => {
console.log('Database connection failed!');
connectionValidation();
});
} else {
execSync(`rm -r ${scope.rootPath}_`);
logger.info('Copying the dashboard...');
// Trigger callback with no error to proceed.
cb.success();
}
});
});
2018-01-08 12:00:56 +01:00
};
connectionValidation();
2016-03-18 11:12:50 +01:00
};