mirror of https://github.com/webpack/webpack.git
add missingDependencies
This commit is contained in:
parent
ada334b199
commit
fc406b758d
|
@ -260,6 +260,8 @@ class DotenvPlugin {
|
|||
|
||||
/** @type {string[] | undefined} */
|
||||
let fileDependenciesCache;
|
||||
/** @type {string[] | undefined} */
|
||||
let missingDependenciesCache;
|
||||
|
||||
compiler.hooks.beforeCompile.tapAsync(PLUGIN_NAME, (_params, callback) => {
|
||||
const inputFileSystem = /** @type {InputFileSystem} */ (
|
||||
|
@ -272,7 +274,7 @@ class DotenvPlugin {
|
|||
inputFileSystem,
|
||||
mode,
|
||||
context,
|
||||
(err, env, fileDependencies) => {
|
||||
(err, env, fileDependencies, missingDependencies) => {
|
||||
if (err) return callback(err);
|
||||
|
||||
const definitions = envToDefinitions(env || {});
|
||||
|
@ -281,6 +283,8 @@ class DotenvPlugin {
|
|||
definePlugin.definitions = definitions;
|
||||
// update the file dependencies
|
||||
fileDependenciesCache = fileDependencies;
|
||||
// update the missing dependencies
|
||||
missingDependenciesCache = missingDependencies;
|
||||
|
||||
callback();
|
||||
}
|
||||
|
@ -289,6 +293,7 @@ class DotenvPlugin {
|
|||
|
||||
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
||||
compilation.fileDependencies.addAll(fileDependenciesCache || []);
|
||||
compilation.missingDependencies.addAll(missingDependenciesCache || []);
|
||||
});
|
||||
|
||||
definePlugin.apply(compiler);
|
||||
|
@ -321,7 +326,7 @@ class DotenvPlugin {
|
|||
* @param {InputFileSystem} fs the input file system
|
||||
* @param {string | undefined} mode the mode
|
||||
* @param {string} context the compiler context
|
||||
* @param {(err: Error | null, env?: Record<string, string>, fileDependencies?: string[]) => void} callback callback function
|
||||
* @param {(err: Error | null, env?: Record<string, string>, fileDependencies?: string[], missingDependencies?: string[]) => void} callback callback function
|
||||
* @returns {void}
|
||||
*/
|
||||
loadEnv(fs, mode, context, callback) {
|
||||
|
@ -353,26 +358,30 @@ class DotenvPlugin {
|
|||
const envFiles = this.getEnvFilesForMode(fs, dir, mode);
|
||||
/** @type {string[]} */
|
||||
const fileDependencies = [];
|
||||
/** @type {string[]} */
|
||||
const missingDependencies = [];
|
||||
|
||||
// Read all files
|
||||
const readPromises = envFiles.map((filePath) =>
|
||||
this.loadFile(fs, filePath).then(
|
||||
(content) => {
|
||||
fileDependencies.push(filePath);
|
||||
return { content, filePath };
|
||||
return content;
|
||||
},
|
||||
() =>
|
||||
// File doesn't exist, skip it (this is normal)
|
||||
({ content: "", filePath })
|
||||
() => {
|
||||
// File doesn't exist, add to missingDependencies (this is normal)
|
||||
missingDependencies.push(filePath);
|
||||
return "";
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
Promise.all(readPromises)
|
||||
.then((results) => {
|
||||
.then((contents) => {
|
||||
// Parse all files and merge (later files override earlier ones)
|
||||
// Similar to Vite's implementation
|
||||
const parsed = /** @type {Record<string, string>} */ ({});
|
||||
for (const { content } of results) {
|
||||
for (const content of contents) {
|
||||
if (!content) continue;
|
||||
const entries = parse(content);
|
||||
for (const key in entries) {
|
||||
|
@ -403,7 +412,7 @@ class DotenvPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
callback(null, env, fileDependencies);
|
||||
callback(null, env, fileDependencies, missingDependencies);
|
||||
})
|
||||
.catch((err) => {
|
||||
callback(err);
|
||||
|
|
|
@ -5,4 +5,12 @@ it("should override .env values with .env.development in step 2", function () {
|
|||
expect(process.env.WEBPACK_NEW_VAR).toBe("added-in-step-1");
|
||||
// New variable from .env.development
|
||||
expect(process.env.WEBPACK_DEV_ONLY).toBe("development-value");
|
||||
// missingDependencies test
|
||||
if (WATCH_STEP === "3") {
|
||||
// In step 3, .env.myLocal from missingDependencies was created, so it has a value
|
||||
expect(process.env.WEBPACK_MY_LOCAL).toBe("3");
|
||||
} else {
|
||||
// In step 2, .env.myLocal doesn't exist yet
|
||||
expect(process.env.WEBPACK_MY_LOCAL).toBeUndefined();
|
||||
}
|
||||
});
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
WEBPACK_MY_LOCAL=3
|
|
@ -1,6 +1,5 @@
|
|||
"use strict";
|
||||
|
||||
const path = require("path");
|
||||
const DotenvPlugin = require("../../../../").DotenvPlugin;
|
||||
|
||||
/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */
|
||||
|
@ -8,14 +7,14 @@ const DotenvPlugin = require("../../../../").DotenvPlugin;
|
|||
module.exports = (env, { srcPath, testPath }) => {
|
||||
const dotenvPlugin = new DotenvPlugin({
|
||||
prefix: "WEBPACK_",
|
||||
dir: ""
|
||||
dir: "",
|
||||
template: [".env", ".env.myLocal", ".env.[mode]", ".env.[mode].myLocal"]
|
||||
});
|
||||
return {
|
||||
mode: "development",
|
||||
dotenv: false,
|
||||
plugins: [
|
||||
(compiler) => {
|
||||
let i = 0;
|
||||
// Update dotenvPlugin.config.dir before each compile
|
||||
// Use beforeCompile with stage -1 to run before DotenvPlugin
|
||||
compiler.hooks.beforeCompile.tap(
|
||||
|
@ -24,8 +23,7 @@ module.exports = (env, { srcPath, testPath }) => {
|
|||
stage: -1
|
||||
},
|
||||
() => {
|
||||
dotenvPlugin.config.dir = path.join(__dirname, String(i));
|
||||
i++;
|
||||
dotenvPlugin.config.dir = srcPath;
|
||||
}
|
||||
);
|
||||
},
|
||||
|
|
|
@ -4463,7 +4463,8 @@ declare class DotenvPlugin {
|
|||
callback: (
|
||||
err: null | Error,
|
||||
env?: Record<string, string>,
|
||||
fileDependencies?: string[]
|
||||
fileDependencies?: string[],
|
||||
missingDependencies?: string[]
|
||||
) => void
|
||||
): void;
|
||||
|
||||
|
|
Loading…
Reference in New Issue