Skip to content

Commit 6de81ee

Browse files
perf(build): only cross-resolve internal aliases (#4371)
1 parent f9f328e commit 6de81ee

2 files changed

Lines changed: 63 additions & 5 deletions

File tree

src/build/config.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { pathRegExp, toPathRegExp } from "../utils/regex.ts";
55

66
export type BaseBuildConfig = ReturnType<typeof baseBuildConfig>;
77

8+
const ROOT_ALIAS = "@";
9+
810
export function baseBuildConfig(nitro: Nitro) {
911
// prettier-ignore
1012
const extensions: string[] = [".ts", ".mjs", ".js", ".json", ".node", ".tsx", ".jsx" ];
@@ -100,13 +102,14 @@ export function resolveAliases(_aliases: Record<string, string>) {
100102
([a], [b]) => b.split("/").length - a.split("/").length || b.length - a.length
101103
)
102104
);
105+
const resolvableAliases = Object.keys(aliases).filter(isResolvableAliasKey);
103106
// Resolve alias values in relation to each other
104107
for (const key in aliases) {
105-
for (const alias in aliases) {
106-
if (!["~", "@", "#"].includes(alias[0])) {
107-
continue;
108-
}
109-
if (alias === "@" && !aliases[key].startsWith("@/")) {
108+
if (!isResolvableAliasValue(aliases[key])) {
109+
continue;
110+
}
111+
for (const alias of resolvableAliases) {
112+
if (alias === ROOT_ALIAS && !aliases[key].startsWith(`${ROOT_ALIAS}/`)) {
110113
continue;
111114
} // Don't resolve @foo/bar
112115

@@ -117,3 +120,12 @@ export function resolveAliases(_aliases: Record<string, string>) {
117120
}
118121
return aliases;
119122
}
123+
124+
function isResolvableAliasKey(id: string) {
125+
// Internal aliases: `~`, `~~`, `@`, `@@`, `#*` (but not scoped packages like `@scope/pkg`)
126+
return id[0] === "~" || id[0] === "#" || /^@+$/.test(id);
127+
}
128+
129+
function isResolvableAliasValue(id: string) {
130+
return id[0] === "~" || id[0] === "#" || /^@+\//.test(id);
131+
}

test/unit/build-config.test.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { describe, expect, it } from "vitest";
2+
import { resolveAliases } from "../../src/build/config.ts";
3+
4+
describe("build config", () => {
5+
it("resolves internal aliases without changing package aliases", () => {
6+
expect(
7+
resolveAliases({
8+
"~": "/root",
9+
"@": "/root",
10+
"#app": "@/app",
11+
"#build": "#app/build",
12+
"#ext": "@scope/package/subpath",
13+
package: "/node_modules/package",
14+
"@scope/package": "/node_modules/@scope/package",
15+
})
16+
).toEqual({
17+
"@scope/package": "/node_modules/@scope/package",
18+
"#build": "/root/app/build",
19+
"#ext": "@scope/package/subpath",
20+
package: "/node_modules/package",
21+
"#app": "/root/app",
22+
"~": "/root",
23+
"@": "/root",
24+
});
25+
});
26+
27+
it("resolves root double aliases (`~~` and `@@`) like single ones", () => {
28+
expect(
29+
resolveAliases({
30+
"~": "/root/src",
31+
"~~": "/root",
32+
"@": "/root/src",
33+
"@@": "/root",
34+
"#fromTildeTilde": "~~/build",
35+
"#fromAtAt": "@@/build",
36+
})
37+
).toEqual({
38+
"#fromTildeTilde": "/root/build",
39+
"#fromAtAt": "/root/build",
40+
"~~": "/root",
41+
"@@": "/root",
42+
"~": "/root/src",
43+
"@": "/root/src",
44+
});
45+
});
46+
});

0 commit comments

Comments
 (0)