summaryrefslogtreecommitdiff
path: root/electron/.electron-vue
diff options
context:
space:
mode:
Diffstat (limited to 'electron/.electron-vue')
-rw-r--r--electron/.electron-vue/build.js132
-rw-r--r--electron/.electron-vue/dev-client.js40
-rw-r--r--electron/.electron-vue/dev-runner.js192
-rw-r--r--electron/.electron-vue/webpack.main.config.js72
-rw-r--r--electron/.electron-vue/webpack.renderer.config.js173
-rw-r--r--electron/.electron-vue/webpack.web.config.js132
6 files changed, 741 insertions, 0 deletions
diff --git a/electron/.electron-vue/build.js b/electron/.electron-vue/build.js
new file mode 100644
index 00000000..2455fbcb
--- /dev/null
+++ b/electron/.electron-vue/build.js
@@ -0,0 +1,132 @@
+'use strict'
+
+process.env.NODE_ENV = 'production'
+
+const { say } = require('cfonts')
+const chalk = require('chalk')
+const del = require('del')
+const { spawn } = require('child_process')
+const webpack = require('webpack')
+const Multispinner = require('multispinner')
+
+
+const mainConfig = require('./webpack.main.config')
+const rendererConfig = require('./webpack.renderer.config')
+const webConfig = require('./webpack.web.config')
+
+const doneLog = chalk.bgGreen.white(' DONE ') + ' '
+const errorLog = chalk.bgRed.white(' ERROR ') + ' '
+const okayLog = chalk.bgBlue.white(' OKAY ') + ' '
+const isCI = process.env.CI || false
+
+if (process.env.BUILD_TARGET === 'clean') clean()
+else if (process.env.BUILD_TARGET === 'web') web()
+else build()
+
+function clean () {
+ del.sync(['build/*', '!build/icons', '!build/icons/icon.*'])
+ console.log(`\n${doneLog}\n`)
+ process.exit()
+}
+
+function build () {
+ greeting()
+
+ del.sync(['dist/electron/*', '!.gitkeep'])
+
+ const tasks = ['main', 'renderer']
+ const m = new Multispinner(tasks, {
+ preText: 'building',
+ postText: 'process'
+ })
+
+ let results = ''
+
+ m.on('success', () => {
+ process.stdout.write('\x1B[2J\x1B[0f')
+ console.log(`\n\n${results}`)
+ console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`)
+ process.exit()
+ })
+
+ pack(mainConfig).then(result => {
+ results += result + '\n\n'
+ m.success('main')
+ }).catch(err => {
+ m.error('main')
+ console.log(`\n ${errorLog}failed to build main process`)
+ console.error(`\n${err}\n`)
+ process.exit(1)
+ })
+
+ pack(rendererConfig).then(result => {
+ results += result + '\n\n'
+ m.success('renderer')
+ }).catch(err => {
+ m.error('renderer')
+ console.log(`\n ${errorLog}failed to build renderer process`)
+ console.error(`\n${err}\n`)
+ process.exit(1)
+ })
+}
+
+function pack (config) {
+ return new Promise((resolve, reject) => {
+ config.mode = 'production'
+ webpack(config, (err, stats) => {
+ if (err) reject(err.stack || err)
+ else if (stats.hasErrors()) {
+ let err = ''
+
+ stats.toString({
+ chunks: false,
+ colors: true
+ })
+ .split(/\r?\n/)
+ .forEach(line => {
+ err += ` ${line}\n`
+ })
+
+ reject(err)
+ } else {
+ resolve(stats.toString({
+ chunks: false,
+ colors: true
+ }))
+ }
+ })
+ })
+}
+
+function web () {
+ del.sync(['dist/web/*', '!.gitkeep'])
+ webConfig.mode = 'production'
+ webpack(webConfig, (err, stats) => {
+ if (err || stats.hasErrors()) console.log(err)
+
+ console.log(stats.toString({
+ chunks: false,
+ colors: true
+ }))
+
+ process.exit()
+ })
+}
+
+function greeting () {
+ const cols = process.stdout.columns
+ let text = ''
+
+ if (cols > 85) text = 'lets-build'
+ else if (cols > 60) text = 'lets-|build'
+ else text = false
+
+ if (text && !isCI) {
+ say(text, {
+ colors: ['yellow'],
+ font: 'simple3d',
+ space: false
+ })
+ } else console.log(chalk.yellow.bold('\n lets-build'))
+ console.log()
+} \ No newline at end of file
diff --git a/electron/.electron-vue/dev-client.js b/electron/.electron-vue/dev-client.js
new file mode 100644
index 00000000..2913ea4b
--- /dev/null
+++ b/electron/.electron-vue/dev-client.js
@@ -0,0 +1,40 @@
+const hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
+
+hotClient.subscribe(event => {
+ /**
+ * Reload browser when HTMLWebpackPlugin emits a new index.html
+ *
+ * Currently disabled until jantimon/html-webpack-plugin#680 is resolved.
+ * https://github.com/SimulatedGREG/electron-vue/issues/437
+ * https://github.com/jantimon/html-webpack-plugin/issues/680
+ */
+ // if (event.action === 'reload') {
+ // window.location.reload()
+ // }
+
+ /**
+ * Notify `mainWindow` when `main` process is compiling,
+ * giving notice for an expected reload of the `electron` process
+ */
+ if (event.action === 'compiling') {
+ document.body.innerHTML += `
+ <style>
+ #dev-client {
+ background: #4fc08d;
+ border-radius: 4px;
+ bottom: 20px;
+ box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
+ color: #fff;
+ font-family: 'Source Sans Pro', sans-serif;
+ left: 20px;
+ padding: 8px 12px;
+ position: absolute;
+ }
+ </style>
+
+ <div id="dev-client">
+ Compiling Main Process...
+ </div>
+ `
+ }
+})
diff --git a/electron/.electron-vue/dev-runner.js b/electron/.electron-vue/dev-runner.js
new file mode 100644
index 00000000..181df411
--- /dev/null
+++ b/electron/.electron-vue/dev-runner.js
@@ -0,0 +1,192 @@
+'use strict'
+
+const chalk = require('chalk')
+const electron = require('electron')
+const path = require('path')
+const { say } = require('cfonts')
+const { spawn } = require('child_process')
+const webpack = require('webpack')
+const WebpackDevServer = require('webpack-dev-server')
+const webpackHotMiddleware = require('webpack-hot-middleware')
+
+const mainConfig = require('./webpack.main.config')
+const rendererConfig = require('./webpack.renderer.config')
+
+let electronProcess = null
+let manualRestart = false
+let hotMiddleware
+
+function logStats (proc, data) {
+ let log = ''
+
+ log += chalk.yellow.bold(`┏ ${proc} Process ${new Array((19 - proc.length) + 1).join('-')}`)
+ log += '\n\n'
+
+ if (typeof data === 'object') {
+ data.toString({
+ colors: true,
+ chunks: false
+ }).split(/\r?\n/).forEach(line => {
+ log += ' ' + line + '\n'
+ })
+ } else {
+ log += ` ${data}\n`
+ }
+
+ log += '\n' + chalk.yellow.bold(`┗ ${new Array(28 + 1).join('-')}`) + '\n'
+
+ console.log(log)
+}
+
+function startRenderer () {
+ return new Promise((resolve, reject) => {
+ rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
+ rendererConfig.mode = 'development'
+ const compiler = webpack(rendererConfig)
+ hotMiddleware = webpackHotMiddleware(compiler, {
+ log: false,
+ heartbeat: 2500
+ })
+
+ compiler.hooks.compilation.tap('compilation', compilation => {
+ compilation.hooks.htmlWebpackPluginAfterEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
+ hotMiddleware.publish({ action: 'reload' })
+ cb()
+ })
+ })
+
+ compiler.hooks.done.tap('done', stats => {
+ logStats('Renderer', stats)
+ })
+
+ const server = new WebpackDevServer(
+ compiler,
+ {
+ contentBase: path.join(__dirname, '../'),
+ quiet: true,
+ before (app, ctx) {
+ app.use(hotMiddleware)
+ ctx.middleware.waitUntilValid(() => {
+ resolve()
+ })
+ }
+ }
+ )
+
+ server.listen(9080)
+ })
+}
+
+function startMain () {
+ return new Promise((resolve, reject) => {
+ mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main)
+ mainConfig.mode = 'development'
+ const compiler = webpack(mainConfig)
+
+ compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
+ logStats('Main', chalk.white.bold('compiling...'))
+ hotMiddleware.publish({ action: 'compiling' })
+ done()
+ })
+
+ compiler.watch({}, (err, stats) => {
+ if (err) {
+ console.log(err)
+ return
+ }
+
+ logStats('Main', stats)
+
+ if (electronProcess && electronProcess.kill) {
+ manualRestart = true
+ process.kill(electronProcess.pid)
+ electronProcess = null
+ startElectron()
+
+ setTimeout(() => {
+ manualRestart = false
+ }, 5000)
+ }
+
+ resolve()
+ })
+ })
+}
+
+function startElectron () {
+ process.argv.shift();
+ process.argv.shift();
+ var args = [
+ '--inspect=5858',
+ path.join(__dirname, '../dist/electron/main.js')
+ ].concat(process.argv)
+
+ // detect yarn or npm and process commandline args accordingly
+ if (process.env.npm_execpath.endsWith('yarn.js')) {
+ args = args.concat(process.argv.slice(3))
+ } else if (process.env.npm_execpath.endsWith('npm-cli.js')) {
+ args = args.concat(process.argv.slice(2))
+ }
+
+ electronProcess = spawn(electron, args)
+
+ electronProcess.stdout.on('data', data => {
+ electronLog(data, 'blue')
+ })
+ electronProcess.stderr.on('data', data => {
+ electronLog(data, 'red')
+ })
+
+ electronProcess.on('close', () => {
+ if (!manualRestart) process.exit()
+ })
+}
+
+function electronLog (data, color) {
+ let log = ''
+ data = data.toString().split(/\r?\n/)
+ data.forEach(line => {
+ log += ` ${line}\n`
+ })
+ if (/[0-9A-z]+/.test(log)) {
+ console.log(
+ chalk[color].bold('┏ Electron -------------------') +
+ '\n\n' +
+ log +
+ chalk[color].bold('┗ ----------------------------') +
+ '\n'
+ )
+ }
+}
+
+function greeting () {
+ const cols = process.stdout.columns
+ let text = ''
+
+ if (cols > 104) text = 'electron-vue'
+ else if (cols > 76) text = 'electron-|vue'
+ else text = false
+
+ if (text) {
+ say(text, {
+ colors: ['yellow'],
+ font: 'simple3d',
+ space: false
+ })
+ } else console.log(chalk.yellow.bold('\n electron-vue'))
+ console.log(chalk.blue(' getting ready...') + '\n')
+}
+
+function init () {
+ greeting()
+
+ Promise.all([startRenderer(), startMain()])
+ .then(() => {
+ startElectron()
+ })
+ .catch(err => {
+ console.error(err)
+ })
+}
+
+init()
diff --git a/electron/.electron-vue/webpack.main.config.js b/electron/.electron-vue/webpack.main.config.js
new file mode 100644
index 00000000..cfdbdf22
--- /dev/null
+++ b/electron/.electron-vue/webpack.main.config.js
@@ -0,0 +1,72 @@
+'use strict'
+
+process.env.BABEL_ENV = 'main'
+
+const path = require('path')
+const { dependencies } = require('../package.json')
+const webpack = require('webpack')
+
+const BabiliWebpackPlugin = require('babili-webpack-plugin')
+
+let mainConfig = {
+ entry: {
+ main: path.join(__dirname, '../src/main/index.js')
+ },
+ externals: [
+ ...Object.keys(dependencies || {})
+ ],
+ module: {
+ rules: [
+ {
+ test: /\.js$/,
+ use: 'babel-loader',
+ exclude: /node_modules/
+ },
+ {
+ test: /\.node$/,
+ use: 'node-loader'
+ }
+ ]
+ },
+ node: {
+ __dirname: process.env.NODE_ENV !== 'production',
+ __filename: process.env.NODE_ENV !== 'production'
+ },
+ output: {
+ filename: '[name].js',
+ libraryTarget: 'commonjs2',
+ path: path.join(__dirname, '../dist/electron')
+ },
+ plugins: [
+ new webpack.NoEmitOnErrorsPlugin()
+ ],
+ resolve: {
+ extensions: ['.js', '.json', '.node']
+ },
+ target: 'electron-main'
+}
+
+/**
+ * Adjust mainConfig for development settings
+ */
+if (process.env.NODE_ENV !== 'production') {
+ mainConfig.plugins.push(
+ new webpack.DefinePlugin({
+ '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
+ })
+ )
+}
+
+/**
+ * Adjust mainConfig for production settings
+ */
+if (process.env.NODE_ENV === 'production') {
+ mainConfig.plugins.push(
+ new BabiliWebpackPlugin(),
+ new webpack.DefinePlugin({
+ 'process.env.NODE_ENV': '"production"'
+ })
+ )
+}
+
+module.exports = mainConfig
diff --git a/electron/.electron-vue/webpack.renderer.config.js b/electron/.electron-vue/webpack.renderer.config.js
new file mode 100644
index 00000000..82727c04
--- /dev/null
+++ b/electron/.electron-vue/webpack.renderer.config.js
@@ -0,0 +1,173 @@
+'use strict'
+
+process.env.BABEL_ENV = 'renderer'
+
+const path = require('path')
+const { dependencies } = require('../package.json')
+const webpack = require('webpack')
+
+const BabiliWebpackPlugin = require('babili-webpack-plugin')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const { VueLoaderPlugin } = require('vue-loader')
+
+/**
+ * List of node_modules to include in webpack bundle
+ *
+ * Required for specific packages like Vue UI libraries
+ * that provide pure *.vue files that need compiling
+ * https://simulatedgreg.gitbooks.io/electron-vue/content/en/webpack-configurations.html#white-listing-externals
+ */
+// 'vue-slider-component' needed here due to this issue:
+// https://github.com/SimulatedGREG/electron-vue/issues/725
+let whiteListedModules = ['vue', 'vue-slider-component']
+
+let rendererConfig = {
+ devtool: '#cheap-module-eval-source-map',
+ entry: {
+ renderer: path.join(__dirname, '../src/renderer/main.js')
+ },
+ externals: [
+ ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d))
+ ],
+ module: {
+ rules: [
+ {
+ test: /\.less$/,
+ use: ['vue-style-loader', 'css-loader', 'less-loader']
+ },
+ {
+ test: /\.css$/,
+ use: ['vue-style-loader', 'css-loader']
+ },
+ {
+ test: /\.html$/,
+ use: 'vue-html-loader'
+ },
+ {
+ test: /\.js$/,
+ use: 'babel-loader',
+ exclude: /node_modules/
+ },
+ {
+ test: /\.node$/,
+ use: 'node-loader'
+ },
+ {
+ test: /\.vue$/,
+ use: {
+ loader: 'vue-loader',
+ options: {
+ extractCSS: process.env.NODE_ENV === 'production',
+ loaders: {
+ sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
+ scss: 'vue-style-loader!css-loader!sass-loader',
+ less: 'vue-style-loader!css-loader!less-loader'
+ }
+ }
+ }
+ },
+ {
+ test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+ use: {
+ loader: 'url-loader',
+ query: {
+ limit: 10000,
+ name: 'imgs/[name]--[folder].[ext]'
+ }
+ }
+ },
+ {
+ test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+ loader: 'url-loader',
+ options: {
+ limit: 10000,
+ name: 'media/[name]--[folder].[ext]'
+ }
+ },
+ {
+ test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+ use: {
+ loader: 'url-loader',
+ query: {
+ limit: 10000,
+ name: 'fonts/[name]--[folder].[ext]'
+ }
+ }
+ }
+ ]
+ },
+ node: {
+ __dirname: process.env.NODE_ENV !== 'production',
+ __filename: process.env.NODE_ENV !== 'production'
+ },
+ plugins: [
+ new VueLoaderPlugin(),
+ new MiniCssExtractPlugin({filename: 'styles.css'}),
+ new HtmlWebpackPlugin({
+ filename: 'index.html',
+ template: path.resolve(__dirname, '../src/index.ejs'),
+ minify: {
+ collapseWhitespace: true,
+ removeAttributeQuotes: true,
+ removeComments: true
+ },
+ nodeModules: process.env.NODE_ENV !== 'production'
+ ? path.resolve(__dirname, '../node_modules')
+ : false
+ }),
+ new webpack.HotModuleReplacementPlugin(),
+ new webpack.NoEmitOnErrorsPlugin()
+ ],
+ output: {
+ filename: '[name].js',
+ libraryTarget: 'commonjs2',
+ path: path.join(__dirname, '../dist/electron')
+ },
+ resolve: {
+ alias: {
+ '@': path.join(__dirname, '../src/renderer'),
+ 'vue$': 'vue/dist/vue.esm.js'
+ },
+ extensions: ['.js', '.vue', '.json', '.css', '.node']
+ },
+ target: 'electron-renderer'
+}
+
+/**
+ * Adjust rendererConfig for development settings
+ */
+if (process.env.NODE_ENV !== 'production') {
+ rendererConfig.plugins.push(
+ new webpack.DefinePlugin({
+ '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
+ })
+ )
+}
+
+/**
+ * Adjust rendererConfig for production settings
+ */
+if (process.env.NODE_ENV === 'production') {
+ rendererConfig.devtool = ''
+
+ rendererConfig.plugins.push(
+ new BabiliWebpackPlugin(),
+ new CopyWebpackPlugin([
+ {
+ from: path.join(__dirname, '../static'),
+ to: path.join(__dirname, '../dist/electron/static'),
+ ignore: ['.*']
+ }
+ ]),
+ new webpack.DefinePlugin({
+ 'process.env.NODE_ENV': '"production"'
+ }),
+ new webpack.LoaderOptionsPlugin({
+ minimize: true
+ })
+ )
+}
+
+module.exports = rendererConfig
diff --git a/electron/.electron-vue/webpack.web.config.js b/electron/.electron-vue/webpack.web.config.js
new file mode 100644
index 00000000..c942c0c7
--- /dev/null
+++ b/electron/.electron-vue/webpack.web.config.js
@@ -0,0 +1,132 @@
+'use strict'
+
+process.env.BABEL_ENV = 'web'
+
+const path = require('path')
+const webpack = require('webpack')
+
+const BabiliWebpackPlugin = require('babili-webpack-plugin')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const { VueLoaderPlugin } = require('vue-loader')
+
+let webConfig = {
+ devtool: '#cheap-module-eval-source-map',
+ entry: {
+ web: path.join(__dirname, '../src/renderer/main.js')
+ },
+ module: {
+ rules: [
+ {
+ test: /\.less$/,
+ use: ['vue-style-loader', 'css-loader', 'less-loader']
+ },
+ {
+ test: /\.css$/,
+ use: ['vue-style-loader', 'css-loader']
+ },
+ {
+ test: /\.html$/,
+ use: 'vue-html-loader'
+ },
+ {
+ test: /\.js$/,
+ use: 'babel-loader',
+ include: [ path.resolve(__dirname, '../src/renderer') ],
+ exclude: /node_modules/
+ },
+ {
+ test: /\.vue$/,
+ use: {
+ loader: 'vue-loader',
+ options: {
+ extractCSS: true,
+ loaders: {
+ sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
+ scss: 'vue-style-loader!css-loader!sass-loader',
+ less: 'vue-style-loader!css-loader!less-loader'
+ }
+ }
+ }
+ },
+ {
+ test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+ use: {
+ loader: 'url-loader',
+ query: {
+ limit: 10000,
+ name: 'imgs/[name].[ext]'
+ }
+ }
+ },
+ {
+ test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+ use: {
+ loader: 'url-loader',
+ query: {
+ limit: 10000,
+ name: 'fonts/[name].[ext]'
+ }
+ }
+ }
+ ]
+ },
+ plugins: [
+ new VueLoaderPlugin(),
+ new MiniCssExtractPlugin({filename: 'styles.css'}),
+ new HtmlWebpackPlugin({
+ filename: 'index.html',
+ template: path.resolve(__dirname, '../src/index.ejs'),
+ minify: {
+ collapseWhitespace: true,
+ removeAttributeQuotes: true,
+ removeComments: true
+ },
+ nodeModules: false
+ }),
+ new webpack.DefinePlugin({
+ 'process.env.IS_WEB': 'true'
+ }),
+ new webpack.HotModuleReplacementPlugin(),
+ new webpack.NoEmitOnErrorsPlugin()
+ ],
+ output: {
+ filename: '[name].js',
+ path: path.join(__dirname, '../dist/web')
+ },
+ resolve: {
+ alias: {
+ '@': path.join(__dirname, '../src/renderer'),
+ 'vue$': 'vue/dist/vue.esm.js'
+ },
+ extensions: ['.js', '.vue', '.json', '.css']
+ },
+ target: 'web'
+}
+
+/**
+ * Adjust webConfig for production settings
+ */
+if (process.env.NODE_ENV === 'production') {
+ webConfig.devtool = ''
+
+ webConfig.plugins.push(
+ new BabiliWebpackPlugin(),
+ new CopyWebpackPlugin([
+ {
+ from: path.join(__dirname, '../static'),
+ to: path.join(__dirname, '../dist/web/static'),
+ ignore: ['.*']
+ }
+ ]),
+ new webpack.DefinePlugin({
+ 'process.env.NODE_ENV': '"production"'
+ }),
+ new webpack.LoaderOptionsPlugin({
+ minimize: true
+ })
+ )
+}
+
+module.exports = webConfig