Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 17 additions & 5 deletions src/build/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { pathRegExp, toPathRegExp } from "../utils/regex.ts";

export type BaseBuildConfig = ReturnType<typeof baseBuildConfig>;

const ROOT_ALIAS = "@";

export function baseBuildConfig(nitro: Nitro) {
// prettier-ignore
const extensions: string[] = [".ts", ".mjs", ".js", ".json", ".node", ".tsx", ".jsx" ];
Expand Down Expand Up @@ -100,13 +102,14 @@ export function resolveAliases(_aliases: Record<string, string>) {
([a], [b]) => b.split("/").length - a.split("/").length || b.length - a.length
)
);
const resolvableAliases = Object.keys(aliases).filter(isResolvableAliasKey);
// Resolve alias values in relation to each other
for (const key in aliases) {
for (const alias in aliases) {
if (!["~", "@", "#"].includes(alias[0])) {
continue;
}
if (alias === "@" && !aliases[key].startsWith("@/")) {
if (!isResolvableAliasValue(aliases[key])) {
continue;
}
for (const alias of resolvableAliases) {
if (alias === ROOT_ALIAS && !aliases[key].startsWith(`${ROOT_ALIAS}/`)) {
continue;
} // Don't resolve @foo/bar

Expand All @@ -117,3 +120,12 @@ export function resolveAliases(_aliases: Record<string, string>) {
}
return aliases;
}

function isResolvableAliasKey(id: string) {
// Internal aliases: `~`, `~~`, `@`, `@@`, `#*` (but not scoped packages like `@scope/pkg`)
return id[0] === "~" || id[0] === "#" || /^@+$/.test(id);
}

function isResolvableAliasValue(id: string) {
return id[0] === "~" || id[0] === "#" || /^@+\//.test(id);
}
46 changes: 46 additions & 0 deletions test/unit/build-config.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { describe, expect, it } from "vitest";
import { resolveAliases } from "../../src/build/config.ts";

describe("build config", () => {
it("resolves internal aliases without changing package aliases", () => {
expect(
resolveAliases({
"~": "/root",
"@": "/root",
"#app": "@/app",
"#build": "#app/build",
"#ext": "@scope/package/subpath",
package: "/node_modules/package",
"@scope/package": "/node_modules/@scope/package",
})
).toEqual({
"@scope/package": "/node_modules/@scope/package",
"#build": "/root/app/build",
"#ext": "@scope/package/subpath",
package: "/node_modules/package",
"#app": "/root/app",
"~": "/root",
"@": "/root",
});
});

it("resolves root double aliases (`~~` and `@@`) like single ones", () => {
expect(
resolveAliases({
"~": "/root/src",
"~~": "/root",
"@": "/root/src",
"@@": "/root",
"#fromTildeTilde": "~~/build",
"#fromAtAt": "@@/build",
})
).toEqual({
"#fromTildeTilde": "/root/build",
"#fromAtAt": "/root/build",
"~~": "/root",
"@@": "/root",
"~": "/root/src",
"@": "/root/src",
});
});
});
Loading