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 | ||
|  | ``` |