UNPKG

@modyo/cli

Version:

Modyo Command Line Interface

109 lines (101 loc) 3.15 kB
const HtmlWebpackPlugin = require('html-webpack-plugin') const HtmlWebpackRootPlugin = require('html-webpack-root-plugin') const VueLoaderPlugin = require('vue-loader/lib/plugin') const Webpack = require('webpack') const path = require('path') const chalk = require('chalk') const WebpackDevServer = require('webpack-dev-server') const openBrowser = require('react-dev-utils/openBrowser') const WebpackMerge = require('webpack-merge') const { choosePort, createCompiler, prepareUrls } = require('react-dev-utils/WebpackDevServerUtils') const baseWebpackConfig = require('./config/webpack.standalone.config') const { getModyoProjectConfiguration, getModyoSiteConfiguration, getAuthToken, webpackProjectSetup } = require('../../helpers/') const PROTOCOL = process.env.protocol || 'http' const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 4200 const HOST = process.env.HOST || '0.0.0.0' /* * TODO: div element is created in head */ /* * Generate a unique webpack config with entry points relatives to the widget path */ const createWebpackConfig = ((widget, opts) => WebpackMerge( { entry: [ path.resolve(widget.entrypoint), `webpack-dev-server/client?http://${HOST}:${DEFAULT_PORT}` ] }, { plugins: [ new VueLoaderPlugin(), new HtmlWebpackPlugin({ template: path.resolve(__dirname, 'templates', 'index.ejs'), title: `${widget.name} - Modyo CLI`, ...opts }), new HtmlWebpackRootPlugin(widget.key), new Webpack.HotModuleReplacementPlugin() ] }, baseWebpackConfig, webpackProjectSetup() )) const createWebpackDevServerConfig = () => ({ disableHostCheck: true, quiet: true, https: false, host: HOST, inline: true, historyApiFallback: { disableDotRule: true } }) const buildAppUrl = (port) => `${PROTOCOL}://${HOST}:${port}` const runServer = (widgetObj, opts, logger) => { const webpackConfig = createWebpackConfig(widgetObj, opts) const devServerConfig = createWebpackDevServerConfig() choosePort(HOST, DEFAULT_PORT).then((PORT) => { const urls = prepareUrls('http', HOST, PORT) const compiler = createCompiler( { webpack: Webpack, config: webpackConfig, appName: widgetObj.name, urls, useYarn: true } ) const devServer = new WebpackDevServer(compiler, devServerConfig) devServer.listen(PORT, HOST, (err) => { if (err) { logger.info(err) process.exit(1) } logger.info(chalk.cyan(`Starting the development server on ${buildAppUrl(PORT)}...\n`)) openBrowser(buildAppUrl(PORT)) }) }) } /* * Start Widget */ module.exports = ((argWidget, logger) => { const conf = getModyoProjectConfiguration(logger) logger.info(`Starting the Modyo-cli service ${chalk.red(conf.widget.name)} on standalone mode`) const { widget } = conf return getAuthToken(conf) .then((token) => getModyoSiteConfiguration(conf, token) .then((site) => { const opts = { public_css: site.public_css, public_js: site.public_js } runServer(widget, opts, logger) })) })