import Joi from "@hapi/joi"; export interface WatchOptions { ignore?: ReadonlyArray; } export interface Watcher { onInit?(): void | Promise; onCleanup?(): void | Promise; watch( rootDir: string, paths: ReadonlyArray, options?: WatchOptions ): AsyncIterable; } export interface Executor { onInit?(): void | Promise; onCleanup?(): void | Promise; execute(filePath: string): void; } export interface Options { only?: ReadonlyArray; } export interface Config { rootDir?: string; backend?: Watcher; watchers: Record; defaultSet?: string; sets?: Record>; } export interface WatchConfig { paths: ReadonlyArray; ignore?: ReadonlyArray; executor: Executor; } export const configSchema = Joi.object({ rootDir: Joi.string().optional(), backend: Joi.object().optional(), watchers: Joi.object().pattern( /.*/, Joi.object({ paths: Joi.array().items(Joi.string()).unique(), ignore: Joi.array().items(Joi.string()).unique().optional(), executor: Joi.object(), }) ), defaultSet: Joi.string().optional(), sets: Joi.object() .pattern(/.*/, Joi.array().items(Joi.string()).unique()) .optional(), }).with("defaultSet", "sets");