Skip to content

Commit 748a288

Browse files
Allow transforms to return a { css, files } object (#147)
* Allow transforms to return a `{ css, files }` object `'file'` events will be emitted for each file listed in `files`. * Fix lint
1 parent 9ee8133 commit 748a288

4 files changed

Lines changed: 60 additions & 8 deletions

File tree

index.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ function parseCss (src, filename, prefix, options, done) {
6464
assert.equal(typeof options, 'object', 'options must be a object')
6565
assert.equal(typeof done, 'function', 'done must be a function')
6666

67-
applyTransforms(filename, String(src), xtend(options), function (err, css) {
67+
applyTransforms(filename, String(src), xtend(options), function (err, result) {
6868
if (err) return done(err)
6969
var p = postcss()
7070
p = p.use(cssPrefix('.' + prefix))
7171

7272
try {
73-
css = p.process(css).toString()
73+
result.css = p.process(result.css).toString()
7474

75-
return done(null, css, prefix)
75+
return done(null, result, prefix)
7676
} catch (e) {
7777
return done(e)
7878
}
@@ -82,9 +82,10 @@ function parseCss (src, filename, prefix, options, done) {
8282
// one at the time
8383
// (str, str, obj, fn) -> null
8484
function applyTransforms (filename, src, options, done) {
85+
var current = { css: src, files: [] }
8586
mapLimit(options.transform, 1, iterate, function (err) {
8687
if (err) return done(err)
87-
done(null, src)
88+
done(null, current)
8889
})
8990

9091
// find and apply a transform to a string of css
@@ -106,9 +107,14 @@ function parseCss (src, filename, prefix, options, done) {
106107
if (err) return done(err)
107108

108109
const transform = require(transformPath)
109-
transform(filename, src, opts, function (err, result) {
110+
transform(filename, current.css, opts, function (err, result) {
110111
if (err) return next(err)
111-
src = result
112+
if (typeof result === 'string') {
113+
current.css = result
114+
} else {
115+
current.css = result.css
116+
current.files = current.files.concat(result.files)
117+
}
112118
next()
113119
})
114120
})

test/fixtures/files-plugin.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = function (file, source, opts, done) {
2+
done(null, {
3+
css: '.test {}',
4+
files: [opts.file]
5+
})
6+
}

test/plugins.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,39 @@ test('plugins', function (t) {
5555
t.end()
5656
}))
5757
})
58+
59+
t.test('should emit \'file\' events if transform included more files', function (t) {
60+
const bpath = path.join(__dirname, 'fixtures/plugins-source.js')
61+
const bOpts = { browserField: false }
62+
const expectedFiles = [
63+
bpath,
64+
'/path/to/included/file.css'
65+
]
66+
const actualFiles = []
67+
browserify(bpath, bOpts)
68+
.transform(sheetify, {
69+
transform: [
70+
[ require.resolve('./fixtures/files-plugin'), {
71+
file: '/path/to/included/file.css'
72+
} ]
73+
]
74+
})
75+
.exclude('sheetify/insert')
76+
.on('file', onfile)
77+
.on('transform', ontransform)
78+
.bundle(function (err, result) {
79+
t.ifError(err)
80+
t.deepEqual(actualFiles.sort(), expectedFiles.sort())
81+
t.end()
82+
})
83+
84+
function onfile (filename) {
85+
if (actualFiles.indexOf(filename) === -1) {
86+
actualFiles.push(filename)
87+
}
88+
}
89+
function ontransform (tr) {
90+
tr.on('file', onfile)
91+
}
92+
})
5893
})

transform.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,10 @@ function transform (filename, options) {
202202
}
203203

204204
function handleCss (val) {
205-
sheetify(val.css, val.filename, val.opts, function (err, css, prefix) {
205+
sheetify(val.css, val.filename, val.opts, function (err, result, prefix) {
206206
if (err) return done(err)
207207
const str = [
208-
"((require('sheetify/insert')(" + JSON.stringify(css) + ')',
208+
"((require('sheetify/insert')(" + JSON.stringify(result.css) + ')',
209209
' || true) && ' + JSON.stringify(prefix) + ')'
210210
].join('')
211211

@@ -215,6 +215,11 @@ function transform (filename, options) {
215215
? ''
216216
: ';'
217217
val.node.update(lolSemicolon + str)
218+
219+
result.files.forEach(function (includedFile) {
220+
transformStream.emit('file', includedFile)
221+
})
222+
218223
done()
219224
})
220225
}

0 commit comments

Comments
 (0)