Free and Open source Web Builder Framework. Next generation tool for building templates without coding
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.
 
 
 
 

129 lines
3.6 KiB

import { babelConfig, rootResolve, isFunction, isObject, log, resolve, originalRequire } from './utils';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import TerserPlugin from 'terser-webpack-plugin';
import chalk from 'chalk';
import path from 'path';
import fs from 'fs';
import webpack from 'webpack';
const dirCwd = process.cwd();
let plugins = [];
export default (opts: Record<string, any> = {}): any => {
const pkgPath = path.join(dirCwd, 'package.json');
const rawPackageJson = fs.readFileSync(pkgPath) as unknown as string;
const pkg = JSON.parse(rawPackageJson);
const { args, cmdOpts = {} } = opts;
const { htmlWebpack = {} } = args;
const name = pkg.name;
const isProd = opts.production;
const banner = `/*! ${name} - ${pkg.version} */`;
if (!isProd) {
const fname = 'index.html';
const index = `${dirCwd}/${fname}`;
const indexDev = `${dirCwd}/_${fname}`;
let template = path.resolve(__dirname, `./../${fname}`);
if (fs.existsSync(indexDev)) {
template = indexDev;
} else if (fs.existsSync(index)) {
template = index;
}
plugins.push(
new HtmlWebpackPlugin({
inject: 'head',
template,
...htmlWebpack,
templateParameters: {
name,
title: name,
gjsVersion: 'latest',
pathGjs: '',
pathGjsCss: '',
...(htmlWebpack.templateParameters || {}),
},
}),
);
}
const outPath = path.resolve(dirCwd, args.output);
const modulesPaths = ['node_modules', path.join(__dirname, '../node_modules')];
let config = {
entry: path.resolve(dirCwd, args.entry),
mode: isProd ? 'production' : 'development',
devtool: isProd ? 'source-map' : 'eval',
optimization: {
minimizer: [
new TerserPlugin({
extractComments: false,
terserOptions: {
compress: {
evaluate: false, // Avoid breaking gjs scripts
},
output: {
comments: false,
quote_style: 3, // Preserve original quotes
preamble: banner, // banner here instead of BannerPlugin
},
},
}),
],
},
output: {
path: outPath,
filename: 'index.js',
library: name,
libraryTarget: 'umd',
globalObject: `typeof globalThis !== 'undefined' ? globalThis : (typeof window !== 'undefined' ? window : this)`,
},
module: {
rules: [
{
test: /\.tsx?$/,
loader: resolve('ts-loader'),
exclude: /node_modules/,
options: {
context: rootResolve(''),
configFile: rootResolve('tsconfig.json'),
},
},
{
test: /\.js$/,
loader: resolve('babel-loader'),
include: /src/,
options: {
...babelConfig(args),
cacheDirectory: true,
...args.babel,
},
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
modules: modulesPaths,
},
plugins,
};
// Try to load local webpack config
const localWebpackPath = rootResolve('webpack.config.js');
let localWebpackConf: any;
if (fs.existsSync(localWebpackPath)) {
const customWebpack = originalRequire()(localWebpackPath);
localWebpackConf = customWebpack.default || customWebpack;
}
if (isFunction(localWebpackConf)) {
const fnRes = localWebpackConf({ config, webpack, pkg });
config = isObject(fnRes) ? fnRes : config;
}
cmdOpts.verbose && log(chalk.yellow('Webpack config:\n'), config, '\n');
return config;
};