What is jest-haste-map?
The jest-haste-map npm package is a utility for building a Haste map, which is a mapping from module names to file paths. It is used by Jest to quickly resolve module dependencies for tests by keeping an in-memory map of all available modules. It can handle duplicate module names and provides a way to query the map for a specific module.
What are jest-haste-map's main functionalities?
Building a Haste Map
This code sample demonstrates how to create a new HasteMap instance with a configuration object, build the map, and then use it to get the module name for a specific file.
const HasteMap = require('jest-haste-map');
const config = {
// These options are required:
roots: ['/path/to/project'],
extensions: ['js', 'json'],
platforms: ['ios', 'android'],
// You can provide additional options:
computeSha1: true,
// other options...
};
const hasteMap = new HasteMap(config);
hasteMap.build().then(map => {
console.log(map.hasteFS.getModuleName('/path/to/project/file.js'));
});
Querying the Haste Map
This code sample shows how to query the built Haste map for the path of a module given its name, platform, and whether it supports the native platform.
hasteMap.build().then(map => {
const modulePath = map.moduleMap.getModule('moduleName', 'platform', 'supportsNativePlatform');
console.log(modulePath);
});
Other packages similar to jest-haste-map
metro
Metro is a JavaScript bundler for React Native applications. It includes a Haste map implementation similar to jest-haste-map, but it is tailored specifically for React Native and includes additional features for bundling and transforming code.
webpack
Webpack is a powerful module bundler for JavaScript applications. While it does not use a Haste map, it provides a similar functionality through its own resolution mechanism, which can handle complex dependency graphs and offers a wide range of plugins for different tasks.
browserify
Browserify is a tool for bundling JavaScript files for usage in the browser. Like webpack, it does not use a Haste map, but it allows developers to require modules in the browser by bundling up all dependencies. It's simpler than webpack and may be more suitable for smaller projects.
jest-haste-map
jest-haste-map
is a module used by Jest, a popular JavaScript testing framework, to create a fast lookup of files in a project. It helps Jest efficiently locate and track changes in files during testing, making it particularly useful for large projects with many files.
why jest-haste-map ?
- Parallel crawling and analysis: jest-haste-map crawls the entire project, extracts dependencies, and analyzes files in parallel across worker processes.This can significantly improve the performance of the map building process.
- Cached file system: jest-haste-map keeps a cache of the file system in memory and on disk. This allows for fast file related operations, such as resolving module imports and checking for changes.
- Minimal work: jest-haste-map only does the minimal amount of work necessary when files change. (If you are using watchman (recommended for large projects), Jest will ask watchman for changed files instead of crawling the file system. This is very fast even if you have tens of thousands of files.)
- File system watching: jest-haste-map can watch the file system for changes. This is useful for building interactive tools, such as watch mode.
Installation
with npm :
npm install jest-haste-map --save-dev
with yarn :
yarn add jest-haste-map --dev
usage
jest-haste-map
is compatible with both ES modules
and CommonJS
simple usage
const map = new HasteMap.default({
});
Example usage (get all files with .js extension in the project)
import HasteMap from 'jest-haste-map';
import os from 'os';
import {dirname} from 'path';
import {fileURLToPath} from 'url';
const root = dirname(fileURLToPath(import.meta.url));
const map = new HasteMap.default({
id: 'myproject',
extensions: ['js'],
maxWorkers: os.availableParallelism(),
platforms: [],
roots: [root],
retainAllFiles: true,
rootDir: root,
});
const {hasteFS} = await map.build();
const files = hasteFS.getAllFiles();
console.log(files);
options
Option | Type | Required | Default Value |
---|
cacheDirectory | string | No | os.tmpdir() |
computeDependencies | boolean | No | true |
computeSha1 | boolean | No | false |
console | Console | No | - |
dependencyExtractor | string | null | No | null |
enableSymlinks | boolean | No | false |
extensions | Array<string> | Yes | - |
forceNodeFilesystemAPI | boolean | Yes | - |
hasteImplModulePath | string | Yes | - |
hasteMapModulePath | string | Yes | - |
id | string | Yes | - |
ignorePattern | HasteRegExp | No | - |
maxWorkers | number | Yes | - |
mocksPattern | string | No | - |
platforms | Array<string> | Yes | - |
resetCache | boolean | No | - |
retainAllFiles | boolean | Yes | - |
rootDir | string | Yes | - |
roots | Array<string> | Yes | - |
skipPackageJson | boolean | Yes | - |
throwOnModuleCollision | boolean | Yes | - |
useWatchman | boolean | No | true |
For more, you can check github