174 lines
4.6 KiB
JavaScript
174 lines
4.6 KiB
JavaScript
|
const crypto = require('crypto');
|
||
|
const fs = require('fs');
|
||
|
const path = require('path');
|
||
|
|
||
|
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
|
||
|
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
||
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||
|
const webpack = require('webpack');
|
||
|
|
||
|
const packageJSON = require('./package.json');
|
||
|
|
||
|
const IS_PRODUCTION = (process.env['NODE_ENV'] === 'production');
|
||
|
const IS_WDS = (process.env['WDS'] === 'true');
|
||
|
const MODULES_FOLDER = (
|
||
|
(process.env['YARN_MODULES_FOLDER']) ? process.env['YARN_MODULES_FOLDER'] : 'node_modules'
|
||
|
);
|
||
|
|
||
|
const CONTEXT = path.resolve(__dirname);
|
||
|
const OUTPUT_DIR = path.resolve(CONTEXT, 'frontend');
|
||
|
|
||
|
const settingsContent = fs.readFileSync(path.resolve(CONTEXT, 'settings.js'));
|
||
|
const settingsHash = crypto.createHash('sha1');
|
||
|
settingsHash.update(settingsContent);
|
||
|
const BUILD = settingsHash.digest('hex');
|
||
|
|
||
|
const OUTPUT_FILENAME = `[name]-${BUILD}.js`;
|
||
|
const PUBLIC_PATH = (IS_WDS) ? '/' : '/frontend/';
|
||
|
const VENDOR_PATH = path.resolve('./vendor');
|
||
|
|
||
|
const HOMEHUB_CSS_PATTERN = (IS_PRODUCTION) ? 'homehub.css' : 'homehub.css*';
|
||
|
const HOMEHUB_COMPONENTS_CSS_PATTERN = (
|
||
|
(IS_PRODUCTION) ? 'homehub-components.css' : 'homehub-components.css*'
|
||
|
);
|
||
|
|
||
|
const copyTransformPath = (targetPath, absolutePath) => {
|
||
|
return path.basename(targetPath).replace('.css', `-${BUILD}.css`);
|
||
|
};
|
||
|
|
||
|
const copyTransform = (content, absolutePath) => {
|
||
|
if (IS_PRODUCTION) {
|
||
|
return content;
|
||
|
}
|
||
|
|
||
|
const filename = path.basename(absolutePath);
|
||
|
const cssFilename = path.basename(filename, '.map');
|
||
|
|
||
|
const stringContent = content.toString('utf-8').replace(
|
||
|
cssFilename, cssFilename.replace('.css', `-${BUILD}.css`)
|
||
|
);
|
||
|
|
||
|
return stringContent;
|
||
|
};
|
||
|
|
||
|
const config = {
|
||
|
mode: (IS_PRODUCTION) ? 'production' : 'development',
|
||
|
devtool: (IS_PRODUCTION) ? false : 'source-map',
|
||
|
context: CONTEXT,
|
||
|
entry: {
|
||
|
homehub: './index.js'
|
||
|
},
|
||
|
output: {
|
||
|
path: OUTPUT_DIR,
|
||
|
publicPath: PUBLIC_PATH,
|
||
|
filename: OUTPUT_FILENAME
|
||
|
},
|
||
|
module: {
|
||
|
rules: [
|
||
|
{
|
||
|
test: /\.js?$/,
|
||
|
include: VENDOR_PATH,
|
||
|
use: [
|
||
|
'babel-loader'
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
test: /\.css?$/,
|
||
|
use: [
|
||
|
'style-loader',
|
||
|
'css-loader'
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
resolve: {
|
||
|
modules: [MODULES_FOLDER],
|
||
|
alias: {
|
||
|
'@bthlabs/homehub-app': path.resolve(
|
||
|
MODULES_FOLDER, '@bthlabs/homehub-app'
|
||
|
),
|
||
|
'@bthlabs/homehub-components': path.resolve(
|
||
|
MODULES_FOLDER, '@bthlabs/homehub-components'
|
||
|
),
|
||
|
'@bthlabs/homehub-core': path.resolve(
|
||
|
MODULES_FOLDER, '@bthlabs/homehub-core'
|
||
|
),
|
||
|
'@bthlabs/homehub-icons': path.resolve(
|
||
|
MODULES_FOLDER, '@bthlabs/homehub-icons'
|
||
|
),
|
||
|
'prop-types': path.resolve(MODULES_FOLDER, 'prop-types'),
|
||
|
react: path.resolve(MODULES_FOLDER, 'react'),
|
||
|
'react-bootstrap': path.resolve(MODULES_FOLDER, 'react-bootstrap'),
|
||
|
'react-dom': path.resolve(MODULES_FOLDER, 'react-dom'),
|
||
|
'vendor': VENDOR_PATH
|
||
|
}
|
||
|
},
|
||
|
devServer: {
|
||
|
disableHostCheck: true,
|
||
|
host: '10.100.100.101',
|
||
|
port: 3012,
|
||
|
proxy: {
|
||
|
'/backend': 'http://10.100.100.101:3010'
|
||
|
}
|
||
|
},
|
||
|
plugins: [
|
||
|
new CleanWebpackPlugin(),
|
||
|
new webpack.DefinePlugin({
|
||
|
PRODUCTION: IS_PRODUCTION
|
||
|
}),
|
||
|
new HtmlWebpackPlugin({
|
||
|
filename: 'index.html',
|
||
|
template: path.resolve(CONTEXT, 'templates', 'index.html'),
|
||
|
templateParameters: {
|
||
|
build: BUILD,
|
||
|
version: packageJSON.version,
|
||
|
publicPath: PUBLIC_PATH
|
||
|
}
|
||
|
}),
|
||
|
new CopyWebpackPlugin({
|
||
|
patterns: [
|
||
|
{
|
||
|
from: path.resolve(
|
||
|
MODULES_FOLDER, '@bthlabs', 'homehub-app', 'lib',
|
||
|
HOMEHUB_CSS_PATTERN
|
||
|
),
|
||
|
transformPath: copyTransformPath,
|
||
|
transform: copyTransform
|
||
|
}
|
||
|
]
|
||
|
}),
|
||
|
new CopyWebpackPlugin({
|
||
|
patterns: [
|
||
|
{
|
||
|
from: path.resolve(
|
||
|
MODULES_FOLDER, '@bthlabs', 'homehub-components', 'lib',
|
||
|
HOMEHUB_COMPONENTS_CSS_PATTERN
|
||
|
),
|
||
|
transformPath: copyTransformPath,
|
||
|
transform: copyTransform
|
||
|
}
|
||
|
]
|
||
|
}),
|
||
|
new CopyWebpackPlugin({
|
||
|
patterns: [
|
||
|
{
|
||
|
from: 'assets/icon.png'
|
||
|
}
|
||
|
]
|
||
|
})
|
||
|
]
|
||
|
};
|
||
|
|
||
|
if (IS_PRODUCTION) {
|
||
|
config.resolve.alias = {
|
||
|
...config.resolve.alias,
|
||
|
'prop-types': path.resolve(MODULES_FOLDER, 'prop-types/prop-types.min.js'),
|
||
|
'react': path.resolve(MODULES_FOLDER, 'react/umd/react.production.min.js'),
|
||
|
'react-dom': path.resolve(
|
||
|
MODULES_FOLDER, 'react-dom/umd/react-dom.production.min.js'
|
||
|
)
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = config;
|