mirror of
https://github.com/denoland/std.git
synced 2024-11-22 04:59:05 +00:00
d102a10235
* refactor: import from `@std/assert` * update
61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
// This module is browser compatible.
|
|
|
|
import {
|
|
CHAR_BACKWARD_SLASH,
|
|
CHAR_COLON,
|
|
CHAR_DOT,
|
|
CHAR_QUESTION_MARK,
|
|
} from "../_common/constants.ts";
|
|
import { isWindowsDeviceRoot } from "./_util.ts";
|
|
import { resolve } from "./resolve.ts";
|
|
|
|
/**
|
|
* Resolves path to a namespace path
|
|
*
|
|
* @example Usage
|
|
* ```ts
|
|
* import { toNamespacedPath } from "@std/path/windows/to-namespaced-path";
|
|
* import { assertEquals } from "@std/assert";
|
|
*
|
|
* const namespaced = toNamespacedPath("C:\\foo\\bar");
|
|
* assertEquals(namespaced, "\\\\?\\C:\\foo\\bar");
|
|
* ```
|
|
*
|
|
* @param path The path to resolve to namespaced path
|
|
* @returns The resolved namespaced path
|
|
*/
|
|
export function toNamespacedPath(path: string): string {
|
|
// Note: this will *probably* throw somewhere.
|
|
if (typeof path !== "string") return path;
|
|
if (path.length === 0) return "";
|
|
|
|
const resolvedPath = resolve(path);
|
|
|
|
if (resolvedPath.length >= 3) {
|
|
if (resolvedPath.charCodeAt(0) === CHAR_BACKWARD_SLASH) {
|
|
// Possible UNC root
|
|
|
|
if (resolvedPath.charCodeAt(1) === CHAR_BACKWARD_SLASH) {
|
|
const code = resolvedPath.charCodeAt(2);
|
|
if (code !== CHAR_QUESTION_MARK && code !== CHAR_DOT) {
|
|
// Matched non-long UNC root, convert the path to a long UNC path
|
|
return `\\\\?\\UNC\\${resolvedPath.slice(2)}`;
|
|
}
|
|
}
|
|
} else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0))) {
|
|
// Possible device root
|
|
|
|
if (
|
|
resolvedPath.charCodeAt(1) === CHAR_COLON &&
|
|
resolvedPath.charCodeAt(2) === CHAR_BACKWARD_SLASH
|
|
) {
|
|
// Matched device root, convert the path to a long UNC path
|
|
return `\\\\?\\${resolvedPath}`;
|
|
}
|
|
}
|
|
}
|
|
|
|
return path;
|
|
}
|