vuejs / core

🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
https://vuejs.org/
MIT License
46.1k stars 8.07k forks source link

Vue compat with Jest: "TypeError: decode_js.EntityDecoder is not a constructor" #10609

Open baffalop opened 4 months ago

baffalop commented 4 months ago

Vue version

3.4.21 (with @vue/compat 3.4.21)

Link to minimal reproduction

https://stackblitz.com/edit/vue2-jest-8qoex3?file=jest.config.js&view=editor

Steps to reproduce

yarn install
yarn test

What is expected?

I would like to run unit tests with Vue Test Utils, while on the migration build. My application has Vue 2 dependencies which cause unit tests to fail when they are run with Vue 3. I would expect to be able to use the migration build to fix this by aliasing vue to @vue/compat via moduleNameMapper. (This is the approach recommended by vue-test-utils-compat though the minimal reproduction uses latest @vue/test-utils.)

What is actually happening?

Running tests with moduleNameMapper: { '^vue$': '@vue/compat' } causes the following TypeError:

TypeError: decode_js.EntityDecoder is not a constructor
...
at new Tokenizer (node_modules/@vue/compat/dist/vue.cjs.js:13619:28)
      at Object.<anonymous> (tests/unit/example.spec.ts:6:22)

System Info

System:
    OS: Linux 5.0 undefined
    CPU: (8) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
    Memory: 0 Bytes / 0 Bytes
    Shell: 1.0 - /bin/jsh
  Binaries:
    Node: 18.18.0 - /usr/local/bin/node
    Yarn: 1.22.19 - /usr/local/bin/yarn
    npm: 10.2.3 - /usr/local/bin/npm
    pnpm: 8.15.3 - /usr/local/bin/pnpm
  npmPackages:
    vue: ^3.3.4 => 3.4.21 

Any additional comments?

This is the same error as in https://github.com/vuejs/core/issues/10148 though it doesn't affect me at build- or runtime, only in Jest.

baffalop commented 4 months ago

Update: I was mistaken about versions. My ^3.3.4 actually resolved to 3.4. When I pin both vue and @vue/compat to ~3.3.4 the issue goes away. This fits with https://github.com/vuejs/core/issues/10148 which reports the error as only present on 3.4, not 3.3.

codeonmoon commented 3 months ago

Is there any update on this issue further, I am also getting this issue in my project.

lzl0304 commented 1 month ago

The problem is caused by incompatible dependency versions, Vue depends on entities:^4.5.0, but there are other packages that depend on entities:^2.2.0, for some reason the dependency installed by yarn is only entities:^2.2.0, which leads to runtime errors.

I tried to use npm, pnpm to install the dependency is not error, just for reference.