Version 1.0.0
@stackline/import-meta-resolve
Resolve things like Node.js — ponyfill for `import.meta.resolve`
Independent maintenance of import-meta-resolve 4.2.0. Original authors and licenses are retained.
Installation
# Preserve existing imports with an npm alias
npm install import-meta-resolve@npm:@stackline/import-meta-resolve@1.0.0
# Or use the scoped package name in your imports
npm install @stackline/import-meta-resolve@1.0.0Node.js: See compatibility notes. Read the compatibility and maintenance notes before migrating.
Usage and API
The reference below may retain upstream package names. Use the alias installation above to run those imports with this Stackline release.
import-meta-resolve
Resolve things like Node.js.
Contents
- What is this?
- When to use this?
- Install
- Use
- API
- Algorithm
- Differences to Node
- Types
- Compatibility
- Contribute
- License
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 passimport.meta.urlor 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, etcparent(URL, example:import.meta.url) — full URL (to a file) thatspecifieris resolved relative fromconditions(Set<string>, default:new Set(['node', 'import'])) — conditionspreserveSymlinks(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'— whenspecifieris invalid (example:'#')'ERR_INVALID_PACKAGE_CONFIG'— when apackage.jsonis invalid (example: invalid JSON)'ERR_INVALID_PACKAGE_TARGET'— when apackage.jsonexportsorimportsis invalid (example: when it does not start with'./')'ERR_MODULE_NOT_FOUND'— whenspecifiercannot be found inparent(example:'some-missing-package')'ERR_NETWORK_IMPORT_DISALLOWED'— thrown when trying to resolve a local file or builtin from a remote file (node:fsrelative 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'— whenconditionsis 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
parentdefaulting toimport.meta.urlcannot 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-mainwork - no support for
WATCH_REPORT_DEPENDENCIESenv 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#sliceor 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
Upstream issues and maintenance review
Upstream origin and triage
- Original package:
import-meta-resolve@4.2.0 - Repository: https://github.com/wooorm/import-meta-resolve
- Source commit: https://github.com/wooorm/import-meta-resolve/commit/88a0e387cb4617c0f03217026adef2208018d41a
- Source directory:
. - npm tarball: https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz
- SHA512 integrity:
sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg== - npm last-release age selects maintenance scope; it does not imply no ongoing source development.
Reviewed issues
Primary-source snapshot: 2026-09-29T00:22:22.754964+00:00. Most recently updated 100 open and 30 closed issue/PR entries; PRs removed. This is triage evidence, not a claim of exhaustive review.
Correct the duplicated object type in argument errors (issue 35) and parse data URL MIME headers in bounded linear work (issue 33).
- 35: types.slice(pos, 1) in errors.js should be splice — 'object' is never removed from the type list
- 34: Allow
#/subpath imports — sync with Node v25.4.0 (nodejs/node#60864)
The structured snapshot in .stackline/issue-triage.json also records recently closed reports. Issues for unrelated packages in shared monorepositories were qualified as outside this fork’s runtime scope. No maintainer was contacted.
Single-wildcard diagnostic substitution is expressed explicitly, retaining the Node resolver behavior; it is not a sanitizer and does not replace multiple wildcards.
Release files and references
Package bytes, npm provenance and the immutable GitHub release were verified for this version. Security checks describe the reviewed release; documented compatibility risks and upstream reports are not blanket claims of resolution.