UNPKG

2.44 kBJavaScriptView Raw
1'use strict'
2const chokidar = require('chokidar')
3const path = require('path')
4const socketsConnected = []
5
6module.exports = (opts, cb) => {
7 let baseURL
8 let pjson
9 let error
10 try {
11 pjson = require(path.join(opts.dir || path.dirname(require.main.filename), 'package.json'))
12 } catch (err) {
13 error = err
14 }
15 if (!error) {
16 baseURL = pjson.jspm && pjson.jspm.directories && pjson.jspm.directories.baseURL || pjson.directories && pjson.directories.baseURL
17 }
18
19 let app = opts.app
20 if (!app) {
21 app = require('http').createServer()
22 }
23
24 var io = require('socket.io')(app)
25 if (!opts.app) {
26 let port = opts.port || 9111
27 app.listen(port, () => {
28 console.log('chokidar-socket-emitter listening on ' + port)
29 cb && cb()
30 })
31 }
32 const pathToWatch = opts.path || baseURL || '.'
33 let ignoredPaths = [
34 /[\/\\]\./,
35 // Ignore relative, top-level dotfiles as well (e.g. '.gitignore').
36 /^\.[^\/\\]/,
37 'node_modules/**',
38 (baseURL ? baseURL + '/' : '') + 'jspm_packages/**',
39 '.git/**'
40 ]
41 let chokidarOpts = Object.assign({
42 ignored: ignoredPaths,
43 ignoreInitial: true
44 }, opts.chokidar)
45 console.log('chokidar watching ', path.resolve(pathToWatch))
46 var watcher = chokidar.watch(pathToWatch, chokidarOpts).on('all', (event, onPath) => {
47 let absolutePath = path.join(process.cwd(), onPath)
48 if (opts.relativeTo) {
49 onPath = path.relative(opts.relativeTo, onPath)
50 } else if (baseURL) {
51 onPath = path.relative(baseURL, onPath)
52 }
53 if (path.sep === '\\') {
54 onPath = onPath.replace(/\\/g, '/')
55 } else {
56
57 }
58 console.log('File ', onPath, ' emitted: ' + event)
59 socketsConnected.forEach((socket) => {
60 socket.emit(event, {path: onPath, absolutePath})
61 })
62 })
63 io.on('connection', (socket) => {
64 let index = socketsConnected.push(socket)
65 socket.on('disconnect', () => {
66 socketsConnected.splice(index - 1, 1)
67 })
68
69 socket.on('identification', (name) => {
70 console.log('connected client: ' + name)
71 })
72 if (pjson) {
73 socket.on('package.json', function (fn) {
74 fn(pjson)
75 })
76 }
77 })
78
79 return {
80 io: io,
81 app: app,
82 watcher: watcher,
83 close: (callback) => {
84 watcher.close()
85 console.log('closing chokidar-socket-emitter')
86 socketsConnected.forEach((socket) => {
87 socket.disconnect()
88 })
89 io.httpServer.close(callback)
90 }
91 }
92}