Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

isSvg expects string but gets object (buffer) #62

Closed
jens-struct opened this issue May 9, 2024 · 10 comments
Closed

isSvg expects string but gets object (buffer) #62

jens-struct opened this issue May 9, 2024 · 10 comments

Comments

@jens-struct
Copy link

There is an issue with the newest release: "imagemin-svgo" hands over a buffer object to "isSvg", which fails because it only works with strings.

@ejtagle
Copy link

ejtagle commented May 13, 2024

I did a pull request to fix it, hope it gets accepted soon

@jessehs
Copy link

jessehs commented May 13, 2024

The changes in the PR appear to solve the issue for me as well.

@Dmitriy-Frostoff
Copy link

Dmitriy-Frostoff commented May 16, 2024

Whatsapp!) 👋
I've got similar exception to yours via imagemin v9.0.0 and imagemin-svgo v11.0.0 usage with Webpack 5 v5.91.0...

What were you expecting to happen?

I expected to get the minimized .svg and .gif files.

What actually happened?

I got 12 errors with main trouble consisting of Expected a 'string', got 'object'.

Please give us a sample of your webpack.config.js

My entire boilerplates are at:

The webpack.config.(js|ts) are at (cwd relative)
configs/webpack/webpack.config.(js|ts).

Terminal output / screenshots

