Skip to content

Commit 47ccc00

Browse files
committed
Expand workspace watcher beyond gitignore
1 parent 5246b69 commit 47ccc00

3 files changed

Lines changed: 16 additions & 28 deletions

File tree

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,24 +123,25 @@ describe("createWatcherIgnoreFilter", () => {
123123
expect(filter(join(testDir, "file.txt"))).toBe(false);
124124
});
125125

126-
it("respects .gitignore rules", async () => {
126+
it("does not apply .gitignore rules to watcher filtering", async () => {
127127
await writeFile(join(testDir, ".gitignore"), "*.log\n*.tmp\nbuild/");
128128

129129
const filter = createWatcherIgnoreFilter(testDir);
130-
expect(filter(join(testDir, "app.log"))).toBe(true);
131-
expect(filter(join(testDir, "error.tmp"))).toBe(true);
130+
expect(filter(join(testDir, "app.log"))).toBe(false);
131+
expect(filter(join(testDir, "error.tmp"))).toBe(false);
132+
expect(filter(join(testDir, "build", "bundle.js"))).toBe(false);
132133
expect(filter(join(testDir, "file.txt"))).toBe(false);
133134
});
134135

135-
it("keeps default watcher behavior when .gitignore exists", async () => {
136+
it("keeps hard watcher ignores even when .gitignore exists", async () => {
136137
await writeFile(join(testDir, ".gitignore"), "*.log");
137138

138139
const filter = createWatcherIgnoreFilter(testDir);
139140

140141
expect(filter(join(testDir, ".git/config"))).toBe(false);
141142
expect(filter(join(testDir, "node_modules/package"))).toBe(true);
142143
expect(filter(join(testDir, ".playwright-mcp/page.yml"))).toBe(true);
143-
expect(filter(join(testDir, "app.log"))).toBe(true);
144+
expect(filter(join(testDir, "app.log"))).toBe(false);
144145
expect(filter(join(testDir, "src/index.ts"))).toBe(false);
145146
});
146147
});

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ describe("WorkspaceWatcher", () => {
9393
expect(ignored?.(join(testDir, "src/index.ts"))).toBe(false);
9494
});
9595

96-
it("continues to respect .gitignore entries after tree visibility was relaxed", async () => {
96+
it("does not let .gitignore shrink watcher coverage", async () => {
9797
await writeFile(join(testDir, ".gitignore"), "dist/\n*.log\n");
9898

9999
new WorkspaceWatcher("test-workspace-id", testDir, broadcaster);
@@ -103,9 +103,10 @@ describe("WorkspaceWatcher", () => {
103103
const ignored = options?.ignored;
104104

105105
expect(typeof ignored).toBe("function");
106-
expect(ignored?.(join(testDir, "dist", "bundle.js"))).toBe(true);
107-
expect(ignored?.(join(testDir, "debug.log"))).toBe(true);
106+
expect(ignored?.(join(testDir, "dist", "bundle.js"))).toBe(false);
107+
expect(ignored?.(join(testDir, "debug.log"))).toBe(false);
108108
expect(ignored?.(join(testDir, ".git", "index"))).toBe(false);
109+
expect(ignored?.(join(testDir, "node_modules", "pkg", "index.js"))).toBe(true);
109110
expect(ignored?.(join(testDir, "src", "index.ts"))).toBe(false);
110111
});
111112

packages/server/src/fs/gitignore.ts

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -85,25 +85,11 @@ export function createTreeVisibilityFilter(): (name: string) => boolean {
8585
* Returns a function suitable for chokidar's `ignored` option.
8686
*/
8787
export function createWatcherIgnoreFilter(rootPath: string): (path: string) => boolean {
88-
const gitignorePath = join(rootPath, ".gitignore");
89-
90-
if (!existsSync(gitignorePath)) {
91-
// Default: ignore obvious noise, but keep .git metadata watched so git
92-
// operations can trigger refreshes.
93-
return (path: string) =>
94-
DEFAULT_WATCHER_IGNORED_PATTERNS.some((p) => p.test(normalizePath(path)));
95-
}
96-
97-
const gitignoreContent = readFileSync(gitignorePath, "utf-8");
98-
const ig = ignore().add(gitignoreContent);
88+
void rootPath;
9989

100-
return (path: string) => {
101-
const normalizedPath = normalizePath(path);
102-
if (DEFAULT_WATCHER_IGNORED_PATTERNS.some((p) => p.test(normalizedPath))) {
103-
return true;
104-
}
105-
106-
const relativePath = relativeToRoot(rootPath, path);
107-
return isIgnoredByGitignore(ig, relativePath);
108-
};
90+
// Watcher coverage intentionally ignores .gitignore so frontend refreshes
91+
// can react to generated files and other ignored paths. Keep only the
92+
// hard-coded noise filters here.
93+
return (path: string) =>
94+
DEFAULT_WATCHER_IGNORED_PATTERNS.some((p) => p.test(normalizePath(path)));
10995
}

0 commit comments

Comments
 (0)