Skip to content

Commit 76ff06b

Browse files
committed
add on option
1 parent 79f34a7 commit 76ff06b

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

index.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var sequence = promisify(require('async-array-methods').forEach)
1111
module.exports = postcss.plugin('postcss-simple-import', atImport)
1212

1313
function atImport(opts) {
14+
var emitter = createEmitter()
1415
opts = mix({
1516
atRule: 'import',
1617
// cache raw contents
@@ -20,8 +21,14 @@ function atImport(opts) {
2021
// if "a.css" imports "c.css" and "b.css", and we cache final contents
2122
// then there is no way to prevent "c.css" from being loaded twice
2223
cache: {},
24+
emitter: emitter,
2325
}, opts)
2426

27+
if (opts.on) {
28+
Object.keys(opts.on).forEach(function (evt) {
29+
emitter.on(evt, opts.on[evt])
30+
})
31+
}
2532
if (typeof opts.resolve !== 'function') {
2633
opts.resolve = promisify(resolver(mix({
2734
packageEntry: 'style',
@@ -118,6 +125,7 @@ function processRoot(root, from, opts) {
118125
if (opts.onImport) {
119126
opts.onImport(from, Object.keys(imports), opts.postcssOpts)
120127
}
128+
opts.emitter.emit('imports', Object.keys(imports), from, opts)
121129
return {
122130
root: root,
123131
from: from,
@@ -149,6 +157,7 @@ function processRule(rule, from, opts) {
149157
// we don't preseve order for globs
150158
return [].concat(rows)
151159
.map(function (row) {
160+
opts.emitter.emit('import', row.from, from, opts)
152161
return processRow(row, opts)
153162
})
154163
})
@@ -191,6 +200,12 @@ function insertBefore(rule, child) {
191200
})
192201
}
193202

203+
function createEmitter() {
204+
var emitter = new (require('events'))
205+
emitter.setMaxListeners(0)
206+
return emitter
207+
}
208+
194209
function trim(s) {
195210
return s && s.replace(/['"]/g, '').trim()
196211
}

test/emitter.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
var test = require('tape')
2+
var atImport = require('..')
3+
var postcss = require('postcss')
4+
var path = require('path')
5+
var fixtures = require('./util/fixtures')
6+
7+
var contents = {
8+
d: '@import "e.css";\nd {}',
9+
e: '@import "f.css";\ne {}',
10+
f: 'f {}',
11+
}
12+
13+
var entry = fixtures('emitter.css')
14+
var expectedImports = {}
15+
expectedImports[entry] = [
16+
'glob_imports/a.css', 'glob_imports/b.css', 'glob_imports/c.css',
17+
'd.css',
18+
].map(fixtures.one)
19+
expectedImports[fixtures('d.css')] = [fixtures('e.css')]
20+
expectedImports[fixtures('e.css')] = [fixtures('f.css')]
21+
22+
test('emitter', function(t) {
23+
var postcssOpts = { from: entry }
24+
return postcss(atImport({
25+
glob: true,
26+
importer: function (url) {
27+
var base = path.basename(url, '.css')
28+
if (!contents[base]) {
29+
return
30+
}
31+
return Promise.resolve({
32+
from: fixtures(url),
33+
source: contents[base],
34+
})
35+
},
36+
on: {
37+
import: function (file, from, opts) {
38+
t.ok(expectedImports[from].indexOf(file) !== -1, file)
39+
t.same(opts.postcssOpts, postcssOpts)
40+
},
41+
imports: function (imports, from, opts) {
42+
t.same(imports, expectedImports[from] || [], from)
43+
t.same(opts.postcssOpts, postcssOpts)
44+
},
45+
},
46+
}))
47+
.process(
48+
'@import "./glob_imports/*.css";\n@import "d.css";',
49+
postcssOpts
50+
)
51+
.then(function (result) {
52+
t.equal(result.css, 'a {}\nb {}\nc {}\nf {}\ne {}\nd {}')
53+
})
54+
.catch(function (err) {
55+
t.error(err)
56+
})
57+
})
58+

0 commit comments

Comments
 (0)