forked from TryGhost/Ghost
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup.js
More file actions
138 lines (121 loc) · 4.88 KB
/
setup.js
File metadata and controls
138 lines (121 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
const {spawn} = require('child_process');
const fs = require('fs').promises;
const path = require('path');
const chalk = require('chalk');
const inquirer = require('inquirer');
/**
* Run a command and stream output to the console
*
* @param {string} command
* @param {string[]} args
* @param {object} options
*/
async function runAndStream(command, args, options) {
return new Promise((resolve, reject) => {
const child = spawn(command, args, {
stdio: 'inherit',
...options
});
child.on('close', (code) => {
if (code === 0) {
resolve(code);
} else {
reject(new Error(`'${command} ${args.join(' ')}' exited with code ${code}`));
}
});
});
}
(async () => {
if (process.env.NODE_ENV !== 'development') {
console.log(chalk.yellow(`NODE_ENV is not development, skipping setup`));
return;
}
const coreFolder = path.join(__dirname, '../../ghost/core');
const rootFolder = path.join(__dirname, '../..');
const config = require('../../ghost/core/core/shared/config/loader').loadNconf({
customConfigPath: coreFolder
});
const dbClient = config.get('database:client');
const isUsingDocker = config.get('database:docker');
// Only reset data if we are using Docker
let resetData = false;
if (!dbClient.includes('mysql')) {
let mysqlSetup = false;
console.log(chalk.blue(`Attempting to setup MySQL via Docker`));
try {
await runAndStream('yarn', ['docker:reset'], {cwd: path.join(__dirname, '../../')});
mysqlSetup = true;
} catch (err) {
console.error(chalk.red('Failed to run MySQL Docker container'), err);
console.error(chalk.red('Hint: is Docker installed and running?'));
}
if (mysqlSetup) {
resetData = true;
console.log(chalk.blue(`Adding MySQL credentials to config.local.json`));
const currentConfigPath = path.join(coreFolder, 'config.local.json');
let currentConfig;
try {
currentConfig = require(currentConfigPath);
} catch (err) {
currentConfig = {};
}
currentConfig.database = {
client: 'mysql',
docker: true,
connection: {
host: '127.0.0.1',
user: 'root',
password: 'root',
database: 'ghost'
}
};
try {
await fs.writeFile(currentConfigPath, JSON.stringify(currentConfig, null, 4));
} catch (err) {
console.error(chalk.red('Failed to write config.local.json'), err);
console.log(chalk.yellow(`Please add the following to config.local.json:\n`), JSON.stringify(currentConfig, null, 4));
process.exit(1);
}
}
} else {
if (isUsingDocker) {
const yesAll = process.argv.includes('-y');
const noAll = process.argv.includes('-n');
const {confirmed} =
yesAll ? {confirmed: true}
: (
noAll ? {confirmed: false}
: await inquirer.prompt({name: 'confirmed', type:'confirm', message: 'MySQL is running via Docker, do you want to reset the Docker container? This will delete all existing data.', default: false})
);
if (confirmed) {
console.log(chalk.yellow(`Resetting Docker container`));
try {
await runAndStream('yarn', ['docker:reset'], {cwd: path.join(__dirname, '../../')});
resetData = true;
} catch (err) {
console.error(chalk.red('Failed to run MySQL Docker container'), err);
console.error(chalk.red('Hint: is Docker installed and running?'));
}
}
} else {
console.log(chalk.green(`MySQL already configured locally. Stop your local database and delete your "database" configuration in config.local.json to switch to Docker.`));
}
}
console.log(chalk.blue(`Running knex-migrator init`));
await runAndStream('yarn', ['knex-migrator', 'init'], {cwd: coreFolder});
if (process.argv.includes('--no-seed')) {
console.log(chalk.yellow(`Skipping seed data`));
console.log(chalk.yellow(`Done`));
return;
}
if (resetData) {
const xxl = process.argv.includes('--xxl');
if (xxl) {
console.log(chalk.blue(`Resetting all data (with xxl)`));
await runAndStream('yarn', ['reset:data:xxl'], {cwd: rootFolder});
} else {
console.log(chalk.blue(`Resetting all data`));
await runAndStream('yarn', ['reset:data'], {cwd: rootFolder});
}
}
})();