mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-11-29 07:09:48 +03:00
47c6509bea
no refs Adds a new `yarn start:dev` command to start portal in development mode that allows development script to be used directly on Ghost site without needing a build for each change. Allows faster development on Portal locally.
149 lines
3.8 KiB
JavaScript
149 lines
3.8 KiB
JavaScript
const handler = require('serve-handler');
|
|
const http = require('http');
|
|
const chalk = require('chalk');
|
|
const {spawn} = require('child_process');
|
|
const minimist = require('minimist');
|
|
|
|
/* eslint-disable no-console */
|
|
const log = console.log;
|
|
/* eslint-enable no-console */
|
|
|
|
let yarnStartProcess;
|
|
let stdOutChunks = [];
|
|
let stdErrChunks = [];
|
|
let startYarnOutput = false;
|
|
|
|
const {v, verbose, port = 5000} = minimist(process.argv.slice(2));
|
|
const showVerbose = !!(v || verbose);
|
|
|
|
function clearConsole({withHistory = true} = {}) {
|
|
if (!withHistory) {
|
|
process.stdout.write('\x1Bc');
|
|
return;
|
|
}
|
|
process.stdout.write(
|
|
process.platform === 'win32' ? '\x1B[2J\x1B[0f' : '\x1B[2J\x1B[3J\x1B[H'
|
|
);
|
|
}
|
|
|
|
function printConfigInstruction() {
|
|
const data = {
|
|
portal: {
|
|
url: `http://localhost:${port}/portal`
|
|
}
|
|
};
|
|
const stringifedData = JSON.stringify(data, null, 2);
|
|
const splitData = stringifedData.split('\n');
|
|
log();
|
|
splitData.forEach((data, idx, arr) => {
|
|
if (idx === 0 || idx === arr.length - 1) {
|
|
log(chalk.grey(data));
|
|
} else {
|
|
log(chalk.bold.whiteBright(data));
|
|
}
|
|
});
|
|
log();
|
|
}
|
|
|
|
function printInstructions() {
|
|
log();
|
|
log(chalk.yellowBright.underline(`Add portal to your local Ghost config`));
|
|
printConfigInstruction();
|
|
log(chalk.cyanBright('='.repeat(50)));
|
|
log();
|
|
}
|
|
|
|
function onProcessClose(code) {
|
|
yarnStartProcess = null;
|
|
stdErrChunks = [];
|
|
stdOutChunks = [];
|
|
log(chalk.redBright.bold.underline(`Please restart the script...\n`));
|
|
}
|
|
|
|
function getBuildOptions() {
|
|
process.env.FORCE_COLOR = 'true';
|
|
const options = {
|
|
shell: true,
|
|
env: process.env
|
|
};
|
|
if (showVerbose) {
|
|
options.stdio = 'inherit';
|
|
}
|
|
return options;
|
|
}
|
|
|
|
function doYarnStart() {
|
|
if (yarnStartProcess) {
|
|
return;
|
|
}
|
|
const options = getBuildOptions();
|
|
yarnStartProcess = spawn('BROWSER=none yarn start', options);
|
|
|
|
['SIGINT', 'SIGTERM'].forEach(function (sig) {
|
|
yarnStartProcess.on(sig, function () {
|
|
yarnStartProcess && yarnStartProcess.exit();
|
|
});
|
|
});
|
|
|
|
yarnStartProcess.on('close', onProcessClose);
|
|
|
|
if (!showVerbose) {
|
|
yarnStartProcess.stdout.on('data', (data) => {
|
|
stdOutChunks.push(data);
|
|
printYarnProcessOutput(data);
|
|
});
|
|
yarnStartProcess.stderr.on('data', (data) => {
|
|
log(Buffer.from(data).toString());
|
|
stdErrChunks.push(data);
|
|
});
|
|
}
|
|
}
|
|
|
|
function printYarnProcessOutput(data) {
|
|
const dataStr = Buffer.from(data).toString();
|
|
const dataArr = dataStr.split('\n').filter((d) => {
|
|
return /\S/.test(d.trim());
|
|
});
|
|
if (dataArr.find(d => d.includes('Starting the development'))) {
|
|
startYarnOutput = true;
|
|
log(chalk.yellowBright('Starting the development server...\n'));
|
|
return;
|
|
}
|
|
dataArr.forEach((dataOut) => {
|
|
if (startYarnOutput) {
|
|
log(dataOut);
|
|
}
|
|
});
|
|
if (startYarnOutput) {
|
|
log();
|
|
}
|
|
}
|
|
|
|
function startDevServer() {
|
|
const server = http.createServer((request, response) => {
|
|
return handler(request, response, {
|
|
rewrites: [
|
|
{source: '/portal', destination: 'scripts/load-portal.js'}
|
|
],
|
|
headers: [
|
|
{
|
|
source: '**',
|
|
headers: [{
|
|
key: 'Cache-Control',
|
|
value: 'no-cache'
|
|
}]
|
|
}
|
|
]
|
|
});
|
|
});
|
|
|
|
server.listen(port, () => {
|
|
log(chalk.whiteBright(`Portal dev server is running on http://localhost:${port}`));
|
|
printInstructions();
|
|
doYarnStart();
|
|
});
|
|
}
|
|
|
|
clearConsole({withHistory: false});
|
|
startDevServer();
|