Skip to content

Commit 202a9a9

Browse files
committed
fix(server): align file tree dotfiles with gitignore
1 parent c385ad6 commit 202a9a9

3 files changed

Lines changed: 35 additions & 4 deletions

File tree

packages/server/src/__tests__/fs/gitignore.test.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ describe("createGitignoreFilter", () => {
3939
expect(filter("file.txt")).toBe(true);
4040
expect(filter("build")).toBe(false);
4141
expect(filter(".env")).toBe(false);
42-
expect(filter(".env.local")).toBe(false);
42+
expect(filter(".env.local")).toBe(true);
4343
});
4444

4545
it("respects negation patterns", async () => {
@@ -60,17 +60,30 @@ describe("createGitignoreFilter", () => {
6060
expect(filter("root-only.txt")).toBe(true);
6161
});
6262

63-
it("keeps default hidden and dependency ignores when .gitignore exists", async () => {
63+
it("keeps required repository and dependency ignores when .gitignore exists", async () => {
6464
await writeFile(join(testDir, ".gitignore"), "*.log");
6565

6666
const filter = createGitignoreFilter(testDir, testDir);
6767

6868
expect(filter(".git")).toBe(false);
69-
expect(filter(".hidden")).toBe(false);
69+
expect(filter(".hidden")).toBe(true);
70+
expect(filter(".gitignore")).toBe(true);
7071
expect(filter("node_modules")).toBe(false);
7172
expect(filter("app.log")).toBe(false);
7273
expect(filter("file.txt")).toBe(true);
7374
});
75+
76+
it("shows dotfiles when .gitignore does not ignore them", async () => {
77+
await writeFile(join(testDir, ".gitignore"), "*.log\n!.env\n!.gitignore");
78+
79+
const filter = createGitignoreFilter(testDir, testDir);
80+
81+
expect(filter(".env")).toBe(true);
82+
expect(filter(".gitignore")).toBe(true);
83+
expect(filter(".hidden")).toBe(true);
84+
expect(filter("node_modules")).toBe(false);
85+
expect(filter(".git")).toBe(false);
86+
});
7487
});
7588

7689
describe("createWatcherIgnoreFilter", () => {

packages/server/src/__tests__/fs/tree.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,18 @@ describe("readTree", () => {
136136
expect(result.children.some((n) => n.name === "app.txt")).toBe(true);
137137
expect(result.children.some((n) => n.name === "src")).toBe(true);
138138
});
139+
140+
it("should show dotfiles when .gitignore does not ignore them", async () => {
141+
await writeFile(join(testDir, ".gitignore"), "*.log");
142+
await writeFile(join(testDir, ".env"), "secret");
143+
await writeFile(join(testDir, ".hidden-config"), "hidden");
144+
await writeFile(join(testDir, "visible.txt"), "visible");
145+
146+
const result = await readTree(testDir);
147+
148+
expect(result.children.some((n) => n.name === ".env")).toBe(true);
149+
expect(result.children.some((n) => n.name === ".gitignore")).toBe(true);
150+
expect(result.children.some((n) => n.name === ".hidden-config")).toBe(true);
151+
expect(result.children.some((n) => n.name === "visible.txt")).toBe(true);
152+
});
139153
});

packages/server/src/fs/gitignore.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ function isDefaultTreeIgnored(name: string): boolean {
2525
return name.startsWith(".") || name === "node_modules" || name === ".git";
2626
}
2727

28+
function isAlwaysTreeIgnored(name: string): boolean {
29+
return name === "node_modules" || name === ".git";
30+
}
31+
2832
function isIgnoredByGitignore(ig: ReturnType<typeof ignore>, path: string): boolean {
2933
if (!path || path.startsWith("..")) {
3034
return false;
@@ -55,7 +59,7 @@ export function createGitignoreFilter(
5559
const ig = ignore().add(gitignoreContent);
5660

5761
return (name: string) => {
58-
if (isDefaultTreeIgnored(name)) {
62+
if (isAlwaysTreeIgnored(name)) {
5963
return false;
6064
}
6165

0 commit comments

Comments
 (0)