|
|
@@ -1,6 +1,5 @@
|
|
|
import z from "zod"
|
|
|
import { Bus } from "../bus"
|
|
|
-import { Flag } from "../flag/flag"
|
|
|
import { Instance } from "../project/instance"
|
|
|
import { Log } from "../util/log"
|
|
|
import { FileIgnore } from "./ignore"
|
|
|
@@ -8,6 +7,7 @@ import { Config } from "../config/config"
|
|
|
// @ts-ignore
|
|
|
import { createWrapper } from "@parcel/watcher/wrapper"
|
|
|
import { lazy } from "@/util/lazy"
|
|
|
+import type ParcelWatcher from "@parcel/watcher"
|
|
|
|
|
|
export namespace FileWatcher {
|
|
|
const log = Log.create({ service: "file.watcher" })
|
|
|
@@ -44,32 +44,46 @@ export namespace FileWatcher {
|
|
|
return {}
|
|
|
}
|
|
|
log.info("watcher backend", { platform: process.platform, backend })
|
|
|
- const sub = await watcher().subscribe(
|
|
|
- Instance.directory,
|
|
|
- (err, evts) => {
|
|
|
- if (err) return
|
|
|
- for (const evt of evts) {
|
|
|
- log.info("event", evt)
|
|
|
- if (evt.type === "create") Bus.publish(Event.Updated, { file: evt.path, event: "add" })
|
|
|
- if (evt.type === "update") Bus.publish(Event.Updated, { file: evt.path, event: "change" })
|
|
|
- if (evt.type === "delete") Bus.publish(Event.Updated, { file: evt.path, event: "unlink" })
|
|
|
- }
|
|
|
- },
|
|
|
- {
|
|
|
- ignore: [...FileIgnore.PATTERNS, ...(cfg.watcher?.ignore ?? [])],
|
|
|
+ const subscribe: ParcelWatcher.SubscribeCallback = (err, evts) => {
|
|
|
+ if (err) return
|
|
|
+ for (const evt of evts) {
|
|
|
+ log.info("event", evt)
|
|
|
+ if (evt.type === "create") Bus.publish(Event.Updated, { file: evt.path, event: "add" })
|
|
|
+ if (evt.type === "update") Bus.publish(Event.Updated, { file: evt.path, event: "change" })
|
|
|
+ if (evt.type === "delete") Bus.publish(Event.Updated, { file: evt.path, event: "unlink" })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const subs = []
|
|
|
+ const cfgIgnores = cfg.watcher?.ignore ?? []
|
|
|
+
|
|
|
+ subs.push(
|
|
|
+ await watcher().subscribe(Instance.directory, subscribe, {
|
|
|
+ ignore: [...FileIgnore.PATTERNS, ...cfgIgnores],
|
|
|
backend,
|
|
|
- },
|
|
|
+ }),
|
|
|
)
|
|
|
- return { sub }
|
|
|
+
|
|
|
+ const vcsDir = Instance.project.vcsDir
|
|
|
+ if (vcsDir && !cfgIgnores.includes(".git") && !cfgIgnores.includes(vcsDir)) {
|
|
|
+ subs.push(
|
|
|
+ await watcher().subscribe(vcsDir, subscribe, {
|
|
|
+ ignore: ["hooks", "info", "logs", "objects", "refs", "worktrees", "modules", "lfs"],
|
|
|
+ backend,
|
|
|
+ }),
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ return { subs }
|
|
|
},
|
|
|
async (state) => {
|
|
|
- if (!state.sub) return
|
|
|
- await state.sub?.unsubscribe()
|
|
|
+ if (!state.subs) return
|
|
|
+ await Promise.all(state.subs.map((sub) => sub?.unsubscribe()))
|
|
|
},
|
|
|
)
|
|
|
|
|
|
export function init() {
|
|
|
- if (!Flag.OPENCODE_EXPERIMENTAL_WATCHER) return
|
|
|
+ // if (!Flag.OPENCODE_EXPERIMENTAL_WATCHER) return
|
|
|
state()
|
|
|
}
|
|
|
}
|