UNPKG

2.31 kBtext/coffeescriptView Raw
1
2# Util.coffee - A few utility methods
3
4# Pull in dependencies
5EventEmitter = require('events').EventEmitter
6Buffer = require('buffer').Buffer
7_ = require 'underscore'
8fs = require 'fs'
9pathutil = require 'path'
10async = require 'async'
11
12# Fake stream for buffer that pretends like it's a stream
13class 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# Ability to extend a base class
29exports.extend = (object) ->
30 class Asset extends this
31 for key, value of object
32 Asset::[key] = value
33 Asset
34
35# Generalized walk function
36exports.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 # if filter is a string, folders shouldn't be passed to the iterator
47 # but should be recursed
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