@types/fb-watchman
Version:
TypeScript definitions for fb-watchman
414 lines (374 loc) • 12.7 kB
TypeScript
/// <reference types="node" />
import { EventEmitter } from "events";
// Emit the responses to these when they get sent down to us
export type UnilateralTags = "unilateralTags" | "log";
/** Options for configuring the Watchman client */
export interface ClientOptions {
/**
* Absolute path to the watchman binary.
* If not provided, the Client locates the binary using the PATH specified
* by the node child_process's default env.
*/
watchmanBinaryPath?: string;
}
/** Watchman capability check configuration */
export interface Capabilities {
optional: string[];
required: string[];
}
/** Response from the watch-project command */
export interface WatchProjectResponse {
/** The watched root directory */
watch: string;
/** Warning message if any */
warning?: string;
/** Relative path from the watch root to the requested directory */
relative_path?: string;
}
/** Response from the subscribe command */
export interface SubscribeResponse {
/** Name of the subscription that was established */
subscribe: string;
}
/** File change notification from a subscription */
export interface SubscriptionResponse {
/** Root directory being watched */
root: string;
/** Subscription name that generated this notification */
subscription: string;
/** Array of files that changed */
files: FileChange[];
}
/** Information about a changed file */
export interface FileChange {
/** Name of the file that changed */
name: string;
/** Size of the file in bytes */
size?: number;
/** Modification time in milliseconds since epoch */
mtime_ms?: number | { toNumber(): number };
/** Whether the file exists */
exists?: boolean;
/** Type of the file */
type?: FileType;
}
/**
* Depth operators for dirname expressions
* @example ["dirname", "foo/bar", ["depth", "eq", 0]]
*/
export type DepthOperator = "eq" | "ge" | "gt" | "le" | "lt" | "ne";
/**
* File type identifiers
* - b: block special file
* - c: character special file
* - d: directory
* - f: regular file
* - p: named pipe (fifo)
* - l: symbolic link
* - s: socket
* - D: Solaris Door
* - ?: unknown file type
*/
export type FileType = "b" | "c" | "d" | "f" | "p" | "l" | "s" | "D" | "?";
/**
* Name scope for match and name expressions
* - basename: Match against the file's basename (default)
* - wholename: Match against the file's full path
*/
export type NameScope = "basename" | "wholename";
/**
* Time fields for since expressions
*/
export type TimeField = "mtime" | "ctime";
/**
* Size comparison operators
*/
export type SizeOperator = "eq" | "ge" | "gt" | "le" | "lt" | "ne";
/**
* Log Levels:
* - debug - receive all log events
* - error - receive only important log events
* - off - receive no log events
*/
export type LogLevel = "debug" | "error" | "off";
/**
* Expression term definitions
* @see https://facebook.github.io/watchman/docs/expr/allof.html
*/
export type Expression =
| readonly ["allof", ...Expression[]]
| readonly ["anyof", ...Expression[]]
| readonly ["not", Expression]
| readonly ["true"]
| readonly ["false"]
| readonly ["empty"]
| readonly ["exists"]
| readonly ["since", string | number, TimeField?]
| readonly ["size", SizeOperator, number]
| readonly ["suffix", string | string[]]
| readonly ["type", FileType]
| readonly ["dirname", string]
| readonly ["dirname", string, readonly ["depth", DepthOperator, number]]
| readonly ["match", string, NameScope?]
| readonly ["name", string | string[], NameScope?]
| readonly ["iname", string | string[], NameScope?];
/** Subscription configuration */
export interface SubscriptionConfig {
/** Expression to filter files */
expression: Expression;
/** Fields to include in the response */
fields?: Array<keyof FileChange>;
/** Relative root for the subscription */
relative_root?: string;
}
/** Callback type for command responses */
export type CommandCallback<T = any> = (error: Error | null, resp: T) => void;
export class Client extends EventEmitter {
constructor(options?: ClientOptions);
/**
* Send the next command in the queue
*/
sendNextCommand(): void;
/**
* Cancel all pending commands
* @param why Reason for cancellation
*/
cancelCommands(why: string): void;
/**
* Connect to the watchman service
*/
connect(): void;
/**
* Watch a directory
* @param dir Directory to watch
* @param callback Response callback
*/
command(args: ["watch-project", string], callback: CommandCallback<WatchProjectResponse>): void;
/**
* Subscribe to file changes
* @param watch Watch root from watch-project response
* @param name Subscription name
* @param config Subscription configuration
* @param callback Response callback
*/
command(
args: ["subscribe", string, string, SubscriptionConfig],
callback: CommandCallback<SubscribeResponse>,
): void;
/**
* Cancel a subscription
* @param watch Watch root from watch-project response
* @param name Subscription name to cancel
* @param callback Response callback
*/
command(args: ["unsubscribe", string, string], callback: CommandCallback): void;
/**
* log-level
* @param level Log level
*
* client.command(['log-level', 'debug']);
* client.on('log', function(info) {
* console.log(info);
* });
*/
command(args: ["log-level", LogLevel], callback: CommandCallback): void;
/**
* Request watching a directory for changes
* @deprecated Since version 3.1. Use watch-project instead
* @param dir Absolute path to directory to watch
* @param callback Response callback
*
* @example
* client.command(['watch', '/home/user/www']);
*/
command(args: ["watch", string], callback: CommandCallback): void;
/**
* Get watchman configuration for a root
* Returns the .watchmanconfig for the root, or empty config if none exists
* @param root Watch root to get config for
* @param callback Response callback
*/
command(
args: ["get-config", string],
callback: CommandCallback<{
version: string;
config: Record<string, unknown>;
}>,
): void;
/**
* Get the path to the watchman socket
* Useful when integrating with watchman using unix socket with JSON/BSER protocol
* Has side effect of spawning the service if not running
* @param callback Response callback
*/
command(
args: ["get-sockname"],
callback: CommandCallback<{
version: string;
sockname: string;
}>,
): void;
/**
* Generate a log line in the watchman log
* @param level Log level (debug, error)
* @param message Message to log
* @param callback Response callback
*
* @example
* client.command(['log', 'debug', 'log this please']);
*/
command(args: ["log", LogLevel, string], callback: CommandCallback): void;
/**
* Shutdown the watchman server
* Causes the watchman service to exit with a normal status code
* @param callback Response callback
*/
command(args: ["shutdown-server"], callback: CommandCallback): void;
/**
* Returns the current clock value for a watched root
* @requires clock-sync-timeout capability for sync_timeout option
* @param root Watch root to get clock for
* @param options Optional sync_timeout configuration
* @param callback Response callback
*
* @example
* client.command(['clock', '/path/to/dir', { sync_timeout: 100 }]);
*/
command(args: ["clock", string] | ["clock", string, Record<string, unknown>], callback: CommandCallback): void;
/**
* Find files under a specified directory
* @param root Directory to search in
* @param patterns Optional patterns to filter files
* @param callback Response callback
*
* @example
* client.command(['find', '/path/to/dir']); // Find all files
* client.command(['find', '/path/to/dir', ['*.js', '*.ts']]); // Find by patterns
*/
command(args: ["find", string] | ["find", string, string[]], callback: CommandCallback<FileChange[]>): void;
/**
* Mark a watch as being in a particular named state
* @since 4.4
* @param root Watch root to set state for
* @param state State name or configuration
* @param callback Response callback
*
* The state persists until a corresponding state-leave command or
* until the client session disconnects. Used in conjunction with
* state-leave for advanced settling in subscriptions.
*
* @example
* // Simple state
* client.command(['state-enter', '/path/to/root', 'mystate']);
*
* // Complex state with metadata and sync_timeout
* client.command(['state-enter', '/path/to/root', {
* name: 'mystate',
* metadata: { foo: 'bar' },
* sync_timeout: 10000
* }]);
*/
command(args: ["state-enter", string, string | Record<string, unknown>], callback: CommandCallback): void;
/**
* Remove a particular named state from a watch
* @since 4.4
* @param root Watch root to remove state from
* @param state State name or configuration
* @param callback Response callback
*
* Used in conjunction with state-enter for advanced settling in subscriptions.
* States are automatically removed when the client session disconnects.
*
* @example
* // Simple state
* client.command(['state-leave', '/path/to/root', 'mystate']);
*
* // Complex state with metadata and sync_timeout
* client.command(['state-leave', '/path/to/root', {
* name: 'mystate',
* metadata: { foo: 'bar' },
* sync_timeout: 10000
* }]);
*/
command(args: ["state-leave", string, string | Record<string, unknown>], callback: CommandCallback): void;
/**
* Get version and build information for the watchman service
* @param callback Response callback
*
* @example
* client.command(['version'], (error, resp) => {
* console.log(`Server version: ${resp.version}`);
* console.log(`Build info: ${resp.buildinfo}`);
* });
*/
command(
args:
| ["version"]
| [
"version",
{
optional: string[];
required: string[];
},
],
callback: CommandCallback<{
version: string;
buildinfo: string;
capabilities?: Record<string, boolean>;
}>,
): void;
/**
* This command returns the full list of supported capabilities offered by the watchman server.
* The intention is that client applications will use the expanded version command to check compatibility rather than interrogating the full list.
* @param callback Response callback
*/
command(
args: ["list-capabilities"],
callback: CommandCallback<{
capabilities: Record<string, boolean>;
}>,
): void;
/**
* There are more commands but they are not documented:
* https://facebook.github.io/watchman/docs/nodejs
*/
command(
args: [
(
| "flush-subscriptions"
| "query"
| "since"
| "trigger-del"
| "trigger-list"
| "trigger"
| "watch-del-all"
| "watch-del"
| "watch-list"
),
...any[],
],
): void;
/**
* Check capabilities of the watchman service
* @param caps Capabilities to check
* @param done Callback with results
*/
capabilityCheck(caps: Capabilities, done: CommandCallback): void;
/**
* End the connection
*/
end(): void;
/** Connect */
on(event: "connect", listener: () => void): this;
/** Subscription event handler */
on(event: "subscription", listener: (resp: SubscriptionResponse) => void): this;
/** Error event handler */
on(event: "error", listener: (error: Error) => void): this;
/** End event handler */
on(event: "end", listener: () => void): this;
/**
* Log event handler
* @see https://facebook.github.io/watchman/docs/cmd/log-level
*/
on(event: "log", listener: (info: { version: string; log: string }) => void): this;
}