-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcoverage.html
359 lines (311 loc) · 116 KB
/
coverage.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
<!DOCTYPE html><html><head><title>Coverage</title><meta charset="utf-8"><script>
headings = [];
onload = function(){
headings = document.querySelectorAll('h2');
};
onscroll = function(e){
var heading = find(window.scrollY);
if (!heading) return;
var links = document.querySelectorAll('#menu a')
, link;
for (var i = 0, len = links.length; i < len; ++i) {
link = links[i];
link.className = link.getAttribute('href') == '#' + heading.id
? 'active'
: '';
}
};
function find(y) {
var i = headings.length
, heading;
while (i--) {
heading = headings[i];
if (y >= heading.offsetTop) {
return heading;
}
}
}
</script>
<style>
body {
font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif;
margin: 0;
color: #2C2C2C;
border-top: 2px solid #ddd;
}
#coverage {
padding: 60px 400px 60px 60px;
}
h1 a {
color: inherit;
font-weight: inherit;
}
h1 a:hover {
text-decoration: none;
}
.onload h1 {
opacity: 1;
}
h2 {
width: 80%;
margin-top: 80px;
margin-bottom: 0;
font-weight: 100;
letter-spacing: 1px;
border-bottom: 1px solid #eee;
}
a {
color: #8A6343;
font-weight: bold;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
ul {
margin-top: 20px;
padding: 0 15px;
width: 100%;
}
ul li {
float: left;
width: 40%;
margin-top: 5px;
margin-right: 60px;
list-style: none;
border-bottom: 1px solid #eee;
padding: 5px 0;
font-size: 12px;
}
ul::after {
content: '.';
height: 0;
display: block;
visibility: hidden;
clear: both;
}
code {
font: 12px monaco, monospace;
}
pre {
margin: 30px;
padding: 30px;
border: 1px solid #eee;
border-bottom-color: #ddd;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: inset 0 0 10px #eee;
-moz-box-shadow: inset 0 0 10px #eee;
box-shadow: inset 0 0 10px #eee;
overflow-x: auto;
}
img {
margin: 30px;
padding: 1px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
-webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
-moz-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
max-width: 100%;
}
footer {
background: #eee;
width: 100%;
padding: 50px 0;
text-align: right;
border-top: 1px solid #ddd;
}
footer span {
display: block;
margin-right: 30px;
color: #888;
font-size: 12px;
}
#menu {
position: fixed;
font-size: 12px;
overflow-y: auto;
top: 0;
right: 0;
margin: 0;
height: 100%;
padding: 15px 0;
text-align: right;
border-left: 1px solid #eee;
max-width: 400px;
overflow: auto;
white-space: nowrap;
-moz-box-shadow: 0 0 2px #888
, inset 5px 0 20px rgba(0,0,0,.5)
, inset 5px 0 3px rgba(0,0,0,.3);
-webkit-box-shadow: 0 0 2px #888
, inset 5px 0 20px rgba(0,0,0,.5)
, inset 5px 0 3px rgba(0,0,0,.3);
box-shadow: 0 0 2px #888
, inset 5px 0 20px rgba(0,0,0,.5)
, inset 5px 0 3px rgba(0,0,0,.3);
-webkit-font-smoothing: antialiased;
background: url("data:image/png;base64,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");
}
#menu::after {
display: block;
content: '';
padding-top: 80px;
}
#logo {
position: fixed;
bottom: 10px;
right: 10px;
background: rgba(255,255,255,.1);
font-size: 11px;
display: block;
width: 20px;
height: 20px;
line-height: 20px;
text-align: center;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
border-radius: 20px;
-webkit-box-shadow: 0 0 3px rgba(0,0,0,.2);
-moz-box-shadow: 0 0 3px rgba(0,0,0,.2);
box-shadow: 0 0 3px rgba(0,0,0,.2);
color: inherit;
}
#menu li a {
display: block;
color: white;
padding: 0 35px 0 25px;
-webkit-transition: background 300ms;
-moz-transition: background 300ms;
}
#menu li {
position: relative;
list-style: none;
}
#menu a:hover,
#menu a.active {
text-decoration: none;
background: rgba(255,255,255,.1);
}
#menu li:hover .cov {
opacity: 1;
}
#menu li .dirname {
opacity: .60;
padding-right: 2px;
}
#menu li .basename {
opacity: 1;
}
#menu .cov {
background: rgba(0,0,0,.4);
position: absolute;
top: 0;
right: 8px;
font-size: 9px;
opacity: .6;
text-align: left;
width: 17px;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
padding: 2px 3px;
text-align: center;
}
#stats:nth-child(2n) {
display: inline-block;
margin-top: 15px;
border: 1px solid #eee;
padding: 10px;
-webkit-box-shadow: inset 0 0 2px #eee;
-moz-box-shadow: inset 0 0 2px #eee;
box-shadow: inset 0 0 2px #eee;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
#stats div {
float: left;
padding: 0 5px;
}
#stats::after {
display: block;
content: '';
clear: both;
}
#stats .sloc::after {
content: ' SLOC';
color: #b6b6b6;
}
#stats .percentage::after {
content: ' coverage';
color: #b6b6b6;
}
#stats .hits,
#stats .misses {
display: none;
}
.high {
color: #00d4b4;
}
.medium {
color: #e87d0d;
}
.low {
color: #d4081a;
}
.terrible {
color: #d4081a;
font-weight: bold;
}
table {
width: 80%;
margin-top: 10px;
border-collapse: collapse;
border: 1px solid #cbcbcb;
color: #363636;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
table thead {
display: none;
}
table td.line,
table td.hits {
width: 20px;
background: #eaeaea;
text-align: center;
font-size: 11px;
padding: 0 10px;
color: #949494;
}
table td.hits {
width: 10px;
padding: 2px 5px;
color: rgba(0,0,0,.2);
background: #f0f0f0;
}
tr.miss td.line,
tr.miss td.hits {
background: #e6c3c7;
}
tr.miss td {
background: #f8d5d8;
}
td.source {
padding-left: 15px;
line-height: 15px;
white-space: pre;
font: 12px monaco, monospace;
}
code .comment { color: #ddd }
code .init { color: #2F6FAD }
code .string { color: #5890AD }
code .keyword { color: #8A6343 }
code .number { color: #2F6FAD }
</style>
</head><body><div id="coverage"><h1 id="overview">Coverage</h1><div id="menu"><li><a href="#overview">overview</a></li><li><span class="cov high">98</span><a href="#cssy.js"><span class="basename">cssy.js</span></a></li><li><span class="cov high">100</span><a href="#parsers/index.js"><span class="dirname">parsers/</span><span class="basename">index.js</span></a></li><li><span class="cov medium">66</span><a href="#parsers/less.js"><span class="dirname">parsers/</span><span class="basename">less.js</span></a></li><li><span class="cov medium">51</span><a href="#parsers/sass.js"><span class="dirname">parsers/</span><span class="basename">sass.js</span></a></li><li><span class="cov high">85</span><a href="#parsers/stylus.js"><span class="dirname">parsers/</span><span class="basename">stylus.js</span></a></li><li><span class="cov high">100</span><a href="#plugin.js"><span class="basename">plugin.js</span></a></li><li><span class="cov high">96</span><a href="#processor.js"><span class="basename">processor.js</span></a></li><li><span class="cov high">96</span><a href="#remedy.js"><span class="basename">remedy.js</span></a></li><li><span class="cov high">96</span><a href="#transform.js"><span class="basename">transform.js</span></a></li><li><span class="cov high">93</span><a href="#utils.js"><span class="basename">utils.js</span></a></li><a id="logo" href="http://mochajs.org/">m</a></div><div id="stats" class="high"><div class="percentage">90%</div><div class="sloc">352</div><div class="hits">318</div><div class="misses">34</div></div><div id="files"><div class="file"><h2 id="cssy.js">cssy.js</h2><div id="stats" class="high"><div class="percentage">98%</div><div class="sloc">70</div><div class="hits">69</div><div class="misses">1</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var extend = require('extend')</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var concatStream = require('concat-stream')</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">var createReadStream = require('fs').createReadStream</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var lrio = require('lrio')</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var transform = require('./transform.js')</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var processor = require('./processor.js')</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source">var chokidar = require('chokidar')</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">var resolve = require('resolve').sync</td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source">var remedy = require('./remedy')</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source">// cssy is a browserify transform and a browserify plugin</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source">var cssy = module.exports = module.exports = function (fileOrBrowserify, opts) {</td></tr><tr class="hit"><td class="line">13</td><td class="hits">12</td><td class="source"> if (typeof (fileOrBrowserify) === 'string') {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">2</td><td class="source"> return require('./transform')(fileOrBrowserify, opts)</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">16</td><td class="hits">10</td><td class="source"> return require('./plugin')(fileOrBrowserify, opts)</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source">// Export api</td></tr><tr class="hit"><td class="line">21</td><td class="hits">1</td><td class="source">cssy.transform = transform</td></tr><tr class="hit"><td class="line">22</td><td class="hits">1</td><td class="source">cssy.processor = processor</td></tr><tr class="hit"><td class="line">23</td><td class="hits">1</td><td class="source">cssy.remedy = remedy</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> * Add a global cssy pre-processor</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> * @param {Array/Function} procs</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> * A processor function or an array of functions</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> * @return {cssy}</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">32</td><td class="hits">1</td><td class="source">cssy.pre = function (procs) {</td></tr><tr class="hit"><td class="line">33</td><td class="hits">16</td><td class="source"> if (!Array.isArray(procs)) procs = [procs]</td></tr><tr class="hit"><td class="line">34</td><td class="hits">13</td><td class="source"> procs.forEach(function (proc) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">5</td><td class="source"> if (typeof (proc) === 'string') {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">1</td><td class="source"> proc = require(resolve(proc, {basedir: process.cwd()}))</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">38</td><td class="hits">5</td><td class="source"> process.cssy.preProcessors.push(proc)</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> })</td></tr><tr class="hit"><td class="line">40</td><td class="hits">13</td><td class="source"> return cssy</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> * Add a global cssy post-processor</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> * @param {Array/Function} procs</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> * A processor function or an array of functions</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> * @return {cssy}</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">50</td><td class="hits">1</td><td class="source">cssy.post = function (procs) {</td></tr><tr class="hit"><td class="line">51</td><td class="hits">22</td><td class="source"> if (!Array.isArray(procs)) procs = [procs]</td></tr><tr class="hit"><td class="line">52</td><td class="hits">16</td><td class="source"> procs.forEach(function (proc) {</td></tr><tr class="hit"><td class="line">53</td><td class="hits">8</td><td class="source"> if (typeof (proc) === 'string') {</td></tr><tr class="hit"><td class="line">54</td><td class="hits">1</td><td class="source"> proc = require(resolve(proc, {basedir: process.cwd()}))</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">56</td><td class="hits">8</td><td class="source"> process.cssy.postProcessors.push(proc)</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> })</td></tr><tr class="hit"><td class="line">58</td><td class="hits">16</td><td class="source"> return cssy</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> * Add an automatic cssy live source reload on a http(s) server</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> * This must be used on the same process than the browserify bundler</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> * @param {http(s).Server} server</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> * A node http / https server</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> * @param {[FSWatcher]} watcher</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> * Optional: a EventEmitter watcher instance (same as chokidar.FSWatcher)</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> * @return {Function}</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> * A change listener (take one argument: the filename that changed)</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> * With two static properties:</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> * - watcher: the chokidar instance</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> * - lrioServer: the lrio instance</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">79</td><td class="hits">1</td><td class="source">cssy.live = function (server, watcher) {</td></tr><tr class="hit"><td class="line">80</td><td class="hits">3</td><td class="source"> if (typeof (server) === 'string') {</td></tr><tr class="hit"><td class="line">81</td><td class="hits">1</td><td class="source"> server = require(resolve(server))</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">83</td><td class="hits">3</td><td class="source"> watcher = watcher || (new chokidar.FSWatcher({persistent: true}))</td></tr><tr class="hit"><td class="line">84</td><td class="hits">3</td><td class="source"> var watched = []</td></tr><tr class="hit"><td class="line">85</td><td class="hits">3</td><td class="source"> var listener = cssy.attachServer(server)</td></tr><tr class="hit"><td class="line">86</td><td class="hits">3</td><td class="source"> watcher.on('change', listener)</td></tr><tr class="hit"><td class="line">87</td><td class="hits">3</td><td class="source"> cssy.post(function (ctx, done) {</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> // Chokidar mays watch a file many times (>=0.10)</td></tr><tr class="hit"><td class="line">89</td><td class="hits">4</td><td class="source"> if (watched.indexOf(ctx.filename) === -1) {</td></tr><tr class="hit"><td class="line">90</td><td class="hits">3</td><td class="source"> watched.push(ctx.filename)</td></tr><tr class="hit"><td class="line">91</td><td class="hits">3</td><td class="source"> watcher.add(ctx.filename)</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">93</td><td class="hits">4</td><td class="source"> done(null, ctx)</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> })</td></tr><tr class="hit"><td class="line">95</td><td class="hits">3</td><td class="source"> listener.watcher = watcher</td></tr><tr class="hit"><td class="line">96</td><td class="hits">3</td><td class="source"> return listener</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> * Attach a cssy live-reload server to a given http-server</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> * This must be used on for development purpose only: Attaching a cssy</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> * live-reload server add a live-reload client to generated sources.</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> * Exemple with chokidar:</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> * var chokidar = require('chokidar')</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> * var cssy = require('cssy')</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> * var server = require('http').createServer()</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">111</td><td class="hits"></td><td class="source"> * if(process.env.NODE_ENV === 'development') {</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> * var cssyListener = css.attachServer(server)</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> * chokidar.watch('./src').on('change', cssyListener)</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> * }</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> * @param {http(s).Server} server</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> * A node http / https server</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> * @return {Function}</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> * A change listener (take one argument: the filename that changed)</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> * With one static property:</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> * - lrioServer: the lrio instance</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">125</td><td class="hits">1</td><td class="source">cssy.attachServer = function (server) {</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">127</td><td class="hits">6</td><td class="source"> function change (filename) {</td></tr><tr class="hit"><td class="line">128</td><td class="hits">2</td><td class="source"> var proc = processor(filename)</td></tr><tr class="hit"><td class="line">129</td><td class="hits">2</td><td class="source"> if (!proc) return</td></tr><tr class="hit"><td class="line">130</td><td class="hits">2</td><td class="source"> createReadStream(filename)</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> .pipe(concatStream(function (source) {</td></tr><tr class="hit"><td class="line">132</td><td class="hits">2</td><td class="source"> proc(source.toString(), function (err, result) {</td></tr><tr class="hit"><td class="line">133</td><td class="hits">2</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">134</td><td class="hits">0</td><td class="source"> console.error('Warning:', err)</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">136</td><td class="hits">2</td><td class="source"> lrioServer.broadcast({type: 'change', uid: result.filename, src: result.src})</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> }))</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> // Attach server only once</td></tr><tr class="hit"><td class="line">142</td><td class="hits">6</td><td class="source"> if (!server._cssyChangeListener) {</td></tr><tr class="hit"><td class="line">143</td><td class="hits">6</td><td class="source"> var lrioServer = lrio(server, 'cssy')</td></tr><tr class="hit"><td class="line">144</td><td class="hits">6</td><td class="source"> process.cssy.livereload = true</td></tr><tr class="hit"><td class="line">145</td><td class="hits">6</td><td class="source"> change.lrioServer = lrioServer</td></tr><tr class="hit"><td class="line">146</td><td class="hits">6</td><td class="source"> server._cssyChangeListener = change</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">148</td><td class="hits">6</td><td class="source"> return server._cssyChangeListener</td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">150</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> * Global config getter/setter</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> * - `minify`: Minify source</td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> * - `sourcemap`: Enable source-map</td></tr><tr><td class="line">156</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> * @param {[Object]}</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> * object to merge with global config</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">160</td><td class="hits"></td><td class="source"> * @return {Object} current config</td></tr><tr><td class="line">161</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">162</td><td class="hits">1</td><td class="source">cssy.config = function (config) {</td></tr><tr class="hit"><td class="line">163</td><td class="hits">44</td><td class="source"> process.cssy.config = extend(process.cssy.config, config || {})</td></tr><tr class="hit"><td class="line">164</td><td class="hits">44</td><td class="source"> return process.cssy.config</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">166</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> * Reset cssy global configuration</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">170</td><td class="hits">1</td><td class="source">cssy.reset = function () {</td></tr><tr class="hit"><td class="line">171</td><td class="hits">41</td><td class="source"> process.cssy = {}</td></tr><tr class="hit"><td class="line">172</td><td class="hits">41</td><td class="source"> process.cssy.postProcessors = []</td></tr><tr class="hit"><td class="line">173</td><td class="hits">41</td><td class="source"> process.cssy.preProcessors = []</td></tr><tr class="hit"><td class="line">174</td><td class="hits">41</td><td class="source"> process.cssy.livereload = false</td></tr><tr class="hit"><td class="line">175</td><td class="hits">41</td><td class="source"> process.cssy.config = {</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> minify: false,</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> sourcemap: true</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">179</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">180</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">181</td><td class="hits"></td><td class="source">// Reset once if needed</td></tr><tr class="hit"><td class="line">182</td><td class="hits">1</td><td class="source">if (!process.cssy) {</td></tr><tr class="hit"><td class="line">183</td><td class="hits">1</td><td class="source"> cssy.reset()</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="parsers/index.js">parsers/index.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">1</div><div class="hits">1</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">module.exports = [</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> require('./less'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> require('./sass'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> require('./stylus')</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source">]</td></tr></tbody></table></div><div class="file"><h2 id="parsers/less.js">parsers/less.js</h2><div id="stats" class="medium"><div class="percentage">66%</div><div class="sloc">21</div><div class="hits">14</div><div class="misses">7</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var semver = require('semver')</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source">// Basic parser for less sources</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">module.exports = function (ctx, done) {</td></tr><tr class="hit"><td class="line">5</td><td class="hits">51</td><td class="source"> if (!/\.less$/i.test(ctx.filename)) return done()</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source"> var less, pkg</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> // Let user manage stylus version</td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> less = require('less')</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source"> pkg = require('less/package.json')</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> } catch(e) {</td></tr><tr class="miss"><td class="line">13</td><td class="hits">0</td><td class="source"> throw new Error('You must install less package to use less sources')</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">16</td><td class="hits">1</td><td class="source"> if (semver.lt(pkg.version, '2.0.0')) {</td></tr><tr class="miss"><td class="line">17</td><td class="hits">0</td><td class="source"> var parser = new less.Parser({</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> filename: ctx.filename</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> </td></tr><tr class="miss"><td class="line">21</td><td class="hits">0</td><td class="source"> parser.parse(ctx.src, function (err, tree) {</td></tr><tr class="miss"><td class="line">22</td><td class="hits">0</td><td class="source"> if (err) return done(err)</td></tr><tr class="miss"><td class="line">23</td><td class="hits">0</td><td class="source"> ctx.src = tree.toCSS({</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> sourceMap: true,</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> writeSourceMap: function (map) { ctx.map = map }</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> })</td></tr><tr class="miss"><td class="line">27</td><td class="hits">0</td><td class="source"> done(null, ctx)</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> // Starting from v2.0.0</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">1</td><td class="source"> var options = {</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> filename: ctx.filename,</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> sourceMap: true</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">36</td><td class="hits">1</td><td class="source"> less.render(ctx.src, options, function (err, result) {</td></tr><tr class="hit"><td class="line">37</td><td class="hits">1</td><td class="source"> if (err) return done(err)</td></tr><tr class="hit"><td class="line">38</td><td class="hits">1</td><td class="source"> ctx.src = result.css</td></tr><tr class="hit"><td class="line">39</td><td class="hits">1</td><td class="source"> ctx.map = result.map</td></tr><tr class="hit"><td class="line">40</td><td class="hits">1</td><td class="source"> done(null, ctx)</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="parsers/sass.js">parsers/sass.js</h2><div id="stats" class="medium"><div class="percentage">51%</div><div class="sloc">33</div><div class="hits">17</div><div class="misses">16</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var semver = require('semver')</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var resolve = require('path').resolve</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source">// Basic parser for sass/scss sources</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">module.exports = function (ctx, done) {</td></tr><tr class="hit"><td class="line">7</td><td class="hits">48</td><td class="source"> if (!/\.(sass|scss)$/i.test(ctx.filename)) return done()</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">9</td><td class="hits">2</td><td class="source"> var sass, pkg, stats = {}</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> // Let user manage sass version</td></tr><tr class="hit"><td class="line">12</td><td class="hits">2</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">13</td><td class="hits">2</td><td class="source"> sass = require('node-sass')</td></tr><tr class="hit"><td class="line">14</td><td class="hits">2</td><td class="source"> pkg = require('node-sass/package.json')</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> } catch(e) {</td></tr><tr class="miss"><td class="line">16</td><td class="hits">0</td><td class="source"> throw new Error('You must install node-sass package to use sass/scss sources')</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> // Use semver to check version (so many breaking changes !!!)</td></tr><tr class="hit"><td class="line">20</td><td class="hits">2</td><td class="source"> if (semver.lte(pkg.version, '1.1.0')) {</td></tr><tr class="miss"><td class="line">21</td><td class="hits">0</td><td class="source"> sass.render({</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> file: ctx.filename,</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> sourceComments: 'map',</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> stats: stats,</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> success: function (result) {</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> ctx.src = result.split('\n').slice(0, -1).join('\n') // Remove sourceUrl comment ...</td></tr><tr class="miss"><td class="line">27</td><td class="hits">0</td><td class="source"> ctx.map = JSON.parse(stats.sourceMap)</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> done(null, ctx)</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> error: done</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> })</td></tr><tr class="hit"><td class="line">32</td><td class="hits">2</td><td class="source"> } else if (semver.lt(pkg.version, '2.0.0-beta')) {</td></tr><tr class="miss"><td class="line">33</td><td class="hits">0</td><td class="source"> sass.render({</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> file: ctx.filename,</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> sourceMap: true,</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> stats: stats,</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> outFile: resolve(ctx.filename + '.css'),</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> omitSourceMapUrl: true,</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> success: function (result, sourceMap) {</td></tr><tr class="miss"><td class="line">40</td><td class="hits">0</td><td class="source"> ctx.src = result</td></tr><tr class="miss"><td class="line">41</td><td class="hits">0</td><td class="source"> ctx.map = JSON.parse(stats.sourceMap)</td></tr><tr class="miss"><td class="line">42</td><td class="hits">0</td><td class="source"> delete ctx.map.file</td></tr><tr class="miss"><td class="line">43</td><td class="hits">0</td><td class="source"> done(null, ctx)</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> error: done</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> })</td></tr><tr class="hit"><td class="line">47</td><td class="hits">2</td><td class="source"> } else if (semver.lt(pkg.version, '3.0.0')) {</td></tr><tr class="miss"><td class="line">48</td><td class="hits">0</td><td class="source"> sass.render({</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> file: ctx.filename,</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> sourceMap: true,</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> stats: stats,</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> outFile: resolve(ctx.filename + '.css'),</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> omitSourceMapUrl: true,</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> success: function (result, sourceMap) {</td></tr><tr class="miss"><td class="line">55</td><td class="hits">0</td><td class="source"> ctx.src = result.css</td></tr><tr class="miss"><td class="line">56</td><td class="hits">0</td><td class="source"> ctx.map = result.map</td></tr><tr class="miss"><td class="line">57</td><td class="hits">0</td><td class="source"> delete ctx.map.file</td></tr><tr class="miss"><td class="line">58</td><td class="hits">0</td><td class="source"> done(null, ctx)</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> error: done</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">63</td><td class="hits">2</td><td class="source"> sass.render({</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> file: ctx.filename,</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> sourceMap: true,</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> stats: stats,</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> outFile: resolve(ctx.filename + '.css'),</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> omitSourceMapUrl: true</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> }, function (err, result) {</td></tr><tr class="hit"><td class="line">70</td><td class="hits">2</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">71</td><td class="hits">0</td><td class="source"> return done(err)</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">73</td><td class="hits">2</td><td class="source"> ctx.src = result.css</td></tr><tr class="hit"><td class="line">74</td><td class="hits">2</td><td class="source"> ctx.map = result.map.toString() // Map is now a Buffer..</td></tr><tr class="hit"><td class="line">75</td><td class="hits">2</td><td class="source"> delete ctx.map.file</td></tr><tr class="hit"><td class="line">76</td><td class="hits">2</td><td class="source"> done(null, ctx)</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="parsers/stylus.js">parsers/stylus.js</h2><div id="stats" class="high"><div class="percentage">85%</div><div class="sloc">14</div><div class="hits">12</div><div class="misses">2</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">// Basic parser for stylus sources</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">module.exports = function (ctx, done) {</td></tr><tr class="hit"><td class="line">3</td><td class="hits">23</td><td class="source"> if (!/\.styl$/i.test(ctx.filename)) {</td></tr><tr class="hit"><td class="line">4</td><td class="hits">22</td><td class="source"> return done()</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source"> var stylus</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> // Let user manage stylus version</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source"> stylus = require('stylus')</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> } catch(e) {</td></tr><tr class="miss"><td class="line">13</td><td class="hits">0</td><td class="source"> throw new Error('You must install stylus package to use stylus sources')</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">16</td><td class="hits">1</td><td class="source"> var style = stylus(ctx.src)</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> .set('filename', ctx.filename)</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> .set('sourcemap', {})</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">20</td><td class="hits">1</td><td class="source"> style.render(function (err, css) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">1</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">22</td><td class="hits">0</td><td class="source"> return done(err)</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">24</td><td class="hits">1</td><td class="source"> ctx.src = css</td></tr><tr class="hit"><td class="line">25</td><td class="hits">1</td><td class="source"> ctx.map = style.sourcemap</td></tr><tr class="hit"><td class="line">26</td><td class="hits">1</td><td class="source"> done(null, ctx)</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="plugin.js">plugin.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">13</div><div class="hits">13</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">module.exports = function (b, config) {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">10</td><td class="source"> var cssy = require('./cssy')</td></tr><tr class="hit"><td class="line">3</td><td class="hits">10</td><td class="source"> var remedy = require('./remedy')</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> // Read configuration:</td></tr><tr class="hit"><td class="line">6</td><td class="hits">10</td><td class="source"> cssy.pre(config.pre || [])</td></tr><tr class="hit"><td class="line">7</td><td class="hits">10</td><td class="source"> cssy.post(config.post || [])</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">9</td><td class="hits">10</td><td class="source"> if (config.live) {</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> cssy.live(config.live) // Attach a server instance</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">13</td><td class="hits">10</td><td class="source"> if (typeof (config.minify) !== 'undefined') {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source"> cssy.config({minify: config.minify})</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">17</td><td class="hits">10</td><td class="source"> if (typeof (config.sourcemap) !== 'undefined') {</td></tr><tr class="hit"><td class="line">18</td><td class="hits">1</td><td class="source"> cssy.config({sourcemap: config.sourcemap})</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">21</td><td class="hits">10</td><td class="source"> if (config.remedy) {</td></tr><tr class="hit"><td class="line">22</td><td class="hits">10</td><td class="source"> b.plugin(remedy, config.remedy)</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="processor.js">processor.js</h2><div id="stats" class="high"><div class="percentage">96%</div><div class="sloc">89</div><div class="hits">86</div><div class="misses">3</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var dirname = require('path').dirname</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var pathRelative = require('path').relative</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">var relativePackage = require('relative-package')</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var resolve = require('resolve')</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var exists = require('fs').existsSync</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var async = require('async')</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source">var postcss = require('postcss')</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">var pathResolve = require('path').resolve</td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source">var csswring = require('csswring')</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source">var extname = require('path').extname</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source">var compose = require('./utils').compose</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source">var toAsync = require('./utils').toAsync</td></tr><tr class="hit"><td class="line">13</td><td class="hits">1</td><td class="source">var getCssyConfig = require('./utils').getCssyConfig</td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source">var extend = require('extend')</td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source">var cssyParsers = require('./parsers')</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">17</td><td class="hits">1</td><td class="source">module.exports = getProcessor</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> * Provide a source processor for the given filename</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> * @param {String} filename</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> * File path of the source to process</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> * @param {Object} [config]</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> * Use given config instead of relative package.json config</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> * @return {Function}</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> * An asynchronous processing function with two arguments: A css source</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> * to process and a standard node callback (err, result)</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> * This function return a cssy context object with:</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> * - `filename` : the source filename</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> * - `src` : the processed source</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> * - `map` : the standard source map object</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> * - `imports` : array of sources to import:</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> * - `path`: The path relative to the source</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> * - `media`: The css media query</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">39</td><td class="hits">1</td><td class="source">function getProcessor (filename, config) {</td></tr><tr class="hit"><td class="line">40</td><td class="hits">38</td><td class="source"> if (!exists(filename)) return</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> // Filename always relative to cwd</td></tr><tr class="hit"><td class="line">43</td><td class="hits">36</td><td class="source"> filename = pathRelative(process.cwd(), pathResolve(filename))</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> // Package.json relative to filename</td></tr><tr class="hit"><td class="line">46</td><td class="hits">36</td><td class="source"> var pkgPath = relativePackage(pathResolve(filename))</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> // Cssy config</td></tr><tr class="hit"><td class="line">49</td><td class="hits">36</td><td class="source"> config = config || getCssyConfig(pkgPath)</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">51</td><td class="hits">36</td><td class="source"> config.basedir = config.basedir || dirname(pkgPath)</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> // Check if cssy should handle this source</td></tr><tr class="hit"><td class="line">54</td><td class="hits">36</td><td class="source"> config.match = config.match || ['\\.(css|sass|scss|less|styl)$', 'i']</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">56</td><td class="hits">36</td><td class="source"> if (!(config.match instanceof RegExp)) {</td></tr><tr class="hit"><td class="line">57</td><td class="hits">23</td><td class="source"> config.match = RegExp.apply(null, Array.isArray(config.match) ? config.match : [config.match])</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">60</td><td class="hits">36</td><td class="source"> if (!(config.match).test(filename)) {</td></tr><tr class="hit"><td class="line">61</td><td class="hits">5</td><td class="source"> return</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> // Default import behavior:</td></tr><tr class="hit"><td class="line">65</td><td class="hits">31</td><td class="source"> config.import = (typeof (config.import) === 'undefined') ? true : config.import</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> // List local parsers according to config (concat with internal cssy parsers):</td></tr><tr class="hit"><td class="line">68</td><td class="hits">31</td><td class="source"> var parsers = resolveFunctionList(config.parsers || config.parser, config.basedir).concat(cssyParsers)</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> // List local processors according to config:</td></tr><tr class="hit"><td class="line">71</td><td class="hits">31</td><td class="source"> var localProcessors = resolveFunctionList(config.processors || config.processor, config.basedir)</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">73</td><td class="hits">31</td><td class="source"> function handle (src, done) {</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> // Transform source</td></tr><tr class="hit"><td class="line">75</td><td class="hits">28</td><td class="source"> async.waterfall([</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> // 1. Parse source</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> function (next) {</td></tr><tr class="hit"><td class="line">78</td><td class="hits">28</td><td class="source"> var ctx = {</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> config: config,</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> filename: filename,</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> src: src</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> // Fake map for empty source</td></tr><tr class="hit"><td class="line">85</td><td class="hits">28</td><td class="source"> if (ctx.src.trim() === '') {</td></tr><tr class="hit"><td class="line">86</td><td class="hits">1</td><td class="source"> ctx.src = ''</td></tr><tr class="hit"><td class="line">87</td><td class="hits">1</td><td class="source"> ctx.map = {</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> version: 3,</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> sources: [ctx.filename],</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> names: [],</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> mappings: 'A',</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> file: 'to.css'</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">94</td><td class="hits">1</td><td class="source"> next(null, ctx)</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">96</td><td class="hits">27</td><td class="source"> var newCtx</td></tr><tr class="hit"><td class="line">97</td><td class="hits">27</td><td class="source"> async.detectSeries(</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> parsers,</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> function (parser, callback) {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">81</td><td class="source"> parser(extend({}, ctx), function (err, result) {</td></tr><tr class="hit"><td class="line">101</td><td class="hits">81</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">102</td><td class="hits">0</td><td class="source"> return done(err)</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">104</td><td class="hits">81</td><td class="source"> if (!result || !result.map) {</td></tr><tr class="hit"><td class="line">105</td><td class="hits">76</td><td class="source"> return callback(false)</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">107</td><td class="hits">5</td><td class="source"> newCtx = result</td></tr><tr class="hit"><td class="line">108</td><td class="hits">5</td><td class="source"> return callback(true)</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">111</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> function (found) {</td></tr><tr class="hit"><td class="line">113</td><td class="hits">27</td><td class="source"> if (found) {</td></tr><tr class="hit"><td class="line">114</td><td class="hits">5</td><td class="source"> next(null, newCtx)</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">116</td><td class="hits">22</td><td class="source"> parseCss(ctx, next)</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> )</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> // 2. Parse css source</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> // parseCss</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> // 3. Perform all global pre-processor on context</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> compose(process.cssy.preProcessors),</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> // 4. Perform local processor on context</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> compose(localProcessors),</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> // 5. Perform all global post-processor on context</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> compose(process.cssy.postProcessors),</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> // 6. Extract importations and generate source</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> function (ctx, next) {</td></tr><tr class="hit"><td class="line">137</td><td class="hits">26</td><td class="source"> ctx.imports = []</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">139</td><td class="hits">26</td><td class="source"> var styles = postcss.parse(ctx.src, {</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> map: {prev: ctx.map }</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> // Extract imports</td></tr><tr class="hit"><td class="line">144</td><td class="hits">26</td><td class="source"> if (ctx.config.import) {</td></tr><tr class="hit"><td class="line">145</td><td class="hits">26</td><td class="source"> styles.eachAtRule(function (atRule) {</td></tr><tr class="hit"><td class="line">146</td><td class="hits">8</td><td class="source"> if (atRule.name !== 'import') {</td></tr><tr class="miss"><td class="line">147</td><td class="hits">0</td><td class="source"> return</td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">149</td><td class="hits">8</td><td class="source"> if (/^url\(|:\/\//.test(atRule.params)) {</td></tr><tr class="miss"><td class="line">150</td><td class="hits">0</td><td class="source"> return // Absolute</td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">152</td><td class="hits">8</td><td class="source"> ctx.imports.push(parseImport(atRule.params))</td></tr><tr class="hit"><td class="line">153</td><td class="hits">8</td><td class="source"> atRule.removeSelf()</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">156</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> // Minify ?</td></tr><tr class="hit"><td class="line">158</td><td class="hits">26</td><td class="source"> if (process.cssy.config.minify) {</td></tr><tr class="hit"><td class="line">159</td><td class="hits">25</td><td class="source"> csswring.postcss(styles)</td></tr><tr><td class="line">160</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">161</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> // Source map</td></tr><tr class="hit"><td class="line">163</td><td class="hits">26</td><td class="source"> if (process.cssy.config.sourcemap) {</td></tr><tr class="hit"><td class="line">164</td><td class="hits">1</td><td class="source"> ctx.src = styles.toResult({map: {inline: true } }).css</td></tr><tr class="hit"><td class="line">165</td><td class="hits">1</td><td class="source"> ctx.src += '\n/*# sourceURL=' + ctx.filename + '.output' + '*/'</td></tr><tr><td class="line">166</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">167</td><td class="hits">25</td><td class="source"> ctx.src = styles.toResult({map: false }).css</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">170</td><td class="hits">26</td><td class="source"> next(null, ctx)</td></tr><tr><td class="line">171</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> ], done)</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">174</td><td class="hits">31</td><td class="source"> return handle</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> * Default source parser for css source</td></tr><tr><td class="line">179</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">180</td><td class="hits"></td><td class="source"> * @param {Object} ctx</td></tr><tr><td class="line">181</td><td class="hits"></td><td class="source"> * Cssy context object with source</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">183</td><td class="hits"></td><td class="source"> * @param {Function} done</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> * Async callback</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">186</td><td class="hits">1</td><td class="source">function parseCss (ctx, done) {</td></tr><tr class="hit"><td class="line">187</td><td class="hits">22</td><td class="source"> var result</td></tr><tr class="hit"><td class="line">188</td><td class="hits">22</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">189</td><td class="hits">22</td><td class="source"> result = postcss()</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> .process(ctx.src, {</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> map: {</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> sourcesContent: true,</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> annotation: false,</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> prev: ctx.map</td></tr><tr><td class="line">195</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">196</td><td class="hits"></td><td class="source"> from: ctx.filename</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> })</td></tr><tr class="hit"><td class="line">198</td><td class="hits">22</td><td class="source"> ctx.src = result.css</td></tr><tr class="hit"><td class="line">199</td><td class="hits">20</td><td class="source"> ctx.map = result.map.toJSON()</td></tr><tr class="hit"><td class="line">200</td><td class="hits">20</td><td class="source"> done(null, ctx)</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> } catch(e) {</td></tr><tr class="hit"><td class="line">202</td><td class="hits">2</td><td class="source"> var msg = e.message</td></tr><tr class="hit"><td class="line">203</td><td class="hits">2</td><td class="source"> var ext = extname(ctx.filename).slice(1).toLowerCase()</td></tr><tr class="hit"><td class="line">204</td><td class="hits">2</td><td class="source"> if (ext !== 'css') {</td></tr><tr class="hit"><td class="line">205</td><td class="hits">1</td><td class="source"> msg += ' (Try to use appropriate parser for ' + ext + ')'</td></tr><tr><td class="line">206</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">207</td><td class="hits">2</td><td class="source"> done(new Error(msg))</td></tr><tr><td class="line">208</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">210</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">211</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">212</td><td class="hits"></td><td class="source"> * Resolve and require a list of module path that exports async function</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> * Each path is resolved against `basedir`. `utils.toAsync()` unsure that</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> * each function will work as async function.</td></tr><tr><td class="line">216</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> * @param {Array|String} functionList</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source"> * Module path or array of module path</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source"> * @param {String} basedir</td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> * Base path for path resolution (dirname of the package.json)</td></tr><tr><td class="line">222</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> * @return {Array}</td></tr><tr><td class="line">224</td><td class="hits"></td><td class="source"> * An array of cssy asynchronous functions</td></tr><tr><td class="line">225</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">226</td><td class="hits">1</td><td class="source">function resolveFunctionList (functionList, basedir) {</td></tr><tr class="hit"><td class="line">227</td><td class="hits">109</td><td class="source"> if (!functionList) return []</td></tr><tr class="hit"><td class="line">228</td><td class="hits">15</td><td class="source"> return (Array.isArray(functionList) ? functionList : [functionList])</td></tr><tr><td class="line">229</td><td class="hits"></td><td class="source"> .map(function (proc) {</td></tr><tr class="hit"><td class="line">230</td><td class="hits">15</td><td class="source"> if (typeof (proc) === 'string') {</td></tr><tr class="hit"><td class="line">231</td><td class="hits">9</td><td class="source"> proc = require(resolve.sync(proc, {basedir: basedir }))</td></tr><tr><td class="line">232</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">233</td><td class="hits">15</td><td class="source"> return toAsync(proc)</td></tr><tr><td class="line">234</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">235</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">236</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">237</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">238</td><td class="hits"></td><td class="source"> * Read a css import arguments: extract filepath and css media query</td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">240</td><td class="hits"></td><td class="source"> * @param {string} imp</td></tr><tr><td class="line">241</td><td class="hits"></td><td class="source"> * The import arguments</td></tr><tr><td class="line">242</td><td class="hits"></td><td class="source"> * (expl: `'./path/to.css' (min-width: 700px) and (orientation: landscape)` )</td></tr><tr><td class="line">243</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">244</td><td class="hits">1</td><td class="source">function parseImport (imp) {</td></tr><tr class="hit"><td class="line">245</td><td class="hits">8</td><td class="source"> var re = /^['"]?([^\s'"]+)['"]?\s*(.*)$/</td></tr><tr class="hit"><td class="line">246</td><td class="hits">8</td><td class="source"> var result = re.exec(imp)</td></tr><tr class="hit"><td class="line">247</td><td class="hits">8</td><td class="source"> return {</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> path: result[1],</td></tr><tr><td class="line">249</td><td class="hits"></td><td class="source"> media: result[2].trim()</td></tr><tr><td class="line">250</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="remedy.js">remedy.js</h2><div id="stats" class="high"><div class="percentage">96%</div><div class="sloc">31</div><div class="hits">30</div><div class="misses">1</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var through2 = require('through2')</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var syntaxError = require('syntax-error')</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">var transform = require('./transform')</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var concatStream = require('concat-stream')</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var getCssyConfig = require('./utils').getCssyConfig</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source">module.exports = function (b, config) {</td></tr><tr class="hit"><td class="line">8</td><td class="hits">13</td><td class="source"> if (Object.prototype.toString.call(config) !== '[object Object]') {</td></tr><tr class="hit"><td class="line">9</td><td class="hits">10</td><td class="source"> config = getCssyConfig() // Default is the cwd package.json</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">12</td><td class="hits">13</td><td class="source"> if (!config.basedir) {</td></tr><tr class="hit"><td class="line">13</td><td class="hits">13</td><td class="source"> config.basedir = process.cwd()</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">16</td><td class="hits">13</td><td class="source"> var match = config.match || ['\\.(css|sass|scss|less|styl)$', 'i']</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">18</td><td class="hits">13</td><td class="source"> if (!(match instanceof RegExp)) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">13</td><td class="source"> match = RegExp.apply(null, Array.isArray(match) ? match : [match])</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">22</td><td class="hits">13</td><td class="source"> match = RegExp.apply(null, match)</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">24</td><td class="hits">13</td><td class="source"> b.transform({global: true}, function (filename) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">55</td><td class="source"> if (!match.test(filename)) {</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> return through2()</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">29</td><td class="hits">55</td><td class="source"> var code = ''</td></tr><tr class="hit"><td class="line">30</td><td class="hits">55</td><td class="source"> return through2(</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> function (chunk, encoding, next) {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">56</td><td class="source"> code += chunk.toString()</td></tr><tr class="hit"><td class="line">33</td><td class="hits">56</td><td class="source"> next()</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> function (done) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">55</td><td class="source"> var self = this</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">38</td><td class="hits">55</td><td class="source"> if (/^module\.exports\s?=/.test(code) || !syntaxError(code, filename)) {</td></tr><tr class="hit"><td class="line">39</td><td class="hits">48</td><td class="source"> self.push(code)</td></tr><tr class="hit"><td class="line">40</td><td class="hits">48</td><td class="source"> done()</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">42</td><td class="hits">7</td><td class="source"> var readable = through2()</td></tr><tr class="hit"><td class="line">43</td><td class="hits">7</td><td class="source"> readable.pipe(transform(filename, config))</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> .pipe(concatStream(function (result) {</td></tr><tr class="hit"><td class="line">45</td><td class="hits">7</td><td class="source"> self.push(result)</td></tr><tr class="hit"><td class="line">46</td><td class="hits">7</td><td class="source"> done()</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> }))</td></tr><tr class="hit"><td class="line">48</td><td class="hits">7</td><td class="source"> readable.push(code)</td></tr><tr class="hit"><td class="line">49</td><td class="hits">7</td><td class="source"> readable.end()</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> )</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="transform.js">transform.js</h2><div id="stats" class="high"><div class="percentage">96%</div><div class="sloc">31</div><div class="hits">30</div><div class="misses">1</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var slash = require('slash')</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var through2 = require('through2')</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">var getProcessor = require('./processor')</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var pathResolve = require('path').resolve</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var pathRelative = require('path').relative</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var dirname = require('path').dirname</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source">* Browserify transform (see browsreify API)</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source">*/</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source">module.exports = function (filename, config) {</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> // Get cssy source processor</td></tr><tr class="hit"><td class="line">13</td><td class="hits">13</td><td class="source"> var proc = getProcessor(filename, config)</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> // If undefined, then ignore and pass through</td></tr><tr class="hit"><td class="line">16</td><td class="hits">15</td><td class="source"> if (!proc) return through2()</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">18</td><td class="hits">11</td><td class="source"> var code = ''</td></tr><tr class="hit"><td class="line">19</td><td class="hits">11</td><td class="source"> return through2(</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> function (chunk, encoding, next) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">11</td><td class="source"> code += chunk.toString()</td></tr><tr class="hit"><td class="line">22</td><td class="hits">11</td><td class="source"> next()</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> function (done) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">11</td><td class="source"> var self = this</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">27</td><td class="hits">11</td><td class="source"> proc(code, function (err, result) {</td></tr><tr class="hit"><td class="line">28</td><td class="hits">11</td><td class="source"> if (err) return done(err)</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">30</td><td class="hits">11</td><td class="source"> var imports = result.imports.map(function (imp) {</td></tr><tr class="hit"><td class="line">31</td><td class="hits">7</td><td class="source"> return '{ module: require("' + imp.path + '"), media:"' + imp.media + '"}'</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> }).join(',')</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">34</td><td class="hits">11</td><td class="source"> var browserPath = rPath('./cssy-browser.js', filename)</td></tr><tr class="hit"><td class="line">35</td><td class="hits">11</td><td class="source"> var cssyioPath = rPath('./cssyio.js', filename)</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">37</td><td class="hits">11</td><td class="source"> self.push("module.exports = (require('" + browserPath + "'))(" + JSON.stringify(result.src) + ', [' + imports + ']' + ');')</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">39</td><td class="hits">11</td><td class="source"> if (process.cssy.livereload) {</td></tr><tr class="hit"><td class="line">40</td><td class="hits">1</td><td class="source"> self.push("\nrequire('" + cssyioPath + "').on('change:" + result.filename + "', function(src) { module.exports.update(src)})")</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">43</td><td class="hits">11</td><td class="source"> done()</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> )</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source">* Generate a relative path to a cssy file, relative to source file</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source">*</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source">* @param {string} cssyFile</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source">* Path relative to current module</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source">*</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source">* @param {string} sourceFilepath</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source">* The source filepath</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source">*</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source">* @return {string}</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source">* A relative path to cssyFile from a transformed source</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source">*/</td></tr><tr class="hit"><td class="line">62</td><td class="hits">1</td><td class="source">function rPath (cssyFile, sourceFilepath) {</td></tr><tr class="hit"><td class="line">63</td><td class="hits">22</td><td class="source"> cssyFile = pathResolve(__dirname, cssyFile)</td></tr><tr class="hit"><td class="line">64</td><td class="hits">22</td><td class="source"> cssyFile = pathRelative(dirname(sourceFilepath), cssyFile)</td></tr><tr class="hit"><td class="line">65</td><td class="hits">22</td><td class="source"> cssyFile = slash(cssyFile)</td></tr><tr class="hit"><td class="line">66</td><td class="hits">22</td><td class="source"> if (!/^(\.|\/)/.test(cssyFile)) {</td></tr><tr class="miss"><td class="line">67</td><td class="hits">0</td><td class="source"> return './' + cssyFile</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">69</td><td class="hits">22</td><td class="source"> return cssyFile</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="utils.js">utils.js</h2><div id="stats" class="high"><div class="percentage">93%</div><div class="sloc">49</div><div class="hits">46</div><div class="misses">3</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var async = require('async')</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var dirname = require('path').dirname</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">var join = require('path').join</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var exists = require('fs').existsSync</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> * Return a composition of sync and async function exectuable in sequence</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * See [async.seq()](https://github.com/caolan/async#seqfn1-fn2).</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> * Each function from `stack` consumes the return value of the latter function.</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> * Function can return a value (sync) or use the callback (async)</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> * @param {Array} fns</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> * List of function in order</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> * @return {Function}</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> * Composed function, that take the initial value</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">19</td><td class="hits">1</td><td class="source">exports.compose = function (fns) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">89</td><td class="source"> if (!Array.isArray(fns)) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">1</td><td class="source"> throw new Error('Invalid argument: Array required')</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">23</td><td class="hits">114</td><td class="source"> fns = fns.map(function (fn) { return exports.toAsync(fn) })</td></tr><tr class="hit"><td class="line">24</td><td class="hits">88</td><td class="source"> return async.seq.apply(null, fns)</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> * Make any function asynchronous (node's async standard)</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> * Example:</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> * ```</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> * var foo = toAsync(function(arg) {</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> * return 35 + arg</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> * })</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> * // Is equivalent to:</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> * var bar = toAsync(function(arg, done) {</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> * done(null, 35 + arg)</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> * })</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> * // Both `foo()` and `bar()` are async functions:</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> * foo(7, function(err, result) { })</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> * bar(7, function(err, result) { })</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> * ```</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> * @param {Function} fn</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> * If the function return a value (!undefined), then</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> * the value is passed to the async callback. Else, this wrapper</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> * is transparent.</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> * @return {Function}</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> * Asynchronous function</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">56</td><td class="hits">1</td><td class="source">exports.toAsync = function (fn) {</td></tr><tr class="hit"><td class="line">57</td><td class="hits">45</td><td class="source"> if (typeof (fn) !== 'function') {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">1</td><td class="source"> throw new Error('Invalid argument: Function required')</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">60</td><td class="hits">44</td><td class="source"> return function () {</td></tr><tr class="hit"><td class="line">61</td><td class="hits">44</td><td class="source"> var args = Array.prototype.slice.apply(arguments)</td></tr><tr class="hit"><td class="line">62</td><td class="hits">44</td><td class="source"> var done = args.pop()</td></tr><tr class="hit"><td class="line">63</td><td class="hits">44</td><td class="source"> var result</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">65</td><td class="hits">44</td><td class="source"> function doneOnce () {</td></tr><tr class="hit"><td class="line">66</td><td class="hits">89</td><td class="source"> if (!doneOnce.isDone) done.apply(null, arguments)</td></tr><tr class="hit"><td class="line">67</td><td class="hits">45</td><td class="source"> doneOnce.isDone = true</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">70</td><td class="hits">44</td><td class="source"> args.push(doneOnce)</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">72</td><td class="hits">44</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">73</td><td class="hits">44</td><td class="source"> result = fn.apply(null, args)</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> } catch(e) {</td></tr><tr class="hit"><td class="line">75</td><td class="hits">2</td><td class="source"> doneOnce(e)</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">77</td><td class="hits">44</td><td class="source"> if (typeof (result) !== 'undefined') {</td></tr><tr class="hit"><td class="line">78</td><td class="hits">16</td><td class="source"> doneOnce(null, result)</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> * Extract cssy configuration from a package.json</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> * @param {Object|String} [pkg]</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> * A package.json object or path to `package.json` to read</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> * Default is the path to the current working directory package.json</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> * (if any)</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> * @return {Object}</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> * Cssy configuration (or {})</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">94</td><td class="hits">1</td><td class="source">exports.getCssyConfig = function (pkg) {</td></tr><tr class="hit"><td class="line">95</td><td class="hits">39</td><td class="source"> if (!pkg) {</td></tr><tr class="hit"><td class="line">96</td><td class="hits">10</td><td class="source"> pkg = exports.getCwdPackagePath()</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">99</td><td class="hits">39</td><td class="source"> if (typeof (pkg) === 'string') {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">38</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">101</td><td class="hits">38</td><td class="source"> pkg = require(pkg)</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> } catch(e) {</td></tr><tr class="hit"><td class="line">103</td><td class="hits">1</td><td class="source"> pkg = {}</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">107</td><td class="hits">39</td><td class="source"> if (!pkg.browserify || !pkg.browserify.transform) {</td></tr><tr class="hit"><td class="line">108</td><td class="hits">24</td><td class="source"> return {}</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">111</td><td class="hits">15</td><td class="source"> return pkg.browserify.transform.reduce(function (memo, item) {</td></tr><tr class="hit"><td class="line">112</td><td class="hits">15</td><td class="source"> if (memo) {</td></tr><tr class="miss"><td class="line">113</td><td class="hits">0</td><td class="source"> return memo</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">115</td><td class="hits">15</td><td class="source"> if ((typeof (item) === 'string') || (item[0] !== 'cssy') || !item[1]) {</td></tr><tr class="miss"><td class="line">116</td><td class="hits">0</td><td class="source"> return</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">118</td><td class="hits">15</td><td class="source"> return item[1]</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> }, null) || {}</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> * Return the package.json path for the current working directory</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">126</td><td class="hits">1</td><td class="source">exports.getCwdPackagePath = function () {</td></tr><tr class="hit"><td class="line">127</td><td class="hits">11</td><td class="source"> var searchIn = process.cwd()</td></tr><tr class="hit"><td class="line">128</td><td class="hits">11</td><td class="source"> var filename = 'package.json'</td></tr><tr class="hit"><td class="line">129</td><td class="hits">11</td><td class="source"> var path</td></tr><tr class="hit"><td class="line">130</td><td class="hits">11</td><td class="source"> while (dirname(searchIn) !== searchIn) {</td></tr><tr class="hit"><td class="line">131</td><td class="hits">11</td><td class="source"> path = join(searchIn, filename)</td></tr><tr class="hit"><td class="line">132</td><td class="hits">11</td><td class="source"> if (exists(path)) {</td></tr><tr class="hit"><td class="line">133</td><td class="hits">11</td><td class="source"> return path</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">135</td><td class="hits">0</td><td class="source"> searchIn = dirname(searchIn)</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div></div></div></body></html>