The full log emited by Webpack 5 v5.91.0 via production mode bundle (development one works smoothly)
      $ npm run build
  > boilerplate-webpack-gulp-html-scss-js-components@1.0.0 build
  > webpack --config ./configs/webpack/webpack.config.js --node-env=production --progress

  assets by status 79.2 KiB [cached] 6 assets
  Entrypoint main = main.03f8.css main.3b77.js 2 auxiliary assets
  orphan modules 41.6 KiB (javascript) 997 bytes (runtime) [orphan] 11 modules
  cacheable modules 952 bytes (javascript) 8.23 KiB (css/mini-extract)
    ./projectName/src/index.js + 1 modules 952 bytes [built] [code generated]
    css ./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2]
  .use[3]!./projectName/src/app/styles/index.scss 8.23 KiB [built] [code generated]

  ERROR in Error with 'src/shared/assets/images/svg/footer/_active/rs_school_js_active.2503.svg': Expected a `string`, got `object`

  ERROR in Error with 'src/shared/assets/images/svg/footer/rs_school_js.e17f.svg': Expected a `string`, got `object`

  ERROR in Error with 'src/shared/assets/images/gif/github.30ae.gif': Expected a `string`, got `object`

  ERROR in   Error: Child compilation failed:
    Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\gif\github.gif': Expected a `
    string`, got `object`
    ModuleError: Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\gif\github.gif': Expected a `
    string`, got `object`
        at Object.emitError (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\webpack\lib\NormalModule.js:669:6)
        at Object.loader (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\loader.
    js:159:12)
        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\_active\github log
    o_active.svg': Expected a `string`, got `object`
    ModuleError: Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\_active\github log
    o_active.svg': Expected a `string`, got `object`
        at Object.emitError (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\webpack\lib\NormalModule.js:669:6)
        at Object.loader (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\loader.
    js:159:12)
    Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\_active\rs_school_
    js_active.svg': Expected a `string`, got `object`
    ModuleError: Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\_active\rs_school_
    js_active.svg': Expected a `string`, got `object`
        at Object.emitError (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\webpack\lib\NormalModule.js:669:6)
        at Object.loader (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\loader.
    js:159:12)
    Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\github logo.svg':
    Expected a `string`, got `object`
    ModuleError: Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\github logo.svg':
    Expected a `string`, got `object`
        at Object.emitError (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\webpack\lib\NormalModule.js:669:6)
        at Object.loader (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\loader.
    js:159:12)
    Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\rs_school_js.svg':
    Expected a `string`, got `object`
    ModuleError: Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):
    Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\rs_school_js.svg':
    Expected a `string`, got `object`
        at Object.emitError (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\webpack\lib\NormalModule.js:669:6)
        at Object.loader (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\loader.
    js:159:12)
    Error with 'src/shared/assets/images/svg/footer/_active/rs_school_js_active.2503.svg': Expected a `string`, got `object`
    Error: Error with 'src/shared/assets/images/svg/footer/_active/rs_school_js_active.2503.svg': Expected a `string`, got `object`
        at Object.imageminMinify [as implementation] (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer
    -webpack-plugin\dist\utils.js:576:22)
        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
        at async worker (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\worker.j
    s:76:25)
        at async E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\index.js:326:18
    Error with 'src/shared/assets/images/svg/footer/rs_school_js.e17f.svg': Expected a `string`, got `object`
    Error: Error with 'src/shared/assets/images/svg/footer/rs_school_js.e17f.svg': Expected a `string`, got `object`
        at Object.imageminMinify [as implementation] (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer
    -webpack-plugin\dist\utils.js:576:22)
        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
        at async worker (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\worker.j
    s:76:25)
        at async E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\index.js:326:18
    Error with 'src/shared/assets/images/gif/github.30ae.gif': Expected a `string`, got `object`
    Error: Error with 'src/shared/assets/images/gif/github.30ae.gif': Expected a `string`, got `object`
        at Object.imageminMinify [as implementation] (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer
    -webpack-plugin\dist\utils.js:576:22)
        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
        at async worker (E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\worker.j
    s:76:25)
        at async E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\node_modules\image-minimizer-webpack-plugin\dist\index.js:326:18

    - NormalModule.js:669 Object.emitError
      [boilerplate-webpack-gulp-html-scss-js-components]/[webpack]/lib/NormalModule.js:669:6

    - loader.js:159 Object.loader
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/loader.js:159:12

    - task_queues:95 process.processTicksAndRejections
      node:internal/process/task_queues:95:5

    - Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):

    - Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\_active\github l
      ogo_active.svg': Expected a `string`, got `object`

    - ModuleError: Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):

    - Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\_active\github l
      ogo_active.svg': Expected a `string`, got `object`

    - NormalModule.js:669 Object.emitError
      [boilerplate-webpack-gulp-html-scss-js-components]/[webpack]/lib/NormalModule.js:669:6

    - loader.js:159 Object.loader
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/loader.js:159:12

    - Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):

    - Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\_active\rs_schoo
      l_js_active.svg': Expected a `string`, got `object`

    - ModuleError: Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):

    - Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\_active\rs_schoo
      l_js_active.svg': Expected a `string`, got `object`

    - NormalModule.js:669 Object.emitError
      [boilerplate-webpack-gulp-html-scss-js-components]/[webpack]/lib/NormalModule.js:669:6

    - loader.js:159 Object.loader
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/loader.js:159:12

    - Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):

    - Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\github logo.svg'
      : Expected a `string`, got `object`

    - ModuleError: Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):

    - Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\github logo.svg'
      : Expected a `string`, got `object`

    - NormalModule.js:669 Object.emitError
      [boilerplate-webpack-gulp-html-scss-js-components]/[webpack]/lib/NormalModule.js:669:6

    - loader.js:159 Object.loader
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/loader.js:159:12

    - Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):

    - Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\rs_school_js.svg
      ': Expected a `string`, got `object`

    - ModuleError: Module Error (from ./node_modules/image-minimizer-webpack-plugin/dist/loader.js):

    - Error with 'E:\Code learning\boilerplate-webpack-gulp-html-scss-js-components\projectName\src\shared\assets\images\svg\footer\rs_school_js.svg
      ': Expected a `string`, got `object`

    - NormalModule.js:669 Object.emitError
      [boilerplate-webpack-gulp-html-scss-js-components]/[webpack]/lib/NormalModule.js:669:6

    - loader.js:159 Object.loader
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/loader.js:159:12

    - Error with 'src/shared/assets/images/svg/footer/_active/rs_school_js_active.2503.svg': Expected a `string`, got `object`

    - Error: Error with 'src/shared/assets/images/svg/footer/_active/rs_school_js_active.2503.svg': Expected a `string`, got `object`

    - utils.js:576 Object.imageminMinify [as implementation]
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/utils.js:576:22

    - task_queues:95 process.processTicksAndRejections
      node:internal/process/task_queues:95:5

    - worker.js:76 async worker
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/worker.js:76:25

    - index.js:326
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/index.js:326:18

    - Error with 'src/shared/assets/images/svg/footer/rs_school_js.e17f.svg': Expected a `string`, got `object`

    - Error: Error with 'src/shared/assets/images/svg/footer/rs_school_js.e17f.svg': Expected a `string`, got `object`

    - utils.js:576 Object.imageminMinify [as implementation]
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/utils.js:576:22

    - task_queues:95 process.processTicksAndRejections
      node:internal/process/task_queues:95:5

    - worker.js:76 async worker
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/worker.js:76:25

    - index.js:326
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/index.js:326:18

    - Error with 'src/shared/assets/images/gif/github.30ae.gif': Expected a `string`, got `object`

    - Error: Error with 'src/shared/assets/images/gif/github.30ae.gif': Expected a `string`, got `object`

    - utils.js:576 Object.imageminMinify [as implementation]
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/utils.js:576:22

    - task_queues:95 process.processTicksAndRejections
      node:internal/process/task_queues:95:5

    - worker.js:76 async worker
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/worker.js:76:25

    - index.js:326
      [boilerplate-webpack-gulp-html-scss-js-components]/[image-minimizer-webpack-plugin]/dist/index.js:326:18

    - child-compiler.js:174
      [boilerplate-webpack-gulp-html-scss-js-components]/[html-webpack-plugin]/lib/child-compiler.js:174:18

    - Compiler.js:605 finalCallback
      [boilerplate-webpack-gulp-html-scss-js-components]/[webpack]/lib/Compiler.js:605:5

    - Compiler.js:640
      [boilerplate-webpack-gulp-html-scss-js-components]/[webpack]/lib/Compiler.js:640:11

    - Compiler.js:1329
      [boilerplate-webpack-gulp-html-scss-js-components]/[webpack]/lib/Compiler.js:1329:17


    - task_queues:95 process.processTicksAndRejections
      node:internal/process/task_queues:95:5

Please provide the following information:

OS & version [e.g. MacOS Catalina 10.15.4]: Windows 10 Pro v1803 (i.e. Windows 10 v10.0.17134)
node version (run node -v): v21.7.1
npm version (run npm -v): 10.7.0
Webpack version (run npx webpack -v): 5.91.0
imagemin version: 9.0.0
imagemin-svgo: 11.0.0

(more details via package.json s at
boilerplate-webpack-gulp-html-scss-js-components
and
boilerplate-webpack-gulp-html-scss-ts-components
)

Steps to reproduce:

  • copy the boilerplate
  • install the dependencies
  • check out that the command
npm run html

works fine;

  • remove imagemin and imagemin-svgo via
npm un imagemin imagemin-svgo
  • install actual imagemin and imagemin-svgo packages via
npm i -D imagemin imagemin-svgo
  • run
npm run build

Additional information

The exceptions are emitted only via actual imagemin v9.0.0 and imagemin-svgo v11.0.0 usage, previous ones work fine.
I hope it'll help to find the problem...

@jessehs
Copy link

jessehs commented May 16, 2024

For what it's worth I don't believe that the PR actually fixed the problem for me. It solved the error message, but it looks like the SVG images were not actually getting optimized anymore. I ended up going a different route and no longer using this package, so I can't help on this issue any further. 🤷

@caugner
Copy link

caugner commented May 27, 2024

FWIW The v5 release notes of is-svg state:

  • It no longer accepts a Buffer.
    • To migrate, simply call .toString() on the buffer before passing it in here.

caugner added a commit to mdn/yari that referenced this issue May 27, 2024
imagemin-svgo v11.0.0 incorrectly calls isSvg(), breaking the filechecker:

See: imagemin/imagemin-svgo#62

Co-authored-by: Claas Augner <495429+caugner@users.noreply.github.com>
@alexander-akait
Copy link

alexander-akait commented Jun 4, 2024

For developers who uses https://github.com/webpack-contrib/image-minimizer-webpack-plugin, we allow directly usage svgo, so you can use https://github.com/webpack-contrib/image-minimizer-webpack-plugin?tab=readme-ov-file#optimize-with-svgo, also we support multiple minimizers, i.e. your configuration can be like:

new ImageMinimizerPlugin({
  minimizer: [
    {
      implementation: ImageMinimizerPlugin.imageminMinify,
      options: {
        // Lossless optimization with custom option
        // Feel free to experiment with options for better result for you
        plugins: [
          ["gifsicle", { interlaced: true }],
          ["jpegtran", { progressive: true }],
          ["optipng", { optimizationLevel: 5 }],
        ],
      },
    },
    {
      implementation: ImageMinimizerPlugin.svgoMinify,
      options: {
        encodeOptions: {
          // Pass over SVGs multiple times to ensure all optimizations are applied. False by default
          multipass: true,
          plugins: [
            {
              name: "preset-default",
              params: {
                overrides: {
                  removeViewBox: false,
                  addAttributesToSVGElement: {
                    params: {
                      attributes: [{ xmlns: "http://www.w3.org/2000/svg" }],
                    },
                  },
                },
              },
            },
          ],
        },
      },
    },
  ],
});

@Dmitriy-Frostoff
Copy link

For developers who uses https://github.com/webpack-contrib/image-minimizer-webpack-plugin, we allow directly usage svgo, so you can use https://github.com/webpack-contrib/image-minimizer-webpack-plugin?tab=readme-ov-file#optimize-with-svgo, also we support multiple minimizers, i.e. you configuration can be like:

new ImageMinimizerPlugin({
  minimizer: [
    {
      implementation: ImageMinimizerPlugin.imageminMinify,
      options: {
        // Lossless optimization with custom option
        // Feel free to experiment with options for better result for you
        plugins: [
          ["gifsicle", { interlaced: true }],
          ["jpegtran", { progressive: true }],
          ["optipng", { optimizationLevel: 5 }],
        ],
      },
    },
    {
      implementation: ImageMinimizerPlugin.svgoMinify,
      options: {
        encodeOptions: {
          // Pass over SVGs multiple times to ensure all optimizations are applied. False by default
          multipass: true,
          plugins: [
            {
              name: "preset-default",
              params: {
                overrides: {
                  removeViewBox: false,
                  addAttributesToSVGElement: {
                    params: {
                      attributes: [{ xmlns: "http://www.w3.org/2000/svg" }],
                    },
                  },
                },
              },
            },
          ],
        },
      },
    },
  ],
});

Alexander, you ' re great Wizard!)))) 🔮🔮🔮🔮🔮
Thank you a lot!))))
Would you have any mind if I copied your answer and paste it to my imagemin/imagemin#417 for next developers with same problem?

@alexander-akait
Copy link

@Dmitriy-Frostoff ⭐ Done

@timmywil
Copy link

I'm not using webpack, but I started using svgo and is-svg directly.

import imagemin from 'imagemin'
import imageminPng from 'imagemin-pngquant'
import isSVG from 'is-svg'
import { optimize as optimizeSVG } from 'svgo'

// ...
await imagemin(
  [
    './public/**/*.{png,svg}',
  ],
  {
    plugins: [
      async (buffer) => {
        const stringData = buffer.toString()
        if (isSVG(stringData)) {
          const result = optimizeSVG(stringData, { multipass: true })
          return Buffer.from(result.data)
        }
        return buffer
      },
      imageminPng({
        quality: [1, 1]
      })
    ]
  }
)
// ...

@sindresorhus
Copy link
Contributor

#64

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants