jest: jest-haste-map: TypeError: dupMap.get is not a function

🐛 Bug Report

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.

To Reproduce

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.

Expected behavior

The test runs without problems

Link to repl or repo (highly encouraged)

Unavailable, sorry

envinfo


  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": [
      "<rootDir>/config/jest/setup.js"
    ],
    "setupFiles": [
      "<rootDir>/config/polyfills.js"
    ],
    "testMatch": [
      "<rootDir>/packages/**/?(*.)(spec|test).{js,jsx,mjs}"
    ],
    "testEnvironment": "jsdom",
    "testURL": "http://localhost",
    "transform": {
      "^.+\\.(js|jsx|mjs)$": "<rootDir>/node_modules/babel-jest",
      "^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",
      "^(?!.*\\.(js|jsx|mjs|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
    },
    "transformIgnorePatterns": [
      "[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$"
    ],
    "moduleFileExtensions": [
      "web.js",
      "js",
      "json",
      "web.jsx",
      "jsx",
      "node",
      "mjs",
      "ts",
      "tsx"
    ]

About this issue

  • Original URL
  • State: open
  • Created 5 years ago
  • Reactions: 10
  • Comments: 40 (9 by maintainers)

Most upvoted comments

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 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)

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

Interesting stuff. Thanks for the reproduction @bingtimren, sorry I missed it when you posted it!

If I run the tests with -i (i.e. forcing not to use workers) we get the correct error

    The name `@bingsjs/ts-proj-template` 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 exclude files until there remains only one of these:

      * `/Users/simen/repos/ts-proj-template/build/pack/package/package.json` (package)
      * `/Users/simen/repos/ts-proj-template/package.json` (package)

So there’s something wrong with (de)serialization of the Maps between workers. Will dig some more into this, but for people encountering this - running with -i (short for --run-in-band) should help you debug

  1. 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

  2. Output path for library project will be dist/my-lib and for application it should dist/my-app

  3. In main tsconfig.json "paths": { "@custom/my-lib": [ "dist/my-lib" ], "@custom/my-lib/*": [ "dist/my-lib/*" ] }

  4. In jest.config.js add configuration for path mapper as moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths || {}, { prefix: '<rootDir>/' })

  5. 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

Error:

TypeError: dupMap.get is not a function

       5 |
       6 | import ua from '@searchfe/user-agent';
    >  7 | import compare from 'versions-compare';

Fix:

i output a log in this file (‘node_modules/jest-haste-map/build/ModuleMap.js:209:14’)

name === 'versions-compare' && (console.log(name, ...dupMap));
this._assertNoDuplicates(
  name,
  _constants.default.GENERIC_PLATFORM,
  `supportsNativePlatform,`
  dupMap.get(_constants.default.GENERIC_PLATFORM)
);

found array

versions-compare [
  'g',
  [
    [ 'dist/modules/versions-compare/package.json', 1 ],
    [ 'amd_modules/versions-compare/package.json', 1 ]
  ]
]

because it found 2 pacakges, The answer above give me clue https://github.com/facebook/jest/issues/9021#issuecomment-539369466 @cameracker

Fixed 🚀🚀🚀🚀

modulePathIgnorePatterns: [
    "dist"
],

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.

@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 😃

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!!

Meet this problem on an Angular app with some Angular libs, problem solved after adding moduleNameMapper to root jest.config.js.

see: https://kulshekhar.github.io/ts-jest/docs/getting-started/paths-mapping/

Let’s says we have a Angular lib placed at projects/my-lib, your root tsconfig paths may look like this

{
  ...others
  "compilerOptions": {
    "paths": {
      "@my-scope/my-lib": [
        "dist/my-lib/my-scope-my-lib",
        "dist/my-lib"
      ]
    }
  }
}

Your root jest.config.js will need to set

  • roots to ['<rootDir>/src']
  • moduleNameMapper to map @my-scope/my-lib to projects/my-lib/src/public-api
module.exports = {
  roots: ['<rootDir>/src'],
  moduleNameMapper: {
    '@my-scope/my-lib': '<rootDir>/projects/my-lib/src/public-api',
  },
};

And for my-lib jest.config.js set

  • roots to ['<rootDir>/projects/my-lib']
module.exports = {
  roots: ['<rootDir>/projects/my-lib'],
};

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

@WilliamChelman I’m unable to reproduce. I get the haste errors you note, but

  1. moduleDirectories: ['node_modules', 'dist'] makes no difference
  2. modulePathIgnorePatterns: ['/projects'] makes it find no tests
  3. I don’t know what modyfing 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?

Facing same issue. Anyone solved it?

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.

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)

@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:
    * <rootDir>\dist\my-lib\package.json
    * <rootDir>\projects\my-lib\package.json

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<AppComponent>;
  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();
  });
});

Hoiw about adding (for these who are using yalc): "modulePathIgnorePatterns": ["dist", ".yalc"], ? This solve the issue for me. If I use yalc remove --all like @vilvai mentioned, I’ll loose the dependencies and my project won’t run successfully anymore.

@vladyn, this indeed solves it in a cleaner way.

However, in my case, I thought I got rid of the yalc imported dependencies and reverted to the main package as I was done working on it and was about to commit the package depending on it. It seems that I need to go back to yalc’s documentation and see how to properly clean up (ie. yalc remove --all) and probably see if a commit hook exists to prevent putting a mess in the repo too.

I have the same issue when I import a module from a custom library, just like @franjpr. Any solution?

@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