154 lines
5.4 KiB
Markdown
154 lines
5.4 KiB
Markdown
|
# watch -- Utilities for watching file trees in node.js
|
||
|
|
||
|
## Install
|
||
|
|
||
|
<pre>
|
||
|
npm install watch
|
||
|
</pre>
|
||
|
|
||
|
## Purpose
|
||
|
|
||
|
The intention of this module is provide tools that make managing the watching of file & directory trees easier.
|
||
|
|
||
|
#### watch.watchTree(root, [options,] callback)
|
||
|
|
||
|
The first argument is the directory root you want to watch.
|
||
|
|
||
|
The options object is passed to fs.watchFile but can also be used to provide two additional watchTree specific options:
|
||
|
|
||
|
* `'ignoreDotFiles'` - When true this option means that when the file tree is walked it will ignore files that being with "."
|
||
|
* `'filter'` - You can use this option to provide a function that returns true or false for each file and directory to decide whether or not that file/directory is included in the watcher.
|
||
|
* `'interval'` - Specifies the interval duration in seconds, the time period between polling for file changes.
|
||
|
* `'ignoreUnreadableDir'` - When true, this options means that when a file can't be read, this file is silently skipped.
|
||
|
* `'ignoreNotPermitted'` - When true, this options means that when a file can't be read due to permission issues, this file is silently skipped.
|
||
|
* `'ignoreDirectoryPattern'` - When a regex pattern is set, e.g. /node_modules/, these directories are silently skipped.
|
||
|
|
||
|
The callback takes 3 arguments. The first is the file that was modified. The second is the current stat object for that file and the third is the previous stat object.
|
||
|
|
||
|
When a file is new the previous stat object is null.
|
||
|
|
||
|
When watchTree is finished walking the tree and adding all the listeners it passes the file hash (keys are the file/directory names and the values are the current stat objects) as the first argument and null as both the previous and current stat object arguments.
|
||
|
|
||
|
<pre>
|
||
|
watch.watchTree('/home/mikeal', function (f, curr, prev) {
|
||
|
if (typeof f == "object" && prev === null && curr === null) {
|
||
|
// Finished walking the tree
|
||
|
} else if (prev === null) {
|
||
|
// f is a new file
|
||
|
} else if (curr.nlink === 0) {
|
||
|
// f was removed
|
||
|
} else {
|
||
|
// f was changed
|
||
|
}
|
||
|
})
|
||
|
</pre>
|
||
|
|
||
|
### watch.unwatchTree(root)
|
||
|
|
||
|
Unwatch a previously watched directory root using `watch.watchTree`.
|
||
|
|
||
|
### watch.createMonitor(root, [options,] callback)
|
||
|
|
||
|
This function creates an EventEmitter that gives notifications for different changes that happen to the file and directory tree under the given root argument.
|
||
|
|
||
|
The options object is passed to watch.watchTree.
|
||
|
|
||
|
The callback receives the monitor object.
|
||
|
|
||
|
The monitor object contains a property, `files`, which is a hash of files and directories as keys with the current stat object as the value.
|
||
|
|
||
|
The monitor has the following events.
|
||
|
|
||
|
* `'created'` - New file has been created. Two arguments, the filename and the stat object.
|
||
|
* `'removed'` - A file has been moved or deleted. Two arguments, the filename and the stat object for the fd.
|
||
|
* `'changed'` - A file has been changed. Three arguments, the filename, the current stat object, and the previous stat object.
|
||
|
|
||
|
The monitor can be stopped using `.stop` (calls `unwatchTree`).
|
||
|
|
||
|
<pre>
|
||
|
var watch = require('watch')
|
||
|
watch.createMonitor('/home/mikeal', function (monitor) {
|
||
|
monitor.files['/home/mikeal/.zshrc'] // Stat object for my zshrc.
|
||
|
monitor.on("created", function (f, stat) {
|
||
|
// Handle new files
|
||
|
})
|
||
|
monitor.on("changed", function (f, curr, prev) {
|
||
|
// Handle file changes
|
||
|
})
|
||
|
monitor.on("removed", function (f, stat) {
|
||
|
// Handle removed files
|
||
|
})
|
||
|
monitor.stop(); // Stop watching
|
||
|
})
|
||
|
</pre>
|
||
|
|
||
|
### CLI
|
||
|
|
||
|
This module includes a simple command line interface, which you can install with `npm install watch -g`.
|
||
|
|
||
|
|
||
|
```
|
||
|
Usage: watch <command> [...directory] [OPTIONS]
|
||
|
|
||
|
OPTIONS:
|
||
|
--wait=<seconds>
|
||
|
Duration, in seconds, that watching will be disabled
|
||
|
after running <command>. Setting this option will
|
||
|
throttle calls to <command> for the specified duration.
|
||
|
|
||
|
--filter=<file>
|
||
|
Path to a require-able .js file that exports a filter
|
||
|
function to be passed to watchTreeOptions.filter.
|
||
|
Path is resolved relative to process.cwd().
|
||
|
|
||
|
--interval=<seconds>
|
||
|
Specifies the interval duration in seconds, the time period between polling for file changes.
|
||
|
|
||
|
--ignoreDotFiles, -d
|
||
|
Ignores dot or hidden files in the watch [directory].
|
||
|
|
||
|
--ignoreUnreadable, -u
|
||
|
Silently ignores files that cannot be read within the
|
||
|
watch [directory].
|
||
|
|
||
|
--ignoreDirectoryPattern=<regexp>, -p
|
||
|
Silently skips directories that match the regular
|
||
|
expression.
|
||
|
```
|
||
|
|
||
|
It will watch the given directories (defaults to the current working directory) with `watchTree` and run the given command every time a file changes.
|
||
|
|
||
|
### Examples
|
||
|
|
||
|
As stated above the pattern is:
|
||
|
|
||
|
watch <command> [...directory] [OPTIONS]
|
||
|
|
||
|
To run the watch command in the terminal you have to write the following:
|
||
|
|
||
|
watch 'npm run test -s' directory
|
||
|
|
||
|
As the command has to be written in quotation marks Windows users may need to use double quotes rather than single quotes
|
||
|
|
||
|
watch "npm run test -s" directory
|
||
|
|
||
|
Note: Because Windows users may need to use double quotes rather than single quotes they need to escape the them in npm scripts
|
||
|
|
||
|
"scripts": {
|
||
|
"watch:osx": "watch 'npm run test -s' source"
|
||
|
"watch:windows": "watch \"npm run test -s\" source",
|
||
|
}
|
||
|
|
||
|
|
||
|
## Contributing
|
||
|
|
||
|
### Releasing
|
||
|
|
||
|
On the latest clean `master`:
|
||
|
|
||
|
```
|
||
|
npm run release:major
|
||
|
npm run release:minor
|
||
|
npm run release:patch
|
||
|
```
|