Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Kit Langton
80fee8691d refactor: unwrap FileWatcher namespace + self-reexport 2026-04-16 19:42:43 -04:00

View file

@ -19,11 +19,10 @@ import { Log } from "../util"
declare const OPENCODE_LIBC: string | undefined
export namespace FileWatcher {
const log = Log.create({ service: "file.watcher" })
const SUBSCRIBE_TIMEOUT_MS = 10_000
const log = Log.create({ service: "file.watcher" })
const SUBSCRIBE_TIMEOUT_MS = 10_000
export const Event = {
export const Event = {
Updated: BusEvent.define(
"file.watcher.updated",
z.object({
@ -31,9 +30,9 @@ export namespace FileWatcher {
event: z.union([z.literal("add"), z.literal("change"), z.literal("unlink")]),
}),
),
}
}
const watcher = lazy((): typeof import("@parcel/watcher") | undefined => {
const watcher = lazy((): typeof import("@parcel/watcher") | undefined => {
try {
const binding = require(
`@parcel/watcher-${process.platform}-${process.arch}${process.platform === "linux" ? `-${OPENCODE_LIBC || "glibc"}` : ""}`,
@ -43,30 +42,30 @@ export namespace FileWatcher {
log.error("failed to load watcher binding", { error })
return
}
})
})
function getBackend() {
function getBackend() {
if (process.platform === "win32") return "windows"
if (process.platform === "darwin") return "fs-events"
if (process.platform === "linux") return "inotify"
}
}
function protecteds(dir: string) {
function protecteds(dir: string) {
return Protected.paths().filter((item) => {
const rel = path.relative(dir, item)
return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel)
})
}
}
export const hasNativeBinding = () => !!watcher()
export const hasNativeBinding = () => !!watcher()
export interface Interface {
export interface Interface {
readonly init: () => Effect.Effect<void>
}
}
export class Service extends Context.Service<Service, Interface>()("@opencode/FileWatcher") {}
export class Service extends Context.Service<Service, Interface>()("@opencode/FileWatcher") {}
export const layer = Layer.effect(
export const layer = Layer.effect(
Service,
Effect.gen(function* () {
const config = yield* Config.Service
@ -157,7 +156,8 @@ export namespace FileWatcher {
}),
})
}),
)
)
export const defaultLayer = layer.pipe(Layer.provide(Config.defaultLayer), Layer.provide(Git.defaultLayer))
}
export const defaultLayer = layer.pipe(Layer.provide(Config.defaultLayer), Layer.provide(Git.defaultLayer))
export * as FileWatcher from "./watcher"