UNPKG

15.2 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import treeKill from \"tree-kill\";\nimport { resolve, dirname, extname, basename } from \"path\";\nimport { ChildProcess } from \"child_process\";\nimport { spawn } from \"cross-spawn\";\nimport chokidar from \"chokidar\";\nimport { Writable, Readable } from \"stream\";\nimport { Deque } from \"@blakeembrey/deque\";\nimport { template, Template } from \"@blakeembrey/template\";\n\nconst ECHO_JS_PATH = resolve(__dirname, \"echo.js\");\nconst ECHO_CMD = `${quote(process.execPath)} ${quote(ECHO_JS_PATH)}`;\n\n/**\n * State used for `onchange` commands.\n */\ninterface State {\n event: string;\n /** @deprecated use file instead */\n changed: string;\n file: string;\n fileExt: string;\n fileBase: string;\n fileBaseNoExt: string;\n fileDir: string;\n}\n\n/**\n * Execute a \"job\" on each change event.\n */\nclass Job {\n childCommand: ChildProcess | undefined;\n childOutpipe: ChildProcess | undefined;\n\n constructor(\n public log: (value: string) => void,\n public command: string[],\n public outpipe?: string\n ) {}\n\n start(\n cwd: string,\n stdin: Readable,\n stdout: Writable,\n stderr: Writable,\n env: NodeJS.ProcessEnv,\n onexit: () => void\n ) {\n if (this.outpipe) {\n const stdio = [null, stdout, stderr];\n\n this.log(`executing outpipe \"${this.outpipe}\"`);\n this.childOutpipe = spawn(this.outpipe, { cwd, env, stdio, shell: true });\n\n this.childOutpipe.on(\"exit\", (code, signal) => {\n this.log(`outpipe ${exitMessage(code, signal)}`);\n this.childOutpipe = undefined;\n if (!this.childCommand) return onexit();\n });\n }\n\n if (this.command.length) {\n const stdio = [\n stdin,\n // Use `--outpipe` when specified, otherwise direct to `stdout`.\n this.childOutpipe ? this.childOutpipe.stdin : stdout,\n stderr,\n ];\n\n this.log(`executing command \"${this.command.join(\" \")}\"`);\n this.childCommand = spawn(this.command[0], this.command.slice(1), {\n cwd,\n env,\n stdio,\n });\n\n this.childCommand.on(\"exit\", (code, signal) => {\n this.log(`command ${exitMessage(code, signal)}`);\n this.childCommand = undefined;\n if (!this.childOutpipe) return onexit();\n return this.childOutpipe?.stdin?.end();\n });\n } else {\n // No data to write to `outpipe`.\n this.childOutpipe?.stdin?.end();\n }\n }\n\n kill(killSignal?: NodeJS.Signals) {\n if (this.childOutpipe) {\n this.log(`killing outpipe ${this.childOutpipe.pid}`);\n treeKill(this.childOutpipe.pid, killSignal);\n }\n\n if (this.childCommand) {\n this.log(`killing command ${this.childCommand.pid}`);\n treeKill(this.childCommand.pid, killSignal);\n }\n }\n}\n\n/**\n * Onchange configuration options.\n */\nexport interface Options {\n add?: boolean;\n awaitWriteFinish?: number;\n command?: string[];\n cwd?: string;\n defaultExclude?: boolean;\n delay?: number;\n env?: NodeJS.ProcessEnv;\n exclude?: (string | ((path: string) => boolean))[];\n filter?: string[];\n initial?: boolean;\n jobs?: number;\n kill?: boolean;\n killSignal?: NodeJS.Signals;\n matches: string[];\n onReady?: () => void;\n outpipe?: string;\n poll?: number;\n stderr?: Writable;\n stdin?: Readable;\n stdout?: Writable;\n verbose?: boolean;\n}\n\n/**\n * Onchange manages\n */\nexport function onchange(options: Options): () => void {\n const { matches } = options;\n const onReady = options.onReady || (() => undefined);\n const initial = !!options.initial;\n const kill = !!options.kill;\n const cwd = options.cwd ? resolve(options.cwd) : process.cwd();\n const stdin: Readable = options.stdin || process.stdin;\n const stdout: Writable = options.stdout || process.stdout;\n const stderr: Writable = options.stderr || process.stderr;\n const env = options.env || process.env;\n const delay = Math.max(options.delay || 0, 0);\n const jobs = Math.max(options.jobs || 0, 1);\n const killSignal = options.killSignal || \"SIGTERM\";\n const command = options.command\n ? options.command.map((arg) => template<State>(arg))\n : [];\n const outpipe = options.outpipe\n ? outpipeTemplate(options.outpipe)\n : undefined;\n const filter = options.filter || [];\n const running = new Set<Job>();\n const queue = new Deque<Job>();\n\n // Logging.\n const log = options.verbose\n ? function log(message: string) {\n stdout.write(`onchange: ${message}\\n`);\n }\n : function () {};\n\n // Invalid, nothing to run on change.\n if (command.length === 0 && !outpipe) {\n throw new TypeError('Expected \"command\" and/or \"outpipe\" to be specified');\n }\n\n const ignored = options.exclude || [];\n const ignoreInitial = options.add !== true;\n const usePolling = options.poll !== undefined;\n const interval = options.poll !== undefined ? options.poll : undefined;\n const awaitWriteFinish = options.awaitWriteFinish\n ? { stabilityThreshold: options.awaitWriteFinish }\n : undefined;\n\n // Add default excludes to the ignore list.\n if (options.defaultExclude !== false) {\n ignored.push(\"**/node_modules/**\", \"**/.git/**\");\n }\n\n // Create the \"watcher\" instance for file system changes.\n const watcher = chokidar.watch(matches, {\n cwd,\n ignored,\n ignoreInitial,\n usePolling,\n interval,\n awaitWriteFinish,\n });\n\n /**\n * Try and dequeue the next job to run.\n */\n function dequeue() {\n // Nothing to process.\n if (queue.size === 0) return;\n\n // Too many jobs running already.\n if (running.size >= jobs) return;\n\n // Remove first job from queue (FIFO).\n const job = queue.popLeft();\n\n // Add job to running set.\n running.add(job);\n\n // Start the process and remove when finished.\n job.start(cwd, stdin, stdout, stderr, env, () => {\n running.delete(job);\n if (delay > 0) return setTimeout(dequeue, delay);\n return dequeue();\n });\n }\n\n /**\n * Enqueue the next change event to run.\n */\n function enqueue(event: string, file: string) {\n const fileExt = extname(file);\n const state: State = {\n event,\n changed: file,\n file,\n fileExt,\n fileBase: basename(file),\n fileBaseNoExt: basename(file, fileExt),\n fileDir: dirname(file),\n };\n\n // Kill all existing tasks on `enqueue`.\n if (kill) {\n queue.clear(); // Remove pending (\"killed\") tasks.\n running.forEach((child) => child.kill(killSignal)); // Kill running tasks.\n }\n\n // Log the event and the file affected.\n log(`${file}: ${event}`);\n\n // Add item to job queue.\n queue.push(\n new Job(\n log,\n command.map((arg) => arg(state)),\n outpipe?.(state)\n )\n );\n\n // Try to immediately run the enqueued job.\n return dequeue();\n }\n\n // Execute initial event without any changes.\n if (initial) enqueue(\"\", \"\");\n\n // For any change, creation or deletion, try to run.\n watcher.on(\"all\", (event, file) => {\n if (filter.length && filter.indexOf(event) === -1) return;\n\n return enqueue(event, file);\n });\n\n // On ready, prepare triggers.\n watcher.on(\"ready\", () => {\n log(`watcher ready`);\n\n // Notify external listener of \"ready\" event.\n return onReady();\n });\n\n watcher.on(\"error\", (error: Error) => log(`watcher error: ${error}`));\n\n // Return a close function.\n return () => watcher.close();\n}\n\n// Template generator for `outpipe` option.\nfunction outpipeTemplate(str: string): Template<State> {\n var value = str.trim();\n\n if (value.charAt(0) === \"|\" || value.charAt(0) === \">\") {\n return template<State>(`${ECHO_CMD} ${value}`);\n }\n\n return template<State>(value);\n}\n\n// Simple exit message generator.\nfunction exitMessage(code: number | null, signal: string | null) {\n return code === null ? `exited with ${signal}` : `completed with ${code}`;\n}\n\n/**\n * Quote value for `exec`.\n */\nfunction quote(str: string) {\n return `\"${str.replace(/[\"\\\\$`!]/g, \"\\\\$&\")}\"`;\n}\n"]}
\No newline at end of file