neft
Version:
Universal Platform
84 lines (71 loc) • 2.43 kB
text/coffeescript
'use strict'
chokidar = require 'chokidar'
fs = require 'fs'
glob = require 'glob'
Module = require 'module'
utils = require 'src/utils'
moduleCache = require 'lib/module-cache'
module.exports = (platform, options, onBuild) ->
srcChangedFiles = []
isWaiting = false
isPending = false
shouldBuildAgain = false
{lastResult} = options
files = Object.create null
ignored = '^(?:build|index\\.js|local\\.json|node_modules)'
ignored += '|(^|[\\/\\\\])\\..'
if options.out
ignored += "|^#{options.out}"
update = ->
isWaiting = false
if isPending
shouldBuildAgain = true
return
changedFiles = [srcChangedFiles...]
for buildFilePath in glob.sync('./build/*(styles|components)/**/*')
changedFiles.push fs.realpathSync buildFilePath
cache = Module._cache
for file in changedFiles
delete cache[file]
isPending = true
buildOptions = utils.mergeAll {}, options,
srcChangedFiles: srcChangedFiles
changedFiles: changedFiles
buildBundleOnly: true
lastResult: lastResult
srcChangedFiles = []
onBuild buildOptions, (result) ->
isPending = false
lastResult = result
if shouldBuildAgain
shouldBuildAgain = false
update()
chokidarOptions =
ignored: new RegExp ignored
ignoreInitial: true
chokidar.watch('.', chokidarOptions).on 'all', (event, path) ->
if event is 'error'
return
unless event in ['addDir', 'unlinkDir']
if event is 'unlink'
delete files[path]
else
file = moduleCache.getFileSync path
if files[path] is file
return
files[path] = file
if event is 'change'
srcChangedFiles.push fs.realpathSync path
unless isWaiting
setTimeout update, 200
isWaiting = true
return