|
const path = require("path"); |
|
const { CleanWebpackPlugin } = require("clean-webpack-plugin"); |
|
const CopyPlugin = require("copy-webpack-plugin"); |
|
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; |
|
|
|
const COLOR_KEYS = ["color", "bgColor", "fillcolor"]; |
|
|
|
const transformDataColors = async (data, path) => { |
|
const {getNamedColor} = await import('./src/colors.mjs'); |
|
|
|
if (!path.endsWith(".json")) { |
|
return data; |
|
} |
|
const parsedData = JSON.parse(data); |
|
|
|
const deepIterateAndSetColor = (key, val) => { |
|
if (val === null) { |
|
return null; |
|
} |
|
if (val == undefined) { |
|
return undefined; |
|
} |
|
if (Array.isArray(val)) { |
|
return val.map(item => deepIterateAndSetColor(key, item)); |
|
} |
|
if (typeof val === "object") { |
|
return Object.entries(val).reduce((newObj, [key, value]) => { |
|
newObj[key] = deepIterateAndSetColor(key, value); |
|
return newObj; |
|
}, {}); |
|
} |
|
if (COLOR_KEYS.includes(key)) { |
|
const [colorName, opacity, ...rest] = val.trim().split(/\s+/); |
|
const floatOpacity = parseFloat(opacity); |
|
const newColor = getNamedColor(colorName, floatOpacity); |
|
if (newColor !== undefined && rest.length === 0 && !isNaN(floatOpacity)) { |
|
console.log(`key: ${key} in file ${path} changed from ${val} to ${newColor}`); |
|
return newColor; |
|
} else { |
|
return val; |
|
} |
|
} |
|
return val; |
|
}; |
|
return JSON.stringify(deepIterateAndSetColor(undefined, parsedData)) |
|
}; |
|
|
|
module.exports = { |
|
entry: { |
|
distill: "./src/distill.js", |
|
main: "./src/index.js", |
|
}, |
|
output: { |
|
filename: "[name].bundle.js", |
|
path: path.resolve(__dirname, "dist"), |
|
}, |
|
module: { |
|
rules: [ |
|
|
|
{ |
|
test: /\.(js|mjs)$/, |
|
exclude: /node_modules/, |
|
use: { |
|
loader: "babel-loader", |
|
options: { |
|
presets: ["@babel/preset-env"], |
|
}, |
|
}, |
|
}, |
|
], |
|
}, |
|
plugins: [ |
|
new CleanWebpackPlugin(), |
|
new CopyPlugin({ |
|
patterns: [ |
|
{ |
|
from: "assets", |
|
to: "assets", |
|
transform: transformDataColors, |
|
}, |
|
{ from: "src/style.css", to: "style.css" }, |
|
{ from: "src/bibliography.bib", to: "bibliography.bib" }, |
|
{ from: "src/index.html", to: "index.html" }, |
|
], |
|
}), |
|
new BundleAnalyzerPlugin() |
|
], |
|
devtool: process.env.NODE_ENV === 'production' ? 'source-map' : 'eval-source-map', |
|
devServer: { |
|
static: "./dist", |
|
open: process.env.NODE_ENV !== 'production', |
|
hot: process.env.NODE_ENV !== 'production', |
|
}, |
|
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', |
|
}; |
|
|
|
console.log(process.env.NODE_ENV) |