Jump To …

src/tasks/build/

build.coffee


          
glob = require 'glob'
Q = require 'q'
Neat = require '../../neat'
logs = Neat.require 'utils/logs'
processors = Neat.require 'processing'

class Build
  constructor: (@name) ->
    @sources = []
    @processors = []

  source: (path) -> @sources.push Neat.rootResolve path

  do: (promise) ->
    @processors.push promise
    this

  then: Build::do

  fail: (handler) ->
    @failHandler = handler
    this

  process: ->
    promise = @findSources()
    .then (files) =>
      @loadBuffer files
    .then (buffer) =>
      @processBuffer buffer
    .then =>
      logs.info logs.green "#{@name} build completed"

    promise.fail @failHandler if @failHandler?
    promise

  findSources: ->
    findOneSources = (path) ->
      defer = Q.defer()
      glob path, {}, (err, results) ->
        return defer.reject err if err?
        defer.resolve results

      defer.promise

    Q.all(findOneSources(source) for source in @sources)
    .then (paths) -> paths.flatten().uniq()

  loadBuffer: (paths) ->
    processors.readFiles(paths)

  processBuffer: (buffer) ->
    promise = Q.fcall(-> buffer)
    for processor in @processors
      promise = promise.then(processor).fail (err) ->
        console.log "failed in processor #{processor} with #{err}\n#{err.stack}"
    promise

  toString: -> "[Build: #{@name}]"

module.exports = Build