Skip to content

Commit 40321f8

Browse files
committed
feat: file-system API
1 parent 12b877c commit 40321f8

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed

src/fixtures/webcontainer.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { commands } from "@vitest/browser/context";
22
import {
3+
type BufferEncoding,
34
type FileSystemTree,
45
WebContainer as WebContainerApi,
56
} from "@webcontainer/api";
@@ -81,4 +82,28 @@ export class WebContainer {
8182

8283
return output.trim();
8384
}
85+
86+
async readFile(path: string, encoding: BufferEncoding = "utf8") {
87+
return this._instance.fs.readFile(path, encoding);
88+
}
89+
90+
async writeFile(path: string, data: string, encoding = "utf8") {
91+
return this._instance.fs.writeFile(path, data, { encoding });
92+
}
93+
94+
async rename(oldPath: string, newPath: string) {
95+
return this._instance.fs.rename(oldPath, newPath);
96+
}
97+
98+
async mkdir(path: string) {
99+
return this._instance.fs.mkdir(path);
100+
}
101+
102+
async readdir(path: string) {
103+
return this._instance.fs.readdir(path);
104+
}
105+
106+
async rm(path: string) {
107+
return this._instance.fs.rm(path);
108+
}
84109
}

test/file-system.test.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { expect } from "vitest";
2+
import { test } from "../src";
3+
4+
test("user can create files and folders into webcontainer", async ({
5+
webcontainer,
6+
}) => {
7+
await webcontainer.writeFile("/example", "Hello world");
8+
await webcontainer.mkdir("/folder");
9+
10+
await expect(webcontainer.readdir("/")).resolves.toStrictEqual([
11+
"example",
12+
"folder",
13+
]);
14+
await expect(webcontainer.readFile("/example")).resolves.toBe("Hello world");
15+
});
16+
17+
test("user can rename files and folders in webcontainer", async ({
18+
webcontainer,
19+
}) => {
20+
await webcontainer.writeFile("/example", "Hello world");
21+
await webcontainer.mkdir("/folder");
22+
23+
await webcontainer.rename("/example", "/example-2");
24+
await webcontainer.rename("/folder", "/folder-2");
25+
26+
await expect(webcontainer.readdir("/")).resolves.toStrictEqual([
27+
"example-2",
28+
"folder-2",
29+
]);
30+
});
31+
32+
test("user can remove files from webcontainer", async ({ webcontainer }) => {
33+
await webcontainer.writeFile("/first", "1");
34+
await webcontainer.writeFile("/second", "2");
35+
await webcontainer.writeFile("/third", "3");
36+
37+
await webcontainer.rm("/second");
38+
await expect(webcontainer.readdir("/")).resolves.toStrictEqual([
39+
"first",
40+
"third",
41+
]);
42+
});

test/preview.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,24 @@ test("user can see server output in preview", async ({
1111

1212
await preview.getByRole("heading", { level: 1, name: "Hello Vite!" });
1313
});
14+
15+
test("user can see HMR changes in preview", async ({
16+
webcontainer,
17+
preview,
18+
}) => {
19+
await webcontainer.mount("test/fixtures/starter-vite");
20+
21+
await webcontainer.runCommand("npm", ["install"]);
22+
void webcontainer.runCommand("npm", ["run", "dev"]);
23+
24+
await preview.getByRole("heading", { level: 1, name: "Hello Vite!" });
25+
26+
const content = await webcontainer.readFile("/src/main.js");
27+
28+
await webcontainer.writeFile(
29+
"/src/main.js",
30+
content.replace("Hello Vite!", "Modified title!"),
31+
);
32+
33+
await preview.getByRole("heading", { level: 1, name: "Modified title!" });
34+
});

0 commit comments

Comments
 (0)