2.0.1 • Published 4 months ago

@abxvn/resolve v2.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

@abxvn/resolve

build version downloads code style

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 🍻