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

import-meta-resolve

v4.1.0

Published

Resolve things like Node.js — ponyfill for `import.meta.resolve`

Downloads

20,221,496

Readme

import-meta-resolve

Build Coverage Downloads

Resolve things like Node.js.

Contents

What is this?

This package is a ponyfill for import.meta.resolve. It supports everything you need to resolve files just like modern Node does: import maps, export maps, loading CJS and ESM projects, all of that!

When to use this?

As of Node.js 20.0, import.meta.resolve is still behind an experimental flag. This package can be used to do what it does in Node 16–20.

Install

This package is ESM only. In Node.js (version 16+), install with npm:

npm install import-meta-resolve

Use

import {resolve} from 'import-meta-resolve'

// A file:
console.log(resolve('./index.js', import.meta.url))
//=> file:///Users/tilde/Projects/oss/import-meta-resolve/index.js

// A CJS package:
console.log(resolve('builtins', import.meta.url))
//=> file:///Users/tilde/Projects/oss/import-meta-resolve/node_modules/builtins/index.js

// A scoped CJS package:
console.log(resolve('@eslint/eslintrc', import.meta.url))
//=> file:///Users/tilde/Projects/oss/import-meta-resolve/node_modules/@eslint/eslintrc/lib/index.js

// A package with an export map:
console.log(resolve('micromark/lib/parse', import.meta.url))
//=> file:///Users/tilde/Projects/oss/import-meta-resolve/node_modules/micromark/lib/parse.js

// A node builtin:
console.log(resolve('fs', import.meta.url))
//=> node:fs

API

This package exports the identifiers moduleResolve and resolve. There is no default export.

resolve(specifier, parent)

Match import.meta.resolve except that parent is required (you can pass import.meta.url).

Parameters
  • specifier (string) — the module specifier to resolve relative to parent (/example.js, ./example.js, ../example.js, some-package, fs, etc)
  • parent (string, example: import.meta.url) — the absolute parent module URL to resolve from; you must pass import.meta.url or something else
Returns

Full file:, data:, or node: URL (string) to the found thing

Throws

Throws an ErrnoException.

moduleResolve(specifier, parent, conditions, preserveSymlinks)

The “Resolver Algorithm Specification” as detailed in the Node docs (which is slightly lower-level than resolve).

Parameters
  • specifier (string) — /example.js, ./example.js, ../example.js, some-package, fs, etc
  • parent (URL, example: import.meta.url) — full URL (to a file) that specifier is resolved relative from
  • conditions (Set<string>, default: new Set(['node', 'import'])) — conditions
  • preserveSymlinks (boolean, default: false) — keep symlinks instead of resolving them
Returns

A URL object (URL) to the found thing.

Throws

Throws an ErrnoException.

ErrnoException

One of many different errors that occur when resolving (TypeScript type).

Type
type ErrnoExceptionFields = Error & {
  errnode?: number | undefined
  code?: string | undefined
  path?: string | undefined
  syscall?: string | undefined
  url?: string | undefined
}

The code field on errors is one of the following strings:

  • 'ERR_INVALID_MODULE_SPECIFIER' — when specifier is invalid (example: '#')
  • 'ERR_INVALID_PACKAGE_CONFIG' — when a package.json is invalid (example: invalid JSON)
  • 'ERR_INVALID_PACKAGE_TARGET' — when a package.json exports or imports is invalid (example: when it does not start with './')
  • 'ERR_MODULE_NOT_FOUND' — when specifier cannot be found in parent (example: 'some-missing-package')
  • 'ERR_NETWORK_IMPORT_DISALLOWED' — thrown when trying to resolve a local file or builtin from a remote file (node:fs relative to 'https://example.com')
  • 'ERR_PACKAGE_IMPORT_NOT_DEFINED' — when a local import is not defined in an import map (example: '#local' when not defined)
  • 'ERR_PACKAGE_PATH_NOT_EXPORTED' — when an export is not defined in an export map (example: 'tape/index.js', which is not in its export map)
  • 'ERR_UNSUPPORTED_DIR_IMPORT' — when attempting to import a directory (example: './lib/')
  • 'ERR_UNKNOWN_FILE_EXTENSION' — when somehow reading a file that has an unexpected extensions ('./readme.md')
  • 'ERR_INVALID_ARG_VALUE' — when conditions is incorrect

Algorithm

The algorithm for resolve matches how Node handles import.meta.resolve, with a couple of differences.

The algorithm for moduleResolve matches the Resolver Algorithm Specification as detailed in the Node docs (which is sync and slightly lower-level than resolve).

Differences to Node

  • parent defaulting to import.meta.url cannot be ponyfilled: you have to explicitly pass it
  • no support for loaders (that would mean implementing all of loaders)
  • no support for CLI flags: --conditions, --experimental-default-type, --experimental-json-modules, --experimental-network-imports, --experimental-policy, --experimental-wasm-modules, --input-type, --no-addons, --preserve-symlinks, nor --preserve-symlinks-main work
  • no support for WATCH_REPORT_DEPENDENCIES env variable
  • no attempt is made to add a suggestion based on how things used to work in CJS before to not-found errors
  • prototypal methods are not guarded: Node protects for example String#slice or so from being tampered with, whereas this doesn’t

Types

This package is fully typed with TypeScript. It exports the additional type ErrnoException.

Compatibility

This package is at least compatible with all maintained versions of Node.js. As of now, that is Node.js 16 and later.

Contribute

Yes please! See How to Contribute to Open Source.

License

MIT © Titus Wormer and Node.js contributors