Spaces:
Running
Running
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 not json file, return | |
if (!path.endsWith(".json")) { | |
return data; | |
} | |
const parsedData = JSON.parse(data); | |
// Change the color of the 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", // The output file | |
path: path.resolve(__dirname, "dist"), // Output directory | |
}, | |
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", // Serve files from the 'dist' directory | |
open: process.env.NODE_ENV !== 'production', // Automatically open the browser unless in production | |
hot: process.env.NODE_ENV !== 'production', // Enable hot module replacement unless in production | |
}, | |
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', | |
}; | |
console.log(process.env.NODE_ENV) |