npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@abxvn/resolve

v2.0.1

Published

Async resolve with pnp supports

Downloads

10

Readme

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