diff options
author | (quasar) nebula <qznebula@protonmail.com> | 2022-01-02 10:57:22 -0400 |
---|---|---|
committer | (quasar) nebula <qznebula@protonmail.com> | 2022-01-02 10:57:22 -0400 |
commit | 22e1c9e1f57a9d2252b6bc614ca8abb805721d4d (patch) | |
tree | 73fedbe63e266f3e9c7470befc3ab6868af7877f /src/util | |
parent | c2428d2a136d2af4ed7235240308082db32cb3f8 (diff) |
be a bit more careful with to() path resolving
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/urls.js | 17 |
1 files changed, 12 insertions, 5 deletions
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 }; }; |