1 |
|
2 | EventEmitter = require('events').EventEmitter
|
3 | Buffer = require('buffer').Buffer
|
4 | _ = require 'underscore'
|
5 | fs = require 'fs'
|
6 | pathutil = require 'path'
|
7 | async = require 'async'
|
8 |
|
9 | class exports.BufferStream extends EventEmitter
|
10 | constructor: (buffer) ->
|
11 | @data = new Buffer buffer
|
12 | super()
|
13 |
|
14 | pipe: (destination) ->
|
15 | destination.write @data
|
16 | destination.end()
|
17 | @emit 'close'
|
18 | @emit 'end'
|
19 | pause: ->
|
20 | resume: ->
|
21 | destroy: ->
|
22 | readable: true
|
23 |
|
24 | exports.extend = (object) ->
|
25 | class Asset extends this
|
26 | for key, value of object
|
27 | Asset::[key] = value
|
28 | Asset
|
29 |
|
30 | exports.walk = (root, options, iterator, cb) ->
|
31 | if _.isFunction options
|
32 | cb = iterator
|
33 | iterator = options
|
34 | options = {}
|
35 | cb ?= ->
|
36 | ignoreFolders = options.ignoreFolders || false
|
37 | filter = options.filter || -> true
|
38 |
|
39 | if _.isString filter
|
40 | filter = ((ext) ->
|
41 | ext = if ext[0] is '.' then ext else '.' + ext
|
42 | (file) -> file.ext == ext
|
43 | ) filter
|
44 |
|
45 | readdir = (dir, cb) ->
|
46 | fs.readdir dir, (err, files) ->
|
47 | return cb err if err?
|
48 | iter = (file, done) ->
|
49 | path = pathutil.join dir, file
|
50 | fs.stat path, (err, stats) ->
|
51 | return done err if err?
|
52 | fobj =
|
53 | name: pathutil.basename file
|
54 | namenoext: pathutil.basename file, pathutil.extname file
|
55 | relpath: pathutil.relative root, path
|
56 | path: path
|
57 | ext: pathutil.extname file
|
58 | stats: stats
|
59 | skip = (ignoreFolders and stats.isDirectory()) or !filter fobj
|
60 | if stats.isDirectory()
|
61 | readdir path, (err) ->
|
62 | return done err if err?
|
63 | if skip then done() else iterator fobj, done
|
64 | else
|
65 | if skip then done() else iterator fobj, done
|
66 | async.forEach files, iter, cb
|
67 |
|
68 | readdir root, cb
|