Skip to main content
This release is 47 versions behind 1.1.4 — the latest version of @std/path. Jump to latest
Works with
This package works with Cloudflare Workers, Deno, Browsers
This package works with Cloudflare Workers
This package works with Deno
This package works with Browsers
JSR Score94%
Downloads118,605/wk
Published2 years ago (0.199.0)

Utilities for working with file system paths

// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. // This module is browser compatible. import { assert } from "jsr:/@std/assert@^0.199.0/assert"; import { assertPath, isPathSeparator } from "./_util.ts"; import { posixNormalize, windowsNormalize } from "./_normalize.ts"; /** * Join all given a sequence of `paths`,then normalizes the resulting path. * @param paths to be joined and normalized */ export function posixJoin(...paths: string[]): string { if (paths.length === 0) return "."; let joined: string | undefined; for (let i = 0, len = paths.length; i < len; ++i) { const path = paths[i]; assertPath(path); if (path.length > 0) { if (!joined) joined = path; else joined += `/${path}`; } } if (!joined) return "."; return posixNormalize(joined); } /** * Join all given a sequence of `paths`,then normalizes the resulting path. * @param paths to be joined and normalized */ export function windowsJoin(...paths: string[]): string { if (paths.length === 0) return "."; let joined: string | undefined; let firstPart: string | null = null; for (let i = 0; i < paths.length; ++i) { const path = paths[i]; assertPath(path); if (path.length > 0) { if (joined === undefined) joined = firstPart = path; else joined += `\\${path}`; } } if (joined === undefined) return "."; // Make sure that the joined path doesn't start with two slashes, because // normalize() will mistake it for an UNC path then. // // This step is skipped when it is very clear that the user actually // intended to point at an UNC path. This is assumed when the first // non-empty string arguments starts with exactly two slashes followed by // at least one more non-slash character. // // Note that for normalize() to treat a path as an UNC path it needs to // have at least 2 components, so we don't filter for that here. // This means that the user can use join to construct UNC paths from // a server name and a share name; for example: // path.join('//server', 'share') -> '\\\\server\\share\\') let needsReplace = true; let slashCount = 0; assert(firstPart != null); if (isPathSeparator(firstPart.charCodeAt(0))) { ++slashCount; const firstLen = firstPart.length; if (firstLen > 1) { if (isPathSeparator(firstPart.charCodeAt(1))) { ++slashCount; if (firstLen > 2) { if (isPathSeparator(firstPart.charCodeAt(2))) ++slashCount; else { // We matched a UNC path in the first part needsReplace = false; } } } } } if (needsReplace) { // Find any more consecutive slashes we need to replace for (; slashCount < joined.length; ++slashCount) { if (!isPathSeparator(joined.charCodeAt(slashCount))) break; } // Replace the slashes if needed if (slashCount >= 2) joined = `\\${joined.slice(slashCount)}`; } return windowsNormalize(joined); }