ztoben / assets-webpack-plugin

Webpack plugin that emits a json file with assets paths
https://www.npmjs.com/package/assets-webpack-plugin
MIT License
958 stars 104 forks source link

Possible Typo in createOutputWriter.js #441

Open JackTiber opened 2 years ago

JackTiber commented 2 years ago

Describe the bug On line 51 of lib/output/createOutputWriter.js the local variable localFs is either filestream or the fs module from Node, but on line 88 the method localFs.mkdirp is called to output the json file. The resulting error during a build is below.

localFs.mkdirp(options.path, mkdirCallback);
              ^
TypeError: localFs.mkdirp is not a function

Changing this to localFs.mkdir seems to fix the issue.

To Reproduce Steps to reproduce the behavior:

  1. Install at 7.1.1
  2. Set options.keepInMemory to true
  3. Run build

Expected behavior For the JSON file to be output correctly in memory.

Webpack Config

const path = require("path");
const resolve = require("path").resolve;
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyPlugin = require("copy-webpack-plugin");
const NodePolyfillPlugin = require("node-polyfill-webpack-plugin");
const AssetsPlugin = require("assets-webpack-plugin");

const runEnv = process.env.NODE_ENV || "development";

module.exports = {
    entry: "./src/index.tsx",
    output: {
        path: resolve(__dirname, "dist"),
        filename: runEnv === "production" ? "[name].[hash].js" : "bundle.js",
        publicPath: runEnv === "production" ? "/request" : "/",
    },
    target: "web",
    mode: runEnv,
    devtool: runEnv === "production" ? "cheap-source-map" : "eval-source-map",
    devServer: {
        contentBase: path.join(__dirname, "dist"),
        port: 3003,
        historyApiFallback: true,
        openPage: "/request",
        hot: true,
    },
    resolve: {
        extensions: [".ts", ".tsx", ".js", ".json"],
    },
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                loader: "babel-loader",
                exclude: /node_modules/,
            },
            {
                test: /\.svg$/,
                use: ["@svgr/webpack", "url-loader"],
            },
            {
                test: /\.(png|pdf|jpg|eot|woff|woff2|ttf|gif)$/,
                oneOf: [
                    {
                        loader: "url-loader",
                        options: {
                            limit: 9000,
                        },
                    },
                ],
            },
        ],
    },
    plugins: [
        new HtmlWebpackPlugin({
            filename: "index.html",
            template: "src/index.html",
            excludeChunks: ["server"],
        }),
        new CopyPlugin({
            patterns: [
                {
                    from: "./src/_assets",
                    to: "assets",
                },
            ],
        }),
        new NodePolyfillPlugin(),
        new AssetsPlugin({
            filename: "bundlePath.json",
            fullPath: false,
            path: path.join(__dirname, "dist"),
            includeAllFileTypes: false,
            fileTypes: ["js"],
            keepInMemory: true,
        }),
    ],
};

Desktop (please complete the following information):

Additional context Add any other context about the problem here.

JackTiber commented 2 years ago

Actually, looking at the file history it looks like the dependency for mkdirp was just removed from this version but changed back to localFs.mkdirp from localFs.mkdir.

wmertens commented 1 year ago

Ran into the same thing. Can't use the plugin with webpack-middleware-dev like this.

LP1994 commented 6 months ago

Actually, looking at the file history it looks like the dependency for mkdirp was just removed from this version but changed back to localFs.mkdirp from localFs.mkdir.

Here's my main version info: node: 21.6.2 npm : 10.4.0 webpack: 5.90.3 webpack-cli: 5.1.4 webpack-dev-middleware: 7.0.0 webpack-dev-server: 5.0.2 webpack-sources: 3.2.3 assets-webpack-plugin: 7.1.1

At some point, when I upgraded to the above mentioned "npm package", I got the same error.Until then, it had been running fine.That's weird.

Personally, I think it's due to the recent "webpack" update that removed the outdated "mkdirp", see: https://webpack.js.org/blog/2020-10-10-webpack-5-release/#filesystems

Then, after I changed "mkdirp" to "mkdir" as you said, it triggered a new error. image

After troubleshooting, the final change to this worked: localFs.mkdir(options.path, { recursive: true }, mkdirCallback);

This issue was created a long time ago, but I'm posting the problem I encountered and the solution for your reference.