@bolt/build-tools
Version:
Curated collection of front-end build tools in the Bolt Design System.
125 lines (111 loc) • 3.19 kB
JavaScript
const browserSync = require('browser-sync');
const path = require('path');
const resolve = require('resolve');
const { handleRequest } = require('@bolt/api');
const events = require('@bolt/build-utils/events');
const { getConfig } = require('@bolt/build-utils/config-store');
const log = require('@bolt/build-utils/log');
const sh = require('@bolt/build-utils/sh');
const server = browserSync.create();
let config;
async function phpServer() {
config = config || (await getConfig());
return new Promise((resolve, reject) => {
console.log(
'Starting up local php render twig api server at port ',
config.renderingServicePort,
);
sh(
'php',
['-S', `127.0.0.1:${config.renderingServicePort}`, 'TwigRendererApi.php'],
true,
true,
true,
true,
)
.then(output => {
console.log('---');
console.log(output);
console.log('===');
})
.catch(error => {
console.log('---Error:');
console.log(error);
console.log('===End: Error');
reject(error);
});
});
}
async function getServerConfig() {
config = config || (await getConfig());
// https://www.browsersync.io/docs/options
const serverConfig = {
open: config.openServerAtStart ? config.openServerAtStart : false,
startPath: config.startPath, // Since `/` doesn't do anything and we want to avoid double browserSync notifications from the very beginning
port: config.port,
host: '127.0.0.1',
ghostMode: false,
baseDir: config.wwwDir,
logFileChanges: false,
logConnections: false,
notify: false, // Hide notifications till we come up with a less disruptive refresh UI
reloadOnRestart: true,
ui: false,
files: [config.wwwDir + '**/*.html'],
};
if (config.renderingService) {
serverConfig.middleware = [
{
route: '/api',
handle: handleRequest,
},
];
}
if (config.webpackDevServer) {
// proxy the Webpack Server endpoint + set header so Webpack knows if it should redirect or not.
serverConfig.proxy = {
target: `http://localhost:${config.proxyPort}/`,
proxyReq: [
function(proxyReq) {
proxyReq.setHeader(`${config.proxyHeader}`, 'true');
},
],
};
} else {
serverConfig.server = [config.wwwDir];
}
return serverConfig;
}
async function serve() {
config = config || (await getConfig());
const serverConfig = await getServerConfig();
// https://www.browsersync.io/docs/api#api-init
server.init(serverConfig, () => {
if (config.verbosity > 3) {
log.info(
'BrowserSync set up and ready to go... (this notice may be redundant)',
);
}
});
}
/**
* Reload BrowserSync
* @param {string[] | string} files - Files to reload. Optional.
* @link https://www.browsersync.io/docs/api#api-reload
*/
function reload(files) {
server.reload(files);
}
events.on('reload', async files => {
config = config || (await getConfig());
if (config.verbosity > 4) {
log.info('Event triggered: "reload"', files);
}
reload(files);
});
module.exports = {
getServerConfig,
serve,
reload,
phpServer,
};