From f5d22a2e3c42a4b0f1a3b977dd8a20195801dcfb Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Wed, 19 Apr 2017 09:12:14 -0400 Subject: [PATCH] path: improve parse => format combination make `parse` return an object where `base` is a computed property Ref: https://github.com/nodejs/node/issues/1999 --- lib/path.js | 62 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/lib/path.js b/lib/path.js index 001152866ffc..64df7c7a3396 100644 --- a/lib/path.js +++ b/lib/path.js @@ -1114,19 +1114,12 @@ const win32 = { startDot === end - 1 && startDot === startPart + 1)) { if (end !== -1) { - if (startPart === 0 && isAbsolute) - ret.base = ret.name = path.slice(rootEnd, end); - else - ret.base = ret.name = path.slice(startPart, end); + const start = (startPart === 0 && isAbsolute) ? rootEnd : startPart; + ret.name = path.slice(start, end); } } else { - if (startPart === 0 && isAbsolute) { - ret.name = path.slice(rootEnd, startDot); - ret.base = path.slice(rootEnd, end); - } else { - ret.name = path.slice(startPart, startDot); - ret.base = path.slice(startPart, end); - } + const start = (startPart === 0 && isAbsolute) ? rootEnd : startPart; + ret.name = path.slice(start, startDot); ret.ext = path.slice(startDot, end); } @@ -1135,6 +1128,22 @@ const win32 = { else if (isAbsolute) ret.dir = path.slice(0, rootEnd); + Object.defineProperty(ret, 'base', { + enumerable: true, + configurable: false, + get() { return this.name + this.ext; }, + set(value) { + const li = value.lastIndexOf('.'); + if (li > 0) { + this.ext = value.slice(li); + this.name = value.slice(0, li); + } else { + this.name = value; + this.ext = ''; + } + } + }); + return ret; }, @@ -1574,19 +1583,12 @@ const posix = { startDot === end - 1 && startDot === startPart + 1)) { if (end !== -1) { - if (startPart === 0 && isAbsolute) - ret.base = ret.name = path.slice(1, end); - else - ret.base = ret.name = path.slice(startPart, end); + const start = (startPart === 0 && isAbsolute) ? 1 : startPart; + ret.name = path.slice(start, end); } } else { - if (startPart === 0 && isAbsolute) { - ret.name = path.slice(1, startDot); - ret.base = path.slice(1, end); - } else { - ret.name = path.slice(startPart, startDot); - ret.base = path.slice(startPart, end); - } + const start = (startPart === 0 && isAbsolute) ? 1 : startPart; + ret.name = path.slice(start, startDot); ret.ext = path.slice(startDot, end); } @@ -1595,6 +1597,22 @@ const posix = { else if (isAbsolute) ret.dir = '/'; + Object.defineProperty(ret, 'base', { + enumerable: true, + configurable: false, + get() { return this.name + this.ext; }, + set(value) { + const li = value.lastIndexOf('.'); + if (li > 0) { + this.ext = value.slice(li); + this.name = value.slice(0, li); + } else { + this.name = value; + this.ext = ''; + } + } + }); + return ret; },