diff --git a/src/utils.ts b/src/utils.ts index f3f160e..887ca5f 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -42,9 +42,16 @@ export function normalizeAliases(_aliases: Record) { export function resolveAlias(path: string, aliases: Record) { const _path = normalizeWindowsPath(path); aliases = normalizeAliases(aliases); - for (const alias in aliases) { - if (_path.startsWith(alias) && pathSeparators.has(_path[alias.length])) { - return join(aliases[alias], _path.slice(alias.length)); + for (const [alias, to] of Object.entries(aliases)) { + if (!_path.startsWith(alias)) { + continue; + } + + // Strip trailing slash from alias for check + const _alias = hasTrailingSlash(alias) ? alias.slice(0, -1) : alias; + + if (hasTrailingSlash(_path[_alias.length])) { + return join(to, _path.slice(alias.length)); } } return _path; @@ -61,3 +68,9 @@ export function filename(path: string) { function _compareAliases(a: string, b: string) { return b.split("/").length - a.split("/").length; } + +// Returns true if path ends with a slash or **is empty** +function hasTrailingSlash(path = "/") { + const lastChar = path[path.length - 1]; + return lastChar === "/" || lastChar === "\\"; +} diff --git a/test/utils.spec.ts b/test/utils.spec.ts index 4845de0..71a9fd9 100644 --- a/test/utils.spec.ts +++ b/test/utils.spec.ts @@ -9,6 +9,10 @@ describe("alias", () => { "@": "/root", bingpot: "@/bingpot/index.ts", test: "@bingpot/index.ts", + "~": "/root/index.js", + "~/": "/src", + "~win": "C:/root/index.js", + "~win/": "C:/src", }; const aliases = normalizeAliases(_aliases); @@ -20,6 +24,10 @@ describe("alias", () => { "@foo/bar/utils": "@foo/bar/dist/utils.mjs", "bingpot": "/root/bingpot/index.ts", "test": "@bingpot/index.ts", + "~": "/root/index.js", + "~/": "/src", + "~win": "C:/root/index.js", + "~win/": "C:/src", } `); }); @@ -43,6 +51,10 @@ describe("alias", () => { expect(resolveAlias("foo/bar.js", aliases)).toBe("foo/bar.js"); expect(resolveAlias("./bar.js", aliases)).toBe("./bar.js"); }); + it("respect ending with /", () => { + expect(resolveAlias("~/foo/bar", aliases)).toBe("/src/foo/bar"); + expect(resolveAlias("~win/foo/bar", aliases)).toBe("C:/src/foo/bar"); + }); }); });