import { log } from "./deps.ts";
import { FileEvent, Watcher } from "./src/watcher.ts";import { Runner } from "./src/runner.ts";import { Daemon } from "./src/daemon.ts";
import { grantPermissions, initializeConfig, printAvailableScripts, printHelp, upgrade,} from "./src/cli.ts";import { CompleteDenonConfig, readConfig, reConfig } from "./src/config.ts";import { parseArgs } from "./src/args.ts";
import { BRANCH, VERSION } from "./info.ts";
const logger = log.create("main");
export declare type DenonEventType = | "start" | "reload" | "crash" | "success" | "exit";
export declare type DenonEvent = | DenonStartEvent | DenonReloadEvent | DenonCrashEvent | DenonSuccessEvent | DenonExitEvent;
export declare interface DenonStartEvent { type: "start";}
export declare interface DenonReloadEvent { type: "reload"; change: FileEvent[];}
export declare interface DenonCrashEvent { type: "crash"; status: Deno.ProcessStatus;}
export declare interface DenonSuccessEvent { type: "success"; status: Deno.ProcessStatus;}
export declare interface DenonExitEvent { type: "exit";}
export class Denon { watcher: Watcher; runner: Runner;
constructor(public config: CompleteDenonConfig) { this.watcher = new Watcher(config.watcher); this.runner = new Runner(config, config.args ? config.args.cmd : []); }
run(script: string): AsyncIterable<DenonEvent> { return new Daemon(this, script); }}
if (import.meta.main) { const args = parseArgs(Deno.args);
await grantPermissions();
let config = await readConfig(args.config); config.args = args;
await log.setup( { filter: config.logger.quiet ? "ERROR" : config.logger.debug ? "DEBUG" : "INFO", }, );
if (BRANCH !== "main") { logger.info(`v${VERSION}-${BRANCH}`); } else { logger.info(`v${VERSION}`); } if (args.version) Deno.exit(0);
if (args.upgrade) { await upgrade(args.upgrade); Deno.exit(0); }
if (args.help) { printHelp(); Deno.exit(0); }
if (args.init) { await initializeConfig(args.init); Deno.exit(0); }
if (args.cmd.length === 0) { await printAvailableScripts(config); Deno.exit(0); }
const script = args.cmd[0];
const denon = new Denon(config);
for await (const event of denon.run(script)) { if (event.type === "reload") { if ( event.change.some( (_) => reConfig.test(_.path) && _.path === config.configPath, ) ) { config = await readConfig(args.config); logger.debug("reloading config"); } } }}