Skip to content

Commit c72495f

Browse files
committed
fix: allow relative paths for outDir and staticDir
1 parent 3fb2f67 commit c72495f

2 files changed

Lines changed: 85 additions & 14 deletions

File tree

src/config.ts

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,35 @@ export interface ResolvedFreshConfig {
3535
}
3636

3737
export function parseRootPath(root: string, cwd: string): string {
38-
if (root.startsWith("file://")) {
39-
root = path.fromFileUrl(root);
40-
} else if (!path.isAbsolute(root)) {
41-
root = path.join(cwd, root);
38+
return parseDirPath(root, cwd, true);
39+
}
40+
41+
function parseDirPath(
42+
dirPath: string,
43+
root: string,
44+
fileToDir = false,
45+
): string {
46+
if (dirPath.startsWith("file://")) {
47+
dirPath = path.fromFileUrl(dirPath);
48+
} else if (!path.isAbsolute(dirPath)) {
49+
dirPath = path.join(root, dirPath);
4250
}
4351

44-
const ext = path.extname(root);
45-
if (
46-
ext === ".ts" || ext === ".tsx" || ext === ".js" || ext === ".jsx" ||
47-
ext === ".mjs"
48-
) {
49-
root = path.dirname(root);
52+
if (fileToDir) {
53+
const ext = path.extname(dirPath);
54+
if (
55+
ext === ".ts" || ext === ".tsx" || ext === ".js" || ext === ".jsx" ||
56+
ext === ".mjs"
57+
) {
58+
dirPath = path.dirname(dirPath);
59+
}
5060
}
5161

5262
if (Deno.build.os === "windows") {
53-
root = root.replaceAll("\\", "/");
63+
dirPath = dirPath.replaceAll("\\", "/");
5464
}
5565

56-
return root;
66+
return dirPath;
5767
}
5868

5969
export function normalizeConfig(options: FreshConfig): ResolvedFreshConfig {
@@ -62,10 +72,10 @@ export function normalizeConfig(options: FreshConfig): ResolvedFreshConfig {
6272
return {
6373
root,
6474
build: {
65-
outDir: options.build?.outDir ?? path.join(root, "_fresh"),
75+
outDir: parseDirPath(options.build?.outDir ?? "_fresh", root),
6676
},
6777
basePath: options.basePath ?? "",
68-
staticDir: options.staticDir ?? path.join(root, "static"),
78+
staticDir: parseDirPath(options.staticDir ?? "static", root),
6979
mode: "production",
7080
};
7181
}

src/config_test.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { expect } from "@std/expect";
22
import { normalizeConfig, parseRootPath } from "./config.ts";
3+
import type { FreshConfig } from "./mod.ts";
34

45
Deno.test("parseRootPath", () => {
56
const cwd = Deno.cwd().replaceAll("\\", "/");
@@ -45,3 +46,63 @@ Deno.test("normalizeConfig - root", () => {
4546
expect(configRoot("file:///C:/foo/bar")).toEqual("C:/foo/bar");
4647
}
4748
});
49+
50+
Deno.test("normalizeConfig - build.outDir", () => {
51+
const cwd = Deno.cwd().replaceAll("\\", "/");
52+
const outDir = (options: FreshConfig) =>
53+
normalizeConfig(options).build.outDir;
54+
55+
// Default outDir
56+
expect(outDir({ root: "./src" })).toEqual(`${cwd}/src/_fresh`);
57+
expect(outDir({ root: "/src" })).toEqual("/src/_fresh");
58+
expect(outDir({ root: "file:///src" })).toEqual("/src/_fresh");
59+
60+
// Relative outDir
61+
expect(outDir({ root: "/src", build: { outDir: "dist" } })).toEqual(
62+
"/src/dist",
63+
);
64+
expect(outDir({ root: "/src", build: { outDir: "./dist" } })).toEqual(
65+
"/src/dist",
66+
);
67+
68+
// Absolute outDir
69+
expect(outDir({ root: "/src", build: { outDir: "/dist" } })).toEqual(
70+
"/dist",
71+
);
72+
expect(outDir({ root: "/src", build: { outDir: "/dist/fresh" } })).toEqual(
73+
"/dist/fresh",
74+
);
75+
expect(outDir({ root: "/src", build: { outDir: "file:///dist" } })).toEqual(
76+
"/dist",
77+
);
78+
});
79+
80+
Deno.test("normalizeConfig - staticDir", () => {
81+
const cwd = Deno.cwd().replaceAll("\\", "/");
82+
const staticDir = (options: FreshConfig) =>
83+
normalizeConfig(options).staticDir;
84+
85+
// Default staticDir
86+
expect(staticDir({ root: "./src" })).toEqual(`${cwd}/src/static`);
87+
expect(staticDir({ root: "/src" })).toEqual("/src/static");
88+
expect(staticDir({ root: "file:///src" })).toEqual("/src/static");
89+
90+
// Relative staticDir
91+
expect(staticDir({ root: "/src", staticDir: "public" })).toEqual(
92+
"/src/public",
93+
);
94+
expect(staticDir({ root: "/src", staticDir: "./public" })).toEqual(
95+
"/src/public",
96+
);
97+
98+
// Absolute staticDir
99+
expect(staticDir({ root: "/src", staticDir: "/public" })).toEqual(
100+
"/public",
101+
);
102+
expect(staticDir({ root: "/src", staticDir: "/public/assets" })).toEqual(
103+
"/public/assets",
104+
);
105+
expect(staticDir({ root: "/src", staticDir: "file:///public" })).toEqual(
106+
"/public",
107+
);
108+
});

0 commit comments

Comments
 (0)