| | 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: /\.css$/, use: ["style-loader", "css-loader"] }, |
| | { |
| | 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" }, |
| | ], |
| | }), |
| | ], |
| | 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) |