You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

186 lines
4.7 KiB

const webpack = require('webpack')
const path = require('path')
const fs = require('fs')
const WebpackNotifierPlugin = require('webpack-notifier')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const Handlebars = require('handlebars')
const basePath = './'
const pagesPath = path.join(__dirname, './pages')
const distPath = path.join(__dirname, './public')
const componentPath = path.join(__dirname, './components')
const imagesPath = path.join(__dirname, './images')
const binsPath = path.join(__dirname, './cgi-bin')
const apisPath = path.join(__dirname, './api')
const adminPath = path.join(__dirname, './admin')
const assetsPath = path.join(__dirname, './assets')
const docsPath = path.join(__dirname, './docs')
const srcPath = './src'
let components = []
let entries = []
let plugins = []
module.exports = (env) => {
const isProd = env && env.prod || false
const dotenv = require('dotenv').config({path: __dirname + `/.env${isProd ? '_prod' : ''}`});
entries.push(srcPath + '/js/index.js')
entries.push(srcPath + '/scss/main.scss')
fs.readdirSync(componentPath).forEach( (comp) => {
entries.push(componentPath + '/' + comp + '/' + comp + '.js')
})
plugins = [
new HtmlWebpackPlugin(),
new WebpackNotifierPlugin({
title: 'IoLovOlio',
contentImage: path.join(__dirname, basePath + '/images/logoWP.png'),
alwaysNotify: true
}),
new webpack.DefinePlugin({
"ENV": JSON.stringify(dotenv.parsed)
}),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
}),
new CopyWebpackPlugin({
patterns: [
{
context: componentPath,
from: '**/*.html',
to: distPath + '/components/[path]/[name].php',
},
{
context: imagesPath,
from: '*.*',
to: distPath + '/images',
},
{
context: imagesPath,
from: '**/*.*',
to: distPath + '/images',
},
{
context: binsPath,
from: '*.*',
to: distPath + '/cgi-bin',
},
{
context: apisPath,
from: '**/*',
to: distPath + '/api',
},
{
context: adminPath,
from: '*.*',
to: distPath + '/admin',
}
]
})
]
fs.readdirSync(pagesPath).forEach( (page) => {
if(page == '.htaccess') {
plugins.push(
new CopyWebpackPlugin({
patterns: [
{
context: pagesPath,
from: '.htaccess',
to: distPath
}
]
})
)
} else {
plugins.push(
new HtmlWebpackPlugin({
template: path.resolve(pagesPath, page),
filename: path.resolve(distPath, page.substr(0, page.lastIndexOf(".")) + ".php"),
inject: page == 'index.ejs'
})
)
}
})
return {
devtool: isProd ? '' : 'eval',
entry: entries,
output: {
path: path.join(distPath, '/assets/js'),
publicPath: '/assets/js',
filename: 'bundle.js'
},
module: {
rules: [
// JS
{
test: /\.js$/,
exclude: /(node_modules|bower_components|vendor)/,
use: {
loader: 'babel-loader',
options: {
minified: false,
babelrc: true
}
},
},
// SCSS
{
test: /\.scss$/,
use: [
{loader: 'file-loader',
options: { name: '../../assets/css/styles.css'}
},
{loader: 'extract-loader'},
{loader: 'css-loader'},
{loader: 'postcss-loader'},
{loader: 'sass-loader'}
]
},
// FONTS
{
test: /\.(woff|woff2|eot|ttf|svg)$/,
use: ['url-loader?limit=100000']
},
// IMAGES
{
test: /\.(jpg|jpeg|gif|png)$/,
use: ['url-loader?limit=100000']
},
// HTML
{
test: /\.html$/i,
loader: 'html-loader',
options: {
attributes: {
list: [
{ tag: 'img', attribute: 'data-src', type: 'src'},
{ tag: 'img', attribute: 'data-srcset', type: 'srcset'}
],
root: '.'
}
}
}
]
},
plugins: plugins,
devtool: false,
performance: {
maxEntrypointSize: 512000,
maxAssetSize: 512000
}
}
}