@lipemat/js-boilerplate
Version:
Dependencies and scripts for a no config JavaScript app
116 lines (115 loc) • 4.47 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const webpack_1 = require("webpack");
const react_refresh_webpack_plugin_1 = __importDefault(require("@pmmmwh/react-refresh-webpack-plugin"));
const path_1 = __importDefault(require("path"));
const fork_ts_checker_webpack_plugin_1 = __importDefault(require("fork-ts-checker-webpack-plugin"));
const config_1 = require("../helpers/config");
const entries_1 = require("../helpers/entries");
const package_config_1 = require("../helpers/package-config");
const postcssOptions = (0, config_1.getConfig)('postcss.config');
const babelOptions = (0, config_1.getConfig)('babel.config');
const cssLoaderOptions = (0, config_1.getConfig)('css-loader.config');
const devServerOptions = (0, config_1.getConfig)('dev-server.config');
// To allow line numbers to show up in console errors. @see React Error Boundaries.
babelOptions.plugins?.unshift('@babel/plugin-transform-react-jsx-source');
// To support React Fast Refresh.
babelOptions.plugins?.unshift('react-refresh/babel');
const plugins = [
new webpack_1.ProvidePlugin({
jQuery: 'jquery',
$: 'jquery',
}),
new react_refresh_webpack_plugin_1.default(),
];
// Loads a thread, which verifies any TypeScript on changes if the project has a "tsconfig.json" file.
if ('' !== (0, config_1.getTsConfigFile)()) {
plugins.push(new fork_ts_checker_webpack_plugin_1.default({
devServer: false,
formatter: 'basic',
typescript: {
configFile: (0, config_1.getTsConfigFile)(),
},
}));
}
const config = {
devtool: 'eval-source-map',
entry: (0, entries_1.getEntries)(),
mode: 'development',
stats: 'minimal',
externals: {
jquery: 'jQuery',
},
target: 'browserslist:' + (0, config_1.getBrowsersList)().join(', '),
output: {
path: path_1.default.resolve((0, package_config_1.getPackageConfig)().workingDirectory, 'dist'),
filename: '[name].js',
publicPath: (0, package_config_1.getPackageConfig)().url + ':' + devServerOptions.port + '/js/dist/',
chunkFilename: '[name].js',
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json', '.pcss'],
modules: [
path_1.default.resolve((0, package_config_1.getPackageConfig)().workingDirectory, 'src'),
'node_modules',
],
},
plugins,
optimization: {
moduleIds: 'named',
emitOnErrors: false,
},
module: {
strictExportPresence: true,
rules: [
{
test: /\.[jt]sx?$/,
loader: 'babel-loader',
include: path_1.default.resolve((0, package_config_1.getPackageConfig)().workingDirectory, 'src'),
exclude: /node_modules/,
options: babelOptions,
},
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
],
},
{
test: /\.pcss$/,
use: [
'style-loader',
{
loader: '@teamsupercell/typings-for-css-modules-loader',
options: {
banner: '// Autogenerated by typings-for-css-modules-loader.',
disableLocalsExport: true,
prettierConfigFile: path_1.default.resolve(__dirname, '../helpers/.prettierrc.json'),
},
},
{
loader: 'css-loader',
options: cssLoaderOptions,
},
{
loader: 'postcss-loader',
options: {
postcssOptions,
},
},
].filter(loader => {
if (!(0, package_config_1.getPackageConfig)().cssTsFiles && 'object' === typeof loader) {
return loader.loader !== '@teamsupercell/typings-for-css-modules-loader';
}
return true;
}),
},
],
},
};
exports.default = config;
module.exports = config;