@abxvn/resolve
v2.0.1
Published
Async resolve with pnp supports
Downloads
10
Maintainers
Readme
@abxvn/resolve
Provide an async node require.resolve algorithmn
, with extra features:
- ⚡ Blazingly faster comparing to vanilla require.resolve (bench) (Especially when you need to work with large amount of modules)
- 🌟 Supports resolving with Yarn PnP API
- 🌇 Supports resolving local packages, Yarn and Npm global packages, symlinks, workspaces, directory and files
- Allow multiple module resolving using wildcard (*) (coming soon)
- Allow advanced search using file contents search (coming soon)
Table of contents
Installation
Pick one of these commands to install:
pnpm add @abxvn/resolve
yarn add @abxvn/resolve
npm install --save @abxvn/resolve
Usage
Resolve in async way
The resolve
supports asynchronously resolving:
- full path to a file
- or a module's main (entry) path, to be used with
require
import { resolve } from `@abxvn/resolve`
// Entry point / main to require
// pnp: <dir>/.yarn/cache/.../packageA/index.js
// non-pnp: <dir>/node_modules/packageA/index.js
console.log(resolve('packageA'))
// full path <dir>/src/index.js
console.log(resolve('./src/index.js'))
// full path <dir>/packages/workspaceA/main.js
// (main.js) is defined in workspaceA's package.json
console.log(resolve('workspaceA'))
console.log(resolve('../localWorkspaceB'))
Resolve modules
The resolveModule
supports asynchronously resolving module metadata
import { resolveModule } from `@abxvn/resolve`
console.log(resolveModule('packageA')) // => IModule
console.log(resolveModule('workspaceA')) // => IModule
console.log(resolveModule('../localWorkspaceB')) // => IModule
The resolved module metadata is:
interface IModule {
// whether the module exists or not
exists: boolean
// input resolve query
query: string
// module dir path
path: string
// module main (entry) script
main: string
// module name
name: string
// module version
version: string
// module dependencies
dependencies: string[]
// error while resolving module
error?: Error
}
Options
We can pass custom options into the resolver:
import { resolve } from `@abxvn/resolve`
resolve('moduleB', options)
All options are optional (We already provided a good configuration for you): | Name | Type | Description | Default | |:---------------------:|:--------:|:-------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------:| | callerPath | string | Base path to resolve requested modules | current script path (or working directory) | | moduleDirs | string[] | (non pnp) node_modules paths | resolving up algorithm including global npm or yarn packages |
Play with CLI
You can quickly get any modules or files requirable path by this command:
resolve <...paths>
if you want CLI to search for module metadata, please call with flag -m
or --metadata
, for example:
resolve @abxvn/resolve lodash -m
Resolve in classic way
You can also resolve
in classic, I mean synchronously resolving, but with this tool's extra features as mentioned earlier:
- Custom caller path for starting point of resolving
- Custom list of node_modules dirs for searching
import { resolveSync } from `@abxvn/resolve`
// Entry point / main to require
// pnp: <dir>/.yarn/cache/.../packageA/index.js
// non-pnp: <dir>/node_modules/packageA/index.js
console.log(resolveSync('packageA'))
// full path <dir>/src/index.js
console.log(resolveSync('./src/index.js'))
Benchmarks
We tested with 2 cases, to compare speed using vanilla require.resolve
and this library's resolver. Here are the results:
Test loading 10 packages
Test loading 80 packages
All tests were done on my Mac intel i5 10th (2020), RAM 16 GB
Changelog
See CHANGELOG.md
Contribution
All PRs and ideas for improvement are welcomed.
If you got any issues using this package, don't hesitate to create new 🐞 Bug report with a proper package:<name>
label.
Feel free to clone this project, make changes that your feel necessary and pull request anytime you want.
Install dependencies and run development build:
yarn install
yarn start
Working on your first Pull Request?
You can learn how from this free video series: How to Contribute to an Open Source Project on GitHub
To help you get your feet wet and get you familiar with our contribution process, we have a list of good first issues that contain bugs that have a relatively limited scope. This is a great place to get started.
Cheers 🍻