From 9b3db1c28c64c58c1a33958eb88888e9ba6350b0 Mon Sep 17 00:00:00 2001 From: mrmlnc Date: Sun, 27 Dec 2020 17:03:34 +0300 Subject: [PATCH] fix(fs.walk): correctly handle the leading slash --- packages/fs/fs.walk/src/readers/common.spec.ts | 13 +++++++++++++ packages/fs/fs.walk/src/readers/common.ts | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/packages/fs/fs.walk/src/readers/common.spec.ts b/packages/fs/fs.walk/src/readers/common.spec.ts index 1be82dcf..b883dddc 100644 --- a/packages/fs/fs.walk/src/readers/common.spec.ts +++ b/packages/fs/fs.walk/src/readers/common.spec.ts @@ -97,5 +97,18 @@ describe('Readers → Common', () => { assert.strictEqual(actual, expected); }); + + it('should return correct string when the first segment ens with the separator symbol', () => { + // Unix + assert.strictEqual(common.joinPathSegments('/', 'a', '/'), '/a'); + assert.strictEqual(common.joinPathSegments('//', 'a', '/'), '//a'); + assert.strictEqual(common.joinPathSegments('/a/', 'b', '/'), '/a/b'); + + // Windows + assert.strictEqual(common.joinPathSegments('C:/', 'Users', '/'), 'C:/Users'); + assert.strictEqual(common.joinPathSegments('C:\\', 'Users', '\\'), 'C:\\Users'); + assert.strictEqual(common.joinPathSegments('//?/C:/', 'Users', '/'), '//?/C:/Users'); + assert.strictEqual(common.joinPathSegments('\\\\?\\C:\\', 'Users', '\\'), '\\\\?\\C:\\Users'); + }); }); }); diff --git a/packages/fs/fs.walk/src/readers/common.ts b/packages/fs/fs.walk/src/readers/common.ts index 20fbb8bd..eeec6674 100644 --- a/packages/fs/fs.walk/src/readers/common.ts +++ b/packages/fs/fs.walk/src/readers/common.ts @@ -22,5 +22,12 @@ export function joinPathSegments(a: string, b: string, separator: string): strin return b; } + /** + * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`). + */ + if (a.endsWith(separator)) { + return a + b; + } + return a + separator + b; }