in tools/node-hermes/nodelib/path.js [456:555]
relative: function relative(from, to) {
validateString(from, 'from');
validateString(to, 'to');
if (from === to) return '';
var fromOrig = win32.resolve(from);
var toOrig = win32.resolve(to);
if (fromOrig === toOrig) return '';
from = StringPrototypeToLowerCase(fromOrig);
to = StringPrototypeToLowerCase(toOrig);
if (from === to) return ''; // Trim any leading backslashes
var fromStart = 0;
while (fromStart < from.length && StringPrototypeCharCodeAt(from, fromStart) === CHAR_BACKWARD_SLASH) {
fromStart++;
} // Trim trailing backslashes (applicable to UNC paths only)
var fromEnd = from.length;
while (fromEnd - 1 > fromStart && StringPrototypeCharCodeAt(from, fromEnd - 1) === CHAR_BACKWARD_SLASH) {
fromEnd--;
}
var fromLen = fromEnd - fromStart; // Trim any leading backslashes
var toStart = 0;
while (toStart < to.length && StringPrototypeCharCodeAt(to, toStart) === CHAR_BACKWARD_SLASH) {
toStart++;
} // Trim trailing backslashes (applicable to UNC paths only)
var toEnd = to.length;
while (toEnd - 1 > toStart && StringPrototypeCharCodeAt(to, toEnd - 1) === CHAR_BACKWARD_SLASH) {
toEnd--;
}
var toLen = toEnd - toStart; // Compare paths to find the longest common path from root
var length = fromLen < toLen ? fromLen : toLen;
var lastCommonSep = -1;
var i = 0;
for (; i < length; i++) {
var fromCode = StringPrototypeCharCodeAt(from, fromStart + i);
if (fromCode !== StringPrototypeCharCodeAt(to, toStart + i)) break;else if (fromCode === CHAR_BACKWARD_SLASH) lastCommonSep = i;
} // We found a mismatch before the first common path separator was seen, so
// return the original `to`.
if (i !== length) {
if (lastCommonSep === -1) return toOrig;
} else {
if (toLen > length) {
if (StringPrototypeCharCodeAt(to, toStart + i) === CHAR_BACKWARD_SLASH) {
// We get here if `from` is the exact base path for `to`.
// For example: from='C:\\foo\\bar'; to='C:\\foo\\bar\\baz'
return StringPrototypeSlice(toOrig, toStart + i + 1);
}
if (i === 2) {
// We get here if `from` is the device root.
// For example: from='C:\\'; to='C:\\foo'
return StringPrototypeSlice(toOrig, toStart + i);
}
}
if (fromLen > length) {
if (StringPrototypeCharCodeAt(from, fromStart + i) === CHAR_BACKWARD_SLASH) {
// We get here if `to` is the exact base path for `from`.
// For example: from='C:\\foo\\bar'; to='C:\\foo'
lastCommonSep = i;
} else if (i === 2) {
// We get here if `to` is the device root.
// For example: from='C:\\foo\\bar'; to='C:\\'
lastCommonSep = 3;
}
}
if (lastCommonSep === -1) lastCommonSep = 0;
}
var out = ''; // Generate the relative path based on the path difference between `to` and
// `from`
for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
if (i === fromEnd || StringPrototypeCharCodeAt(from, i) === CHAR_BACKWARD_SLASH) {
out += out.length === 0 ? '..' : '\\..';
}
}
toStart += lastCommonSep; // Lastly, append the rest of the destination (`to`) path that comes after
// the common path parts
if (out.length > 0) return "".concat(out).concat(StringPrototypeSlice(toOrig, toStart, toEnd));
if (StringPrototypeCharCodeAt(toOrig, toStart) === CHAR_BACKWARD_SLASH) ++toStart;
return StringPrototypeSlice(toOrig, toStart, toEnd);
},