Node module resolution that is flexible, synchronous and requires no builtin dependencies.
npm install resolve-syncimport { resolveSync } from "resolve-sync";
const result = resolveSync(id, options);id: The module id or path to resolve (e.g."./file","some-pkg","#alias").options: An object controlling resolution (see below).
This module is designed to optimize speed while resolving in the same way node and bundlers do.
It avoids using any node: built in modules to make using in any environment (including browsers) easy.
- main field (and other fields via
options.fields) - browser field
- custom extensions
- export conditions
- import conditions
The absolute path to the source file (not a directory) where the resolution is initiated. Determines the starting directory and influences relative resolution.
An optional root boundary directory. Module resolution won't ascend beyond this directory when traversing parent paths. Defaults to / if unspecified.
Optional function to mark module ids as external. When true is returned, that id is returned without resolution (useful for built-ins, peer dependencies, or virtual modules).
Defaults:
- In Node.js: uses
node:module'sisBuiltin(treats built-ins as external). - Elsewhere:
() => false(no externals).
const result = resolveSync("fs", {
from: "/project/src/index.js",
external: (id) => id === "fs", // treat 'fs' as external
});
// result === "fs"If silent is set to true, the resolver will suppress errors and return undefined when a module cannot be resolved, instead of throwing an exception. This is useful for optional dependencies or when you want to handle missing modules gracefully.
An optional array of file extensions to try when resolving files without explicit extensions. Defaults to:
[".js", ".json"];Specifies the priority order of package.json fields to look at when resolving package main entries. Defaults to:
["module", "main"]ifbrowserisfalseor unset.["browser", "module", "main"]ifbrowseristrue.
When true, this flag enables require conditions in exports maps. Default is false.
Partially implements the package.json browser field specification.
- Prioritizes the
browserfield in package.json when selecting entry points. - Enables
browserremapping for internal paths (e.g.,browser: { "./main.js": "./shim.js" }).
Note: Remaps defined in the
browserfield are only applied when resolving the module as a dependency (e.g.,some-module/foo). They do not affect relative paths like./foothat are resolved from within the module itself. Module remaps in the browser field likewise are not supported.
A list of custom export conditions to use during resolution of package exports and imports fields. These conditions are matched in order and function identically to how conditions are interpreted by the wonderful resolve.exports module.
fs?: { isFile(file: string): boolean; readPkg(file: string): unknown; realpath?(file: string): string; }
A partial filesystem interface used by the resolver. If running in node, and not provided, a default node:fs based implementation is used. Must implement:
isFile(file: string): boolean– checks if the file exists and is a file.readPkg(file: string): unknown– reads and parses a JSON file (e.g.,package.json).realpath?(file: string): string– optionally resolves symlinks or returns the canonical path.
For use with the --preserve-symlinks flag in Node.js, this option is false by default. If set to true, the resolver will return the symlinked path instead of resolving it to its real path.
import { resolveSync } from "resolve-sync";
const result = resolveSync("./file", {
from: "/project/src/index.js",
});
console.log(result); // => "/project/src/file.js"const result = resolveSync("./file", {
from: "/project/src/index.js",
exts: [".ts", ".js"],
});
// Tries ./file.ts, then ./file.jsconst result = resolveSync("some-pkg", {
from: "/project/src/index.js",
});
// Looks for /project/node_modules/some-pkg/package.json and resolves its main/module fieldconst result = resolveSync("some-pkg", {
from: "/project/src/index.js",
browser: true,
});
// Adds the `browser` export condition.
// If no `exports` field is found will check the "browser" field in package.jsonconst result = resolveSync("some-pkg", {
from: "/project/src/index.js",
require: true,
});
// Replaces the "node" export condition with "require".const result = resolveSync("some-pkg", {
from: "/project/src/index.js",
fields: ["module", "jsnext:main", "main"],
});
// Looks for "module", then "jsnext:main" and finally "main" in package.jsonconst result = resolveSync("some-pkg", {
from: "/project/src/index.js",
conditions: ["worker"],
});
// Adds "worker" to conditions, in this case ["default", "worker", "import", "node"]
const importResult = resolveSync("#alias", {
from: "/project/src/index.js",
});
// Uses the "imports" field in the nearest package.json to find "#alias"const result = resolveSync("some-pkg", {
from: "/project/src/index.js",
root: "/project", // Do not search above /project
});
// Will not resolve modules outside of /projectThis module has no dependencies hard dependencies on node: apis and can easily be used
in browser environments (eg a repl). When doing so the fs option is required.
import { resolveSync } from "resolve-sync";
const files = {
"/project/src/file.js": "",
"/project/package.json": JSON.stringify({ main: "src/file.js" }),
};
const result = resolveSync("./file", {
from: "/project/src/index.js",
// Provide a minimal fs interface:
fs: {
isFile(file) {
return file in files;
},
readPkg(file) {
return JSON.parse(files[file]);
},
},
});
console.log(result); // => "/project/src/file.js"