From 2a5af8b36b233b6330997b2262a45a23034d719d Mon Sep 17 00:00:00 2001 From: River <22485304+actual-size@users.noreply.github.com> Date: Thu, 18 Jun 2020 20:10:07 +1000 Subject: [PATCH] fix: decode path properly on win32 (#6351) --- cli/js/util.ts | 12 +++++++----- cli/tests/unit/path_from_url_test.ts | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/cli/js/util.ts b/cli/js/util.ts index c50a4cdcb5..a67dec5958 100644 --- a/cli/js/util.ts +++ b/cli/js/util.ts @@ -82,19 +82,21 @@ export function immutableDefine( } function pathFromURLWin32(url: URL): string { - if (url.hostname !== "") { + const hostname = url.hostname; + const pathname = decodeURIComponent(url.pathname.replace(/\//g, "\\")); + + if (hostname !== "") { //TODO(actual-size) Node adds a punycode decoding step, we should consider adding this - return `\\\\${url.hostname}${url.pathname}`; + return `\\\\${hostname}${pathname}`; } - const validPath = /^\/(?[A-Za-z]):\//; - const matches = validPath.exec(url.pathname); + const validPath = /^\\(?[A-Za-z]):\\/; + const matches = validPath.exec(pathname); if (!matches?.groups?.driveLetter) { throw new TypeError("A URL with the file schema must be absolute."); } - const pathname = url.pathname.replace(/\//g, "\\"); // we don't want a leading slash on an absolute path in Windows return pathname.slice(1); } diff --git a/cli/tests/unit/path_from_url_test.ts b/cli/tests/unit/path_from_url_test.ts index 5e7203a582..41f2c47ea7 100644 --- a/cli/tests/unit/path_from_url_test.ts +++ b/cli/tests/unit/path_from_url_test.ts @@ -7,6 +7,7 @@ unitTest( { ignore: Deno.build.os === "windows" }, function pathFromURLPosix(): void { assertEquals(pathFromURL("file:///test/directory"), "/test/directory"); + assertEquals(pathFromURL("file:///space_ .txt"), "/space_ .txt"); assertThrows(() => pathFromURL("file://host/test/directory")); assertThrows(() => pathFromURL("https://deno.land/welcome.ts")); } @@ -16,6 +17,7 @@ unitTest( { ignore: Deno.build.os !== "windows" }, function pathFromURLWin32(): void { assertEquals(pathFromURL("file:///c:/windows/test"), "c:\\windows\\test"); + assertEquals(pathFromURL("file:///c:/space_ .txt"), "c:\\space_ .txt"); assertThrows(() => pathFromURL("file:///thing/test")); assertThrows(() => pathFromURL("https://deno.land/welcome.ts")); /* TODO(ry) Add tests for these situations @@ -24,7 +26,6 @@ unitTest( * emoji_🙃.txt file:///D:/weird_names/emoji_%F0%9F%99%83.txt * percent_%.txt file:///D:/weird_names/percent_%25.txt * pound_#.txt file:///D:/weird_names/pound_%23.txt - * space_ .txt file:///D:/weird_names/space_%20.txt * swapped_surrogate_pair_��.txt file:///D:/weird_names/swapped_surrogate_pair_%EF%BF%BD%EF%BF%BD.txt */ }