flagstrap-preact
Version:
Flagstrap jquery plugin version for Preact
212 lines (183 loc) • 5.84 kB
JavaScript
const fs = require('fs');
const qs = require('qs');
const path = require('path');
const webpack = require('webpack');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
// babel rc json file
let babelrc = JSON.parse(fs.readFileSync('.babelrc'));
let isProduction = process.env.NODE_ENV === 'production';
let sourceMapQueryStr = '+sourceMap';
const PATHS = {
js: path.join(__dirname, 'src', 'js'),
dist: path.join(__dirname, 'dist'),
assets: path.join(__dirname, 'src', 'assets')
};
// define source-map type
let srcMapsType = isProduction ? 'source-map' : 'eval-source-map';
// define date
const today = new Date();
const day = today.getUTCDate();
const year = today.getFullYear() + '';
let month = today.getUTCMonth() + 1;
let hour = today.getHours();
let minutes = today.getMinutes() < 10 ? '0' + today.getMinutes() : today.getMinutes();
// update month
month = month < 10 ? '0' + month : month;
const version = `v ${day}.${month}.${year.substring(2, 4)} - ${hour}:${minutes}`;
// update process env version
process.env.version = version;
// define plugins array
let plugins = [
new CleanWebpackPlugin([
PATHS.dist,
'index.html'
], {root: __dirname}),
new CopyWebpackPlugin(
[{
from: PATHS.assets, to: PATHS.dist
}]
),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
'process.env.version': JSON.stringify(version)
}),
new HtmlWebpackPlugin({
// will not automatically inject files in the template
// improve this to automatically generate the html file for
// an SPA
inject: false,
// this is relative to output path
filename: '../index.html',
template: path.join(__dirname, 'src', 'html', 'index.ejs'),
title: 'Flagstrap Preact example ' + version
}),
new ExtractTextPlugin({
// filename: 'css/[name].[hash].css',
filename: 'css/[name].css'
// allChunks: true,
})
];
// check if it's production
if (isProduction) {
// update plugins
plugins.splice(4, 0, new webpack.optimize.UglifyJsPlugin({ sourceMap: srcMapsType }));
}
let webpackConfig = {
// Entries have to resolve to files! They rely on Node
// convention by default so if a directory contains *index.js*,
// it resolves to that.
entry: {
app: path.join(__dirname, 'src', 'js', 'app.js'),
core: path.join(__dirname, 'src', 'sass', 'core.scss'),
flagstrap: path.join(__dirname, 'src', 'sass', 'app.scss')
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/[name].js'
},
target: 'web',
// enable source maps
// check link: https://survivejs.com/webpack/building/source-maps/
devtool: srcMapsType,
module: {
rules: [
{
test: /\.jsx?$/,
include: PATHS.js,
use: 'eslint-loader',
enforce: 'pre'
},
/* {
test: /\.js$/,
include: PATHS.js,
use: 'babel-loader'
}, */
{
// **Conditions**
// Match files against RegExp or a function.
test: /\.jsx?$/,
// **Restrictions**
// Restrict matching to a directory. This
// also accepts an array of paths or a function.
// The same applies to `exclude`.
include: PATHS.js,
/* exclude(path) {
// You can perform more complicated checks
// through functions if you want.
return path.match(/node_modules/);
}, */
exclude: [path.join(__dirname, 'node_modules')],
// Apply loaders the matched files.
use: {
loader: 'babel-loader?' + JSON.stringify(Object.assign({}, babelrc, {cacheDirectory: true}))
}
},
{
test: /\.css$/,
include: path.resolve(__dirname, 'src/sass'),
loader: ExtractTextPlugin.extract({
fallbackLoader: 'style-loader',
loader: [`css-loader?${sourceMapQueryStr}&minimize=true`]
})
},
{
test: /\.scss$/,
include: path.resolve(__dirname, 'src/sass'),
loader: ExtractTextPlugin.extract({
fallbackLoader: 'style-loader',
publicPath: '../',
loader: [
`css-loader?${sourceMapQueryStr}&minimize=true`,
`resolve-url-loader?${sourceMapQueryStr}`,
`sass-loader?${sourceMapQueryStr}`
]
})
},
{
test: /\.(png|jpe?g|gif|svg|xml|json)$/,
include: path.resolve(__dirname, 'src'),
loaders: [
`file-loader?${qs.stringify({
name: 'images/[name].[ext]'
})}`
]
},
{
test: /\.(ttf|eot)$/,
include: path.resolve(__dirname, 'src'),
loader: `file-loader?${qs.stringify({
name: 'fonts/[name].[ext]'
})}`
},
{
test: /\.woff2?$/,
include: path.resolve(__dirname, 'src'),
loader: `url-loader?${qs.stringify({
limit: 10000,
mimetype: 'application/font-woff',
name: 'fonts/[name].[ext]'
})}`
},
{
test: /\.(ttf|eot|woff2?|png|jpe?g|gif|svg)$/,
include: /node_modules/,
loader: 'file-loader',
query: {
name: 'fonts/[name].[ext]'
}
}
]
},
resolve: {
extensions: ['.js', '.jsx']
},
plugins: plugins,
// Disable performance hints during development
performance: {
hints: false
}
};
module.exports = webpackConfig;