Skip to content

Repository files navigation

eliware.org

@eliware/path npm versionlicensebuild status

A Node.js ESM-friendly path utility for resolving file and directory paths.


Table of Contents

Features

  • Unified API for ESM: pass either import.meta or a string (like __dirname)
  • Works seamlessly in Node.js and modern ESM environments
  • TypeScript type definitions included
  • Simple, runtime dependency-free, and well-tested
  • pathUrl, resolvePath, and relativePath helpers based on import.meta
  • fileUrlToPath for converting file URLs back to filesystem paths

Requirements

  • Node.js 26 or newer
  • Native ESM support

Installation

npm install @eliware/path

Usage

ESM Example

import path, { fileUrlToPath, pathUrl, relativePath, resolvePath } from '@eliware/path';

// for ESM, we need to pass import.meta
const envFile = path(import.meta, ".env");
console.log(envFile);

// Get a file URL href for dynamic import
const envFileUrl = pathUrl(import.meta, ".env");
console.log(envFileUrl);
// import(envFileUrl).then(mod => ...);

Dynamic Import Example

// ESM
import { pathUrl } from '@eliware/path';
const mod = await import(pathUrl(import.meta, './my-module.mjs'));

API

getCurrentFilename(metaOrDir: ImportMeta | string): string

Returns the filesystem path represented by import.meta. When passed a string (for example, __dirname), returns that directory string unchanged. The string form is always treated as a directory, not a filename. Throws if the base is missing or does not contain a usable module URL.

getCurrentDirname(metaOrDir: ImportMeta | string, dirnameFn?: (path: string) => string): string

Returns the directory path represented by import.meta or the supplied string. The result is absolute when the input is absolute. Throws if the base is missing or does not contain a usable module URL.

When dirnameFn is provided, it is used for ImportMeta inputs. Directory string inputs are already directories, so the injected function is not called.

default path(metaOrDir: ImportMeta | string, ...segments: string[]): string

Joins the current dirname (from import.meta or a string) with provided segments. The result follows the host platform’s native path behavior.

pathUrl(metaOrDir: ImportMeta | string, ...segments: string[]): string

Returns a file URL href string for the resolved path, suitable for use with dynamic import() on all platforms.

resolvePath(metaOrDir: ImportMeta | string, ...segments: string[]): string

Resolves path segments from the current directory and returns an absolute filesystem path.

relativePath(metaOrDir: ImportMeta | string, ...segments: string[]): string

Resolves the target from the current directory and returns its normalized path relative to that directory.

fileUrlToPath(fileUrl: string | URL): string

Converts a file URL string or URL object to a filesystem path.

Errors / Troubleshooting

Pass import.meta or a directory string to the helpers. Missing or invalid bases throw an error. Paths use the host platform’s native separators; pathUrl() returns a file URL suitable for dynamic imports.

Configuration

No configuration is required. Each helper accepts an ImportMeta value or a directory string; getCurrentDirname() also accepts an optional injected dirname function for custom path behavior and testing.

The package has no runtime dependencies and performs no initialization at import time. Development commands use the shared @eliware/test tool.

Security and Operations

These helpers do not access the filesystem or perform network I/O. They only convert and compose paths. Native path semantics allow absolute segments and .. segments to escape the supplied base; validate user-controlled input and enforce application-specific permissions before reading or writing files.

Validation

npm test
npm run lint
npm run typecheck
npm audit --omit=dev --audit-level=moderate
npm run pack

TypeScript

Type definitions are included:

export function getCurrentFilename(metaOrDir: ImportMeta | string): string;
export function getCurrentDirname(metaOrDir: ImportMeta | string, dirnameFn?: (path: string) => string): string;
export const path: (metaOrDir: ImportMeta | string, ...segments: string[]) => string;
export function pathUrl(metaOrDir: ImportMeta | string, ...segments: string[]): string;
export function resolvePath(metaOrDir: ImportMeta | string, ...segments: string[]): string;
export function relativePath(metaOrDir: ImportMeta | string, ...segments: string[]): string;
export function fileUrlToPath(fileUrl: string | URL): string;
export default path;

Support

For help, questions, or to chat with the author and community, visit:

Discordeliware.org

eliware.org on Discord

License

MIT © 2025 Eli Sterling, eliware.org

Links

About

Import-meta-based path utilities for modern Node.js ESM applications.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages