From 22e1c9e1f57a9d2252b6bc614ca8abb805721d4d Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Sun, 2 Jan 2022 10:57:22 -0400 Subject: be a bit more careful with to() path resolving --- src/util/urls.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/util') diff --git a/src/util/urls.js b/src/util/urls.js index a30cc81b..e15c018b 100644 --- a/src/util/urls.js +++ b/src/util/urls.js @@ -34,25 +34,32 @@ export function generateURLs(urlSpec) { }; }; + // This should be called on values which are going to be passed to + // path.relative, because relative will resolve a leading slash as the root + // directory of the working device, which we aren't looking for here. + const trimLeadingSlash = P => P.startsWith('/') ? P.slice(1) : P; + const generateTo = (fromPath, fromGroup) => { + const A = trimLeadingSlash(fromPath); + const rebasePrefix = '../'.repeat((fromGroup.prefix || '').split('/').filter(Boolean).length); const pathHelper = (toPath, toGroup) => { - let target = (toPath === '/' ? '' : toPath); + let B = trimLeadingSlash(toPath); let argIndex = 0; - target = target.replaceAll('<>', () => `<${argIndex++}>`); + B = B.replaceAll('<>', () => `<${argIndex++}>`); if (toGroup.prefix !== fromGroup.prefix) { // TODO: Handle differing domains in prefixes. - target = rebasePrefix + (toGroup.prefix || '') + target; + B = rebasePrefix + (toGroup.prefix || '') + B; } const suffix = (toPath.endsWith('/') ? '/' : ''); return { - posix: path.posix.relative(fromPath, target) + suffix, - device: path.relative(fromPath, target) + suffix + posix: path.posix.relative(A, B) + suffix, + device: path.relative(A, B) + suffix }; }; -- cgit 1.3.0-6-gf8a5