const ConstDependency = require('webpack/lib/dependencies/ConstDependency');
class EnvironmentPlugin {
constructor(env) {
this.env = env;
}
apply(compiler) {
compiler.hooks.compilation.tap(
'EnvironmentPlugin',
(compilation, { normalModuleFactory }) => {
const handler = (parser) => {
// Handle process.env.VAR_NAME
parser.hooks.expressionAnyMember
.for('process.env')
.tap('EnvironmentPlugin', (expr) => {
if (expr.property.type === 'Identifier') {
const name = expr.property.name;
const value = this.env[name];
if (value !== undefined) {
const dep = new ConstDependency(
JSON.stringify(value),
expr.range
);
dep.loc = expr.loc;
parser.state.module.addDependency(dep);
return true;
}
}
});
// Handle typeof process.env.VAR_NAME
parser.hooks.typeof
.for('process.env')
.tap('EnvironmentPlugin', (expr) => {
// Return 'object' for process.env
const dep = new ConstDependency(
JSON.stringify('object'),
expr.range
);
dep.loc = expr.loc;
parser.state.module.addDependency(dep);
return true;
});
};
normalModuleFactory.hooks.parser
.for('javascript/auto')
.tap('EnvironmentPlugin', handler);
normalModuleFactory.hooks.parser
.for('javascript/dynamic')
.tap('EnvironmentPlugin', handler);
normalModuleFactory.hooks.parser
.for('javascript/esm')
.tap('EnvironmentPlugin', handler);
}
);
}
}
// Usage
new EnvironmentPlugin({
NODE_ENV: 'production',
API_URL: 'https://api.example.com'
});