mirror of
https://github.com/denoland/std.git
synced 2024-11-22 04:59:05 +00:00
71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
// This module is browser compatible.
|
|
|
|
import { assertArg } from "../_common/dirname.ts";
|
|
import { stripTrailingSeparators } from "../_common/strip_trailing_separators.ts";
|
|
import { isPosixPathSeparator } from "./_util.ts";
|
|
|
|
/**
|
|
* Return the directory path of a `path`.
|
|
*
|
|
* @example Usage
|
|
* ```ts
|
|
* import { dirname } from "@std/path/posix/dirname";
|
|
* import { assertEquals } from "@std/assert";
|
|
*
|
|
* assertEquals(dirname("/home/user/Documents/"), "/home/user");
|
|
* assertEquals(dirname("/home/user/Documents/image.png"), "/home/user/Documents");
|
|
* assertEquals(dirname("https://deno.land/std/path/mod.ts"), "https://deno.land/std/path");
|
|
* ```
|
|
*
|
|
* @example Working with URLs
|
|
*
|
|
* ```ts
|
|
* import { dirname } from "@std/path/posix/dirname";
|
|
* import { assertEquals } from "@std/assert";
|
|
*
|
|
* assertEquals(dirname("https://deno.land/std/path/mod.ts"), "https://deno.land/std/path");
|
|
* assertEquals(dirname("https://deno.land/std/path/mod.ts?a=b"), "https://deno.land/std/path");
|
|
* assertEquals(dirname("https://deno.land/std/path/mod.ts#header"), "https://deno.land/std/path");
|
|
* ```
|
|
*
|
|
* Note: If you are working with file URLs,
|
|
* use the new version of `dirname` from `@std/path/posix/unstable-dirname`.
|
|
*
|
|
* @param path The path to get the directory from.
|
|
* @returns The directory path.
|
|
*/
|
|
export function dirname(path: string): string {
|
|
assertArg(path);
|
|
|
|
let end = -1;
|
|
let matchedNonSeparator = false;
|
|
|
|
for (let i = path.length - 1; i >= 1; --i) {
|
|
if (isPosixPathSeparator(path.charCodeAt(i))) {
|
|
if (matchedNonSeparator) {
|
|
end = i;
|
|
break;
|
|
}
|
|
} else {
|
|
matchedNonSeparator = true;
|
|
}
|
|
}
|
|
|
|
// No matches. Fallback based on provided path:
|
|
//
|
|
// - leading slashes paths
|
|
// "/foo" => "/"
|
|
// "///foo" => "/"
|
|
// - no slash path
|
|
// "foo" => "."
|
|
if (end === -1) {
|
|
return isPosixPathSeparator(path.charCodeAt(0)) ? "/" : ".";
|
|
}
|
|
|
|
return stripTrailingSeparators(
|
|
path.slice(0, end),
|
|
isPosixPathSeparator,
|
|
);
|
|
}
|