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