Running a jest test results in a test build failure:
TypeError: dupMap.get is not a function
at ModuleMap._getModuleMetadata (node_modules/jest-haste-map/build/ModuleMap.js:231:14)
When console logging dupMap
at the source location, dupMap
is undefined. I don't see a control flow where this is possible because when dupMap is declared, it is set to EMPTY_MAP if it's value would be undefined.
The error is also bound to a material-ui style object, which doesn't make much sense.
Steps to reproduce the behavior:
I'm afraid I don't have a reproduction. I'm using lerna
and material-ui
in jest. The library I'm experiencing the issue with is dependent on another library in my mono repo.
The test runs without problems
Unavailable, sorry
```npx: installed 1 in 1.515s
System:
OS: Linux 5.0 Ubuntu 18.04.2 LTS (Bionic Beaver)
CPU: (12) x64 Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
Binaries:
Node: 10.16.0 - /usr/local/bin/node
Yarn: 1.17.3 - /usr/bin/yarn
npm: 6.9.0 - /usr/local/bin/npm
npmPackages:
jest: ^24.9.0 => 24.9.0
My jest config:
"jest": {
"collectCoverageFrom": [
"packages//.{js,jsx,mjs}",
"!packages//common/icons/components/",
"!packages//.stories.{js,jsx,ts,tsx}",
"!packages///story//.{js,jsx,ts,tsx}"
],
"moduleDirectories": [
"node_modules"
],
"setupFilesAfterEnv": [
"
],
"setupFiles": [
"
],
"testMatch": [
"
],
"testEnvironment": "jsdom",
"testURL": "http://localhost",
"transform": {
"^.+\.(js|jsx|mjs)$": "
"^.+\.css$": "
"^(?!.*\.(js|jsx|mjs|css|json)$)": "
},
"transformIgnorePatterns": [
"[/\\]node_modules[/\\].+\.(js|jsx|mjs)$"
],
"moduleFileExtensions": [
"web.js",
"js",
"json",
"web.jsx",
"jsx",
"node",
"mjs",
"ts",
"tsx"
]
```
Hi! I managed to figure it out by reading over your lovely example project :)
I was missing these properties:
"modulePathIgnorePatterns": [
"packages/.*/build"
],
"projects": ["<rootDir>/packages/*"],
Thanks!!
@CameronAckermanSEL i'm getting this at the moment. Might you know why the solution above worked? and what might have caused this, this solution doesn't seem work for me. I'm on lerna v2
@CameronAckermanSEL I get that error too but it happens when I import a module from a custom library
~~~
jest --no-cache
jest-haste-map: Haste module naming collision: my-lib
The following files share their name; please adjust your hasteImpl:
*
*
PASS src/app/services/test.service.spec.ts
PASS projects/my-lib/src/lib/components/button/button.component.spec.ts
FAIL src/app/app.component.spec.ts
● Test suite failed to run
TypeError: dupMap.get is not a function
3 | import { TestService } from './services/test.service';
4 | import { of } from 'rxjs';
> 5 | import { MyLibModule } from 'my-lib';
| ^
6 |
7 | jest.mock("./services/test.service");
8 |
at ModuleMap._getModuleMetadata (node_modules/jest-haste-map/build/ModuleMap.js:231:14)
at Object.<anonymous> (src/app/app.component.spec.ts:5:1)
Test Suites: 1 failed, 2 passed, 3 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 6.013s
~~~
This is the .spec.ts file
~~~
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { TestService } from './services/test.service';
import { of } from 'rxjs';
import { MyLibModule } from 'my-lib';
jest.mock("./services/test.service");
describe('AppComponent', () => {
let component: AppComponent;
let fixture: ComponentFixture
let testService: TestService;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [AppComponent],
imports : [MyLibModule],
providers: [TestService]
})
.compileComponents();
}));
beforeEach(() => {
testService = TestBed.get(testService);
jest.spyOn(testService, "getResource").mockReturnValue(
of({
username: 'Brent'
})
);
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
~~~
Facing the same issue, I have my own custom library as shared project on angular. I have all necessary things like moduleNameMapper
but still the issue is there.
think i might have found what caused this. If you make any updates to package-lock this happens 😕 , when i removed any changes on my parent package lock. This error got resolved
We should never have TypeError
s internally, no matter what your config is. Can anyone provide a full, minimal reproduction we can clone and run locally to see the error?
Create a library project along with normal angular application
ng new my-workspace --createApplication="false"
cd my-workspace
ng generate application my-app
ng generate library my-lib
Output path for library project will be dist/my-lib
and for application it should dist/my-app
In main tsconfig.json "paths": {
"@custom/my-lib": [
"dist/my-lib"
],
"@custom/my-lib/*": [
"dist/my-lib/*"
]
}
In jest.config.js add configuration for path mapper as moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths || {}, {
prefix: '<rootDir>/'
})
And in one of the spec/test file use the library as import { Something} from '@custom/my-lib'
This fails at the above import with the error as dupMap.get is not a function
.
PS: Jasmine framework works fine for same test
I have encountered this too in a mixed TypeScript and JavaScript project that uses Vue. As with the other posters, this happens when importing a class from another custom library that is included as a git submodule, referenced from package.json
using file:
syntax. The error occurs several layers deep in the import hierarchy, not from an import from the .spec file itself. So the import hierarchy is:
thing.spec.ts
import { MyComponent } from 'MyComponent.vue'
import { SomeModel } from '@my-org/package-name'
import { AnotherModel } from './local_file'
import { Utility } from '@my-org/another-package'
The error is raised at the fourth level down, when importing Utility
from @my-org/another-package
:
TypeError: dupMap.get is not a function
> 1 | import { Utility } from '@my-org/another-package'
| ^
at ModuleMap._getModuleMetadata (node_modules/jest-haste-map/build/ModuleMap.js:231:14)
at Object.<anonymous> (--redacted local path--.js:1:1)
@isumeetk thanks, but could you do those steps in a repo and publish that? I tried to follow your steps but step 3 is unclear (paths
is already in the file - should I replace or add to it?), step 4 is unclear (should I create this file? What is pathsToModuleNameMapper
?) and step 5 is unclear since I don't know which file to make the change.
I could probably figure out these things if I spent some time on it, but it's a higher barrier than need be here. Either a repo I can clone, or a repl.it/codesandbox would be ideal. Ideally I should be able to clone, install, and run to see the error
PS: Jasmine framework works fine for same test
Not sure what this means - jasmine instead of jest, or using jest-jasmine (which is the default test runner within jest)?
Well this is interesting, while creating a repo to reproduce something made it work, both in reproducing repo and the my main repo. Still for people who want to go through the working structure here is the repo https://github.com/isumeetk/jest-angular-sample
I have the same issue when I import a module from a custom library, just like @franjpr.
Any solution?
For the umpteenth time, if you want it fixed somebody needs to put together a repository, or some other reproduction, where we can see the error.
https://www.snoyman.com/blog/2017/10/effective-ways-help-from-maintainers
not sure if this will help, but i am seeing this issue on a lerna repo i'm setting up. it seems to be an issue with symlinks and copies (still figuring it out since i inherited the code). deleted some symlinks/copies before running tests made this issue go away.
main issue is that the dupMap
object is not a Map
instance. here's what it looks like for me:
[
[
"g",
[
[
"packages/components/lib/utils/package.json",
1
],
[
"packages/utils/package.json",
1
]
]
]
]
i'm guessing something isn't creating a Map
object in this._raw.duplicates.get(name)
properly?
Hi all,
Here is a minimal repository where this bug is reproduced: https://github.com/WilliamChelman/angular-jest-bug-repro
How-to:
npm ci
npm t
Cannot find module '@me/lib-a' from 'lib-b.component.ts'
Require stack:
projects/me/lib-b/src/lib/lib-b.component.ts
projects/me/lib-b/src/lib/lib-b.component.spec.ts
- This is expected since in our tsconfig.json we have the paths that point to a built version of the package in dist/
npm run build-all
npm t
- This fails with
The name@me/lib-a
was looked up in the Haste module map. It cannot be resolved, because there exists several different files, or packages, that provide a module for that
particular name and platform. The platform is generic (no extension). You must delete or blacklist files until there remains only one of these:
/home/william/Dev/other/angular-jest-bug/dist/me/lib-a/package.json
(package)
/home/william/Dev/other/angular-jest-bug/projects/me/lib-a/package.json
(package)
Some of the leads that were explored to fix this, but to no avail and usually end up with the "dupMap.get is not a function" error:
Solution that did work but felt dirty: change projects/me/lib-a/ng-package.json to
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../node_modules/@me/lib-a", // here
"lib": {
"entryFile": "src/public-api.ts"
}
}
So that the build is put in the node_modules directly, so then it's considered as any other external lib when tests are launched.
To whoever read this, have a great day :smile:
EDIT: doesn't really reproduce the dupMap.get error unfortunately, but leaving this at least for the ng-package.json hack that might help someone.
@WilliamChelman I'm unable to reproduce. I get the haste errors you note, but
moduleDirectories: ['node_modules', 'dist']
makes no differencemodulePathIgnorePatterns: ['/projects']
makes it find no testsmodyfing paths in tsconfig
entails so I didn't touch that part.I haven't done any angular since v1, so there might be some detail I'm missing.
Could you add a commit to that repo so that I can run npm cit
and get the dupMap.get is not a function
error?
For some reason I'm currently unable to reproduce the dupMap.get error, even if it was that same error that brought me here... But now that I think of it (after sleeping a bit), it seems like the issue I have might be more for ts-jest in fact, since it looks like it is the tsconfig file that doesn't bode well with module resolution in this context. I'll see to create an issue on their side instead, thank you for your time @SimenB .
I still think this is a bug in Jest somehow, if nothing else we should provide a better error. So if you figure out why you get the error please report back so we can improve things 👍
@SimenB just ran into this same problem, and it appears that I needed to ignore my output folders as @CameronAckermanSEL mentioned.
modulePathIgnorePatterns: ["packages/*/dist"]
for me, as I have a mono-repo where all package sources are in packages/**/src/*
and packages/**/dist
is where they build to.
Hopefully someone else will find this helpful :)
I was able to get rid of this error by calling jest --clearCache, probably because I had fixed one of the other causes listed above, but the cache retained the error?
I'm working in an Angular CLI project with an application and a library.
It get it working by:
...
"dest": "../../node_modules/@my-domain/my-library",
...
"paths": {
"@my-domain/my-library": [
"../node_modules/@my-domain/my-library"
]
}
I just resolved same problem with angular project by this config:
// jest.config.js
module.exports = {
preset: 'jest-preset-angular',
setupFilesAfterEnv: ['<rootDir>/src/setupJest.ts'],
testRegex: ...,
roots: ['<rootDir>/src'],
modulePaths: ['<rootDir>/dist'],
};
More at Medium
I ran into this same issue today. For me the issue was related to using yalc to develop multiple dependent repos.
The problem disappeared after I removed all yalc installations (yalc remove --all
in every repo and then verified that yalc installations show
was empty)
I have the same issue in my Angular project. For some reason, when I remove package.json
in (projects/my-project
, not the one in my root), the error is gone.
I got this error when I added a path mapping to my project from my tsconfig.spec.json
:
{
"compilerOptions": {
"paths": {
"my-project": ["projects/my-project/src/public-api.ts"]
}
}
}
And, my jest.config.js
:
module.exports = {
moduleNameMapper: {
"my-project": "<rootDir>/projects/my-project/src/public-api.ts"
},
};
However, I need my package.json
there because it is the one that gets packaged by Angular.
My workaround was to rename the path mapping of my-project
to my-project-api
, which fixed the issue.
Can you put together a reproduction? I'd like to fix this so people don't need any workarounds (or at least give a clearer/actionable error)
I have found the issue. I will describe it here and post a reproducible demo in a bit. Here is what happens:
dist/
).
Case 1: If I run npm test
from root, everything will pass without issues.
Case 2: Build library using npm run build
in <monorepo-root>/my-library
. Then, run tests from root. This will give dupMap.get
error.
Jest version: ^24.9.0
Most helpful comment
Facing the same issue, I have my own custom library as shared project on angular. I have all necessary things like
moduleNameMapper
but still the issue is there.