342 | </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">100</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/build.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">build.js</span></a></li><li><span class="cov high">85</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/config.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">config.js</span></a></li><li><span class="cov high">94</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/context.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">context.js</span></a></li><li><span class="cov high">93</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/fileUtil.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">fileUtil.js</span></a></li><li><span class="cov medium">62</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/jsCombine.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">jsCombine.js</span></a></li><li><span class="cov high">94</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/libraries.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">libraries.js</span></a></li><li><span class="cov high">89</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/lumbar.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">lumbar.js</span></a></li><li><span class="cov high">99</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugin.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">plugin.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/coffee-script.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">coffee-script.js</span></a></li><li><span class="cov high">91</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/handlebars.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">handlebars.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/inline-styles-resources.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">inline-styles-resources.js</span></a></li><li><span class="cov high">94</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/inline-styles.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">inline-styles.js</span></a></li><li><span class="cov high">96</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/many-to-one-output.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">many-to-one-output.js</span></a></li><li><span class="cov high">96</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/mixin.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">mixin.js</span></a></li><li><span class="cov high">87</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/module-map.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">module-map.js</span></a></li><li><span class="cov high">90</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/package-config.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">package-config.js</span></a></li><li><span class="cov high">95</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/router.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">router.js</span></a></li><li><span class="cov high">97</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/scope.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">scope.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/scripts-output.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">scripts-output.js</span></a></li><li><span class="cov high">80</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/scripts.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">scripts.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/server-scripts.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">server-scripts.js</span></a></li><li><span class="cov high">88</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/static-output.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">static-output.js</span></a></li><li><span class="cov high">92</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/static.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">static.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/styles-output.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">styles-output.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/styles.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">styles.js</span></a></li><li><span class="cov high">94</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/stylus-config.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">stylus-config.js</span></a></li><li><span class="cov high">94</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/stylus.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">stylus.js</span></a></li><li><span class="cov high">97</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/template.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">template.js</span></a></li><li><span class="cov high">92</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/plugins/update-externals.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/</span><span class="basename">update-externals.js</span></a></li><li><span class="cov high">97</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/state-machine.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">state-machine.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/templateUtil.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">templateUtil.js</span></a></li><li><span class="cov high">95</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/util/file-map.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/util/</span><span class="basename">file-map.js</span></a></li><li><span class="cov high">98</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/util/resources.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/util/</span><span class="basename">resources.js</span></a></li><li><span class="cov high">90</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/util/watcher.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/util/</span><span class="basename">watcher.js</span></a></li><li><span class="cov high">95</span><a href="#/Users/kpdecker/dev/walmart/lumbar/lib/watch-manager.js"><span class="dirname">/Users/kpdecker/dev/walmart/lumbar/lib/</span><span class="basename">watch-manager.js</span></a></li><a id="logo" href="http://visionmedia.github.com/mocha/">m</a></div><div id="stats" class="high"><div class="percentage">93%</div><div class="sloc">2179</div><div class="hits">2033</div><div class="misses">146</div></div><div id="files"><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/build.js">/Users/kpdecker/dev/walmart/lumbar/lib/build.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">46</div><div class="hits">46</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">var _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> fu = require('./fileUtil'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> resources = require('./util/resources');</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"> * Creates a list of all of the resources for the current module.</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"> * Context state: module</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"> * Plugin Calls:</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> * moduleResources</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> * fileFilter</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> * resourceList</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">exports.loadResources = function(context, callback) {</td></tr><tr class="hit"><td class="line">17</td><td class="hits">331</td><td class="source"> var plugins = context.plugins;</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">331</td><td class="source"> function filterResource(resource) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">569</td><td class="source"> resource = resources.cast(resource);</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">569</td><td class="source"> if (exports.filterResource(resource, context)) {</td></tr><tr class="hit"><td class="line">23</td><td class="hits">488</td><td class="source"> return resource;</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"> </td></tr><tr class="hit"><td class="line">27</td><td class="hits">331</td><td class="source"> plugins.moduleResources(context, function(err, files) {</td></tr><tr class="hit"><td class="line">28</td><td class="hits">331</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">29</td><td class="hits">1</td><td class="source"> return callback(err);</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> }</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">330</td><td class="source"> var fileFilter = plugins.fileFilter(context) || /.*/;</td></tr><tr class="hit"><td class="line">33</td><td class="hits">330</td><td class="source"> fu.fileList(files, fileFilter, function(err, files) {</td></tr><tr class="hit"><td class="line">34</td><td class="hits">330</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">1</td><td class="source"> return callback(err);</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"> </td></tr><tr class="hit"><td class="line">38</td><td class="hits">329</td><td class="source"> async.map(files, function(resource, callback) {</td></tr><tr class="hit"><td class="line">39</td><td class="hits">514</td><td class="source"> var resourceContext = context.clone();</td></tr><tr class="hit"><td class="line">40</td><td class="hits">514</td><td class="source"> resourceContext.resource = resource;</td></tr><tr class="hit"><td class="line">41</td><td class="hits">514</td><td class="source"> plugins.resourceList(resourceContext, callback);</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"> function(err, resources) {</td></tr><tr class="hit"><td class="line">44</td><td class="hits">329</td><td class="source"> resources = _.flatten(resources);</td></tr><tr class="hit"><td class="line">45</td><td class="hits">329</td><td class="source"> resources = _.map(resources, filterResource);</td></tr><tr class="hit"><td class="line">46</td><td class="hits">898</td><td class="source"> resources = _.filter(resources, function(resource) { return resource; });</td></tr><tr class="hit"><td class="line">47</td><td class="hits">329</td><td class="source"> callback(err, resources);</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">};</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"> * Filters a given resource for platform constraints, if specified.</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.filterResource = function(resource, context) {</td></tr><tr class="hit"><td class="line">57</td><td class="hits">918</td><td class="source"> function check(value, singular, plural) {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">2506</td><td class="source"> if (typeof singular !== 'undefined') {</td></tr><tr class="hit"><td class="line">59</td><td class="hits">172</td><td class="source"> return singular.not ? singular.not !== value : singular === value;</td></tr><tr class="hit"><td class="line">60</td><td class="hits">2334</td><td class="source"> } else if (plural) {</td></tr><tr class="hit"><td class="line">61</td><td class="hits">73</td><td class="source"> var ret = (plural.not || plural).reduce(function(found, filePlatform) {</td></tr><tr class="hit"><td class="line">62</td><td class="hits">105</td><td class="source"> return found || filePlatform === value;</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> }, false);</td></tr><tr class="hit"><td class="line">64</td><td class="hits">73</td><td class="source"> return plural.not ? !ret : ret;</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">66</td><td class="hits">2261</td><td class="source"> return true;</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">69</td><td class="hits">918</td><td class="source"> function checkResource(resource) {</td></tr><tr class="hit"><td class="line">70</td><td class="hits">922</td><td class="source"> return check(context.platform, resource.platform, resource.platforms)</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> && check(context.package, resource.package, resource.packages)</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> && check(!!context.combined, resource.combined);</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">74</td><td class="hits">918</td><td class="source"> return checkResource(resource)</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> && (!resource.originalResource || checkResource(resource.originalResource));</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source">};</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><tr><td class="line">80</td><td class="hits"></td><td class="source"> * Runs a set of resources through the resource plugin.</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"> * Context state: module</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"> * Plugin Calls:</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> * resource</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">87</td><td class="hits">1</td><td class="source">exports.processResources = function(resources, context, callback) {</td></tr><tr class="hit"><td class="line">88</td><td class="hits">329</td><td class="source"> var plugins = context.plugins;</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">90</td><td class="hits">329</td><td class="source"> async.map(resources, function(resource, callback) {</td></tr><tr class="hit"><td class="line">91</td><td class="hits">461</td><td class="source"> var resourceContext = context.clone();</td></tr><tr class="hit"><td class="line">92</td><td class="hits">461</td><td class="source"> resourceContext.resource = resource;</td></tr><tr class="hit"><td class="line">93</td><td class="hits">461</td><td class="source"> plugins.resource(resourceContext, function(err, newResource) {</td></tr><tr class="hit"><td class="line">94</td><td class="hits">461</td><td class="source"> if (newResource && newResource !== resource) {</td></tr><tr class="hit"><td class="line">95</td><td class="hits">103</td><td class="source"> newResource.originalResource = resource;</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">98</td><td class="hits">461</td><td class="source"> callback(err, newResource);</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"> },</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> function(err, resources) {</td></tr><tr class="hit"><td class="line">102</td><td class="hits">329</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">103</td><td class="hits">1</td><td class="source"> return callback(err);</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 class="hit"><td class="line">106</td><td class="hits">788</td><td class="source"> callback(err, resources.filter(function(resource) { return resource; }));</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/config.js">/Users/kpdecker/dev/walmart/lumbar/lib/config.js</h2><div id="stats" class="high"><div class="percentage">85%</div><div class="sloc">67</div><div class="hits">57</div><div class="misses">10</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> fu = require('./fileUtil'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> vm = require('vm');</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"> * Reads the RAW JSON for a lumbar config file.</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">1</td><td class="source">exports.readConfig = function(lumbarFile) {</td></tr><tr class="hit"><td class="line">10</td><td class="hits">37</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">11</td><td class="hits">37</td><td class="source"> var data = '(' + fu.readFileSync(lumbarFile) + ')';</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"> // Yes this is totally unsafe, but we don't want the strictness of pure JSON for our</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> // config files and if you are running an untrusted lumbar file you already have concerns.</td></tr><tr class="hit"><td class="line">15</td><td class="hits">37</td><td class="source"> return vm.runInThisContext(data, lumbarFile);</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr class="miss"><td class="line">17</td><td class="hits">0</td><td class="source"> var line;</td></tr><tr class="miss"><td class="line">18</td><td class="hits">0</td><td class="source"> try {</td></tr><tr class="miss"><td class="line">19</td><td class="hits">0</td><td class="source"> var esprima = require('esprima');</td></tr><tr class="miss"><td class="line">20</td><td class="hits">0</td><td class="source"> console.log(err.stack, esprima.parse(data));</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr class="miss"><td class="line">22</td><td class="hits">0</td><td class="source"> if (err.lineNumber) {</td></tr><tr class="miss"><td class="line">23</td><td class="hits">0</td><td class="source"> line = ':' + err.lineNumber;</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 class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> throw new Error('Failed to load config ' + lumbarFile + line + ': ' + err);</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><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">/**</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"> * @name load</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> * @function This function loads the lumbar JSON file, and returns</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> * helper methods associated with accessing its specific data.</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> * @param {string} lumbarFile the location of the lumbar file.</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> * @return {Object}</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">1</td><td class="source">exports.load = function(lumbarFile) {</td></tr><tr class="hit"><td class="line">39</td><td class="hits">29</td><td class="source"> fu.lookupPath('');</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">41</td><td class="hits">29</td><td class="source"> var config = exports.readConfig(lumbarFile);</td></tr><tr class="hit"><td class="line">42</td><td class="hits">29</td><td class="source"> fu.lookupPath(path.dirname(lumbarFile));</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">44</td><td class="hits">29</td><td class="source"> return exports.create(config);</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 class="hit"><td class="line">47</td><td class="hits">1</td><td class="source">exports.create = function(config) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">183</td><td class="source"> var packageList, moduleList;</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">183</td><td class="source"> function loadPackageList() {</td></tr><tr class="hit"><td class="line">51</td><td class="hits">183</td><td class="source"> if (!config.packages) {</td></tr><tr class="hit"><td class="line">52</td><td class="hits">137</td><td class="source"> config.packages = { web: { name: '' } };</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><tr class="hit"><td class="line">55</td><td class="hits">183</td><td class="source"> packageList = _.keys(config.packages);</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">57</td><td class="hits">183</td><td class="source"> function loadModuleList() {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">183</td><td class="source"> if (!config.modules) {</td></tr><tr class="hit"><td class="line">59</td><td class="hits">1</td><td class="source"> throw new Error('No modules object defined: ' + JSON.stringify(config, undefined, 2));</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">61</td><td class="hits">182</td><td class="source"> moduleList = _.keys(config.modules);</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 class="hit"><td class="line">64</td><td class="hits">183</td><td class="source"> loadPackageList();</td></tr><tr class="hit"><td class="line">65</td><td class="hits">183</td><td class="source"> loadModuleList();</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">67</td><td class="hits">182</td><td class="source"> return {</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> /** @typedef {Object} The raw lumbar file as a JSON object. */</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> attributes: config,</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> loadPrefix: function() {</td></tr><tr class="hit"><td class="line">71</td><td class="hits">53</td><td class="source"> return config.loadPrefix || '';</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> </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"> *</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> * @name packageList</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> * @function This function returns the list of packages found</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> * in the lumbar file.</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> * @return {Array.<Object>} array of package(s).</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"> packageList: function() {</td></tr><tr class="hit"><td class="line">82</td><td class="hits">60</td><td class="source"> return packageList;</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"> </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"> *</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> * @name combineModules</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> * @function This functions checks to see if the package, pkg,</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> * is going to combine all its modules or not.</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> * @param {string} pkg the name of the package</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> * @return {boolean} is this package destined to be combined?</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> combineModules: function(pkg) {</td></tr><tr class="hit"><td class="line">94</td><td class="hits">1918</td><td class="source"> if (config && config.packages && config.packages[pkg]) {</td></tr><tr class="hit"><td class="line">95</td><td class="hits">1615</td><td class="source"> return config.packages[pkg].combine;</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">97</td><td class="hits">303</td><td class="source"> return false;</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"> platformList: function(pkg) {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">109</td><td class="source"> if (!pkg) {</td></tr><tr class="hit"><td class="line">101</td><td class="hits">62</td><td class="source"> return config.platforms || [''];</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">103</td><td class="hits">47</td><td class="source"> if (config.packages[pkg]) {</td></tr><tr class="hit"><td class="line">104</td><td class="hits">47</td><td class="source"> return config.packages[pkg].platforms || this.platformList();</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">106</td><td class="hits">0</td><td class="source"> return this.platformList();</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> },</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"> moduleList: function(pkg) {</td></tr><tr class="hit"><td class="line">111</td><td class="hits">258</td><td class="source"> return (config.packages[pkg] || {}).modules || _.keys(config.modules);</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> module: function(name) {</td></tr><tr class="hit"><td class="line">115</td><td class="hits">523</td><td class="source"> var ret = config.modules[name];</td></tr><tr class="hit"><td class="line">116</td><td class="hits">523</td><td class="source"> if (ret) {</td></tr><tr class="hit"><td class="line">117</td><td class="hits">520</td><td class="source"> ret.name = name;</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">119</td><td class="hits">523</td><td class="source"> return ret;</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"> isAppModule: function(module) {</td></tr><tr class="hit"><td class="line">122</td><td class="hits">76</td><td class="source"> var app = config.application;</td></tr><tr class="hit"><td class="line">123</td><td class="hits">76</td><td class="source"> return (app && app.module) === (module.name || module);</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> scopedAppModuleName: function(module) {</td></tr><tr class="hit"><td class="line">126</td><td class="hits">46</td><td class="source"> var app = config.application;</td></tr><tr class="hit"><td class="line">127</td><td class="hits">46</td><td class="source"> if (this.isAppModule(module)) {</td></tr><tr class="hit"><td class="line">128</td><td class="hits">4</td><td class="source"> return 'module.exports';</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">130</td><td class="hits">42</td><td class="source"> var app = config.application;</td></tr><tr class="hit"><td class="line">131</td><td class="hits">42</td><td class="source"> return app && app.name;</td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> },</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"> routeList: function(module) {</td></tr><tr class="hit"><td class="line">136</td><td class="hits">28</td><td class="source"> return config.modules[module].routes;</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"> serialize: function() {</td></tr><tr class="hit"><td class="line">140</td><td class="hits">2</td><td class="source"> function objectClone(object) {</td></tr><tr class="hit"><td class="line">141</td><td class="hits">19</td><td class="source"> var clone = object;</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">143</td><td class="hits">19</td><td class="source"> if (object && object.serialize) {</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> // Allow specialized objects to handle themselves</td></tr><tr class="miss"><td class="line">145</td><td class="hits">0</td><td class="source"> clone = object.serialize();</td></tr><tr class="hit"><td class="line">146</td><td class="hits">19</td><td class="source"> } else if (_.isArray(object)) {</td></tr><tr class="hit"><td class="line">147</td><td class="hits">1</td><td class="source"> clone = _.map(object, objectClone);</td></tr><tr class="hit"><td class="line">148</td><td class="hits">18</td><td class="source"> } else if (_.isObject(object)) {</td></tr><tr class="hit"><td class="line">149</td><td class="hits">12</td><td class="source"> clone = {};</td></tr><tr class="hit"><td class="line">150</td><td class="hits">12</td><td class="source"> _.each(object, function(value, name) {</td></tr><tr class="hit"><td class="line">151</td><td class="hits">15</td><td class="source"> clone[name] = objectClone(value);</td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> });</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"> </td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> // Collapse simple resources</td></tr><tr class="hit"><td class="line">156</td><td class="hits">19</td><td class="source"> if (clone && clone.src && _.keys(clone).length === 1) {</td></tr><tr class="miss"><td class="line">157</td><td class="hits">0</td><td class="source"> clone = clone.src;</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">160</td><td class="hits">19</td><td class="source"> return clone;</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"> </td></tr><tr class="hit"><td class="line">163</td><td class="hits">2</td><td class="source"> return objectClone(this.attributes);</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> }</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"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/context.js">/Users/kpdecker/dev/walmart/lumbar/lib/context.js</h2><div id="stats" class="high"><div class="percentage">94%</div><div class="sloc">114</div><div class="hits">108</div><div class="misses">6</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> fs = require('fs'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> fu = require('./fileUtil'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> resources = require('./util/resources');</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">function Context(options, config, plugins, libraries, event) {</td></tr><tr class="hit"><td class="line">8</td><td class="hits">2271</td><td class="source"> this._package = options.package;</td></tr><tr class="hit"><td class="line">9</td><td class="hits">2271</td><td class="source"> this._platform = options.platform;</td></tr><tr class="hit"><td class="line">10</td><td class="hits">2271</td><td class="source"> this._plugins = plugins;</td></tr><tr class="hit"><td class="line">11</td><td class="hits">2271</td><td class="source"> this.mode = options.mode;</td></tr><tr class="hit"><td class="line">12</td><td class="hits">2271</td><td class="source"> this.module = options.module;</td></tr><tr class="hit"><td class="line">13</td><td class="hits">2271</td><td class="source"> this.fileConfig = options.fileConfig;</td></tr><tr class="hit"><td class="line">14</td><td class="hits">2271</td><td class="source"> this.resource = options.resource;</td></tr><tr class="hit"><td class="line">15</td><td class="hits">2271</td><td class="source"> this.config = config;</td></tr><tr class="hit"><td class="line">16</td><td class="hits">2271</td><td class="source"> this.libraries = libraries || options.libraries;</td></tr><tr class="hit"><td class="line">17</td><td class="hits">2271</td><td class="source"> this.event = event || options.event;</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">Context.prototype = {</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> fileUtil: fu,</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"> clone: function(options) {</td></tr><tr class="hit"><td class="line">23</td><td class="hits">2092</td><td class="source"> var ret = new Context(this, this.config);</td></tr><tr class="hit"><td class="line">24</td><td class="hits">2092</td><td class="source"> ret.parent = this;</td></tr><tr class="hit"><td class="line">25</td><td class="hits">2092</td><td class="source"> var prototype = Object.keys(Context.prototype);</td></tr><tr class="hit"><td class="line">26</td><td class="hits">2092</td><td class="source"> for (var name in this) {</td></tr><tr class="hit"><td class="line">27</td><td class="hits">64420</td><td class="source"> if (this.hasOwnProperty(name) && prototype.indexOf(name) === -1) {</td></tr><tr class="hit"><td class="line">28</td><td class="hits">37224</td><td class="source"> ret[name] = this[name];</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"> }</td></tr><tr class="hit"><td class="line">31</td><td class="hits">2092</td><td class="source"> if (options) {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">293</td><td class="source"> _.extend(ret, options);</td></tr><tr class="hit"><td class="line">33</td><td class="hits">293</td><td class="source"> ret._package = options.package || this._package;</td></tr><tr class="hit"><td class="line">34</td><td class="hits">293</td><td class="source"> ret._platform = options.platform || this._platform;</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">2092</td><td class="source"> return ret;</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> },</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"> fileNamesForModule: function(mode, moduleName, callback) {</td></tr><tr class="hit"><td class="line">40</td><td class="hits">89</td><td class="source"> var context = this.clone();</td></tr><tr class="hit"><td class="line">41</td><td class="hits">89</td><td class="source"> context.mode = mode;</td></tr><tr class="hit"><td class="line">42</td><td class="hits">89</td><td class="source"> context.module = moduleName && this.config.module(moduleName);</td></tr><tr class="hit"><td class="line">43</td><td class="hits">89</td><td class="source"> if (moduleName && !context.module) {</td></tr><tr class="hit"><td class="line">44</td><td class="hits">2</td><td class="source"> return callback(new Error('Unknown module "' + moduleName + '"'));</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 class="hit"><td class="line">47</td><td class="hits">87</td><td class="source"> this.plugins.outputConfigs(context, function(err, configs) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">87</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">49</td><td class="hits">0</td><td class="source"> return callback(err);</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 class="hit"><td class="line">52</td><td class="hits">87</td><td class="source"> async.map(configs, function(config, callback) {</td></tr><tr class="hit"><td class="line">53</td><td class="hits">113</td><td class="source"> var fileContext = context.clone();</td></tr><tr class="hit"><td class="line">54</td><td class="hits">113</td><td class="source"> fileContext.fileConfig = config;</td></tr><tr class="hit"><td class="line">55</td><td class="hits">113</td><td class="source"> fileContext._plugins.fileName(fileContext, function(err, fileName) {</td></tr><tr class="hit"><td class="line">56</td><td class="hits">113</td><td class="source"> config.fileName = fileName;</td></tr><tr class="hit"><td class="line">57</td><td class="hits">113</td><td class="source"> callback(err, config);</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><td class="line">60</td><td class="hits"></td><td class="source"> callback);</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"> },</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"> loadResource: function(resource, callback) {</td></tr><tr class="hit"><td class="line">65</td><td class="hits">421</td><td class="source"> if (!callback) {</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> // if only single param, assume as callback and resource from context</td></tr><tr class="miss"><td class="line">67</td><td class="hits">0</td><td class="source"> resource = this.resource;</td></tr><tr class="miss"><td class="line">68</td><td class="hits">0</td><td class="source"> callback = resource;</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"> </td></tr><tr class="hit"><td class="line">71</td><td class="hits">421</td><td class="source"> var fileInfo = {name: resource.hasOwnProperty('sourceFile') ? resource.sourceFile : resource.src};</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">421</td><td class="source"> function loaded(err, data) {</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> /*jshint eqnull: true */</td></tr><tr class="hit"><td class="line">75</td><td class="hits">421</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">76</td><td class="hits">4</td><td class="source"> if (!err.resourceLoadError) {</td></tr><tr class="hit"><td class="line">77</td><td class="hits">4</td><td class="source"> var json = '';</td></tr><tr class="hit"><td class="line">78</td><td class="hits">4</td><td class="source"> try {</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> // Output JSON for the resource... but protect ourselves from a failure masking a failure</td></tr><tr class="hit"><td class="line">80</td><td class="hits">4</td><td class="source"> resource = _.clone(resource.originalResource || resource);</td></tr><tr class="hit"><td class="line">81</td><td class="hits">4</td><td class="source"> delete resource.library;</td></tr><tr class="hit"><td class="line">82</td><td class="hits">4</td><td class="source"> delete resource.enoent;</td></tr><tr class="hit"><td class="line">83</td><td class="hits">4</td><td class="source"> json = '\n\t' + JSON.stringify(resource);</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> } catch (err) { /* NOP */ }</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">86</td><td class="hits">4</td><td class="source"> var errorWrapper = new Error('Failed to load resource "' + fileInfo.name + '"' + json + '\n\t' + (err.stack || err));</td></tr><tr class="hit"><td class="line">87</td><td class="hits">4</td><td class="source"> errorWrapper.stack = errorWrapper.message + ' ' + (err.stack || err);</td></tr><tr class="hit"><td class="line">88</td><td class="hits">4</td><td class="source"> errorWrapper.source = err;</td></tr><tr class="hit"><td class="line">89</td><td class="hits">4</td><td class="source"> errorWrapper.code = err.code;</td></tr><tr class="hit"><td class="line">90</td><td class="hits">4</td><td class="source"> errorWrapper.resourceLoadError = true;</td></tr><tr class="hit"><td class="line">91</td><td class="hits">4</td><td class="source"> err = errorWrapper;</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"> callback(err);</td></tr><tr class="hit"><td class="line">94</td><td class="hits">4</td><td class="source"> return;</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">96</td><td class="hits">417</td><td class="source"> fileInfo.inputs = data.inputs;</td></tr><tr class="hit"><td class="line">97</td><td class="hits">417</td><td class="source"> fileInfo.generated = data.generated;</td></tr><tr class="hit"><td class="line">98</td><td class="hits">417</td><td class="source"> fileInfo.noSeparator = data.noSeparator;</td></tr><tr class="hit"><td class="line">99</td><td class="hits">417</td><td class="source"> fileInfo.ignoreWarnings = data.ignoreWarnings || resource.ignoreWarnings;</td></tr><tr class="hit"><td class="line">100</td><td class="hits">417</td><td class="source"> fileInfo.content = data.data != null ? data.data : data;</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"> // Ensure that we dump off the stack</td></tr><tr class="hit"><td class="line">103</td><td class="hits">417</td><td class="source"> _.defer(function() {</td></tr><tr class="hit"><td class="line">104</td><td class="hits">417</td><td class="source"> callback(err, fileInfo);</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><td class="line">107</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">108</td><td class="hits">421</td><td class="source"> if (typeof resource === 'function') {</td></tr><tr class="hit"><td class="line">109</td><td class="hits">202</td><td class="source"> resource(this, loaded);</td></tr><tr class="hit"><td class="line">110</td><td class="hits">219</td><td class="source"> } else if (resource.src) {</td></tr><tr><td class="line">111</td><td class="hits"></td><td class="source"> // Assume a file page, attempt to load</td></tr><tr class="hit"><td class="line">112</td><td class="hits">206</td><td class="source"> fu.readFile(resource.src, loaded);</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">114</td><td class="hits">13</td><td class="source"> loaded(undefined, {data: '', noSeparator: true, inputs: resource.dir ? [resource.dir] : []});</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"> </td></tr><tr class="hit"><td class="line">117</td><td class="hits">421</td><td class="source"> return fileInfo;</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"> outputFile: function(writer, callback) {</td></tr><tr class="hit"><td class="line">121</td><td class="hits">144</td><td class="source"> var context = this;</td></tr><tr class="hit"><td class="line">122</td><td class="hits">144</td><td class="source"> context.plugins.file(context, function(err) {</td></tr><tr class="hit"><td class="line">123</td><td class="hits">144</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">124</td><td class="hits">0</td><td class="source"> return callback(err);</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"> </td></tr><tr class="hit"><td class="line">127</td><td class="hits">144</td><td class="source"> context.plugins.fileName(context, function(err, fileName) {</td></tr><tr class="hit"><td class="line">128</td><td class="hits">144</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">129</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">132</td><td class="hits">144</td><td class="source"> context.buildPath = (fileName.root ? '' : context.platformPath) + fileName.path + '.' + fileName.extension;</td></tr><tr class="hit"><td class="line">133</td><td class="hits">144</td><td class="source"> context.fileName = context.outdir + '/' + context.buildPath;</td></tr><tr class="hit"><td class="line">134</td><td class="hits">144</td><td class="source"> writer(function(err, data) {</td></tr><tr class="hit"><td class="line">135</td><td class="hits">144</td><td class="source"> data = _.defaults({</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> fileConfig: context.fileConfig,</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> platform: context.platform,</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> package: context.package,</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> mode: context.mode</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> }, data);</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">142</td><td class="hits">144</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">143</td><td class="hits">3</td><td class="source"> fs.unlink(context.fileName, function() { /* NOP To Prevent warning */});</td></tr><tr class="hit"><td class="line">144</td><td class="hits">3</td><td class="source"> data.error = err;</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">146</td><td class="hits">144</td><td class="source"> context.event.emit('output', data);</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">144</td><td class="source"> context.fileCache = undefined;</td></tr><tr class="hit"><td class="line">149</td><td class="hits">144</td><td class="source"> callback(err, data);</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"> });</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"> </td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> get description() {</td></tr><tr class="hit"><td class="line">156</td><td class="hits">547</td><td class="source"> var ret = 'package:' + this.package + '_platform:' + this.platform;</td></tr><tr class="hit"><td class="line">157</td><td class="hits">547</td><td class="source"> if (this.mode) {</td></tr><tr class="hit"><td class="line">158</td><td class="hits">350</td><td class="source"> ret += '_mode:' + this.mode;</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">160</td><td class="hits">547</td><td class="source"> if (this.fileName) {</td></tr><tr class="hit"><td class="line">161</td><td class="hits">115</td><td class="source"> ret += '_config:' + this.fileName;</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">163</td><td class="hits">547</td><td class="source"> if (this.module) {</td></tr><tr class="hit"><td class="line">164</td><td class="hits">329</td><td class="source"> ret += '_module:' + (this.module.name || this.module);</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">166</td><td class="hits">547</td><td class="source"> if (this.resource) {</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source"> // TODO : Anything better for this?</td></tr><tr class="hit"><td class="line">168</td><td class="hits">19</td><td class="source"> ret += '_resource:' + resources.source(this.resource);</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">547</td><td class="source"> return ret;</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"> </td></tr><tr class="hit"><td class="line">173</td><td class="hits">1988</td><td class="source"> get plugins() { return this._plugins; },</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">175</td><td class="hits">5961</td><td class="source"> get package() { return this._package; },</td></tr><tr class="hit"><td class="line">176</td><td class="hits">4329</td><td class="source"> get platform() { return this._platform; },</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> get platformPath() {</td></tr><tr class="hit"><td class="line">178</td><td class="hits">156</td><td class="source"> return this.platform ? this.platform + '/' : '';</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"> get combined() {</td></tr><tr class="hit"><td class="line">182</td><td class="hits">1918</td><td class="source"> return this.config.combineModules(this.package);</td></tr><tr><td class="line">183</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> get baseName() {</td></tr><tr class="hit"><td class="line">185</td><td class="hits">231</td><td class="source"> if (!this.combined) {</td></tr><tr class="hit"><td class="line">186</td><td class="hits">163</td><td class="source"> return this.module.name;</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">188</td><td class="hits">68</td><td class="source"> return (this.config.attributes.packages[this.package] || {}).name || this.package;</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> get resources() {</td></tr><tr class="hit"><td class="line">193</td><td class="hits">289</td><td class="source"> if (this.parent) {</td></tr><tr class="miss"><td class="line">194</td><td class="hits">0</td><td class="source"> return this.parent.resources;</td></tr><tr><td class="line">195</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">196</td><td class="hits">289</td><td class="source"> return this._resources;</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> set resources(value) {</td></tr><tr class="hit"><td class="line">200</td><td class="hits">362</td><td class="source"> if (this.parent) {</td></tr><tr class="hit"><td class="line">201</td><td class="hits">326</td><td class="source"> delete this.parent;</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">203</td><td class="hits">362</td><td class="source"> this._resources = value;</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source">};</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">1</td><td class="source">module.exports = Context;</td></tr><tr><td class="line">208</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/fileUtil.js">/Users/kpdecker/dev/walmart/lumbar/lib/fileUtil.js</h2><div id="stats" class="high"><div class="percentage">93%</div><div class="sloc">175</div><div class="hits">164</div><div class="misses">11</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> EventEmitter = require('events').EventEmitter,</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> fs = require('fs'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> handlebars = require('handlebars'),</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> resources = require('./util/resources');</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">const EMFILE_RETRY = 250;</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source">var fileCache = {};</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">1</td><td class="source">exports = module.exports = new EventEmitter();</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source">function cacheRead(path, exec, callback) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">352</td><td class="source"> path = exports.resolvePath(path);</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">352</td><td class="source"> var cache = fileCache[path];</td></tr><tr class="hit"><td class="line">18</td><td class="hits">352</td><td class="source"> if (cache) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">192</td><td class="source"> if (cache.data) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">99</td><td class="source"> callback(undefined, cache);</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">22</td><td class="hits">93</td><td class="source"> cache.pending.push(callback);</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">192</td><td class="source"> return;</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 class="hit"><td class="line">27</td><td class="hits">160</td><td class="source"> cache = fileCache[path] = {</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> pending: [callback],</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> artifacts: {}</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> };</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">160</td><td class="source"> exec(path, function _callback(err, data) {</td></tr><tr class="hit"><td class="line">33</td><td class="hits">160</td><td class="source"> if (err && err.code === 'EMFILE') {</td></tr><tr class="miss"><td class="line">34</td><td class="hits">0</td><td class="source"> setTimeout(exec.bind(this, path, _callback), EMFILE_RETRY);</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">160</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">37</td><td class="hits">2</td><td class="source"> delete fileCache[path];</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"> </td></tr><tr class="hit"><td class="line">40</td><td class="hits">160</td><td class="source"> cache.data = data;</td></tr><tr class="hit"><td class="line">41</td><td class="hits">160</td><td class="source"> cache.pending.forEach(function(callback) {</td></tr><tr class="hit"><td class="line">42</td><td class="hits">253</td><td class="source"> callback(err, cache);</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">44</td><td class="hits">160</td><td class="source"> exports.emit('cache:set', path);</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 class="hit"><td class="line">49</td><td class="hits">1</td><td class="source">exports.resetCache = function(filePath) {</td></tr><tr class="hit"><td class="line">50</td><td class="hits">259</td><td class="source"> filePath = filePath && path.normalize(filePath);</td></tr><tr class="hit"><td class="line">51</td><td class="hits">259</td><td class="source"> exports.emit('cache:reset', filePath);</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">53</td><td class="hits">259</td><td class="source"> if (filePath) {</td></tr><tr class="hit"><td class="line">54</td><td class="hits">177</td><td class="source"> filePath = exports.resolvePath(filePath);</td></tr><tr class="hit"><td class="line">55</td><td class="hits">177</td><td class="source"> delete fileCache[filePath];</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">57</td><td class="hits">82</td><td class="source"> fileCache = {};</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><td class="line">60</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">61</td><td class="hits">1</td><td class="source">var lookupPath;</td></tr><tr class="hit"><td class="line">62</td><td class="hits">1</td><td class="source">exports.resolvePath = function(pathName) {</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> // Poormans path.resolve. We aren't able to use the bundled path.resolve due to</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> // it throwing sync EMFILE errors without a type to key on.</td></tr><tr class="hit"><td class="line">65</td><td class="hits">1459</td><td class="source"> if (lookupPath</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> && (pathName[0] !== '/' && pathName.indexOf(':/') === -1 && pathName.indexOf(':\\') === -1)</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> && pathName.indexOf(lookupPath) !== 0) {</td></tr><tr class="hit"><td class="line">68</td><td class="hits">974</td><td class="source"> return lookupPath + pathName;</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">70</td><td class="hits">485</td><td class="source"> return pathName;</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">};</td></tr><tr class="hit"><td class="line">73</td><td class="hits">1</td><td class="source">exports.makeRelative = function(pathName) {</td></tr><tr class="hit"><td class="line">74</td><td class="hits">597</td><td class="source"> if (pathName.indexOf(lookupPath) === 0) {</td></tr><tr class="hit"><td class="line">75</td><td class="hits">565</td><td class="source"> return pathName.substring(lookupPath.length);</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">77</td><td class="hits">32</td><td class="source"> return pathName;</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><tr><td class="line">80</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">81</td><td class="hits">1</td><td class="source">exports.lookupPath = function(pathName) {</td></tr><tr class="hit"><td class="line">82</td><td class="hits">156</td><td class="source"> if (pathName !== undefined) {</td></tr><tr class="hit"><td class="line">83</td><td class="hits">94</td><td class="source"> lookupPath = pathName;</td></tr><tr class="hit"><td class="line">84</td><td class="hits">94</td><td class="source"> if (lookupPath && !/\/$/.test(lookupPath)) {</td></tr><tr class="hit"><td class="line">85</td><td class="hits">38</td><td class="source"> lookupPath += '/';</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">88</td><td class="hits">156</td><td class="source"> return lookupPath;</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">91</td><td class="hits">1</td><td class="source">exports.stat = function(file, callback) {</td></tr><tr class="hit"><td class="line">92</td><td class="hits">826</td><td class="source"> fs.stat(file, function(err, stat) {</td></tr><tr class="hit"><td class="line">93</td><td class="hits">826</td><td class="source"> if (err && err.code === 'EMFILE') {</td></tr><tr class="miss"><td class="line">94</td><td class="hits">0</td><td class="source"> setTimeout(exports.stat.bind(exports, file, callback), EMFILE_RETRY);</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">826</td><td class="source"> callback(err, stat);</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"> </td></tr><tr class="hit"><td class="line">101</td><td class="hits">1</td><td class="source">exports.readFileSync = function(file) {</td></tr><tr class="hit"><td class="line">102</td><td class="hits">37</td><td class="source"> return fs.readFileSync(exports.resolvePath(file));</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">1</td><td class="source">exports.readFile = function(file, callback) {</td></tr><tr class="hit"><td class="line">105</td><td class="hits">230</td><td class="source"> cacheRead(file, fs.readFile.bind(fs), function(err, cache) {</td></tr><tr class="hit"><td class="line">106</td><td class="hits">230</td><td class="source"> callback(err, cache && cache.data);</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source">};</td></tr><tr class="hit"><td class="line">109</td><td class="hits">1</td><td class="source">exports.readFileArtifact = function(file, name, callback) {</td></tr><tr class="hit"><td class="line">110</td><td class="hits">61</td><td class="source"> cacheRead(file, fs.readFile.bind(fs), function(err, cache) {</td></tr><tr class="hit"><td class="line">111</td><td class="hits">61</td><td class="source"> var artifacts = cache.artifacts;</td></tr><tr class="hit"><td class="line">112</td><td class="hits">61</td><td class="source"> callback(err, {data: cache.data, artifact: artifacts[name]});</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> });</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">1</td><td class="source">exports.setFileArtifact = function(path, name, artifact) {</td></tr><tr class="hit"><td class="line">116</td><td class="hits">27</td><td class="source"> path = exports.resolvePath(path);</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">118</td><td class="hits">27</td><td class="source"> var cache = fileCache[path];</td></tr><tr class="hit"><td class="line">119</td><td class="hits">27</td><td class="source"> if (cache) {</td></tr><tr class="hit"><td class="line">120</td><td class="hits">27</td><td class="source"> cache.artifacts[name] = artifact;</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 class="hit"><td class="line">124</td><td class="hits">1</td><td class="source">exports.readdir = function(dir, callback) {</td></tr><tr class="hit"><td class="line">125</td><td class="hits">61</td><td class="source"> cacheRead(dir, fs.readdir.bind(fs), function(err, cache) {</td></tr><tr class="hit"><td class="line">126</td><td class="hits">61</td><td class="source"> callback(err, cache && cache.data);</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> });</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"> </td></tr><tr class="hit"><td class="line">130</td><td class="hits">1</td><td class="source">exports.ensureDirs = function(pathname, callback) {</td></tr><tr class="hit"><td class="line">131</td><td class="hits">245</td><td class="source"> var dirname = path.dirname(pathname);</td></tr><tr class="hit"><td class="line">132</td><td class="hits">245</td><td class="source"> exports.stat(dirname, function(err) {</td></tr><tr class="hit"><td class="line">133</td><td class="hits">245</td><td class="source"> if (err && err.code === 'ENOENT') {</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> // If we don't exist, check to see if our parent exists before trying to create ourselves</td></tr><tr class="hit"><td class="line">135</td><td class="hits">42</td><td class="source"> exports.ensureDirs(dirname, function() {</td></tr><tr class="hit"><td class="line">136</td><td class="hits">42</td><td class="source"> fs.mkdir(dirname, parseInt('0755', 8), function _callback(err) {</td></tr><tr class="hit"><td class="line">137</td><td class="hits">42</td><td class="source"> if (err && err.code === 'EMFILE') {</td></tr><tr class="miss"><td class="line">138</td><td class="hits">0</td><td class="source"> setTimeout(fs.mkdir.bind(fs, dirname, parseInt('0755', 8), _callback), EMFILE_RETRY);</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> } else {</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> // Off to the races... and we lost.</td></tr><tr class="hit"><td class="line">141</td><td class="hits">42</td><td class="source"> callback(err && err.code === 'EEXIST' ? undefined : err);</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"> });</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">146</td><td class="hits">203</td><td class="source"> callback();</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> });</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 class="hit"><td class="line">151</td><td class="hits">1</td><td class="source">exports.writeFile = function(file, data, callback) {</td></tr><tr class="hit"><td class="line">152</td><td class="hits">136</td><td class="source"> exports.resetCache(file);</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">154</td><td class="hits">136</td><td class="source"> exports.ensureDirs(file, function(err) {</td></tr><tr class="hit"><td class="line">155</td><td class="hits">136</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">156</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">159</td><td class="hits">136</td><td class="source"> fs.writeFile(file, data, 'utf8', function _callback(err) {</td></tr><tr class="hit"><td class="line">160</td><td class="hits">136</td><td class="source"> if (err && err.code === 'EMFILE') {</td></tr><tr class="miss"><td class="line">161</td><td class="hits">0</td><td class="source"> setTimeout(fs.writeFile.bind(fs, file, data, 'utf8', _callback), EMFILE_RETRY);</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">163</td><td class="hits">136</td><td class="source"> callback(err);</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> }</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"> </td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> * Takes a given input and returns the files that are represented.</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"> * pathname may be:</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> * a resource object</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> * a path on the file system</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> * an array of resources</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">177</td><td class="hits">1</td><td class="source">exports.fileList = function(pathname, extension, callback, dirList, resource, srcDir) {</td></tr><tr class="hit"><td class="line">178</td><td class="hits">886</td><td class="source"> if (_.isFunction(extension)) {</td></tr><tr class="hit"><td class="line">179</td><td class="hits">5</td><td class="source"> callback = extension;</td></tr><tr class="hit"><td class="line">180</td><td class="hits">5</td><td class="source"> extension = /.*/;</td></tr><tr><td class="line">181</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">183</td><td class="hits">886</td><td class="source"> if (_.isArray(pathname)) {</td></tr><tr class="hit"><td class="line">184</td><td class="hits">307</td><td class="source"> var files = pathname;</td></tr><tr class="hit"><td class="line">185</td><td class="hits">307</td><td class="source"> pathname = '';</td></tr><tr class="hit"><td class="line">186</td><td class="hits">307</td><td class="source"> if (!files.length) {</td></tr><tr class="hit"><td class="line">187</td><td class="hits">123</td><td class="source"> return callback(undefined, []);</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">189</td><td class="hits">184</td><td class="source"> return handleFiles(false, undefined, _.uniq(files));</td></tr><tr class="hit"><td class="line">190</td><td class="hits">579</td><td class="source"> } else if (!dirList) {</td></tr><tr class="hit"><td class="line">191</td><td class="hits">418</td><td class="source"> if (pathname.src) {</td></tr><tr class="miss"><td class="line">192</td><td class="hits">0</td><td class="source"> resource = resource || pathname;</td></tr><tr class="miss"><td class="line">193</td><td class="hits">0</td><td class="source"> pathname = pathname.src;</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">195</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">196</td><td class="hits">418</td><td class="source"> pathname = exports.resolvePath(pathname);</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">579</td><td class="source"> if (resource && resource.src) {</td></tr><tr class="hit"><td class="line">199</td><td class="hits">193</td><td class="source"> resource = _.clone(resource);</td></tr><tr class="hit"><td class="line">200</td><td class="hits">193</td><td class="source"> delete resource.src;</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">203</td><td class="hits">579</td><td class="source"> function handleFiles(dirname, err, files, srcDir) {</td></tr><tr class="hit"><td class="line">204</td><td class="hits">242</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">205</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">206</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">207</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">208</td><td class="hits">242</td><td class="source"> var ret = [],</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source"> count = 0,</td></tr><tr><td class="line">210</td><td class="hits"></td><td class="source"> expected = files.length,</td></tr><tr><td class="line">211</td><td class="hits"></td><td class="source"> prefix = pathname ? pathname.replace(/\/$/, '') + '/' : '';</td></tr><tr><td class="line">212</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">213</td><td class="hits">242</td><td class="source"> function complete(files, index) {</td></tr><tr class="hit"><td class="line">214</td><td class="hits">614</td><td class="source"> count++;</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">216</td><td class="hits">614</td><td class="source"> ret[index] = files;</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">218</td><td class="hits">614</td><td class="source"> if (count === expected) {</td></tr><tr class="hit"><td class="line">219</td><td class="hits">241</td><td class="source"> ret = _.flatten(ret);</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">221</td><td class="hits">241</td><td class="source"> if (srcDir) {</td></tr><tr class="hit"><td class="line">222</td><td class="hits">57</td><td class="source"> ret = ret.map(function(file) {</td></tr><tr class="hit"><td class="line">223</td><td class="hits">124</td><td class="source"> file = resources.cast(file);</td></tr><tr class="hit"><td class="line">224</td><td class="hits">124</td><td class="source"> file.srcDir = srcDir;</td></tr><tr class="hit"><td class="line">225</td><td class="hits">124</td><td class="source"> return file;</td></tr><tr><td class="line">226</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">228</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">229</td><td class="hits">241</td><td class="source"> if (dirname) {</td></tr><tr class="hit"><td class="line">230</td><td class="hits">57</td><td class="source"> ret.push(_.defaults({dir: dirname}, resource));</td></tr><tr class="hit"><td class="line">231</td><td class="hits">57</td><td class="source"> ret = ret.sort(function(a, b) {</td></tr><tr class="hit"><td class="line">232</td><td class="hits">241</td><td class="source"> return resources.source(a).localeCompare(resources.source(b));</td></tr><tr><td class="line">233</td><td class="hits"></td><td class="source"> });</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 class="hit"><td class="line">236</td><td class="hits">241</td><td class="source"> callback(undefined, ret);</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"> }</td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">240</td><td class="hits">242</td><td class="source"> if (!files.length) {</td></tr><tr class="hit"><td class="line">241</td><td class="hits">1</td><td class="source"> callback(undefined, []);</td></tr><tr><td class="line">242</td><td class="hits"></td><td class="source"> }</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">242</td><td class="source"> files.forEach(function(file, index) {</td></tr><tr class="hit"><td class="line">245</td><td class="hits">614</td><td class="source"> var fileResource = resource;</td></tr><tr class="hit"><td class="line">246</td><td class="hits">614</td><td class="source"> if (file.src) {</td></tr><tr class="hit"><td class="line">247</td><td class="hits">193</td><td class="source"> fileResource = resource || file;</td></tr><tr class="hit"><td class="line">248</td><td class="hits">193</td><td class="source"> file = file.src;</td></tr><tr class="hit"><td class="line">249</td><td class="hits">421</td><td class="source"> } else if (_.isObject(file)) {</td></tr><tr class="hit"><td class="line">250</td><td class="hits">64</td><td class="source"> complete(file, index);</td></tr><tr class="hit"><td class="line">251</td><td class="hits">64</td><td class="source"> return;</td></tr><tr><td class="line">252</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">253</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">254</td><td class="hits">550</td><td class="source"> exports.fileList(prefix + file, extension, function(err, files) {</td></tr><tr class="hit"><td class="line">255</td><td class="hits">550</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">256</td><td class="hits">0</td><td class="source"> callback(err);</td></tr><tr class="miss"><td class="line">257</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">258</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">259</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">260</td><td class="hits">550</td><td class="source"> complete(files, index);</td></tr><tr><td class="line">261</td><td class="hits"></td><td class="source"> }, dirname, fileResource, srcDir);</td></tr><tr><td class="line">262</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">263</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">264</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">265</td><td class="hits">579</td><td class="source"> exports.stat(pathname, function(err, stat) {</td></tr><tr class="hit"><td class="line">266</td><td class="hits">579</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">267</td><td class="hits">69</td><td class="source"> if (err.code === 'ENOENT') {</td></tr><tr class="hit"><td class="line">268</td><td class="hits">69</td><td class="source"> callback(undefined, [ _.extend({src: exports.makeRelative(pathname), enoent: true}, resource) ]);</td></tr><tr><td class="line">269</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">270</td><td class="hits">0</td><td class="source"> callback(err);</td></tr><tr><td class="line">271</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">272</td><td class="hits">69</td><td class="source"> return;</td></tr><tr><td class="line">273</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">274</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">275</td><td class="hits">510</td><td class="source"> if (stat.isDirectory()) {</td></tr><tr class="hit"><td class="line">276</td><td class="hits">58</td><td class="source"> exports.readdir(pathname, function(err, files) {</td></tr><tr class="hit"><td class="line">277</td><td class="hits">58</td><td class="source"> var _pathname = exports.makeRelative(pathname);</td></tr><tr class="hit"><td class="line">278</td><td class="hits">58</td><td class="source"> handleFiles(_pathname, undefined, files, srcDir || _pathname);</td></tr><tr><td class="line">279</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">280</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">281</td><td class="hits">452</td><td class="source"> pathname = exports.makeRelative(pathname);</td></tr><tr><td class="line">282</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">283</td><td class="hits">452</td><td class="source"> var basename = path.basename(pathname),</td></tr><tr><td class="line">284</td><td class="hits"></td><td class="source"> namePasses = basename[0] !== '.' && basename !== 'vendor' && (!dirList || extension.test(pathname)),</td></tr><tr><td class="line">285</td><td class="hits"></td><td class="source"> ret = [];</td></tr><tr class="hit"><td class="line">286</td><td class="hits">452</td><td class="source"> if (namePasses) {</td></tr><tr class="hit"><td class="line">287</td><td class="hits">394</td><td class="source"> if (resource) {</td></tr><tr class="hit"><td class="line">288</td><td class="hits">170</td><td class="source"> ret = [ _.defaults({src: pathname, srcDir: srcDir}, resource) ];</td></tr><tr class="hit"><td class="line">289</td><td class="hits">224</td><td class="source"> } else if (srcDir) {</td></tr><tr class="hit"><td class="line">290</td><td class="hits">71</td><td class="source"> ret = [ { src: pathname, srcDir: srcDir } ];</td></tr><tr><td class="line">291</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">292</td><td class="hits">153</td><td class="source"> ret = [ pathname ];</td></tr><tr><td class="line">293</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">294</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">295</td><td class="hits">452</td><td class="source"> callback(undefined, ret);</td></tr><tr><td class="line">296</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">297</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">298</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">299</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">300</td><td class="hits"></td><td class="source">//accepts a template string or a filename ending in .handlebars</td></tr><tr class="hit"><td class="line">301</td><td class="hits">1</td><td class="source">exports.loadTemplate = function(template, splitOnDelimiter, callback) {</td></tr><tr class="hit"><td class="line">302</td><td class="hits">44</td><td class="source"> function compile(templateStr, callback) {</td></tr><tr class="hit"><td class="line">303</td><td class="hits">33</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">304</td><td class="hits">33</td><td class="source"> if (splitOnDelimiter) {</td></tr><tr class="hit"><td class="line">305</td><td class="hits">20</td><td class="source"> callback(null, templateStr.split(splitOnDelimiter).map(function(bit) {</td></tr><tr class="hit"><td class="line">306</td><td class="hits">40</td><td class="source"> return handlebars.compile(bit);</td></tr><tr><td class="line">307</td><td class="hits"></td><td class="source"> }));</td></tr><tr><td class="line">308</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">309</td><td class="hits">13</td><td class="source"> callback(null, handlebars.compile(templateStr));</td></tr><tr><td class="line">310</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">311</td><td class="hits"></td><td class="source"> } catch (e) {</td></tr><tr class="hit"><td class="line">312</td><td class="hits">1</td><td class="source"> callback(e);</td></tr><tr><td class="line">313</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">314</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">315</td><td class="hits">44</td><td class="source"> if (template.match(/\.handlebars$/)) {</td></tr><tr class="hit"><td class="line">316</td><td class="hits">19</td><td class="source"> exports.readFileArtifact(template, 'template', function(err, data) {</td></tr><tr class="hit"><td class="line">317</td><td class="hits">19</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">318</td><td class="hits">1</td><td class="source"> return callback(err);</td></tr><tr><td class="line">319</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">320</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">321</td><td class="hits">18</td><td class="source"> if (data.artifact) {</td></tr><tr class="hit"><td class="line">322</td><td class="hits">10</td><td class="source"> callback(undefined, data.artifact);</td></tr><tr><td class="line">323</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">324</td><td class="hits">8</td><td class="source"> compile(data.data.toString(), function(err, data) {</td></tr><tr class="hit"><td class="line">325</td><td class="hits">8</td><td class="source"> if (!err) {</td></tr><tr class="hit"><td class="line">326</td><td class="hits">8</td><td class="source"> exports.setFileArtifact(template, 'template', data);</td></tr><tr><td class="line">327</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">328</td><td class="hits">8</td><td class="source"> callback(err, data);</td></tr><tr><td class="line">329</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">330</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">331</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">332</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">333</td><td class="hits">25</td><td class="source"> compile(template, callback);</td></tr><tr><td class="line">334</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">335</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">336</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/jsCombine.js">/Users/kpdecker/dev/walmart/lumbar/lib/jsCombine.js</h2><div id="stats" class="medium"><div class="percentage">62%</div><div class="sloc">64</div><div class="hits">40</div><div class="misses">24</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> FileMap = require('./util/file-map'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> fu = require('./fileUtil'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> ChildPool = require('child-pool');</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 uglify = new ChildPool(__dirname + '/uglify-worker', {logId: 'uglify-worker'});</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">1</td><td class="source">exports.combine = function(context, files, output, minimize, noSeparator, callback) {</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">112</td><td class="source"> function outputIfCompleted() {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">372</td><td class="source"> if (completed >= files.length) {</td></tr><tr class="hit"><td class="line">13</td><td class="hits">109</td><td class="source"> var lastEl,</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> map = new FileMap(output),</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> warnings = [],</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> tasks = [];</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">109</td><td class="source"> _.each(content, function(el) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">372</td><td class="source"> var content = el.content.toString();</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">372</td><td class="source"> if (!noSeparator && (!lastEl || !lastEl.noSeparator) && map.content()) {</td></tr><tr class="hit"><td class="line">23</td><td class="hits">114</td><td class="source"> map.add(undefined, '\n;;\n');</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 class="hit"><td class="line">26</td><td class="hits">372</td><td class="source"> map.add(el.name, content, el, el.generated);</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">28</td><td class="hits">372</td><td class="source"> lastEl = el;</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"> </td></tr><tr class="hit"><td class="line">31</td><td class="hits">109</td><td class="source"> var inputs = [];</td></tr><tr class="hit"><td class="line">32</td><td class="hits">109</td><td class="source"> content.forEach(function(el) {</td></tr><tr class="hit"><td class="line">33</td><td class="hits">372</td><td class="source"> if (el.inputs) {</td></tr><tr class="hit"><td class="line">34</td><td class="hits">96</td><td class="source"> inputs.push.apply(inputs, el.inputs);</td></tr><tr class="hit"><td class="line">35</td><td class="hits">276</td><td class="source"> } else if (el.name) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">178</td><td class="source"> inputs.push(el.name);</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> }</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">109</td><td class="source"> inputs = _.unique(inputs);</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> // "Serialize" the data in the map</td></tr><tr class="hit"><td class="line">42</td><td class="hits">109</td><td class="source"> tasks.push(function(callback) {</td></tr><tr class="hit"><td class="line">43</td><td class="hits">109</td><td class="source"> callback(undefined, map.content());</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"> // Minimize the content if flagged</td></tr><tr class="hit"><td class="line">47</td><td class="hits">109</td><td class="source"> if (minimize) {</td></tr><tr class="miss"><td class="line">48</td><td class="hits">0</td><td class="source"> var uglifyConfig = context.config.attributes.uglify || {};</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> </td></tr><tr class="miss"><td class="line">50</td><td class="hits">0</td><td class="source"> tasks.push(function(data, callback) {</td></tr><tr class="miss"><td class="line">51</td><td class="hits">0</td><td class="source"> uglify.send({</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> output: output,</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> data: data,</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> compressorOptions: uglifyConfig.compressor,</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> manglerOptions: uglifyConfig.mangler,</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> outputOptions: uglifyConfig.output,</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> sourceMap: context.options.sourceMap ? map.sourceMap() : undefined</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"> function(err, data) {</td></tr><tr class="miss"><td class="line">60</td><td class="hits">0</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">61</td><td class="hits">0</td><td class="source"> return callback(err);</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 class="miss"><td class="line">64</td><td class="hits">0</td><td class="source"> _.each(data.warnings, function(msg) {</td></tr><tr class="miss"><td class="line">65</td><td class="hits">0</td><td class="source"> var match = /(.*?)\s*\[.*:(\d+),(\d+)/.exec(msg);</td></tr><tr class="miss"><td class="line">66</td><td class="hits">0</td><td class="source"> if (match) {</td></tr><tr class="miss"><td class="line">67</td><td class="hits">0</td><td class="source"> var msg = match[1],</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> line = parseInt(match[2], 10),</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> column = match[3],</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> context = map.context(line, column);</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> </td></tr><tr class="miss"><td class="line">72</td><td class="hits">0</td><td class="source"> if (context && (!context.fileContext || !context.fileContext.ignoreWarnings)) {</td></tr><tr class="miss"><td class="line">73</td><td class="hits">0</td><td class="source"> context.msg = msg;</td></tr><tr class="miss"><td class="line">74</td><td class="hits">0</td><td class="source"> warnings.push(context);</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">77</td><td class="hits">0</td><td class="source"> warnings.push({msg: msg});</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><tr><td class="line">80</td><td class="hits"></td><td class="source"> </td></tr><tr class="miss"><td class="line">81</td><td class="hits">0</td><td class="source"> if (data.sourceMap) {</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> // Remap the sourcemap output for the point that it is actually used for output</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> // We need to restore the source map here as uglify will remove the original</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> // Declaration</td></tr><tr class="miss"><td class="line">85</td><td class="hits">0</td><td class="source"> map.sourceMap = function() { return data.sourceMap; };</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> </td></tr><tr class="miss"><td class="line">88</td><td class="hits">0</td><td class="source"> callback(err, data.data);</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> });</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"> }</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> // Output the source map if requested</td></tr><tr class="hit"><td class="line">94</td><td class="hits">109</td><td class="source"> var sourceMap = context.options.sourceMap;</td></tr><tr class="hit"><td class="line">95</td><td class="hits">109</td><td class="source"> if (sourceMap) {</td></tr><tr class="miss"><td class="line">96</td><td class="hits">0</td><td class="source"> var inlineSourceMap = sourceMap === true;</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> </td></tr><tr class="miss"><td class="line">98</td><td class="hits">0</td><td class="source"> tasks.push(function(data, callback) {</td></tr><tr class="miss"><td class="line">99</td><td class="hits">0</td><td class="source"> map.writeSourceMap({</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> mapDestination: !inlineSourceMap && (sourceMap + '/' + context.buildPath),</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> outputSource: inlineSourceMap,</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> callback: function(err) {</td></tr><tr class="miss"><td class="line">103</td><td class="hits">0</td><td class="source"> if (inlineSourceMap) {</td></tr><tr class="miss"><td class="line">104</td><td class="hits">0</td><td class="source"> data += '\n' + map.sourceMapToken();</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">106</td><td class="hits">0</td><td class="source"> callback(err, data);</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> });</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"> // Output step</td></tr><tr class="hit"><td class="line">113</td><td class="hits">109</td><td class="source"> tasks.push(function(data, callback) {</td></tr><tr class="hit"><td class="line">114</td><td class="hits">109</td><td class="source"> fu.writeFile(output, data, callback);</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"> </td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> // Excute everything and return to the caller</td></tr><tr class="hit"><td class="line">118</td><td class="hits">109</td><td class="source"> async.waterfall(tasks, function(err) {</td></tr><tr class="hit"><td class="line">119</td><td class="hits">109</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">120</td><td class="hits">0</td><td class="source"> callback(new Error('Combined output "' + output + '" failed\n\t' + err));</td></tr><tr class="miss"><td class="line">121</td><td class="hits">0</td><td class="source"> return;</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 class="hit"><td class="line">124</td><td class="hits">109</td><td class="source"> callback(undefined, {</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> fileName: output,</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> inputs: inputs,</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> warnings: warnings</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"> });</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">132</td><td class="hits">112</td><td class="source"> var completed = 0,</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> content = [];</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">135</td><td class="hits">112</td><td class="source"> files.forEach(function(resource) {</td></tr><tr class="hit"><td class="line">136</td><td class="hits">375</td><td class="source"> var fileInfo = context.loadResource(resource, function(err) {</td></tr><tr class="hit"><td class="line">137</td><td class="hits">375</td><td class="source"> if (err && callback) {</td></tr><tr class="hit"><td class="line">138</td><td class="hits">3</td><td class="source"> callback(err);</td></tr><tr class="hit"><td class="line">139</td><td class="hits">3</td><td class="source"> callback = undefined;</td></tr><tr class="hit"><td class="line">140</td><td class="hits">3</td><td class="source"> return;</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 class="hit"><td class="line">143</td><td class="hits">372</td><td class="source"> if (callback) {</td></tr><tr class="hit"><td class="line">144</td><td class="hits">372</td><td class="source"> completed++;</td></tr><tr class="hit"><td class="line">145</td><td class="hits">372</td><td class="source"> outputIfCompleted();</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> }</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">375</td><td class="source"> content.push(fileInfo);</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></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/libraries.js">/Users/kpdecker/dev/walmart/lumbar/lib/libraries.js</h2><div id="stats" class="high"><div class="percentage">94%</div><div class="sloc">168</div><div class="hits">158</div><div class="misses">10</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> bower = require('bower'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> config = require('./config'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> fs = require('fs'),</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> fu = require('./fileUtil'),</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> resources = require('./util/resources');</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source">function Libraries(options) {</td></tr><tr class="hit"><td class="line">11</td><td class="hits">152</td><td class="source"> this.options = options;</td></tr><tr class="hit"><td class="line">12</td><td class="hits">152</td><td class="source"> this.mixins = [];</td></tr><tr class="hit"><td class="line">13</td><td class="hits">152</td><td class="source"> this.configs = [];</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">Libraries.prototype.initialize = function(context, callback) {</td></tr><tr class="hit"><td class="line">17</td><td class="hits">149</td><td class="source"> this.mixins = [];</td></tr><tr class="hit"><td class="line">18</td><td class="hits">149</td><td class="source"> this.originalConfig = _.clone(context.config.attributes);</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">149</td><td class="source"> function normalize(libraries) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">298</td><td class="source"> if (_.isString(libraries)) {</td></tr><tr class="hit"><td class="line">22</td><td class="hits">2</td><td class="source"> return [libraries];</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">24</td><td class="hits">296</td><td class="source"> return _.map(libraries, function (name) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">83</td><td class="source"> if (_.isString(name)) {</td></tr><tr class="hit"><td class="line">26</td><td class="hits">11</td><td class="source"> return path.normalize(name);</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">28</td><td class="hits">72</td><td class="source"> return name;</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"> });</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"> </td></tr><tr class="hit"><td class="line">34</td><td class="hits">149</td><td class="source"> var commandLineLibraries = normalize(this.options.libraries || []),</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> configLibraries = normalize(context.config.attributes.libraries || context.config.attributes.mixins || []),</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> bowerLibraries = this.bowerLibraries(context) || [],</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> allLibraries = _.union(commandLineLibraries, configLibraries, bowerLibraries);</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">149</td><td class="source"> delete context.config.attributes.mixins;</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">42</td><td class="hits">149</td><td class="source"> async.forEachSeries(allLibraries, _.bind(this.load, this, context), callback);</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><tr class="hit"><td class="line">45</td><td class="hits">1</td><td class="source">Libraries.prototype.bowerLibraries = function(context) {</td></tr><tr class="hit"><td class="line">46</td><td class="hits">150</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">150</td><td class="source"> fs.statSync(fu.resolvePath('bower.json'));</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">49</td><td class="hits">2</td><td class="source"> var bowerDir = bower.config.directory,</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> possibleModules = fs.readdirSync(bowerDir);</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">52</td><td class="hits">1</td><td class="source"> return possibleModules</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> .map(function(name) {</td></tr><tr class="hit"><td class="line">54</td><td class="hits">3</td><td class="source"> return path.normalize(path.join(bowerDir, name));</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"> .filter(function(name) {</td></tr><tr class="hit"><td class="line">57</td><td class="hits">3</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">3</td><td class="source"> fs.statSync(path.join(name, 'lumbar.json'));</td></tr><tr class="hit"><td class="line">59</td><td class="hits">2</td><td class="source"> return true;</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> /* NOP */</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"> } catch (err) {</td></tr><tr class="hit"><td class="line">65</td><td class="hits">149</td><td class="source"> context.event.emit('debug', err);</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">};</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">69</td><td class="hits">1</td><td class="source">Libraries.prototype.load = function(context, libraryConfig, callback) {</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> // Allow mixins to be passed directly</td></tr><tr class="hit"><td class="line">71</td><td class="hits">88</td><td class="source"> var root = libraryConfig.root,</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> configPath,</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> self = this;</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"> // Or as a file reference</td></tr><tr class="hit"><td class="line">76</td><td class="hits">88</td><td class="source"> if (!_.isObject(libraryConfig)) {</td></tr><tr class="hit"><td class="line">77</td><td class="hits">8</td><td class="source"> root = root || libraryConfig;</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"> // If we have a dir then pull lumbar.json from that</td></tr><tr class="hit"><td class="line">80</td><td class="hits">8</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">81</td><td class="hits">8</td><td class="source"> var stat = fs.statSync(fu.resolvePath(libraryConfig));</td></tr><tr class="hit"><td class="line">82</td><td class="hits">8</td><td class="source"> if (stat.isDirectory()) {</td></tr><tr class="hit"><td class="line">83</td><td class="hits">3</td><td class="source"> libraryConfig = libraryConfig + '/lumbar.json';</td></tr><tr class="hit"><td class="line">84</td><td class="hits">5</td><td class="source"> } else if (root === libraryConfig) {</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> // If we are a file the root should be the file's directory unless explicitly passed</td></tr><tr class="hit"><td class="line">86</td><td class="hits">5</td><td class="source"> root = path.dirname(root);</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr class="miss"><td class="line">89</td><td class="hits">0</td><td class="source"> return callback(err);</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"> </td></tr><tr class="hit"><td class="line">92</td><td class="hits">8</td><td class="source"> configPath = fu.resolvePath(libraryConfig);</td></tr><tr class="hit"><td class="line">93</td><td class="hits">8</td><td class="source"> libraryConfig = config.readConfig(configPath);</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> // To make things easy force root to be a dir</td></tr><tr class="hit"><td class="line">97</td><td class="hits">88</td><td class="source"> if (root && !/\/$/.test(root)) {</td></tr><tr class="hit"><td class="line">98</td><td class="hits">29</td><td class="source"> root = root + '/';</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"> </td></tr><tr class="hit"><td class="line">101</td><td class="hits">88</td><td class="source"> if (!libraryConfig.name) {</td></tr><tr class="hit"><td class="line">102</td><td class="hits">4</td><td class="source"> return callback(new Error('Mixin with root "' + root + '" is missing a name.'));</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">105</td><td class="hits">84</td><td class="source"> var mixins = libraryConfig.mixins,</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> toRegister = {};</td></tr><tr class="hit"><td class="line">107</td><td class="hits">84</td><td class="source"> delete libraryConfig.mixins;</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">109</td><td class="hits">84</td><td class="source"> function mapMixin(mixin, name) {</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> // Only register once, giving priority to an explicitly defined mixin</td></tr><tr class="hit"><td class="line">111</td><td class="hits">64</td><td class="source"> if (!toRegister[name]) {</td></tr><tr class="hit"><td class="line">112</td><td class="hits">63</td><td class="source"> toRegister[name] = {</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> serialize: function() {</td></tr><tr class="miss"><td class="line">114</td><td class="hits">0</td><td class="source"> return {name: this.name, library: this.parent.name};</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"> name: name,</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> attributes: mixin,</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> parent: libraryConfig,</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> root: root</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"> </td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> // Read each of the mixins that are defined in the config</td></tr><tr class="hit"><td class="line">125</td><td class="hits">84</td><td class="source"> _.each(mixins, mapMixin, this);</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> // Make mixin modules accessible as normal mixins as well</td></tr><tr class="hit"><td class="line">128</td><td class="hits">84</td><td class="source"> _.each(libraryConfig.modules, mapMixin, this);</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> // After we've pulled everything in register</td></tr><tr class="hit"><td class="line">131</td><td class="hits">84</td><td class="source"> _.each(toRegister, function(mixin, name) {</td></tr><tr class="hit"><td class="line">132</td><td class="hits">63</td><td class="source"> this.mixins[name] = this.mixins[name] || [];</td></tr><tr class="hit"><td class="line">133</td><td class="hits">63</td><td class="source"> var list = this.mixins[name];</td></tr><tr class="hit"><td class="line">134</td><td class="hits">63</td><td class="source"> list.push(mixin);</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> }, this);</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"> // Run all of the plugins that are concerned with this.</td></tr><tr class="hit"><td class="line">138</td><td class="hits">84</td><td class="source"> libraryConfig.root = root;</td></tr><tr class="hit"><td class="line">139</td><td class="hits">84</td><td class="source"> libraryConfig.path = configPath;</td></tr><tr class="hit"><td class="line">140</td><td class="hits">84</td><td class="source"> context.loadedLibrary = libraryConfig;</td></tr><tr class="hit"><td class="line">141</td><td class="hits">84</td><td class="source"> context.plugins.loadMixin(context, function(err) {</td></tr><tr class="hit"><td class="line">142</td><td class="hits">84</td><td class="source"> delete libraryConfig.root;</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> // And then splat everything else into our config</td></tr><tr class="hit"><td class="line">145</td><td class="hits">84</td><td class="source"> _.defaults(context.config.attributes, _.omit(context.loadedLibrary, 'name', 'path'));</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">147</td><td class="hits">84</td><td class="source"> libraryConfig.serialize = function() {</td></tr><tr class="miss"><td class="line">148</td><td class="hits">0</td><td class="source"> return { library: this.name };</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 class="hit"><td class="line">151</td><td class="hits">84</td><td class="source"> libraryConfig.root = root;</td></tr><tr class="hit"><td class="line">152</td><td class="hits">84</td><td class="source"> self.configs.push(libraryConfig);</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">154</td><td class="hits">84</td><td class="source"> callback(err);</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"> </td></tr><tr class="hit"><td class="line">158</td><td class="hits">1</td><td class="source">Libraries.prototype.findDecl = function(mixins, mixinName) {</td></tr><tr class="hit"><td class="line">159</td><td class="hits">22</td><td class="source"> if (!mixinName.name) {</td></tr><tr class="hit"><td class="line">160</td><td class="hits">2</td><td class="source"> mixinName = {name: mixinName};</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"> </td></tr><tr class="hit"><td class="line">163</td><td class="hits">22</td><td class="source"> return _.find(mixins, function(mixinDecl) {</td></tr><tr class="hit"><td class="line">164</td><td class="hits">26</td><td class="source"> return (mixinDecl.name || mixinDecl) === mixinName.name</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> && (!mixinDecl.library || mixinDecl.library === mixinName.library);</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"> </td></tr><tr class="hit"><td class="line">169</td><td class="hits">1</td><td class="source">Libraries.prototype.moduleMixins = function(module) {</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> // Perform any nested mixin lookup</td></tr><tr class="hit"><td class="line">171</td><td class="hits">330</td><td class="source"> var mixins = _.clone(module.mixins || []),</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> processed = {};</td></tr><tr class="hit"><td class="line">173</td><td class="hits">330</td><td class="source"> for (var i = 0; i < mixins.length; i++) {</td></tr><tr class="hit"><td class="line">174</td><td class="hits">120</td><td class="source"> var firstInclude = mixins[i],</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> mixinConfig = firstInclude.name && firstInclude,</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> mixin = this.getMixin(firstInclude),</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> added = [i, 0];</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"> // Save a config object off for propagation to included mixins</td></tr><tr class="hit"><td class="line">180</td><td class="hits">118</td><td class="source"> if (mixinConfig) {</td></tr><tr class="hit"><td class="line">181</td><td class="hits">52</td><td class="source"> mixinConfig = _.omit(mixinConfig, 'overrides', 'name', 'library');</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"> </td></tr><tr class="hit"><td class="line">184</td><td class="hits">118</td><td class="source"> if (!mixin) {</td></tr><tr class="miss"><td class="line">185</td><td class="hits">0</td><td class="source"> throw new Error('Unable to find mixin "' + ((firstInclude && firstInclude.name) || firstInclude) + '"');</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> // Check if we need to include any modules that this defined</td></tr><tr class="hit"><td class="line">189</td><td class="hits">118</td><td class="source"> var processedName = mixin.name + '_' + (mixin.parent && mixin.parent.name);</td></tr><tr class="hit"><td class="line">190</td><td class="hits">118</td><td class="source"> if (!processed[processedName]) {</td></tr><tr class="hit"><td class="line">191</td><td class="hits">96</td><td class="source"> processed[processedName] = true;</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">193</td><td class="hits">96</td><td class="source"> _.each(mixin.attributes.mixins, function(mixinInclude) {</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> // Apply any attributes that were applied to the mixin config here</td></tr><tr class="hit"><td class="line">195</td><td class="hits">22</td><td class="source"> if (mixinConfig) {</td></tr><tr class="hit"><td class="line">196</td><td class="hits">8</td><td class="source"> mixinInclude = mixinInclude.name ? _.clone(mixinInclude) : {name: mixinInclude};</td></tr><tr class="hit"><td class="line">197</td><td class="hits">8</td><td class="source"> _.extend(mixinInclude, mixinConfig);</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> // Save the library that caused the include so we can lookup the root and reverse</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> // any overrides in the future.</td></tr><tr class="hit"><td class="line">202</td><td class="hits">22</td><td class="source"> if (firstInclude.overrides) {</td></tr><tr class="hit"><td class="line">203</td><td class="hits">4</td><td class="source"> mixinInclude.overrideLibrary = _.extend({root: mixin.parent.root}, firstInclude);</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">205</td><td class="hits">18</td><td class="source"> mixinInclude.overrideLibrary = mixin.parent;</td></tr><tr><td class="line">206</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">207</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">208</td><td class="hits">22</td><td class="source"> if (!this.findDecl(mixins, mixinInclude)) {</td></tr><tr class="hit"><td class="line">209</td><td class="hits">22</td><td class="source"> added.push(mixinInclude);</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"> }, this);</td></tr><tr><td class="line">212</td><td class="hits"></td><td class="source"> }</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"> // If we've found any new mixins insert them at the current spot and iterate</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> // over those items</td></tr><tr class="hit"><td class="line">216</td><td class="hits">118</td><td class="source"> if (added.length > 2) {</td></tr><tr class="hit"><td class="line">217</td><td class="hits">22</td><td class="source"> mixins.splice.apply(mixins, added);</td></tr><tr class="hit"><td class="line">218</td><td class="hits">22</td><td class="source"> i--;</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"> }</td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">222</td><td class="hits"></td><td class="source"> // Extend the module with each of the mixins content, giving priority to the module</td></tr><tr class="hit"><td class="line">223</td><td class="hits">328</td><td class="source"> return _.map(mixins.reverse(), function(mixin) {</td></tr><tr class="hit"><td class="line">224</td><td class="hits">96</td><td class="source"> var mixinConfig = mixin.name && mixin,</td></tr><tr><td class="line">225</td><td class="hits"></td><td class="source"> name = mixin;</td></tr><tr class="hit"><td class="line">226</td><td class="hits">96</td><td class="source"> if (mixinConfig) {</td></tr><tr class="hit"><td class="line">227</td><td class="hits">44</td><td class="source"> mixinConfig = _.clone(mixinConfig);</td></tr><tr class="hit"><td class="line">228</td><td class="hits">44</td><td class="source"> delete mixinConfig.library;</td></tr><tr class="hit"><td class="line">229</td><td class="hits">44</td><td class="source"> delete mixinConfig.container;</td></tr><tr><td class="line">230</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">231</td><td class="hits">96</td><td class="source"> mixin = _.extend(</td></tr><tr><td class="line">232</td><td class="hits"></td><td class="source"> {},</td></tr><tr><td class="line">233</td><td class="hits"></td><td class="source"> this.getMixin(name),</td></tr><tr><td class="line">234</td><td class="hits"></td><td class="source"> mixinConfig);</td></tr><tr class="hit"><td class="line">235</td><td class="hits">96</td><td class="source"> if (!mixin.attributes) {</td></tr><tr class="miss"><td class="line">236</td><td class="hits">0</td><td class="source"> throw new Error('Mixin "' + (name.name || name) + '" is not defined.');</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"> </td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> // Save a distinct instance of the config for resource extension</td></tr><tr class="hit"><td class="line">240</td><td class="hits">96</td><td class="source"> if (mixinConfig) {</td></tr><tr class="hit"><td class="line">241</td><td class="hits">44</td><td class="source"> mixinConfig = _.clone(mixinConfig);</td></tr><tr class="hit"><td class="line">242</td><td class="hits">44</td><td class="source"> delete mixinConfig.overrides;</td></tr><tr class="hit"><td class="line">243</td><td class="hits">44</td><td class="source"> delete mixinConfig.name;</td></tr><tr><td class="line">244</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">246</td><td class="hits">96</td><td class="source"> return {</td></tr><tr><td class="line">247</td><td class="hits"></td><td class="source"> library: mixin,</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> mixinConfig: mixinConfig</td></tr><tr><td class="line">249</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">250</td><td class="hits"></td><td class="source"> }, this);</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">252</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">253</td><td class="hits">1</td><td class="source">Libraries.prototype.mapFiles = function(value, library, config) {</td></tr><tr class="hit"><td class="line">254</td><td class="hits">182</td><td class="source"> var files = _.map(value, function(resource) {</td></tr><tr class="hit"><td class="line">255</td><td class="hits">280</td><td class="source"> return this.mapFile(resource, library, config);</td></tr><tr><td class="line">256</td><td class="hits"></td><td class="source"> }, this);</td></tr><tr class="hit"><td class="line">257</td><td class="hits">460</td><td class="source"> files = _.filter(files, function(file) { return file; });</td></tr><tr><td class="line">258</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">259</td><td class="hits">181</td><td class="source"> return files;</td></tr><tr><td class="line">260</td><td class="hits"></td><td class="source">};</td></tr><tr class="hit"><td class="line">261</td><td class="hits">1</td><td class="source">Libraries.prototype.mapFile = function(resource, library, config) {</td></tr><tr><td class="line">262</td><td class="hits"></td><td class="source"> // If explicitly declared the resource library takes precedence</td></tr><tr class="hit"><td class="line">263</td><td class="hits">331</td><td class="source"> if (_.isString(resource.library || resource.mixin)) {</td></tr><tr class="hit"><td class="line">264</td><td class="hits">3</td><td class="source"> library = this.getConfig(resource.library || resource.mixin);</td></tr><tr class="hit"><td class="line">265</td><td class="hits">3</td><td class="source"> if (!library) {</td></tr><tr class="hit"><td class="line">266</td><td class="hits">1</td><td class="source"> throw new Error('Mixin "' + (resource.library || resource.mixin) + '" not found');</td></tr><tr><td class="line">267</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">268</td><td class="hits">2</td><td class="source"> delete resource.mixin;</td></tr><tr><td class="line">269</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">270</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">271</td><td class="hits">330</td><td class="source"> return resources.map(resource, library, config);</td></tr><tr><td class="line">272</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">273</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">274</td><td class="hits">1</td><td class="source">Libraries.prototype.mapPathToLibrary = function(src, library) {</td></tr><tr class="hit"><td class="line">275</td><td class="hits">39</td><td class="source"> return resources.pathToLibrary(src, library);</td></tr><tr><td class="line">276</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">277</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">278</td><td class="hits">1</td><td class="source">Libraries.prototype.getMixin = function(name) {</td></tr><tr class="hit"><td class="line">279</td><td class="hits">216</td><td class="source"> var mixins = (this.mixins && this.mixins[name.name || name]) || [],</td></tr><tr><td class="line">280</td><td class="hits"></td><td class="source"> library = name.library || name.container;</td></tr><tr class="hit"><td class="line">281</td><td class="hits">216</td><td class="source"> if (mixins.length > 1 && !library) {</td></tr><tr class="hit"><td class="line">282</td><td class="hits">1</td><td class="source"> throw new Error(</td></tr><tr><td class="line">283</td><td class="hits"></td><td class="source"> 'Duplicate mixins found for "' + (name.name || name) + '"'</td></tr><tr><td class="line">284</td><td class="hits"></td><td class="source"> + _.map(mixins, function(mixin) {</td></tr><tr class="hit"><td class="line">285</td><td class="hits">2</td><td class="source"> return ' parent: "' + mixin.parent.name + '"';</td></tr><tr><td class="line">286</td><td class="hits"></td><td class="source"> }).join(''));</td></tr><tr><td class="line">287</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">288</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">289</td><td class="hits">215</td><td class="source"> if (library) {</td></tr><tr class="hit"><td class="line">290</td><td class="hits">9</td><td class="source"> if (name.name === undefined) {</td></tr><tr class="miss"><td class="line">291</td><td class="hits">0</td><td class="source"> var found = _.find(this.configs, function(config) {</td></tr><tr class="miss"><td class="line">292</td><td class="hits">0</td><td class="source"> return config.name === library;</td></tr><tr><td class="line">293</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">294</td><td class="hits">0</td><td class="source"> if (!found) {</td></tr><tr class="miss"><td class="line">295</td><td class="hits">0</td><td class="source"> throw new Error('Unable to find library "' + library + '"');</td></tr><tr><td class="line">296</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">297</td><td class="hits">0</td><td class="source"> return found;</td></tr><tr><td class="line">298</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">299</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">300</td><td class="hits">9</td><td class="source"> var found = _.find(mixins, function(mixin) {</td></tr><tr class="hit"><td class="line">301</td><td class="hits">17</td><td class="source"> return mixin.parent.name === library;</td></tr><tr><td class="line">302</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">303</td><td class="hits">9</td><td class="source"> if (found) {</td></tr><tr class="hit"><td class="line">304</td><td class="hits">8</td><td class="source"> return found;</td></tr><tr><td class="line">305</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">306</td><td class="hits">1</td><td class="source"> throw new Error('Mixin named "' + name.name + '" not found in library "' + library + '"');</td></tr><tr><td class="line">307</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">308</td><td class="hits">206</td><td class="source"> } else if (mixins.length === 1) {</td></tr><tr class="hit"><td class="line">309</td><td class="hits">206</td><td class="source"> return mixins[0];</td></tr><tr><td class="line">310</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">311</td><td class="hits"></td><td class="source">};</td></tr><tr class="hit"><td class="line">312</td><td class="hits">1</td><td class="source">Libraries.prototype.getConfig = function(name) {</td></tr><tr class="hit"><td class="line">313</td><td class="hits">13</td><td class="source"> return _.find(this.configs, function(config) { return config.name === name; });</td></tr><tr><td class="line">314</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">315</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">316</td><td class="hits">1</td><td class="source">Libraries.prototype.mergeHash = function(hashName, input, mixin, output) {</td></tr><tr class="hit"><td class="line">317</td><td class="hits">90</td><td class="source"> if (mixin[hashName]) {</td></tr><tr><td class="line">318</td><td class="hits"></td><td class="source"> // Close the value to make sure that we are not overriding anything</td></tr><tr class="hit"><td class="line">319</td><td class="hits">11</td><td class="source"> if (!output[hashName] || output[hashName] === input[hashName]) {</td></tr><tr class="hit"><td class="line">320</td><td class="hits">9</td><td class="source"> output[hashName] = _.clone(input[hashName] || {});</td></tr><tr><td class="line">321</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">322</td><td class="hits">11</td><td class="source"> _.each(mixin[hashName], function(value, key) {</td></tr><tr class="hit"><td class="line">323</td><td class="hits">17</td><td class="source"> if (!input[hashName] || !(key in input[hashName])) {</td></tr><tr class="hit"><td class="line">324</td><td class="hits">13</td><td class="source"> output[hashName][key] = value;</td></tr><tr><td class="line">325</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">326</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">327</td><td class="hits">11</td><td class="source"> return true;</td></tr><tr><td class="line">328</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">329</td><td class="hits"></td><td class="source">};</td></tr><tr class="hit"><td class="line">330</td><td class="hits">1</td><td class="source">Libraries.prototype.mergeFiles = function(fieldName, input, mixinData, output, library) {</td></tr><tr class="hit"><td class="line">331</td><td class="hits">44</td><td class="source"> if (mixinData[fieldName]) {</td></tr><tr class="hit"><td class="line">332</td><td class="hits">10</td><td class="source"> mixinData = _.isArray(mixinData[fieldName]) ? mixinData[fieldName] : [mixinData[fieldName]];</td></tr><tr><td class="line">333</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">334</td><td class="hits">10</td><td class="source"> var configData = input[fieldName] || [];</td></tr><tr class="hit"><td class="line">335</td><td class="hits">10</td><td class="source"> if (!output[fieldName] || configData === output[fieldName]) {</td></tr><tr class="hit"><td class="line">336</td><td class="hits">8</td><td class="source"> output[fieldName] = _.clone(configData);</td></tr><tr><td class="line">337</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">338</td><td class="hits">10</td><td class="source"> if (!_.isArray(configData)) {</td></tr><tr class="hit"><td class="line">339</td><td class="hits">2</td><td class="source"> configData = [configData];</td></tr><tr><td class="line">340</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">341</td><td class="hits">10</td><td class="source"> if (!_.isArray(output[fieldName])) {</td></tr><tr class="hit"><td class="line">342</td><td class="hits">1</td><td class="source"> output[fieldName] = [output[fieldName]];</td></tr><tr><td class="line">343</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">344</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">345</td><td class="hits"></td><td class="source"> // Insert point is at the start of the upstream list, which we are</td></tr><tr><td class="line">346</td><td class="hits"></td><td class="source"> // assuming occurs at length postions from the end.</td></tr><tr class="hit"><td class="line">347</td><td class="hits">10</td><td class="source"> _.each(mixinData, function(value) {</td></tr><tr><td class="line">348</td><td class="hits"></td><td class="source"> //Make the include relative to the mixin</td></tr><tr class="hit"><td class="line">349</td><td class="hits">13</td><td class="source"> value = (library.root || '') + value;</td></tr><tr><td class="line">350</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">351</td><td class="hits">13</td><td class="source"> output[fieldName].splice(</td></tr><tr><td class="line">352</td><td class="hits"></td><td class="source"> output[fieldName].length - configData.length,</td></tr><tr><td class="line">353</td><td class="hits"></td><td class="source"> 0,</td></tr><tr><td class="line">354</td><td class="hits"></td><td class="source"> {src: value, library: library});</td></tr><tr><td class="line">355</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">356</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">357</td><td class="hits">10</td><td class="source"> return true;</td></tr><tr><td class="line">358</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">359</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">360</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">361</td><td class="hits">1</td><td class="source">module.exports = Libraries;</td></tr><tr><td class="line">362</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/lumbar.js">/Users/kpdecker/dev/walmart/lumbar/lib/lumbar.js</h2><div id="stats" class="high"><div class="percentage">89%</div><div class="sloc">86</div><div class="hits">77</div><div class="misses">9</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> ChildPool = require('child-pool'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> Context = require('./context'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> EventEmitter = require('events').EventEmitter,</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> fs = require('fs'),</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> stateMachine = require('./state-machine'),</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> WatchManager = require('./watch-manager');</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source">exports.build = require('./build');</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source">exports.fileUtil = require('./fileUtil');</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source">exports.plugin = require('./plugin').plugin;</td></tr><tr class="hit"><td class="line">13</td><td class="hits">1</td><td class="source">exports.combine = require('./jsCombine').combine;</td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source">exports.config = require('./config');</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><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"> * @name init</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> * @function This function initializes a Lumbar instance</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> * @param {string} lumbarFile The lumbarFile is the main</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> * file. Its responsible to define all the platforms,</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> * packages, modules, and templates for Lumbar to use.</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> * @param {Object} options supports the following options:</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> * packageConfigFile (string): name of the package config file.</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> * outdir (string): path to directory of where to output the files.</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> * minimize (boolean): Should we minimize the files?</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> * @return {Object.<Function>}</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">1</td><td class="source">exports.init = function(lumbarFile, options) {</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> // Clone so we can mutate in the use API</td></tr><tr class="hit"><td class="line">31</td><td class="hits">30</td><td class="source"> options = _.clone(options || {});</td></tr><tr class="hit"><td class="line">32</td><td class="hits">30</td><td class="source"> options.plugins = _.clone(options.plugins || []);</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">30</td><td class="source"> function logError(err) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">57</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">3</td><td class="source"> event.emit('error', err);</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> }</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"> </td></tr><tr class="hit"><td class="line">40</td><td class="hits">30</td><td class="source"> var event = new EventEmitter(),</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> watch,</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> watchContext;</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">44</td><td class="hits">30</td><td class="source"> function watchOutputHandler(status) {</td></tr><tr class="hit"><td class="line">45</td><td class="hits">102</td><td class="source"> if (!watch) {</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> // We've been cleaned up but residuals may still exist, do nothing on this exec</td></tr><tr class="hit"><td class="line">47</td><td class="hits">14</td><td class="source"> return;</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 class="hit"><td class="line">50</td><td class="hits">88</td><td class="source"> if (status.fileConfig.isPrimary) {</td></tr><tr class="hit"><td class="line">51</td><td class="hits">36</td><td class="source"> delete status.fileConfig;</td></tr><tr class="hit"><td class="line">52</td><td class="hits">52</td><td class="source"> } else if (status.fileConfig.isPrimary === false) {</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> // This config is directly linked to another meaning we don't want to watch on it as</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> // it will be rebuilt.</td></tr><tr class="hit"><td class="line">55</td><td class="hits">11</td><td class="source"> return;</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> }</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">77</td><td class="source"> var originalContext = watchContext;</td></tr><tr class="hit"><td class="line">59</td><td class="hits">77</td><td class="source"> watch.moduleOutput(status, function() {</td></tr><tr class="hit"><td class="line">60</td><td class="hits">35</td><td class="source"> if (watchContext !== originalContext) {</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> // Ignore builds that may have occured at the same time as a config file change (i.e. a branch switch)</td></tr><tr class="miss"><td class="line">62</td><td class="hits">0</td><td class="source"> return;</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"> </td></tr><tr class="hit"><td class="line">65</td><td class="hits">35</td><td class="source"> stateMachine.loadPlatform(watchContext.clone(status), function(err, contexts) {</td></tr><tr class="hit"><td class="line">66</td><td class="hits">35</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">67</td><td class="hits">0</td><td class="source"> return logError(err);</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">35</td><td class="source"> stateMachine.buildContexts(contexts, logError);</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"> });</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">75</td><td class="hits">30</td><td class="source"> return _.extend(event, {</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> use: function(plugin) {</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> // Only has impact before exec</td></tr><tr class="miss"><td class="line">78</td><td class="hits">0</td><td class="source"> options.plugins.push(plugin);</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"> moduleMap: function(packageName, callback) {</td></tr><tr class="hit"><td class="line">82</td><td class="hits">5</td><td class="source"> if (!callback) {</td></tr><tr class="hit"><td class="line">83</td><td class="hits">1</td><td class="source"> callback = packageName;</td></tr><tr class="hit"><td class="line">84</td><td class="hits">1</td><td class="source"> packageName = undefined;</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"> </td></tr><tr class="hit"><td class="line">87</td><td class="hits">5</td><td class="source"> stateMachine.loadConfig(lumbarFile, event, options, function(err, rootContext) {</td></tr><tr class="hit"><td class="line">88</td><td class="hits">5</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">89</td><td class="hits">1</td><td class="source"> return callback(err);</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"> </td></tr><tr class="hit"><td class="line">92</td><td class="hits">4</td><td class="source"> rootContext.mode = 'scripts';</td></tr><tr class="hit"><td class="line">93</td><td class="hits">4</td><td class="source"> stateMachine.loadPackages(rootContext, packageName, function(err, contexts) {</td></tr><tr class="hit"><td class="line">94</td><td class="hits">4</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">95</td><td class="hits">1</td><td class="source"> return callback(err);</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">98</td><td class="hits">3</td><td class="source"> async.forEach(_.keys(contexts), function(packageName, callback) {</td></tr><tr class="hit"><td class="line">99</td><td class="hits">3</td><td class="source"> var package = contexts[packageName];</td></tr><tr class="hit"><td class="line">100</td><td class="hits">3</td><td class="source"> async.forEach(_.keys(package), function(platformName, callback) {</td></tr><tr class="hit"><td class="line">101</td><td class="hits">4</td><td class="source"> var platform = package[platformName],</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> context = platform[0];</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">4</td><td class="source"> rootContext.plugins.get('module-map').buildMap(context, function(err, map) {</td></tr><tr class="hit"><td class="line">105</td><td class="hits">4</td><td class="source"> if (!err) {</td></tr><tr class="hit"><td class="line">106</td><td class="hits">4</td><td class="source"> package[platformName] = map;</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">108</td><td class="hits">4</td><td class="source"> callback(err);</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"> callback);</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> function(err) {</td></tr><tr class="hit"><td class="line">114</td><td class="hits">3</td><td class="source"> callback(err, contexts);</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"> });</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"> * @name build</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> * @function This function builds out the package(s).</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> * @param {string} packageName the name of the package listed under</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> * 'packages' from the lumbarFile passed in during the call to init().</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> * @param {Function} callback the node process Function</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> build: function(packageName, modules, callback) {</td></tr><tr class="hit"><td class="line">129</td><td class="hits">11</td><td class="source"> stateMachine.loadAndInitDir(lumbarFile, event, options, function(err, rootContext) {</td></tr><tr class="hit"><td class="line">130</td><td class="hits">11</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">131</td><td class="hits">0</td><td class="source"> if (!callback) {</td></tr><tr class="miss"><td class="line">132</td><td class="hits">0</td><td class="source"> throw err;</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">134</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">137</td><td class="hits">11</td><td class="source"> stateMachine.buildPackages(rootContext, packageName, modules, callback);</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"> watch: function(packageName, modules, callback) {</td></tr><tr class="hit"><td class="line">141</td><td class="hits">18</td><td class="source"> if (!fs.watch) {</td></tr><tr class="miss"><td class="line">142</td><td class="hits">0</td><td class="source"> throw new Error('Watch requires fs.watch, introduced in Node v0.6.0');</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">145</td><td class="hits">18</td><td class="source"> ChildPool.isBackground(true);</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">147</td><td class="hits">18</td><td class="source"> watch = new WatchManager();</td></tr><tr class="hit"><td class="line">148</td><td class="hits">18</td><td class="source"> watch.on('watch-change', function(info) {</td></tr><tr class="hit"><td class="line">149</td><td class="hits">43</td><td class="source"> event.emit('watch-change', info);</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 class="hit"><td class="line">152</td><td class="hits">18</td><td class="source"> var self = this;</td></tr><tr class="hit"><td class="line">153</td><td class="hits">18</td><td class="source"> stateMachine.loadAndInitDir(lumbarFile, event, options, function(err, rootContext) {</td></tr><tr class="hit"><td class="line">154</td><td class="hits">18</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">155</td><td class="hits">0</td><td class="source"> logError(err);</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"> </td></tr><tr class="hit"><td class="line">158</td><td class="hits">18</td><td class="source"> if (!callback) {</td></tr><tr class="hit"><td class="line">159</td><td class="hits">18</td><td class="source"> callback = modules;</td></tr><tr class="hit"><td class="line">160</td><td class="hits">18</td><td class="source"> modules = undefined;</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"> </td></tr><tr class="hit"><td class="line">163</td><td class="hits">18</td><td class="source"> watchContext = rootContext;</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> // Watch for changes in the config file</td></tr><tr class="hit"><td class="line">166</td><td class="hits">23</td><td class="source"> var mixinPaths = _.filter(_.pluck(rootContext.libraries.configs, 'path'), function(path) { return path; });</td></tr><tr class="hit"><td class="line">167</td><td class="hits">18</td><td class="source"> watch.configFile(lumbarFile, mixinPaths, function() {</td></tr><tr class="hit"><td class="line">168</td><td class="hits">4</td><td class="source"> watchContext = undefined;</td></tr><tr class="hit"><td class="line">169</td><td class="hits">4</td><td class="source"> self.watch(packageName, callback);</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> });</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"> // If we have errored do not exec everything as it could be in an indeterminate state</td></tr><tr class="hit"><td class="line">173</td><td class="hits">18</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">174</td><td class="hits">0</td><td class="source"> return;</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"> // Watch the individual components</td></tr><tr class="hit"><td class="line">178</td><td class="hits">18</td><td class="source"> event.removeListener('output', watchOutputHandler);</td></tr><tr class="hit"><td class="line">179</td><td class="hits">18</td><td class="source"> event.on('output', watchOutputHandler);</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"> // Actual build everything</td></tr><tr class="hit"><td class="line">182</td><td class="hits">18</td><td class="source"> var packages = packageName ? [packageName] : rootContext.config.packageList();</td></tr><tr class="hit"><td class="line">183</td><td class="hits">18</td><td class="source"> packages.forEach(function(name) {</td></tr><tr class="hit"><td class="line">184</td><td class="hits">22</td><td class="source"> stateMachine.buildPackages(rootContext, name, modules, logError);</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> unwatch: function() {</td></tr><tr class="hit"><td class="line">189</td><td class="hits">14</td><td class="source"> event.removeListener('output', watchOutputHandler);</td></tr><tr class="hit"><td class="line">190</td><td class="hits">14</td><td class="source"> if (watch) {</td></tr><tr class="hit"><td class="line">191</td><td class="hits">14</td><td class="source"> watch.removeAllListeners();</td></tr><tr class="hit"><td class="line">192</td><td class="hits">14</td><td class="source"> watch.reset();</td></tr><tr class="hit"><td class="line">193</td><td class="hits">14</td><td class="source"> watch = undefined;</td></tr><tr class="hit"><td class="line">194</td><td class="hits">14</td><td class="source"> watchContext = undefined;</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"> }</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugin.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugin.js</h2><div id="stats" class="high"><div class="percentage">99%</div><div class="sloc">108</div><div class="hits">107</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> path = require('path');</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">const corePlugins = [</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> 'mixin',</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> 'styles-output', 'scripts-output', 'static-output',</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> 'scope', 'router', 'template', 'inline-styles',</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> 'coffee-script', 'stylus', 'handlebars',</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> 'module-map', 'package-config', 'stylus-config',</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> 'update-externals',</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> 'server-scripts',</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> 'inline-styles-resources', 'styles', 'scripts', 'static'</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">1</td><td class="source">var fileUtils = require("/Users/kpdecker/dev/walmart/lumbar/lib/./fileUtil");</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source">var globalPlugins = {};</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">exports.plugin = function(name, plugin) {</td></tr><tr class="hit"><td class="line">18</td><td class="hits">20</td><td class="source"> globalPlugins[name] = plugin;</td></tr><tr class="hit"><td class="line">19</td><td class="hits">20</td><td class="source"> plugin.id = name;</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">1</td><td class="source">exports.plugin('module-map', require('./plugins/module-map'));</td></tr><tr class="hit"><td class="line">23</td><td class="hits">1</td><td class="source">exports.plugin('package-config', require('./plugins/package-config'));</td></tr><tr class="hit"><td class="line">24</td><td class="hits">1</td><td class="source">exports.plugin('router', require('./plugins/router'));</td></tr><tr class="hit"><td class="line">25</td><td class="hits">1</td><td class="source">exports.plugin('scope', require('./plugins/scope'));</td></tr><tr class="hit"><td class="line">26</td><td class="hits">1</td><td class="source">exports.plugin('stylus', require('./plugins/stylus'));</td></tr><tr class="hit"><td class="line">27</td><td class="hits">1</td><td class="source">exports.plugin('stylus-config', require('./plugins/stylus-config'));</td></tr><tr class="hit"><td class="line">28</td><td class="hits">1</td><td class="source">exports.plugin('coffee-script', require('./plugins/coffee-script'));</td></tr><tr class="hit"><td class="line">29</td><td class="hits">1</td><td class="source">exports.plugin('handlebars', require('./plugins/handlebars'));</td></tr><tr class="hit"><td class="line">30</td><td class="hits">1</td><td class="source">exports.plugin('inline-styles', require('./plugins/inline-styles'));</td></tr><tr class="hit"><td class="line">31</td><td class="hits">1</td><td class="source">exports.plugin('inline-styles-resources', require('./plugins/inline-styles-resources'));</td></tr><tr class="hit"><td class="line">32</td><td class="hits">1</td><td class="source">exports.plugin('mixin', require('./plugins/mixin'));</td></tr><tr class="hit"><td class="line">33</td><td class="hits">1</td><td class="source">exports.plugin('update-externals', require('./plugins/update-externals'));</td></tr><tr class="hit"><td class="line">34</td><td class="hits">1</td><td class="source">exports.plugin('template', require('./plugins/template'));</td></tr><tr class="hit"><td class="line">35</td><td class="hits">1</td><td class="source">exports.plugin('styles', require('./plugins/styles.js'));</td></tr><tr class="hit"><td class="line">36</td><td class="hits">1</td><td class="source">exports.plugin('server-scripts', require('./plugins/server-scripts.js'));</td></tr><tr class="hit"><td class="line">37</td><td class="hits">1</td><td class="source">exports.plugin('scripts', require('./plugins/scripts.js'));</td></tr><tr class="hit"><td class="line">38</td><td class="hits">1</td><td class="source">exports.plugin('static', require('./plugins/static.js'));</td></tr><tr class="hit"><td class="line">39</td><td class="hits">1</td><td class="source">exports.plugin('styles-output', require('./plugins/styles-output.js'));</td></tr><tr class="hit"><td class="line">40</td><td class="hits">1</td><td class="source">exports.plugin('scripts-output', require('./plugins/scripts-output.js'));</td></tr><tr class="hit"><td class="line">41</td><td class="hits">1</td><td class="source">exports.plugin('static-output', require('./plugins/static-output.js'));</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">1</td><td class="source">exports.create = function(options) {</td></tr><tr class="hit"><td class="line">44</td><td class="hits">142</td><td class="source"> var plugins;</td></tr><tr class="hit"><td class="line">45</td><td class="hits">142</td><td class="source"> var modes; // all registered modes</td></tr><tr class="hit"><td class="line">46</td><td class="hits">142</td><td class="source"> var pluginModes; // map of modes and plugins scoped to the mode</td></tr><tr class="hit"><td class="line">47</td><td class="hits">142</td><td class="source"> var modeAll; // plugins that are scoped to all modes</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">49</td><td class="hits">142</td><td class="source"> function runPlugins(context, methodName, complete, failOver, noMode) {</td></tr><tr class="hit"><td class="line">50</td><td class="hits">3088</td><td class="source"> var len = 0,</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> pluginMode = pluginModes[context.mode] || [];</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">53</td><td class="hits">3088</td><td class="source"> return (function next(complete) {</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> /*jshint boss:true */</td></tr><tr class="hit"><td class="line">55</td><td class="hits">9151</td><td class="source"> var plugin;</td></tr><tr class="hit"><td class="line">56</td><td class="hits">9151</td><td class="source"> while (plugin = plugins[len++]) {</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> // if plugin shouldn't work with current mode, go to next</td></tr><tr class="hit"><td class="line">58</td><td class="hits">59897</td><td class="source"> if (!noMode</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> && (!context.mode || pluginMode.indexOf(plugin) < 0)</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> && modeAll.indexOf(plugin) < 0) {</td></tr><tr class="hit"><td class="line">61</td><td class="hits">26387</td><td class="source"> continue;</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 class="hit"><td class="line">64</td><td class="hits">33510</td><td class="source"> var method = plugin[methodName];</td></tr><tr class="hit"><td class="line">65</td><td class="hits">33510</td><td class="source"> if (method) {</td></tr><tr class="hit"><td class="line">66</td><td class="hits">6765</td><td class="source"> if (complete) {</td></tr><tr class="hit"><td class="line">67</td><td class="hits">6625</td><td class="source"> process.nextTick(function() {</td></tr><tr class="hit"><td class="line">68</td><td class="hits">6625</td><td class="source"> method.call(plugin, context, next, complete);</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">6625</td><td class="source"> return;</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">72</td><td class="hits">140</td><td class="source"> return method.call(plugin, context, next, complete);</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> }</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"> }</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> // We're done, send data back</td></tr><tr class="hit"><td class="line">78</td><td class="hits">2386</td><td class="source"> if (complete) {</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> // async</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> // Clear out our stack under async mode to try to keep the stack somewhat sane.</td></tr><tr class="hit"><td class="line">81</td><td class="hits">2197</td><td class="source"> process.nextTick(function() {</td></tr><tr class="hit"><td class="line">82</td><td class="hits">2197</td><td class="source"> complete(undefined, failOver && failOver());</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"> } else {</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> // sync</td></tr><tr class="hit"><td class="line">86</td><td class="hits">189</td><td class="source"> return failOver && failOver();</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> })(complete);</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">91</td><td class="hits">142</td><td class="source"> function registerPlugin(plugin) {</td></tr><tr class="hit"><td class="line">92</td><td class="hits">2793</td><td class="source"> var _plugin = globalPlugins[plugin] || plugin;</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">2793</td><td class="source"> var mode = _plugin.mode;</td></tr><tr class="hit"><td class="line">95</td><td class="hits">2793</td><td class="source"> if (mode) {</td></tr><tr class="hit"><td class="line">96</td><td class="hits">2654</td><td class="source"> if (_.isString(mode)) {</td></tr><tr class="hit"><td class="line">97</td><td class="hits">2091</td><td class="source"> mode = [mode];</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">2654</td><td class="source"> _.each(mode, function(_mode) {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">3217</td><td class="source"> if (mode === 'all') {</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> // allow plugins to contribute new modes and participate in all modes</td></tr><tr class="miss"><td class="line">102</td><td class="hits">0</td><td class="source"> modeAll.push(_plugin);</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">104</td><td class="hits">3217</td><td class="source"> if (modes.indexOf(_mode) < 0) {</td></tr><tr class="hit"><td class="line">105</td><td class="hits">424</td><td class="source"> modes.push(_mode);</td></tr><tr class="hit"><td class="line">106</td><td class="hits">424</td><td class="source"> pluginModes[_mode] = [];</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">108</td><td class="hits">3217</td><td class="source"> pluginModes[_mode].push(_plugin);</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"> } else {</td></tr><tr class="hit"><td class="line">112</td><td class="hits">139</td><td class="source"> modeAll.push(_plugin);</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">114</td><td class="hits">2793</td><td class="source"> plugins.push(_plugin);</td></tr><tr class="hit"><td class="line">115</td><td class="hits">2793</td><td class="source"> plugins.sort(function(a, b) {</td></tr><tr class="hit"><td class="line">116</td><td class="hits">39521</td><td class="source"> return (a.priority || 50) - (b.priority || 50);</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 class="hit"><td class="line">120</td><td class="hits">142</td><td class="source"> return {</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> get: function(name) {</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> // Find the plugin with this id, if one exists</td></tr><tr class="hit"><td class="line">123</td><td class="hits">77</td><td class="source"> var plugin = plugins.reduce(function(plugin, left) {</td></tr><tr class="hit"><td class="line">124</td><td class="hits">1463</td><td class="source"> return plugin.id === name ? plugin : left;</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"> </td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> // If the plugin was not found do not return the last item in the reduce</td></tr><tr class="hit"><td class="line">128</td><td class="hits">77</td><td class="source"> if (plugin.id === name) {</td></tr><tr class="hit"><td class="line">129</td><td class="hits">75</td><td class="source"> return plugin;</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> }</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"> use: function(plugin) {</td></tr><tr class="hit"><td class="line">133</td><td class="hits">13</td><td class="source"> if (plugin.path || (_.isString(plugin) && !globalPlugins[plugin])) {</td></tr><tr class="hit"><td class="line">134</td><td class="hits">1</td><td class="source"> var pluginPath = plugin.path || plugin;</td></tr><tr class="hit"><td class="line">135</td><td class="hits">1</td><td class="source"> var options = plugin.options;</td></tr><tr class="hit"><td class="line">136</td><td class="hits">1</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">137</td><td class="hits">1</td><td class="source"> plugin = require(pluginPath);</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> } catch (e) {</td></tr><tr class="hit"><td class="line">139</td><td class="hits">1</td><td class="source"> plugin = require(path.resolve(process.cwd(), fileUtils.lookupPath()) + '/node_modules/' + pluginPath);</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">141</td><td class="hits">1</td><td class="source"> if ('function' === typeof plugin) {</td></tr><tr class="hit"><td class="line">142</td><td class="hits">1</td><td class="source"> plugin = plugin(options);</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">145</td><td class="hits">13</td><td class="source"> registerPlugin(plugin);</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> initialize: function(config) {</td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source"> // reset</td></tr><tr class="hit"><td class="line">150</td><td class="hits">142</td><td class="source"> plugins = [];</td></tr><tr class="hit"><td class="line">151</td><td class="hits">142</td><td class="source"> modes = []; // all registered modes</td></tr><tr class="hit"><td class="line">152</td><td class="hits">142</td><td class="source"> pluginModes = {}; // map of modes and plugins scoped to the mode</td></tr><tr class="hit"><td class="line">153</td><td class="hits">142</td><td class="source"> modeAll = []; // plugins that are scoped to all modes</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"> // load the core plugins</td></tr><tr class="hit"><td class="line">156</td><td class="hits">142</td><td class="source"> if (!options.ignoreCorePlugins) {</td></tr><tr class="hit"><td class="line">157</td><td class="hits">139</td><td class="source"> corePlugins.forEach(registerPlugin);</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">160</td><td class="hits">142</td><td class="source"> var self = this;</td></tr><tr class="hit"><td class="line">161</td><td class="hits">142</td><td class="source"> function plugin(plugins) {</td></tr><tr class="hit"><td class="line">162</td><td class="hits">284</td><td class="source"> if (plugins) {</td></tr><tr class="hit"><td class="line">163</td><td class="hits">38</td><td class="source"> plugins.forEach(self.use, self);</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> }</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"> // load command line plugins</td></tr><tr class="hit"><td class="line">168</td><td class="hits">142</td><td class="source"> plugin(options.plugins);</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> // load lumbar.json plugins</td></tr><tr class="hit"><td class="line">171</td><td class="hits">142</td><td class="source"> plugin(config.attributes.plugins);</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> loadMixin: function(context, complete) {</td></tr><tr class="hit"><td class="line">175</td><td class="hits">84</td><td class="source"> runPlugins(context, 'loadMixin', complete, undefined, true);</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"> loadConfig: function(context, complete) {</td></tr><tr class="hit"><td class="line">178</td><td class="hits">141</td><td class="source"> runPlugins(context, 'loadConfig', complete, undefined, true);</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"> outputConfigs: function(context, complete) {</td></tr><tr class="hit"><td class="line">181</td><td class="hits">248</td><td class="source"> runPlugins(context, 'outputConfigs', complete, function() {</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> // Default to a one to one mapping for a given {platform, package, module, mode} combo</td></tr><tr class="hit"><td class="line">183</td><td class="hits">246</td><td class="source"> return [ {} ];</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> modeComplete: function(context, complete) {</td></tr><tr class="hit"><td class="line">187</td><td class="hits">184</td><td class="source"> runPlugins(context, 'modeComplete', complete);</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> fileName: function(context, complete) {</td></tr><tr class="hit"><td class="line">190</td><td class="hits">257</td><td class="source"> runPlugins(context, 'fileName', complete);</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> fileFilter: function(context) {</td></tr><tr class="hit"><td class="line">194</td><td class="hits">329</td><td class="source"> return runPlugins(context, 'fileFilter');</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"> moduleResources: function(context, complete) {</td></tr><tr class="hit"><td class="line">197</td><td class="hits">453</td><td class="source"> runPlugins(context, 'moduleResources', complete, function() {</td></tr><tr class="hit"><td class="line">198</td><td class="hits">248</td><td class="source"> var module = context.module;</td></tr><tr class="hit"><td class="line">199</td><td class="hits">248</td><td class="source"> return (module[context.mode] || []).slice();</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> resourceList: function(context, complete) {</td></tr><tr class="hit"><td class="line">203</td><td class="hits">1028</td><td class="source"> runPlugins(context, 'resourceList', complete, function() { return [context.resource]; });</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">206</td><td class="hits"></td><td class="source"> file: function(context, complete) {</td></tr><tr class="hit"><td class="line">207</td><td class="hits">144</td><td class="source"> runPlugins(context, 'file', complete);</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"> module: function(context, complete) {</td></tr><tr class="hit"><td class="line">210</td><td class="hits">274</td><td class="source"> runPlugins(context, 'module', complete);</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"> resource: function(context, complete) {</td></tr><tr class="hit"><td class="line">213</td><td class="hits">825</td><td class="source"> runPlugins(context, 'resource', complete, function() { return context.resource; });</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> modes: function() {</td></tr><tr class="hit"><td class="line">216</td><td class="hits">47</td><td class="source"> return modes;</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source"> };</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"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/coffee-script.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/coffee-script.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">15</div><div class="hits">15</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">var CoffeeScript,</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> fu = require('../fileUtil'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> _ = require('underscore');</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 = {</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> mode: 'scripts',</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> priority: 50,</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> resource: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">10</td><td class="hits">273</td><td class="source"> var resource = context.resource;</td></tr><tr class="hit"><td class="line">11</td><td class="hits">273</td><td class="source"> if (/\.coffee$/.test(resource.src)) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">2</td><td class="source"> CoffeeScript = CoffeeScript || require('coffee-script');</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">14</td><td class="hits">2</td><td class="source"> next(function(err, resource) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">2</td><td class="source"> function generator(context, callback) {</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> // Load the source data</td></tr><tr class="hit"><td class="line">17</td><td class="hits">2</td><td class="source"> context.loadResource(resource, function(err, file) {</td></tr><tr class="hit"><td class="line">18</td><td class="hits">2</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">1</td><td class="source"> return callback(err);</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><td class="line">22</td><td class="hits"></td><td class="source"> // Update the content</td></tr><tr class="hit"><td class="line">23</td><td class="hits">1</td><td class="source"> callback(err, {</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> data: CoffeeScript.compile(file.content.toString()),</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> inputs: file.inputs</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"> }</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"> // Include any attributes that may have been defined on the base entry</td></tr><tr class="hit"><td class="line">31</td><td class="hits">2</td><td class="source"> if (!_.isString(resource)) {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">2</td><td class="source"> _.extend(generator, resource);</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">2</td><td class="source"> complete(undefined, generator);</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"> } else {</td></tr><tr class="hit"><td class="line">37</td><td class="hits">271</td><td class="source"> next(complete);</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"> }</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/handlebars.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/handlebars.js</h2><div id="stats" class="high"><div class="percentage">91%</div><div class="sloc">92</div><div class="hits">84</div><div class="misses">8</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">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * Template Plugin : Includes handlebars templates associated with a given file</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * when said file is imported.</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"> * Config:</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> * root:</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> * templates:</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * template: Defines the template that is used to output the template in the module. See consts below.</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * precompile:</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> * Flag/hash that enable precompilation. Truthy will enable precompilation. A hash with</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> * the key name "template" will override the rendering template. (See the template value above.)</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> * cache: Name of the javascript object that templates will be assigned to.</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> * Defaults to `$AppModule.templates` if an app module exists, otherwise `templates`</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"> * Mixins:</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> * The template plugin will mixin any special values directly, giving priority to the local version.</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 class="hit"><td class="line">19</td><td class="hits">1</td><td class="source">var _ = require('underscore'),</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> handlebars = require('handlebars'),</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> resources = require('../util/resources'),</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> templateUtil = require('../templateUtil');</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">handlebars.registerHelper('without-extension', function(str) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">1</td><td class="source"> return str.replace(/\.[a-zA-Z0-9]+$/, '');</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"> </td></tr><tr class="hit"><td class="line">29</td><td class="hits">1</td><td class="source">const DEFAULT_TEMPLATE_TEMPLATE = "/* handsfree : {{{name}}}*/\n{{{templateCache}}}['{{{name}}}'] = {{handlebarsCall}}({{{data}}});\n";</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">31</td><td class="hits">1</td><td class="source">function ensureTemplateTemplates(context, complete) {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">40</td><td class="source"> if (!context.configCache.templateTemplate) {</td></tr><tr class="hit"><td class="line">33</td><td class="hits">14</td><td class="source"> var templateTemplate = (context.config.attributes.templates && context.config.attributes.templates.template) || DEFAULT_TEMPLATE_TEMPLATE;</td></tr><tr class="hit"><td class="line">34</td><td class="hits">14</td><td class="source"> context.fileUtil.loadTemplate(templateTemplate, false, function(err, compiled) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">14</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">1</td><td class="source"> complete(err);</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">38</td><td class="hits">13</td><td class="source"> context.configCache.templateTemplate = compiled;</td></tr><tr class="hit"><td class="line">39</td><td class="hits">13</td><td class="source"> complete();</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> }</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"> } else {</td></tr><tr class="hit"><td class="line">43</td><td class="hits">26</td><td class="source"> complete();</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 class="hit"><td class="line">47</td><td class="hits">1</td><td class="source">function loadTemplate(src, resource, context, callback) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">40</td><td class="source"> ensureTemplateTemplates(context, function(err) {</td></tr><tr class="hit"><td class="line">49</td><td class="hits">40</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">50</td><td class="hits">1</td><td class="source"> return callback(err);</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">52</td><td class="hits">39</td><td class="source"> var artifactType = 'template' + context.fileConfig.server;</td></tr><tr class="hit"><td class="line">53</td><td class="hits">39</td><td class="source"> context.fileUtil.readFileArtifact(src, artifactType, function(err, cache) {</td></tr><tr class="hit"><td class="line">54</td><td class="hits">39</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">55</td><td class="hits">0</td><td class="source"> callback(new Error('Failed to load template "' + src + '"\n\t' + err));</td></tr><tr class="miss"><td class="line">56</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">59</td><td class="hits">39</td><td class="source"> var artifact = cache.artifact || {},</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> data = artifact.data || cache.data.toString(),</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> attr = context.config.attributes,</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> templates = attr.templates || {},</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> appModule = context.config.scopedAppModuleName(context.module),</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> templateCache = (attr.templates && attr.templates.cache)</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> || attr.templateCache</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> || ((appModule ? appModule + '.' : '') + 'templates'),</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> template = context.configCache.templateTemplate;</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"> // Figure out what this file is called. This could vary due to prefixing and overriding</td></tr><tr class="hit"><td class="line">70</td><td class="hits">39</td><td class="source"> var name = context.libraries.mapPathToLibrary(src, resource.library);</td></tr><tr class="hit"><td class="line">71</td><td class="hits">39</td><td class="source"> if (templates.root && name.indexOf(templates.root) === 0) {</td></tr><tr class="hit"><td class="line">72</td><td class="hits">4</td><td class="source"> name = name.substring(templates.root.length);</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">74</td><td class="hits">39</td><td class="source"> name = templateUtil.escapeJsString(name);</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> // We have the template data, now convert it into the proper format</td></tr><tr class="hit"><td class="line">77</td><td class="hits">39</td><td class="source"> if (!cache.artifact) {</td></tr><tr class="hit"><td class="line">78</td><td class="hits">18</td><td class="source"> if (templates.precompile) {</td></tr><tr class="hit"><td class="line">79</td><td class="hits">2</td><td class="source"> var options = context.fileCache.precompileTemplates;</td></tr><tr class="hit"><td class="line">80</td><td class="hits">2</td><td class="source"> if (!options) {</td></tr><tr class="hit"><td class="line">81</td><td class="hits">2</td><td class="source"> context.fileCache.precompileTemplates = options = _.clone(templates.precompile);</td></tr><tr class="hit"><td class="line">82</td><td class="hits">2</td><td class="source"> if (templates.knownHelpers || options.knownHelpers) {</td></tr><tr class="miss"><td class="line">83</td><td class="hits">0</td><td class="source"> options.knownHelpers = (options.knownHelpers || templates.knownHelpers).reduce(</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> function(value, helper) {</td></tr><tr class="miss"><td class="line">85</td><td class="hits">0</td><td class="source"> value[helper] = true;</td></tr><tr class="miss"><td class="line">86</td><td class="hits">0</td><td class="source"> return value;</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> }, {});</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">89</td><td class="hits">2</td><td class="source"> if (context.fileConfig.server && templates.server) {</td></tr><tr class="hit"><td class="line">90</td><td class="hits">1</td><td class="source"> _.extend(options, templates.server);</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> }</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">2</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">94</td><td class="hits">2</td><td class="source"> data = handlebars.precompile(data, options);</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr class="miss"><td class="line">96</td><td class="hits">0</td><td class="source"> return callback(err);</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"> } else {</td></tr><tr class="hit"><td class="line">99</td><td class="hits">16</td><td class="source"> data = "'" + templateUtil.escapeJsString(data) + "'";</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">101</td><td class="hits">18</td><td class="source"> context.fileUtil.setFileArtifact(src, artifactType, {data: data, template: template});</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> }</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">39</td><td class="source"> callback(</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> undefined,</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> template({</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> name: name,</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> handlebarsCall: templates.precompile ? 'Handlebars.template' : 'Handlebars.compile',</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> templateCache: templateCache,</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> data: data</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"> );</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> });</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"> </td></tr><tr class="hit"><td class="line">117</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> mode: 'scripts',</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> priority: 50,</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"> loadMixin: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">122</td><td class="hits">84</td><td class="source"> var mixinTemplates = context.loadedLibrary.templates;</td></tr><tr class="hit"><td class="line">123</td><td class="hits">84</td><td class="source"> if (mixinTemplates) {</td></tr><tr class="hit"><td class="line">124</td><td class="hits">14</td><td class="source"> var templates = context.libraries.originalConfig.templates || {},</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> configTemplates = _.clone(context.config.attributes.templates || templates),</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> assigned = false;</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">128</td><td class="hits">14</td><td class="source"> ['template', 'precompile', 'cache', 'root'].forEach(function(key) {</td></tr><tr class="hit"><td class="line">129</td><td class="hits">56</td><td class="source"> if (_.has(mixinTemplates, key) && !_.has(templates, key)) {</td></tr><tr class="hit"><td class="line">130</td><td class="hits">10</td><td class="source"> configTemplates[key] = mixinTemplates[key];</td></tr><tr class="hit"><td class="line">131</td><td class="hits">10</td><td class="source"> assigned = true;</td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">135</td><td class="hits">14</td><td class="source"> if (_.has(mixinTemplates, 'knownHelpers')) {</td></tr><tr class="hit"><td class="line">136</td><td class="hits">1</td><td class="source"> configTemplates.knownHelpers = (configTemplates.knownHelpers || []).concat(mixinTemplates.knownHelpers);</td></tr><tr class="hit"><td class="line">137</td><td class="hits">1</td><td class="source"> assigned = true;</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 class="hit"><td class="line">140</td><td class="hits">14</td><td class="source"> if (assigned) {</td></tr><tr class="hit"><td class="line">141</td><td class="hits">7</td><td class="source"> context.config.attributes.templates = configTemplates;</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"> }</td></tr><tr class="hit"><td class="line">144</td><td class="hits">84</td><td class="source"> next(complete);</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> resource: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">148</td><td class="hits">229</td><td class="source"> var resource = context.resource;</td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">150</td><td class="hits">229</td><td class="source"> if (/\.handlebars$/.test(resource.src) || resource.template) {</td></tr><tr class="hit"><td class="line">151</td><td class="hits">31</td><td class="source"> var loadedTemplates = context.fileCache.loadedTemplates;</td></tr><tr class="hit"><td class="line">152</td><td class="hits">31</td><td class="source"> if (!loadedTemplates) {</td></tr><tr class="hit"><td class="line">153</td><td class="hits">27</td><td class="source"> loadedTemplates = context.fileCache.loadedTemplates = {};</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 class="hit"><td class="line">156</td><td class="hits">31</td><td class="source"> var generator = function(buildContext, callback) {</td></tr><tr class="hit"><td class="line">157</td><td class="hits">28</td><td class="source"> var output = [],</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> inputs = [];</td></tr><tr class="hit"><td class="line">159</td><td class="hits">28</td><td class="source"> context.fileUtil.fileList(resource.src, /\.handlebars$/, function(err, files) {</td></tr><tr class="hit"><td class="line">160</td><td class="hits">28</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">161</td><td class="hits">0</td><td class="source"> callback(err);</td></tr><tr class="miss"><td class="line">162</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">163</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">165</td><td class="hits">28</td><td class="source"> function ignore(file) {</td></tr><tr class="hit"><td class="line">166</td><td class="hits">121</td><td class="source"> return file.dir || loadedTemplates[resources.source(file)];</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">168</td><td class="hits">28</td><td class="source"> function checkComplete() {</td></tr><tr class="hit"><td class="line">169</td><td class="hits">67</td><td class="source"> if (inputs.length === files.length) {</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> // Sorting is effectively sorting on the file name due to the name comment in the template</td></tr><tr class="hit"><td class="line">171</td><td class="hits">27</td><td class="source"> callback(undefined, {</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> inputs: inputs,</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> data: output.sort().join(''),</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> name: resource.src,</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> generated: true,</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> noSeparator: true,</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> ignoreWarnings: true</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">179</td><td class="hits">27</td><td class="source"> return true;</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"> }</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">183</td><td class="hits">49</td><td class="source"> inputs = _.map(files.filter(ignore), function(input) { return input.src || input; });</td></tr><tr class="hit"><td class="line">184</td><td class="hits">28</td><td class="source"> if (checkComplete()) {</td></tr><tr class="hit"><td class="line">185</td><td class="hits">1</td><td class="source"> return;</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">188</td><td class="hits">27</td><td class="source"> files.forEach(function(file) {</td></tr><tr class="hit"><td class="line">189</td><td class="hits">60</td><td class="source"> if (ignore(file)) {</td></tr><tr class="hit"><td class="line">190</td><td class="hits">20</td><td class="source"> return;</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">193</td><td class="hits">40</td><td class="source"> var src = file.src || file;</td></tr><tr class="hit"><td class="line">194</td><td class="hits">40</td><td class="source"> loadedTemplates[src] = true;</td></tr><tr class="hit"><td class="line">195</td><td class="hits">40</td><td class="source"> loadTemplate(src, resource, context, function(err, data) {</td></tr><tr class="hit"><td class="line">196</td><td class="hits">40</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">197</td><td class="hits">1</td><td class="source"> return callback(err);</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">200</td><td class="hits">39</td><td class="source"> output.push(data.data || data);</td></tr><tr class="hit"><td class="line">201</td><td class="hits">39</td><td class="source"> inputs.push(src);</td></tr><tr class="hit"><td class="line">202</td><td class="hits">39</td><td class="source"> checkComplete();</td></tr><tr><td class="line">203</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source"> });</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">31</td><td class="source"> generator.sourceFile = resource.src;</td></tr><tr class="hit"><td class="line">208</td><td class="hits">31</td><td class="source"> complete(undefined, generator);</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">210</td><td class="hits">198</td><td class="source"> next(complete);</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"> }</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"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/inline-styles-resources.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/inline-styles-resources.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">8</div><div class="hits">8</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">var inlineStyles = require('./inline-styles');</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> mode: ['scripts', 'styles'],</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> priority: 80,</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"> moduleResources: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">8</td><td class="hits">369</td><td class="source"> if (inlineStyles.isInline(context) && context.mode === 'styles') {</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> // Prevent stylesheet output if in inline mode</td></tr><tr class="hit"><td class="line">10</td><td class="hits">3</td><td class="source"> complete(undefined, []);</td></tr><tr class="hit"><td class="line">11</td><td class="hits">366</td><td class="source"> } else if (inlineStyles.isInline(context)) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">6</td><td class="source"> next(function(err, scripts) {</td></tr><tr class="hit"><td class="line">13</td><td class="hits">6</td><td class="source"> complete(undefined, scripts.concat(context.module.styles || []));</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"> } else {</td></tr><tr class="hit"><td class="line">16</td><td class="hits">360</td><td class="source"> next(complete);</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"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/inline-styles.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/inline-styles.js</h2><div id="stats" class="high"><div class="percentage">94%</div><div class="sloc">34</div><div class="hits">32</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">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * Inline-Styles Plugin : Include stylesheet in javascript modules</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"> * Config:</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> * root:</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> * styles:</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> * inline: Truthy to inline styles on build.</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * inlineLoader: Javascript method used to load sheets on the client.</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> *</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> * Mixins:</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> * All fields may be mixed in. In the case of conflicts the local config wins.</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">1</td><td class="source">var _ = require('underscore');</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source">function isInline(context) {</td></tr><tr class="hit"><td class="line">16</td><td class="hits">1564</td><td class="source"> return (context.config.attributes.styles || {}).inline;</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 class="hit"><td class="line">19</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> isInline: isInline,</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> mode: ['scripts', 'styles'],</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> priority: 10,</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"> loadMixin: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">84</td><td class="source"> var mixinStyles = context.loadedLibrary.styles;</td></tr><tr class="hit"><td class="line">26</td><td class="hits">84</td><td class="source"> if (mixinStyles) {</td></tr><tr class="hit"><td class="line">27</td><td class="hits">22</td><td class="source"> var styles = context.libraries.originalConfig.styles || {},</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> configStyles = _.clone(context.config.attributes.styles || styles),</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> assigned = false;</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">31</td><td class="hits">22</td><td class="source"> ['inline', 'inlineLoader'].forEach(function(key) {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">44</td><td class="source"> if ((key in mixinStyles) && !(key in styles)) {</td></tr><tr class="hit"><td class="line">33</td><td class="hits">6</td><td class="source"> configStyles[key] = mixinStyles[key];</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">35</td><td class="hits">6</td><td class="source"> assigned = true;</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"> });</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">22</td><td class="source"> if (assigned) {</td></tr><tr class="hit"><td class="line">40</td><td class="hits">5</td><td class="source"> context.config.attributes.styles = configStyles;</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">84</td><td class="source"> next(complete);</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"> outputConfigs: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">200</td><td class="source"> if (isInline(context) && context.mode === 'styles') {</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> // Prevent stylesheet output if in inline mode</td></tr><tr class="hit"><td class="line">49</td><td class="hits">2</td><td class="source"> complete(undefined, []);</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">51</td><td class="hits">198</td><td class="source"> next(complete);</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><tr><td class="line">55</td><td class="hits"></td><td class="source"> module: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">56</td><td class="hits">193</td><td class="source"> next(function(err) {</td></tr><tr class="hit"><td class="line">57</td><td class="hits">193</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">58</td><td class="hits">0</td><td class="source"> return complete(err);</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 class="hit"><td class="line">61</td><td class="hits">193</td><td class="source"> if (isInline(context)) {</td></tr><tr class="hit"><td class="line">62</td><td class="hits">3</td><td class="source"> context.moduleResources = context.moduleResources.map(function(resource) {</td></tr><tr class="hit"><td class="line">63</td><td class="hits">9</td><td class="source"> if (resource.style || /\.css$/.test(resource.src)) {</td></tr><tr class="hit"><td class="line">64</td><td class="hits">3</td><td class="source"> var generator = function(context, callback) {</td></tr><tr class="hit"><td class="line">65</td><td class="hits">3</td><td class="source"> context.loadResource(resource, function(err, data) {</td></tr><tr class="hit"><td class="line">66</td><td class="hits">3</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">67</td><td class="hits">0</td><td class="source"> return callback(err);</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">3</td><td class="source"> var config = context.config,</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> loaderName = config.attributes.styles.inlineLoader || (config.scopedAppModuleName(context.module) + '.loader.loadInlineCSS');</td></tr><tr class="hit"><td class="line">72</td><td class="hits">3</td><td class="source"> callback(err, {</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> data: loaderName + '("'</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> + data.content</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> .replace(/\\/g, '\\')</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> .replace(/\n/g, '\\n')</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> .replace(/"/g, '\\"')</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> + '");\n',</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> inputs: data.inputs,</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> generated: true,</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> noSeparator: true</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"> };</td></tr><tr class="hit"><td class="line">85</td><td class="hits">3</td><td class="source"> generator.style = true;</td></tr><tr class="hit"><td class="line">86</td><td class="hits">3</td><td class="source"> generator.sourceFile = resource.sourceFile || resource.src;</td></tr><tr class="hit"><td class="line">87</td><td class="hits">3</td><td class="source"> return generator;</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">89</td><td class="hits">6</td><td class="source"> return resource;</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"> });</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> }</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">193</td><td class="source"> complete();</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> }</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></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/many-to-one-output.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/many-to-one-output.js</h2><div id="stats" class="high"><div class="percentage">96%</div><div class="sloc">50</div><div class="hits">48</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 class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> lumbar = require('../lumbar');</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">function filterDuplicates(context) {</td></tr><tr class="hit"><td class="line">5</td><td class="hits">199</td><td class="source"> if (context.config.attributes.filterDuplicates === false) {</td></tr><tr class="hit"><td class="line">6</td><td class="hits">2</td><td class="source"> return context.moduleResources;</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 class="hit"><td class="line">9</td><td class="hits">197</td><td class="source"> var paths = {};</td></tr><tr class="hit"><td class="line">10</td><td class="hits">197</td><td class="source"> return _.filter(context.moduleResources, function(resource) {</td></tr><tr class="hit"><td class="line">11</td><td class="hits">382</td><td class="source"> if (resource.src) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">185</td><td class="source"> var id = (resource.global ? 'global_' : '') + resource.src;</td></tr><tr class="hit"><td class="line">13</td><td class="hits">185</td><td class="source"> if (paths[id] && !resource.duplicate) {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">2</td><td class="source"> return false;</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">183</td><td class="source"> paths[id] = true;</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">380</td><td class="source"> return true;</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><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">1</td><td class="source">function combineResources(context, outputData, callback) {</td></tr><tr class="hit"><td class="line">23</td><td class="hits">169</td><td class="source"> var resources = context.resources || [];</td></tr><tr class="hit"><td class="line">24</td><td class="hits">169</td><td class="source"> if (!resources.length) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">51</td><td class="source"> return callback();</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 class="hit"><td class="line">28</td><td class="hits">118</td><td class="source"> context.outputFile(function(callback) {</td></tr><tr class="hit"><td class="line">29</td><td class="hits">118</td><td class="source"> lumbar.combine(</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> context,</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> resources,</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> context.fileName,</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> context.options.minimize && context.mode === 'scripts',</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> context.mode === 'styles',</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> function(err, data) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">118</td><td class="source"> data = data || {};</td></tr><tr class="hit"><td class="line">37</td><td class="hits">118</td><td class="source"> _.extend(data, outputData);</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">118</td><td class="source"> if (!data.fileName) {</td></tr><tr class="hit"><td class="line">40</td><td class="hits">9</td><td class="source"> data.fileName = context.fileName;</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">42</td><td class="hits">118</td><td class="source"> if (!data.inputs) {</td></tr><tr class="hit"><td class="line">43</td><td class="hits">9</td><td class="source"> data.inputs = _.chain(resources)</td></tr><tr class="hit"><td class="line">44</td><td class="hits">12</td><td class="source"> .map(function(resource) { return resource.inputs || resource; })</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> .flatten()</td></tr><tr class="hit"><td class="line">46</td><td class="hits">12</td><td class="source"> .map(function(resource) { return resource.src || resource; })</td></tr><tr class="hit"><td class="line">47</td><td class="hits">12</td><td class="source"> .filter(function(resource) { return _.isString(resource); })</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> .map(context.fileUtil.makeRelative, context.fileUtil)</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> .value();</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 class="hit"><td class="line">52</td><td class="hits">118</td><td class="source"> callback(err, data);</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><tr><td class="line">55</td><td class="hits"></td><td class="source"> callback);</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source">}</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">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> priority: 1,</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"> modeComplete: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">62</td><td class="hits">130</td><td class="source"> next(function(err) {</td></tr><tr class="hit"><td class="line">63</td><td class="hits">130</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">64</td><td class="hits">0</td><td class="source"> return complete(err);</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"> </td></tr><tr class="hit"><td class="line">67</td><td class="hits">130</td><td class="source"> if (context.combined) {</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> // Build the resources array from each of the modules (Need to maintain proper ordering)</td></tr><tr class="hit"><td class="line">69</td><td class="hits">30</td><td class="source"> var modules = context.config.moduleList(context.package);</td></tr><tr class="hit"><td class="line">70</td><td class="hits">30</td><td class="source"> context.resources = [];</td></tr><tr class="hit"><td class="line">71</td><td class="hits">30</td><td class="source"> modules.forEach(function(module) {</td></tr><tr class="hit"><td class="line">72</td><td class="hits">60</td><td class="source"> context.resources.push.apply(context.resources, context.combineResources[module]);</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">74</td><td class="hits">30</td><td class="source"> combineResources(context, {}, complete);</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">76</td><td class="hits">100</td><td class="source"> complete();</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><tr><td class="line">80</td><td class="hits"></td><td class="source"> module: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">81</td><td class="hits">199</td><td class="source"> next(function(err) {</td></tr><tr class="hit"><td class="line">82</td><td class="hits">199</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">83</td><td class="hits">0</td><td class="source"> return complete(err);</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">86</td><td class="hits">199</td><td class="source"> if (!context.combined) {</td></tr><tr class="hit"><td class="line">87</td><td class="hits">139</td><td class="source"> context.resources = filterDuplicates(context);</td></tr><tr class="hit"><td class="line">88</td><td class="hits">139</td><td class="source"> context.moduleResources = undefined;</td></tr><tr class="hit"><td class="line">89</td><td class="hits">139</td><td class="source"> combineResources(context, {</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> module: context.module.name</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> complete);</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">94</td><td class="hits">60</td><td class="source"> context.combineResources = context.combineResources || {};</td></tr><tr class="hit"><td class="line">95</td><td class="hits">60</td><td class="source"> context.combineResources[context.module.name] = filterDuplicates(context);</td></tr><tr class="hit"><td class="line">96</td><td class="hits">60</td><td class="source"> context.moduleResources = undefined;</td></tr><tr class="hit"><td class="line">97</td><td class="hits">60</td><td class="source"> complete();</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"> }</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"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/mixin.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/mixin.js</h2><div id="stats" class="high"><div class="percentage">96%</div><div class="sloc">61</div><div class="hits">59</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 class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var _ = require('underscore');</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> priority: 1,</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"> loadConfig: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">7</td><td class="hits">138</td><td class="source"> var modules = context.config.attributes.modules,</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> errored;</td></tr><tr class="hit"><td class="line">9</td><td class="hits">138</td><td class="source"> _.each(context.libraries.configs, function(library) {</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> // Import any modules that are not overriden in the core file</td></tr><tr class="hit"><td class="line">11</td><td class="hits">79</td><td class="source"> _.each(library.modules, function(module, key) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">21</td><td class="source"> if (!_.has(modules, key)) {</td></tr><tr class="hit"><td class="line">13</td><td class="hits">11</td><td class="source"> module = modules[key] = _.clone(module);</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">15</td><td class="hits">11</td><td class="source"> ['scripts', 'styles', 'static', 'routes'].forEach(function(field) {</td></tr><tr class="hit"><td class="line">16</td><td class="hits">44</td><td class="source"> var value = module[field];</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"> // Deep(er) clone, updating file references</td></tr><tr class="hit"><td class="line">19</td><td class="hits">44</td><td class="source"> if (_.isArray(value)) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">13</td><td class="source"> module[field] = context.libraries.mapFiles(value, library);</td></tr><tr class="hit"><td class="line">21</td><td class="hits">31</td><td class="source"> } else if (value) {</td></tr><tr class="miss"><td class="line">22</td><td class="hits">0</td><td class="source"> module[field] = _.clone(value);</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><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"> </td></tr><tr class="hit"><td class="line">29</td><td class="hits">138</td><td class="source"> _.each(modules, function(module, name) {</td></tr><tr class="hit"><td class="line">30</td><td class="hits">168</td><td class="source"> module.name = module.name || name;</td></tr><tr class="hit"><td class="line">31</td><td class="hits">168</td><td class="source"> var mixins;</td></tr><tr class="hit"><td class="line">32</td><td class="hits">168</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">33</td><td class="hits">168</td><td class="source"> mixins = context.libraries.moduleMixins(module);</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">2</td><td class="source"> errored = true;</td></tr><tr class="hit"><td class="line">36</td><td class="hits">2</td><td class="source"> return complete(new Error('Failed mixins for module "' + name + '": ' + err.message));</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> }</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"> // Map existing files that have mixin references</td></tr><tr class="hit"><td class="line">40</td><td class="hits">166</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">41</td><td class="hits">166</td><td class="source"> ['scripts', 'styles', 'static'].forEach(function(field) {</td></tr><tr class="hit"><td class="line">42</td><td class="hits">496</td><td class="source"> var list = module[field];</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">44</td><td class="hits">496</td><td class="source"> if (list) {</td></tr><tr class="hit"><td class="line">45</td><td class="hits">126</td><td class="source"> module[field] = context.libraries.mapFiles(list);</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 class="hit"><td class="line">49</td><td class="hits">165</td><td class="source"> _.each(mixins, function(mixin) {</td></tr><tr class="hit"><td class="line">50</td><td class="hits">48</td><td class="source"> var mixinConfig = mixin.mixinConfig,</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> library = mixin.library;</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"> // Direct copy for any fields that are not already defined on the object.</td></tr><tr class="hit"><td class="line">54</td><td class="hits">48</td><td class="source"> _.defaults(module, library.attributes);</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"> // Merge known array/object types</td></tr><tr class="hit"><td class="line">57</td><td class="hits">48</td><td class="source"> ['scripts', 'styles', 'static', 'routes'].forEach(function(field) {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">192</td><td class="source"> mergeValues(module, field, library, mixinConfig, context);</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"> } catch (err) {</td></tr><tr class="hit"><td class="line">62</td><td class="hits">1</td><td class="source"> errored = true;</td></tr><tr class="hit"><td class="line">63</td><td class="hits">1</td><td class="source"> return complete(err);</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> }</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"> </td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> // Remove suppressed modules completely</td></tr><tr class="hit"><td class="line">68</td><td class="hits">138</td><td class="source"> _.each(_.keys(modules), function(name) {</td></tr><tr class="hit"><td class="line">69</td><td class="hits">168</td><td class="source"> if (!modules[name]) {</td></tr><tr class="hit"><td class="line">70</td><td class="hits">1</td><td class="source"> delete modules[name];</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"> });</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">74</td><td class="hits">138</td><td class="source"> if (!errored) {</td></tr><tr class="hit"><td class="line">75</td><td class="hits">135</td><td class="source"> next(complete);</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> }</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><tr class="hit"><td class="line">80</td><td class="hits">1</td><td class="source">function firstLocal(collection) {</td></tr><tr class="hit"><td class="line">81</td><td class="hits">58</td><td class="source"> for (var i = 0, len = collection.length; i < len; i++) {</td></tr><tr class="hit"><td class="line">82</td><td class="hits">73</td><td class="source"> if (!collection[i].global) {</td></tr><tr class="hit"><td class="line">83</td><td class="hits">58</td><td class="source"> return i;</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">86</td><td class="hits">0</td><td class="source"> return i;</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">89</td><td class="hits">1</td><td class="source">function mergeValues(module, field, library, mixinConfig, context) {</td></tr><tr class="hit"><td class="line">90</td><td class="hits">192</td><td class="source"> var value = module[field],</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> mixinValue = library.attributes[field];</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">192</td><td class="source"> if (!value) {</td></tr><tr class="hit"><td class="line">94</td><td class="hits">137</td><td class="source"> return;</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">97</td><td class="hits">55</td><td class="source"> if (value === mixinValue) {</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> // Clone any direct copy entries from a mixin</td></tr><tr class="hit"><td class="line">99</td><td class="hits">16</td><td class="source"> if (_.isArray(value)) {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">14</td><td class="source"> module[field] = context.libraries.mapFiles(value, library, mixinConfig);</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">102</td><td class="hits">2</td><td class="source"> module[field] = _.clone(value);</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">39</td><td class="source"> } else if (!_.isArray(value)) {</td></tr><tr class="hit"><td class="line">105</td><td class="hits">5</td><td class="source"> _.defaults(value, mixinValue);</td></tr><tr class="hit"><td class="line">106</td><td class="hits">34</td><td class="source"> } else if (mixinValue) {</td></tr><tr class="hit"><td class="line">107</td><td class="hits">29</td><td class="source"> mixinValue = context.libraries.mapFiles(mixinValue, library, mixinConfig);</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">109</td><td class="hits">29</td><td class="source"> var mixinFirstLocal = firstLocal(mixinValue),</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> moduleFirstLocal = firstLocal(value);</td></tr><tr><td class="line">111</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">112</td><td class="hits">29</td><td class="source"> if (mixinFirstLocal) {</td></tr><tr class="hit"><td class="line">113</td><td class="hits">4</td><td class="source"> value.unshift.apply(value, mixinValue.slice(0, mixinFirstLocal));</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">29</td><td class="source"> if (mixinFirstLocal < mixinValue.length) {</td></tr><tr class="hit"><td class="line">116</td><td class="hits">29</td><td class="source"> var locals = mixinValue.slice(mixinFirstLocal);</td></tr><tr class="hit"><td class="line">117</td><td class="hits">29</td><td class="source"> locals.unshift(mixinFirstLocal + moduleFirstLocal, 0);</td></tr><tr class="hit"><td class="line">118</td><td class="hits">29</td><td class="source"> value.splice.apply(value, locals);</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></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/module-map.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/module-map.js</h2><div id="stats" class="high"><div class="percentage">87%</div><div class="sloc">124</div><div class="hits">108</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> handlebars = require('handlebars'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> fs = require('fs'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> dirname = path.dirname;</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">var moduleMapTemplate;</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source">function getModuleMapTemplate() {</td></tr><tr class="hit"><td class="line">11</td><td class="hits">17</td><td class="source"> if (!moduleMapTemplate) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source"> moduleMapTemplate = handlebars.compile(fs.readFileSync(__dirname + '/module-map.handlebars').toString());</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">14</td><td class="hits">17</td><td class="source"> return moduleMapTemplate;</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><td class="line">17</td><td class="hits"></td><td class="source">// Force template load before EMFILE may be an issue</td></tr><tr class="hit"><td class="line">18</td><td class="hits">1</td><td class="source">getModuleMapTemplate();</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">function loadModuleMap(map, mapper, callback) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">16</td><td class="source"> var moduleMapTemplate = getModuleMapTemplate();</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> // This bit of voodoo forces uniform ordering for the output under node. This is used primarily for</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> // testing purposes.</td></tr><tr class="hit"><td class="line">25</td><td class="hits">16</td><td class="source"> map = (function orderObject(map) {</td></tr><tr class="hit"><td class="line">26</td><td class="hits">94</td><td class="source"> var ret = _.isArray(map) ? [] : {};</td></tr><tr class="hit"><td class="line">27</td><td class="hits">94</td><td class="source"> _.keys(map).sort().forEach(function(key) {</td></tr><tr class="hit"><td class="line">28</td><td class="hits">167</td><td class="source"> var value = map[key];</td></tr><tr class="hit"><td class="line">29</td><td class="hits">167</td><td class="source"> ret[key] = _.isObject(value) ? orderObject(value) : value;</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">31</td><td class="hits">94</td><td class="source"> return ret;</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> })(map);</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">16</td><td class="source"> callback(</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> undefined,</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> moduleMapTemplate({</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> moduleMapper: mapper,</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> map: JSON.stringify(map)</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> );</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">1</td><td class="source">function buildMap(context, callback) {</td></tr><tr class="hit"><td class="line">44</td><td class="hits">38</td><td class="source"> if (context.combined) {</td></tr><tr class="hit"><td class="line">45</td><td class="hits">15</td><td class="source"> moduleConfig(context, undefined, function(err, config, prefix) {</td></tr><tr class="hit"><td class="line">46</td><td class="hits">15</td><td class="source"> callback(err, { base: config }, prefix);</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"> } else {</td></tr><tr class="hit"><td class="line">49</td><td class="hits">23</td><td class="source"> var attr = context.config.attributes || {},</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> app = attr.application || {},</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> modules = context.config.moduleList(context.package);</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">53</td><td class="hits">23</td><td class="source"> var map = {modules: {}, routes: {}},</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> commonPrefix;</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">23</td><td class="source"> async.forEach(modules, function(module, callback) {</td></tr><tr class="hit"><td class="line">57</td><td class="hits">32</td><td class="source"> moduleConfig(context, module, function(err, config, prefix) {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">32</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">59</td><td class="hits">0</td><td class="source"> return callback(err);</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 class="hit"><td class="line">62</td><td class="hits">32</td><td class="source"> if (app.module === module) {</td></tr><tr class="hit"><td class="line">63</td><td class="hits">4</td><td class="source"> map.base = config;</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">65</td><td class="hits">28</td><td class="source"> map.modules[module] = config;</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">67</td><td class="hits">28</td><td class="source"> var routes = context.config.routeList(module);</td></tr><tr class="hit"><td class="line">68</td><td class="hits">28</td><td class="source"> _.each(routes, function(value, route) {</td></tr><tr class="hit"><td class="line">69</td><td class="hits">29</td><td class="source"> map.routes[route] = module;</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><tr class="hit"><td class="line">72</td><td class="hits">32</td><td class="source"> commonPrefix = findPrefix(prefix, commonPrefix);</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">74</td><td class="hits">32</td><td class="source"> callback();</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> function(err) {</td></tr><tr class="hit"><td class="line">78</td><td class="hits">23</td><td class="source"> callback(err, map, commonPrefix);</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 class="hit"><td class="line">83</td><td class="hits">1</td><td class="source">function stripPrefix(map, prefix) {</td></tr><tr class="hit"><td class="line">84</td><td class="hits">16</td><td class="source"> if (!prefix) {</td></tr><tr class="hit"><td class="line">85</td><td class="hits">15</td><td class="source"> return;</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">88</td><td class="hits">1</td><td class="source"> function stripModule(module) {</td></tr><tr class="miss"><td class="line">89</td><td class="hits">0</td><td class="source"> if (module.js) {</td></tr><tr class="miss"><td class="line">90</td><td class="hits">0</td><td class="source"> module.js = stripList(module.js);</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">92</td><td class="hits">0</td><td class="source"> if (module.css) {</td></tr><tr class="miss"><td class="line">93</td><td class="hits">0</td><td class="source"> module.css = stripList(module.css);</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">96</td><td class="hits">1</td><td class="source"> function stripList(list) {</td></tr><tr class="miss"><td class="line">97</td><td class="hits">0</td><td class="source"> if (_.isArray(list)) {</td></tr><tr class="miss"><td class="line">98</td><td class="hits">0</td><td class="source"> return list.map(stripEntry);</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">100</td><td class="hits">0</td><td class="source"> return stripEntry(list);</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"> }</td></tr><tr class="hit"><td class="line">103</td><td class="hits">1</td><td class="source"> function stripEntry(entry) {</td></tr><tr class="miss"><td class="line">104</td><td class="hits">0</td><td class="source"> if (entry.href) {</td></tr><tr class="miss"><td class="line">105</td><td class="hits">0</td><td class="source"> entry.href = entry.href.substring(prefix.length);</td></tr><tr class="miss"><td class="line">106</td><td class="hits">0</td><td class="source"> return entry;</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">108</td><td class="hits">0</td><td class="source"> return entry.substring(prefix.length);</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">1</td><td class="source"> if (map.base) {</td></tr><tr class="miss"><td class="line">112</td><td class="hits">0</td><td class="source"> stripModule(map.base);</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">114</td><td class="hits">1</td><td class="source"> if (map.modules) {</td></tr><tr class="miss"><td class="line">115</td><td class="hits">0</td><td class="source"> _.each(map.modules, stripModule);</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source">}</td></tr><tr class="hit"><td class="line">118</td><td class="hits">1</td><td class="source">function moduleConfig(context, module, callback) {</td></tr><tr class="hit"><td class="line">119</td><td class="hits">47</td><td class="source"> var ret = {},</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> commonPrefix,</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> preload = module && context.config.module(module).preload,</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> depends = module && context.config.module(module).depends;</td></tr><tr class="hit"><td class="line">123</td><td class="hits">47</td><td class="source"> if (preload) {</td></tr><tr class="hit"><td class="line">124</td><td class="hits">1</td><td class="source"> ret.preload = preload;</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">47</td><td class="source"> if (depends) {</td></tr><tr class="hit"><td class="line">127</td><td class="hits">4</td><td class="source"> ret.depends = depends;</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">129</td><td class="hits">47</td><td class="source"> async.forEach([{key: 'js', mode: 'scripts'}, {key: 'css', mode: 'styles'}], function(obj, callback) {</td></tr><tr class="hit"><td class="line">130</td><td class="hits">94</td><td class="source"> fileList(context, obj.mode, module, function(err, list, prefix) {</td></tr><tr class="hit"><td class="line">131</td><td class="hits">94</td><td class="source"> ret[obj.key] = list;</td></tr><tr class="hit"><td class="line">132</td><td class="hits">94</td><td class="source"> commonPrefix = findPrefix(prefix, commonPrefix);</td></tr><tr class="hit"><td class="line">133</td><td class="hits">94</td><td class="source"> callback(err);</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"> },</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> function(err) {</td></tr><tr class="hit"><td class="line">137</td><td class="hits">47</td><td class="source"> callback(err, ret, commonPrefix);</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 class="hit"><td class="line">140</td><td class="hits">1</td><td class="source">function fileList(context, mode, module, callback) {</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> // Check to see if we even have this type of resource</td></tr><tr class="hit"><td class="line">142</td><td class="hits">94</td><td class="source"> var modules = !context.combined ? [ module ] : context.config.moduleList(context.package);</td></tr><tr class="hit"><td class="line">143</td><td class="hits">94</td><td class="source"> async.some(modules, function(module, callback) {</td></tr><tr class="hit"><td class="line">144</td><td class="hits">124</td><td class="source"> var resourceContext = context.clone();</td></tr><tr class="hit"><td class="line">145</td><td class="hits">124</td><td class="source"> resourceContext.mode = mode;</td></tr><tr class="hit"><td class="line">146</td><td class="hits">124</td><td class="source"> resourceContext.module = context.config.module(module);</td></tr><tr class="hit"><td class="line">147</td><td class="hits">124</td><td class="source"> resourceContext.isModuleMap = true;</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">124</td><td class="source"> resourceContext.plugins.moduleResources(resourceContext, function(err, resources) {</td></tr><tr class="hit"><td class="line">150</td><td class="hits">124</td><td class="source"> callback((resources || []).length);</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"> },</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> function(hasResource) {</td></tr><tr class="hit"><td class="line">154</td><td class="hits">94</td><td class="source"> if (!hasResource) {</td></tr><tr class="hit"><td class="line">155</td><td class="hits">15</td><td class="source"> return callback();</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"> </td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> // Output the config</td></tr><tr class="hit"><td class="line">159</td><td class="hits">79</td><td class="source"> context.fileNamesForModule(mode, module, function(err, configs) {</td></tr><tr class="hit"><td class="line">160</td><td class="hits">79</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">161</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">163</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">164</td><td class="hits">79</td><td class="source"> var prefix;</td></tr><tr class="hit"><td class="line">165</td><td class="hits">184</td><td class="source"> configs = configs.filter(function(config) { return !config.server; });</td></tr><tr class="hit"><td class="line">166</td><td class="hits">105</td><td class="source"> configs = configs.sort(function(a, b) { return a.pixelDensity - b.pixelDensity; });</td></tr><tr class="hit"><td class="line">167</td><td class="hits">79</td><td class="source"> configs = configs.map(function(config, i) {</td></tr><tr class="hit"><td class="line">168</td><td class="hits">105</td><td class="source"> var path = config.fileName.path,</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> ret = path + '.' + config.fileName.extension;</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">171</td><td class="hits">105</td><td class="source"> if (config.pixelDensity) {</td></tr><tr class="hit"><td class="line">172</td><td class="hits">61</td><td class="source"> ret = { href: ret };</td></tr><tr class="hit"><td class="line">173</td><td class="hits">61</td><td class="source"> if (0 < i) {</td></tr><tr class="hit"><td class="line">174</td><td class="hits">26</td><td class="source"> ret.minRatio = configs[i - 1].pixelDensity + (config.pixelDensity - configs[i - 1].pixelDensity) / 2;</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">176</td><td class="hits">61</td><td class="source"> if (i < configs.length - 1) {</td></tr><tr class="hit"><td class="line">177</td><td class="hits">26</td><td class="source"> ret.maxRatio = config.pixelDensity + (configs[i + 1].pixelDensity - config.pixelDensity) / 2;</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"> // Update the prefix tracker</td></tr><tr class="hit"><td class="line">182</td><td class="hits">105</td><td class="source"> prefix = findPrefix(path, prefix);</td></tr><tr><td class="line">183</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">184</td><td class="hits">105</td><td class="source"> return ret;</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">187</td><td class="hits">79</td><td class="source"> var ret;</td></tr><tr class="hit"><td class="line">188</td><td class="hits">79</td><td class="source"> if (configs.length === 1) {</td></tr><tr class="hit"><td class="line">189</td><td class="hits">54</td><td class="source"> ret = configs[0];</td></tr><tr class="hit"><td class="line">190</td><td class="hits">25</td><td class="source"> } else if (configs.length) {</td></tr><tr class="hit"><td class="line">191</td><td class="hits">25</td><td class="source"> ret = configs;</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">193</td><td class="hits">79</td><td class="source"> callback(undefined, ret, prefix);</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> });</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">}</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">1</td><td class="source">function findPrefix(path, prefix) {</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> /*jshint eqnull:true*/</td></tr><tr class="hit"><td class="line">200</td><td class="hits">231</td><td class="source"> if (path == null) {</td></tr><tr class="hit"><td class="line">201</td><td class="hits">15</td><td class="source"> return prefix;</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">203</td><td class="hits">216</td><td class="source"> if (prefix == null) {</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> // Ensure that we get 'x' for strings of type 'x/'</td></tr><tr class="hit"><td class="line">205</td><td class="hits">149</td><td class="source"> prefix = dirname(path + 'a') + '/';</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">216</td><td class="source"> for (var i = 0, len = prefix.length; i < len; i++) {</td></tr><tr class="hit"><td class="line">208</td><td class="hits">149</td><td class="source"> if (path.charAt(i) !== prefix.charAt(i)) {</td></tr><tr class="hit"><td class="line">209</td><td class="hits">149</td><td class="source"> return prefix.substring(0, i);</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 class="hit"><td class="line">212</td><td class="hits">67</td><td class="source"> return prefix;</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"> </td></tr><tr class="hit"><td class="line">215</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">216</td><td class="hits"></td><td class="source"> mode: 'scripts',</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> priority: 50,</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> buildMap: buildMap,</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> resource: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">222</td><td class="hits">252</td><td class="source"> var config = context.config;</td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">224</td><td class="hits">252</td><td class="source"> if (context.resource['module-map']) {</td></tr><tr class="hit"><td class="line">225</td><td class="hits">21</td><td class="source"> var buildModuleMap = function(context, callback) {</td></tr><tr class="hit"><td class="line">226</td><td class="hits">16</td><td class="source"> module.exports.buildMap(context, function(err, map, prefix) {</td></tr><tr class="hit"><td class="line">227</td><td class="hits">16</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">228</td><td class="hits">0</td><td class="source"> callback(err);</td></tr><tr><td class="line">229</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">230</td><td class="hits">16</td><td class="source"> var moduleMap = config.attributes.moduleMap || 'module.exports.moduleMap';</td></tr><tr class="hit"><td class="line">231</td><td class="hits">16</td><td class="source"> stripPrefix(map, prefix);</td></tr><tr class="hit"><td class="line">232</td><td class="hits">16</td><td class="source"> loadModuleMap(map, moduleMap, function(err, data) {</td></tr><tr class="hit"><td class="line">233</td><td class="hits">16</td><td class="source"> callback(err, data && {data: data, generated: true, noSeparator: true, ignoreWarnings: true});</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 class="hit"><td class="line">238</td><td class="hits">21</td><td class="source"> buildModuleMap.sourceFile = undefined;</td></tr><tr class="hit"><td class="line">239</td><td class="hits">21</td><td class="source"> complete(undefined, buildModuleMap);</td></tr><tr><td class="line">240</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">241</td><td class="hits">231</td><td class="source"> next(complete);</td></tr><tr><td class="line">242</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">243</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">244</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/package-config.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/package-config.js</h2><div id="stats" class="high"><div class="percentage">90%</div><div class="sloc">21</div><div class="hits">19</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 class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var handlebars = require('handlebars');</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">const DEFAULT_CONFIG_TEMPLATE = "{{{name}}} = {{{data}}};\n";</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var packageConfigTemplate = handlebars.compile(DEFAULT_CONFIG_TEMPLATE);</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">function loadPackageConfig(name, configFile, fileUtil, callback) {</td></tr><tr class="hit"><td class="line">7</td><td class="hits">16</td><td class="source"> if (!configFile) {</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source"> return callback(new Error('package_config.json specified without file being set'));</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> }</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">15</td><td class="source"> fileUtil.readFile(configFile, function(err, data) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">15</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">13</td><td class="hits">0</td><td class="source"> callback(new Error('Failed to load package config "' + configFile + '"\n\t' + err));</td></tr><tr class="miss"><td class="line">14</td><td class="hits">0</td><td class="source"> return;</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">15</td><td class="source"> callback(</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> undefined,</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> packageConfigTemplate({</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> name: name,</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> data: data</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> })</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><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 class="hit"><td class="line">27</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> mode: 'scripts',</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> priority: 50,</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> resource: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">290</td><td class="source"> var resource = context.resource;</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">290</td><td class="source"> if (resource['package-config']) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">17</td><td class="source"> var packageConfigGen = function(context, callback) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">16</td><td class="source"> var config = context.config,</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> options = context.options,</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> packageConfig = config.attributes.packageConfig || 'module.exports.config';</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">16</td><td class="source"> loadPackageConfig(packageConfig, options.packageConfigFile, context.fileUtil, function(err, data) {</td></tr><tr class="hit"><td class="line">41</td><td class="hits">16</td><td class="source"> callback(err, data && {data: data, inputs: [options.packageConfigFile], generated: true, noSeparator: true});</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 class="hit"><td class="line">44</td><td class="hits">17</td><td class="source"> packageConfigGen.sourceFile = undefined;</td></tr><tr class="hit"><td class="line">45</td><td class="hits">17</td><td class="source"> complete(undefined, packageConfigGen);</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">273</td><td class="source"> next(complete);</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"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/router.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/router.js</h2><div id="stats" class="high"><div class="percentage">95%</div><div class="sloc">22</div><div class="hits">21</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 handlebars = require('handlebars');</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">const TEMPLATE = '/* router : {{{name}}} */\nmodule.name = "{{{name}}}";\nmodule.routes = {{{routes}}};\n';</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var routerTemplate = handlebars.compile(TEMPLATE);</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">function loadRouter(context, name, routes, callback) {</td></tr><tr class="hit"><td class="line">7</td><td class="hits">14</td><td class="source"> callback(</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> undefined,</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> routerTemplate({</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> name: name,</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> routes: JSON.stringify(routes)</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"> );</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">module.exports = {</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> mode: 'scripts',</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> priority: 50,</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"> moduleResources: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">202</td><td class="source"> next(function(err, ret) {</td></tr><tr class="hit"><td class="line">22</td><td class="hits">202</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">23</td><td class="hits">0</td><td class="source"> return complete(err);</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"> // Generate the router if we have the info for it</td></tr><tr class="hit"><td class="line">27</td><td class="hits">202</td><td class="source"> var module = context.module;</td></tr><tr class="hit"><td class="line">28</td><td class="hits">202</td><td class="source"> if (module.routes) {</td></tr><tr class="hit"><td class="line">29</td><td class="hits">53</td><td class="source"> ret.unshift({ routes: module.routes });</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> }</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">202</td><td class="source"> complete(undefined, ret);</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> });</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"> resource: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">273</td><td class="source"> var resource = context.resource,</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> module = context.module.name;</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">273</td><td class="source"> if (resource.routes) {</td></tr><tr class="hit"><td class="line">40</td><td class="hits">21</td><td class="source"> var routerGen = function(context, callback) {</td></tr><tr class="hit"><td class="line">41</td><td class="hits">14</td><td class="source"> loadRouter(context, module, resource.routes, function(err, data) {</td></tr><tr class="hit"><td class="line">42</td><td class="hits">14</td><td class="source"> callback(err, data && {data: data, generated: true, noSeparator: true});</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><tr class="hit"><td class="line">45</td><td class="hits">21</td><td class="source"> routerGen.moduleStart = true;</td></tr><tr class="hit"><td class="line">46</td><td class="hits">21</td><td class="source"> routerGen.sourceFile = undefined;</td></tr><tr class="hit"><td class="line">47</td><td class="hits">21</td><td class="source"> complete(undefined, routerGen);</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">49</td><td class="hits">252</td><td class="source"> next(complete);</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></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/scope.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/scope.js</h2><div id="stats" class="high"><div class="percentage">97%</div><div class="sloc">108</div><div class="hits">105</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><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * Scope Plugin : Wrap javascript units in module scopes.</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"> * Config:</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> * root:</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> * scope:</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> * scope: Size of the smallest module scope. May be: 'module', 'resource', 'none'</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * template: Template used override the default module logic.</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * This may be an inline handlebars template or a reference to a handlebars file.</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> * Available fields:</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> * scope : Name of the javascript module</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> * isTopNamespace : Truthy if the current module is a top level namespace</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> * appName : Name of the application object</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> * yield : Location that the embedded javascript will be inserted</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> * aliases : Key value mapping of objects that will be imported into the module locally.</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> * This is useful for allowing minimization of commonly used objects such as the</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> * application object or common libraries.</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"> * root.scope may be set to the scope values as a shorthand.</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"> * Mixins:</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> * All fields may be mixed in. Template file references are converted to mixin space. The alias</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> * field will be mixed in per-key with the local definition taking priority.</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">25</td><td class="hits">1</td><td class="source">var _ = require('underscore');</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">1</td><td class="source">function getScope(attr) {</td></tr><tr class="hit"><td class="line">28</td><td class="hits">419</td><td class="source"> return (attr.scope && attr.scope.scope) || attr.scope;</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">1</td><td class="source">function toObj(obj) {</td></tr><tr class="hit"><td class="line">31</td><td class="hits">96</td><td class="source"> return _.isString(obj) ? {scope: obj} : obj;</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"> </td></tr><tr class="hit"><td class="line">34</td><td class="hits">1</td><td class="source">function generator(string) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">166</td><td class="source"> var ret = function(context, callback) { callback(undefined, {data: string, generated: true, noSeparator: true}); };</td></tr><tr class="hit"><td class="line">36</td><td class="hits">96</td><td class="source"> ret.stringValue = string;</td></tr><tr class="hit"><td class="line">37</td><td class="hits">96</td><td class="source"> ret.sourceFile = undefined;</td></tr><tr class="hit"><td class="line">38</td><td class="hits">96</td><td class="source"> ret.ignoreWarnings = true;</td></tr><tr class="hit"><td class="line">39</td><td class="hits">96</td><td class="source"> return ret;</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">42</td><td class="hits">1</td><td class="source">var scopeTemplateDelimiter = /\{?\{\{yield\}\}\}?/;</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">44</td><td class="hits">1</td><td class="source">function ensureModuleTemplates(context, complete) {</td></tr><tr class="hit"><td class="line">45</td><td class="hits">47</td><td class="source"> if (!context.configCache.moduleTemplate) {</td></tr><tr class="hit"><td class="line">46</td><td class="hits">30</td><td class="source"> var template = context.config.attributes.scope && context.config.attributes.scope.template;</td></tr><tr class="hit"><td class="line">47</td><td class="hits">30</td><td class="source"> if (!template) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">18</td><td class="source"> template = __dirname + '/scope-module.handlebars';</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 class="hit"><td class="line">51</td><td class="hits">30</td><td class="source"> context.fileUtil.loadTemplate(template, scopeTemplateDelimiter, function(err, templates) {</td></tr><tr class="hit"><td class="line">52</td><td class="hits">31</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">53</td><td class="hits">1</td><td class="source"> complete(err);</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">55</td><td class="hits">30</td><td class="source"> context.configCache.moduleTemplate = {</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> start: templates[0],</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> end: templates[1]</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">59</td><td class="hits">30</td><td class="source"> complete();</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"> } else {</td></tr><tr class="hit"><td class="line">63</td><td class="hits">17</td><td class="source"> complete();</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> }</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"> </td></tr><tr class="hit"><td class="line">67</td><td class="hits">1</td><td class="source">function wrapResources(resources, context) {</td></tr><tr class="hit"><td class="line">68</td><td class="hits">46</td><td class="source"> var cache = context.moduleCache;</td></tr><tr class="hit"><td class="line">69</td><td class="hits">46</td><td class="source"> if (!cache.scopeName) {</td></tr><tr class="hit"><td class="line">70</td><td class="hits">46</td><td class="source"> var app = context.config.attributes.application,</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> appName = app && app.name;</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">46</td><td class="source"> if (!appName || context.module.topLevelName || context.config.isAppModule(context.module)) {</td></tr><tr class="hit"><td class="line">74</td><td class="hits">32</td><td class="source"> cache.isTopNamespace = true;</td></tr><tr class="hit"><td class="line">75</td><td class="hits">32</td><td class="source"> cache.scopeName = context.module.topLevelName || appName || context.module.name;</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">77</td><td class="hits">14</td><td class="source"> cache.scopeName = appName + "['" + context.module.name + "']";</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">46</td><td class="source"> cache.appName = appName;</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"> // Wrap the module content in a javascript module</td></tr><tr class="hit"><td class="line">83</td><td class="hits">46</td><td class="source"> if (resources.length) {</td></tr><tr class="hit"><td class="line">84</td><td class="hits">46</td><td class="source"> function isModule(reference) {</td></tr><tr class="hit"><td class="line">85</td><td class="hits">26</td><td class="source"> var stripOperators = /['"\]]/g;</td></tr><tr class="hit"><td class="line">86</td><td class="hits">26</td><td class="source"> return reference === cache.scopeName</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> || (!cache.isTopNamespace</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> && reference.replace(stripOperators, '').substr(-context.module.name.length) === context.module.name);</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">91</td><td class="hits">46</td><td class="source"> var scope = context.config.attributes.scope || {},</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> // Call args calculation</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> aliasesHash = context.module.aliases === false ? {} : _.extend({}, scope.aliases, context.module.aliases),</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> aliases = _.pairs(aliasesHash),</td></tr><tr class="hit"><td class="line">96</td><td class="hits">16</td><td class="source"> aliases = _.filter(aliases, function(alias) { return alias[1]; }),</td></tr><tr class="hit"><td class="line">97</td><td class="hits">13</td><td class="source"> externals = _.filter(aliases, function(alias) { return !isModule(alias[1]); }),</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> aliasVars = _.pluck(externals, '0'),</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> callSpec = _.pluck(externals, '1'),</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> // Internal scope calculation</td></tr><tr class="hit"><td class="line">102</td><td class="hits">13</td><td class="source"> internals = _.filter(aliases, function(alias) { return isModule(alias[1]); }),</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> internalVars = _.pluck(internals, '0'),</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> internalScope = '';</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">106</td><td class="hits">46</td><td class="source"> callSpec.unshift('this');</td></tr><tr class="hit"><td class="line">107</td><td class="hits">46</td><td class="source"> if (cache.isTopNamespace) {</td></tr><tr class="hit"><td class="line">108</td><td class="hits">32</td><td class="source"> internalVars.unshift(cache.scopeName);</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">110</td><td class="hits">14</td><td class="source"> internalScope += cache.scopeName + ' = exports;';</td></tr><tr><td class="line">111</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">112</td><td class="hits">84</td><td class="source"> internalVars = _.map(internalVars, function(name) { return name + ' = exports'; });</td></tr><tr class="hit"><td class="line">113</td><td class="hits">46</td><td class="source"> if (internalVars.length) {</td></tr><tr class="hit"><td class="line">114</td><td class="hits">33</td><td class="source"> internalScope += 'var ' + internalVars.join(', ') + ';';</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"> </td></tr><tr class="hit"><td class="line">117</td><td class="hits">46</td><td class="source"> var scopeDecl = '';</td></tr><tr class="hit"><td class="line">118</td><td class="hits">46</td><td class="source"> if (context.moduleCache.isTopNamespace) {</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> // Insert the package declaration</td></tr><tr class="hit"><td class="line">120</td><td class="hits">32</td><td class="source"> scopeDecl = 'var ' + context.moduleCache.scopeName + ';';</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">122</td><td class="hits">46</td><td class="source"> var templateContext = {</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> isTopNamespace: cache.isTopNamespace,</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> name: cache.appName,</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> scopeDecl: scopeDecl,</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> scope: cache.scopeName,</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> aliasVars: aliasVars.join(', '),</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> internalScope: internalScope,</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> callSpec: callSpec.join(', ')</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">132</td><td class="hits">46</td><td class="source"> resources.unshift(generator(context.configCache.moduleTemplate.start(templateContext)));</td></tr><tr class="hit"><td class="line">133</td><td class="hits">46</td><td class="source"> resources.push(generator(context.configCache.moduleTemplate.end(templateContext)));</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">135</td><td class="hits">46</td><td class="source"> return resources;</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><tr class="hit"><td class="line">138</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> mode: 'scripts',</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> priority: 50,</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"> loadMixin: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">143</td><td class="hits">84</td><td class="source"> var mixinScope = toObj(context.loadedLibrary.scope);</td></tr><tr class="hit"><td class="line">144</td><td class="hits">84</td><td class="source"> if (mixinScope) {</td></tr><tr class="hit"><td class="line">145</td><td class="hits">6</td><td class="source"> var scope = toObj(context.libraries.originalConfig.scope || {}),</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> configScope = toObj(_.clone(context.config.attributes.scope || scope)),</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> assigned = false;</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">6</td><td class="source"> if (('scope' in mixinScope) && !('scope' in scope)) {</td></tr><tr class="hit"><td class="line">150</td><td class="hits">2</td><td class="source"> configScope.scope = mixinScope.scope;</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">2</td><td class="source"> assigned = true;</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"> </td></tr><tr class="hit"><td class="line">155</td><td class="hits">6</td><td class="source"> if (('template' in mixinScope) && !('template' in scope)) {</td></tr><tr class="hit"><td class="line">156</td><td class="hits">3</td><td class="source"> configScope.template = (context.loadedLibrary.root || '') + mixinScope.template;</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">158</td><td class="hits">3</td><td class="source"> assigned = true;</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"> </td></tr><tr class="hit"><td class="line">161</td><td class="hits">6</td><td class="source"> if (context.libraries.mergeHash('aliases', scope, mixinScope, configScope)) {</td></tr><tr class="hit"><td class="line">162</td><td class="hits">3</td><td class="source"> assigned = true;</td></tr><tr><td class="line">163</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">165</td><td class="hits">6</td><td class="source"> if (assigned) {</td></tr><tr class="hit"><td class="line">166</td><td class="hits">4</td><td class="source"> context.config.attributes.scope = configScope;</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"> }</td></tr><tr class="hit"><td class="line">169</td><td class="hits">84</td><td class="source"> next(complete);</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">171</td><td class="hits"></td><td class="source"> loadConfig: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">172</td><td class="hits">135</td><td class="source"> var modules = context.config.attributes.modules;</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">135</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">175</td><td class="hits">135</td><td class="source"> _.each(modules, function(module) {</td></tr><tr class="hit"><td class="line">176</td><td class="hits">162</td><td class="source"> var mixins = context.libraries.moduleMixins(module);</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">178</td><td class="hits">162</td><td class="source"> _.each(mixins, function(mixin) {</td></tr><tr class="hit"><td class="line">179</td><td class="hits">48</td><td class="source"> context.libraries.mergeHash('aliases', module, mixin.library.attributes, module);</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"> });</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr class="miss"><td class="line">183</td><td class="hits">0</td><td class="source"> return complete(err);</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> }</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">135</td><td class="source"> next(complete);</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> resourceList: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">190</td><td class="hits">315</td><td class="source"> next(function(err, resources) {</td></tr><tr class="hit"><td class="line">191</td><td class="hits">315</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">192</td><td class="hits">0</td><td class="source"> return complete(err);</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">195</td><td class="hits">315</td><td class="source"> if (getScope(context.config.attributes) === 'resource'</td></tr><tr><td class="line">196</td><td class="hits"></td><td class="source"> && !context.resource.global</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> && !context.resource.dir) {</td></tr><tr class="hit"><td class="line">198</td><td class="hits">2</td><td class="source"> resources.unshift(generator('(function() {\n'));</td></tr><tr class="hit"><td class="line">199</td><td class="hits">2</td><td class="source"> resources.push(generator('}).call(this);\n'));</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">201</td><td class="hits">315</td><td class="source"> complete(undefined, resources);</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">203</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source"> module: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">206</td><td class="hits">104</td><td class="source"> next(function(err) {</td></tr><tr class="hit"><td class="line">207</td><td class="hits">104</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">208</td><td class="hits">0</td><td class="source"> return complete(err);</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 class="hit"><td class="line">211</td><td class="hits">104</td><td class="source"> var resources = context.moduleResources,</td></tr><tr><td class="line">212</td><td class="hits"></td><td class="source"> scope = getScope(context.config.attributes);</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">214</td><td class="hits">104</td><td class="source"> if (resources.length && scope !== 'none') {</td></tr><tr class="hit"><td class="line">215</td><td class="hits">47</td><td class="source"> ensureModuleTemplates(context, function(err) {</td></tr><tr class="hit"><td class="line">216</td><td class="hits">48</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">217</td><td class="hits">1</td><td class="source"> complete(err);</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source"> } else {</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> // Split up globals and non-globals</td></tr><tr class="hit"><td class="line">220</td><td class="hits">47</td><td class="source"> var globals = [],</td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> children = [],</td></tr><tr><td class="line">222</td><td class="hits"></td><td class="source"> moduleStart = [];</td></tr><tr class="hit"><td class="line">223</td><td class="hits">47</td><td class="source"> for (var i = 0; i < resources.length; i++) {</td></tr><tr class="hit"><td class="line">224</td><td class="hits">160</td><td class="source"> var resource = resources[i];</td></tr><tr class="hit"><td class="line">225</td><td class="hits">160</td><td class="source"> if (resource.moduleStart) {</td></tr><tr class="hit"><td class="line">226</td><td class="hits">13</td><td class="source"> moduleStart.push(resource);</td></tr><tr class="hit"><td class="line">227</td><td class="hits">147</td><td class="source"> } else if (!resource.global) {</td></tr><tr class="hit"><td class="line">228</td><td class="hits">131</td><td class="source"> children.push(resource);</td></tr><tr><td class="line">229</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">230</td><td class="hits">16</td><td class="source"> if (children.length) {</td></tr><tr class="hit"><td class="line">231</td><td class="hits">1</td><td class="source"> throw new Error('Scoped files may not appear before global files.\n' + _.map(children, function(resource) {</td></tr><tr class="hit"><td class="line">232</td><td class="hits">1</td><td class="source"> return resource.stringValue || resource.sourceFile || resource.src || resource;</td></tr><tr><td class="line">233</td><td class="hits"></td><td class="source"> }).join(', ') + ', ' + (resource.src || resource));</td></tr><tr><td class="line">234</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">235</td><td class="hits">15</td><td class="source"> globals.push(resource);</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"> </td></tr><tr class="hit"><td class="line">239</td><td class="hits">46</td><td class="source"> children = moduleStart.concat(children);</td></tr><tr class="hit"><td class="line">240</td><td class="hits">46</td><td class="source"> globals.push.apply(globals, wrapResources(children, context, complete));</td></tr><tr><td class="line">241</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">242</td><td class="hits">46</td><td class="source"> context.moduleResources = globals;</td></tr><tr class="hit"><td class="line">243</td><td class="hits">46</td><td class="source"> complete();</td></tr><tr><td class="line">244</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">246</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">247</td><td class="hits">57</td><td class="source"> complete();</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">249</td><td class="hits"></td><td class="source"> });</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><tr><td class="line">252</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">253</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/scripts-output.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/scripts-output.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">2</div><div class="hits">2</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">var _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> manyToOne = require('./many-to-one-output');</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">module.exports = _.extend({ mode: 'scripts' }, manyToOne);</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="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/scripts.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/scripts.js</h2><div id="stats" class="high"><div class="percentage">80%</div><div class="sloc">5</div><div class="hits">4</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">module.exports = {</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> mode: 'scripts',</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> priority: 99,</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"> fileFilter: function(context, next) {</td></tr><tr class="miss"><td class="line">6</td><td class="hits">0</td><td class="source"> return /\.(js|json)$/;</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"> fileName: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">10</td><td class="hits">113</td><td class="source"> complete(undefined, {path: context.baseName, extension: 'js'});</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><td class="line">13</td><td class="hits"></td><td class="source"> moduleResources: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">202</td><td class="source"> var module = context.module;</td></tr><tr class="hit"><td class="line">15</td><td class="hits">202</td><td class="source"> complete(undefined, (module.scripts || module.files || (module.slice && module) || []).slice());</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> }</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></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/server-scripts.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/server-scripts.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">29</div><div class="hits">29</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">var _ = require('underscore');</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> mode: 'scripts',</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> priority: 98, // Just below the core scripts plugin....</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"> fileFilter: function(context, next) {</td></tr><tr class="hit"><td class="line">8</td><td class="hits">141</td><td class="source"> return /\.(js|json)$/;</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> },</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"> outputConfigs: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">108</td><td class="source"> next(function(err, files) {</td></tr><tr class="hit"><td class="line">13</td><td class="hits">108</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source"> return complete(err);</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><td class="line">17</td><td class="hits"></td><td class="source"> // Permutation of other configs and ours</td></tr><tr class="hit"><td class="line">18</td><td class="hits">107</td><td class="source"> var ret = [];</td></tr><tr class="hit"><td class="line">19</td><td class="hits">107</td><td class="source"> files.forEach(function(fileConfig) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">109</td><td class="source"> [true, false].forEach(function(server) {</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> // If they did not opt into server mode then we want to only emit non-server</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> // mode</td></tr><tr class="hit"><td class="line">23</td><td class="hits">218</td><td class="source"> if (context.config.attributes.server || !server) {</td></tr><tr class="hit"><td class="line">24</td><td class="hits">111</td><td class="source"> var config = _.clone(fileConfig);</td></tr><tr class="hit"><td class="line">25</td><td class="hits">111</td><td class="source"> config.server = server;</td></tr><tr class="hit"><td class="line">26</td><td class="hits">111</td><td class="source"> ret.push(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"> });</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">107</td><td class="source"> complete(undefined, ret);</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"> </td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> fileName: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">115</td><td class="source"> next(function(err, ret) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">115</td><td class="source"> if (ret && context.fileConfig.server) {</td></tr><tr class="hit"><td class="line">37</td><td class="hits">1</td><td class="source"> ret.path += '-server';</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">115</td><td class="source"> complete(err, ret);</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> });</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"> moduleResources: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">44</td><td class="hits">208</td><td class="source"> var module = context.module;</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">46</td><td class="hits">208</td><td class="source"> if (module.server && context.fileConfig.server) {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">1</td><td class="source"> return complete(undefined, module.server);</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 class="hit"><td class="line">50</td><td class="hits">207</td><td class="source"> next(function(err, scripts) {</td></tr><tr class="hit"><td class="line">51</td><td class="hits">207</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">52</td><td class="hits">1</td><td class="source"> return complete(err);</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><tr class="hit"><td class="line">55</td><td class="hits">206</td><td class="source"> var files = [];</td></tr><tr class="hit"><td class="line">56</td><td class="hits">206</td><td class="source"> _.each(scripts, function(script) {</td></tr><tr class="hit"><td class="line">57</td><td class="hits">483</td><td class="source"> if (!_.has(script, 'server') || script.server === context.fileConfig.server) {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">481</td><td class="source"> files.push(script);</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 class="hit"><td class="line">61</td><td class="hits">206</td><td class="source"> complete(undefined, files);</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">};</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/static-output.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/static-output.js</h2><div id="stats" class="high"><div class="percentage">88%</div><div class="sloc">17</div><div class="hits">15</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 class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var async = require('async');</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> mode: 'static',</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> priority: 1,</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"> module: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">8</td><td class="hits">76</td><td class="source"> next(function(err) {</td></tr><tr class="hit"><td class="line">9</td><td class="hits">76</td><td class="source"> async.forEach(context.moduleResources, function(resource, callback) {</td></tr><tr class="hit"><td class="line">10</td><td class="hits">28</td><td class="source"> var fileContext = context.clone();</td></tr><tr class="hit"><td class="line">11</td><td class="hits">28</td><td class="source"> fileContext.resource = resource;</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"> // Filter out dir entries</td></tr><tr class="hit"><td class="line">14</td><td class="hits">28</td><td class="source"> if (resource.dir) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">2</td><td class="source"> return callback();</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> }</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">26</td><td class="source"> fileContext.outputFile(function(callback) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">26</td><td class="source"> var fileInfo = fileContext.loadResource(resource, function(err, data) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">26</td><td class="source"> if (err || !data || !data.content) {</td></tr><tr class="miss"><td class="line">21</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> }</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">26</td><td class="source"> var ret = {</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> fileName: fileContext.fileName,</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> inputs: fileInfo.inputs || [ fileInfo.name ],</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> module: context.module.name,</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> resource: resource</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"> </td></tr><tr class="hit"><td class="line">31</td><td class="hits">26</td><td class="source"> context.fileUtil.writeFile(fileContext.fileName, data.content, function(err) {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">26</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">33</td><td class="hits">0</td><td class="source"> err = new Error('Static output "' + fileContext.fileName + '" failed\n\t' + err);</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"> </td></tr><tr class="hit"><td class="line">36</td><td class="hits">26</td><td class="source"> callback(err, ret);</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> });</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"> },</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> callback);</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"> complete);</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><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></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/static.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/static.js</h2><div id="stats" class="high"><div class="percentage">92%</div><div class="sloc">25</div><div class="hits">23</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 class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var _ = require('underscore');</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">/*</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * Replace variables with actual values</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">function replaceVariables(str, context) {</td></tr><tr class="hit"><td class="line">7</td><td class="hits">78</td><td class="source"> return str.replace(/\#\{platform\}/, context.platform);</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"> </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"> * Make sure the directory name has a trailing slash</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">1</td><td class="source">function normalizeDirName(dirName) {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">2</td><td class="source"> if (dirName.match(/\/$/)) {</td></tr><tr class="miss"><td class="line">15</td><td class="hits">0</td><td class="source"> return dirName;</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">2</td><td class="source"> return dirName + '/';</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 class="hit"><td class="line">20</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> mode: 'static',</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> priority: 99,</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"> fileName: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">26</td><td class="source"> var resource = context.resource,</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> src = resource.src || resource.sourceFile,</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> dir = resource.dir;</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">26</td><td class="source"> var root = '';</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">31</td><td class="hits">26</td><td class="source"> if (resource.srcDir && resource.dest) {</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> // srcDir is some prefix of src - we want to append the remaining part or src to dest</td></tr><tr class="hit"><td class="line">33</td><td class="hits">2</td><td class="source"> src = src.substring(resource.srcDir.length + 1);</td></tr><tr class="hit"><td class="line">34</td><td class="hits">2</td><td class="source"> root += normalizeDirName(resource.dest);</td></tr><tr class="hit"><td class="line">35</td><td class="hits">24</td><td class="source"> } else if (resource.dest) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">19</td><td class="source"> src = resource.dest;</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> }</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">26</td><td class="source"> root = replaceVariables(root, context);</td></tr><tr class="hit"><td class="line">40</td><td class="hits">26</td><td class="source"> src = replaceVariables(src, context);</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">42</td><td class="hits">26</td><td class="source"> var components = /(.*?)(?:\.([^.]+))?$/.exec(src);</td></tr><tr class="hit"><td class="line">43</td><td class="hits">26</td><td class="source"> complete(undefined, {root: resource.root, path: root + components[1], extension: components[2]});</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"> resource: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">28</td><td class="source"> next(function(err, resource) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">28</td><td class="source"> if (_.isString(resource)) {</td></tr><tr class="miss"><td class="line">49</td><td class="hits">0</td><td class="source"> resource = replaceVariables(resource, context);</td></tr><tr class="hit"><td class="line">50</td><td class="hits">28</td><td class="source"> } else if (resource.src) {</td></tr><tr class="hit"><td class="line">51</td><td class="hits">26</td><td class="source"> resource.src = replaceVariables(resource.src, context);</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">53</td><td class="hits">28</td><td class="source"> complete(undefined, resource);</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> });</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">};</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/styles-output.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/styles-output.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">2</div><div class="hits">2</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">var _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> manyToOne = require('./many-to-one-output');</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">module.exports = _.extend({ mode: 'styles' }, manyToOne);</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="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/styles.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/styles.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">2</div><div class="hits">2</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"> mode: 'styles',</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> priority: 99,</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"> fileName: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">6</td><td class="hits">118</td><td class="source"> complete(undefined, {path: context.baseName, extension: 'css'});</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"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/stylus-config.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/stylus-config.js</h2><div id="stats" class="high"><div class="percentage">94%</div><div class="sloc">39</div><div class="hits">37</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 class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async');</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> mode: ['scripts', 'styles'],</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> priority: 25,</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"> loadMixin: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">9</td><td class="hits">84</td><td class="source"> var mixinStyles = context.loadedLibrary.styles;</td></tr><tr class="hit"><td class="line">10</td><td class="hits">84</td><td class="source"> if (mixinStyles) {</td></tr><tr class="hit"><td class="line">11</td><td class="hits">22</td><td class="source"> var styles = context.libraries.originalConfig.styles || {},</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> configStyles = _.clone(context.config.attributes.styles || styles),</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> assigned = false;</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">15</td><td class="hits">22</td><td class="source"> ['configObject'].forEach(function(key) {</td></tr><tr class="hit"><td class="line">16</td><td class="hits">22</td><td class="source"> if ((key in mixinStyles) && !(key in styles)) {</td></tr><tr class="hit"><td class="line">17</td><td class="hits">1</td><td class="source"> configStyles[key] = mixinStyles[key];</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"> assigned = true;</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><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">22</td><td class="source"> if (context.libraries.mergeFiles('config', styles, mixinStyles, configStyles, context.loadedLibrary)) {</td></tr><tr class="hit"><td class="line">24</td><td class="hits">4</td><td class="source"> assigned = true;</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 class="hit"><td class="line">27</td><td class="hits">22</td><td class="source"> if (assigned) {</td></tr><tr class="hit"><td class="line">28</td><td class="hits">4</td><td class="source"> context.config.attributes.styles = configStyles;</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"> }</td></tr><tr class="hit"><td class="line">31</td><td class="hits">84</td><td class="source"> next(complete);</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"> </td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> resource: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">433</td><td class="source"> if (context.resource['stylus-config']) {</td></tr><tr class="hit"><td class="line">36</td><td class="hits">3</td><td class="source"> var configGenerator = function(context, callback) {</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> // TODO : Load and output the JSON config options</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> // We can use normal JSON.parse here as stylus uses this -> we can call extend as part of the build</td></tr><tr class="hit"><td class="line">39</td><td class="hits">3</td><td class="source"> var styles = context.config.attributes.styles || {},</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> configFiles = styles.config || [],</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> stylusConfig = styles.configObject || 'module.exports.stylusConfig';</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">9</td><td class="source"> configFiles = _.map(configFiles, function(config) { return config.src || config; });</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">45</td><td class="hits">3</td><td class="source"> async.map(configFiles,</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> function(config, callback) {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">6</td><td class="source"> context.fileUtil.readFile(config, function(err, data) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">6</td><td class="source"> callback(err, data);</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"> function(err, data) {</td></tr><tr class="hit"><td class="line">52</td><td class="hits">3</td><td class="source"> if (data) {</td></tr><tr class="hit"><td class="line">53</td><td class="hits">3</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">54</td><td class="hits">3</td><td class="source"> var config = _.reduce(data, function(config, json) {</td></tr><tr class="hit"><td class="line">55</td><td class="hits">6</td><td class="source"> return _.extend(config, JSON.parse(json));</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> }, {});</td></tr><tr class="hit"><td class="line">57</td><td class="hits">3</td><td class="source"> data = {data: stylusConfig + ' = ' + JSON.stringify(config) + ';\n', inputs: configFiles, noSeparator: true};</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> } catch (parseError) {</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> // TODO : Better error handling here?</td></tr><tr class="miss"><td class="line">60</td><td class="hits">0</td><td class="source"> err = parseError;</td></tr><tr class="miss"><td class="line">61</td><td class="hits">0</td><td class="source"> data = undefined;</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 class="hit"><td class="line">64</td><td class="hits">3</td><td class="source"> callback(err, data);</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"> };</td></tr><tr class="hit"><td class="line">67</td><td class="hits">3</td><td class="source"> configGenerator.sourceFile = undefined;</td></tr><tr class="hit"><td class="line">68</td><td class="hits">3</td><td class="source"> complete(undefined, configGenerator);</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">70</td><td class="hits">430</td><td class="source"> next(complete);</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"> },</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> module: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">75</td><td class="hits">199</td><td class="source"> next(function() {</td></tr><tr class="hit"><td class="line">76</td><td class="hits">199</td><td class="source"> var styles = context.config.attributes.styles || {},</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> config = styles.config || [];</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">199</td><td class="source"> if (config.length) {</td></tr><tr class="hit"><td class="line">80</td><td class="hits">59</td><td class="source"> _.each(context.moduleResources, function(resource) {</td></tr><tr class="hit"><td class="line">81</td><td class="hits">218</td><td class="source"> if (resource.stylus) {</td></tr><tr class="hit"><td class="line">82</td><td class="hits">29</td><td class="source"> resource.plugins.push({</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> plugin: __dirname + '/stylus-config-worker',</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> data: config</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"> }</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">90</td><td class="hits">199</td><td class="source"> complete();</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/stylus.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/stylus.js</h2><div id="stats" class="high"><div class="percentage">94%</div><div class="sloc">131</div><div class="hits">124</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><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * Stylus Plugin : Compile stylus files.</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"> * Config:</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> * root:</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> * styles:</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> * includes: Array of paths to add to stylus includes.</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * pixelDensity: Defines the pixel densities generated for each plaform.</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * urlSizeLimit: Maximum file size to inline. Passed to stylus-images plugin</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> * copyFiles: Boolean specifying if non-inlined url references should be compied</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> * To the build directly. Passed to stylus-images plugin.</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> * styleRoot: Project path to resolve files from.</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> * useNib: Truthy to include nib in the project build</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"> * Mixins:</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> * All fields may be mixed in. In the case of conflicts the local config wins for simple values and</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> * for arrays the content will be merged in order. pixelDensity is mixed in at the platform definition</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> * level. File references are converted to mixin space.</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"> * styleRoot is used locally for file lookup when compiling the mixin content.</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">1</td><td class="source">var _ = require('underscore'),</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> ChildPool = require('child-pool'),</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> inlineStyles = require('./inline-styles'),</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> normalize = path.normalize,</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> fu = require('../fileUtil'),</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> resources = require('../util/resources');</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">// Forward cache resets to any workers</td></tr><tr class="hit"><td class="line">31</td><td class="hits">1</td><td class="source">fu.on('cache:reset', function(path) {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">259</td><td class="source"> worker.sendAll({type: 'cache:reset', path: path});</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source">});</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">35</td><td class="hits">1</td><td class="source">var worker = new ChildPool(__dirname + '/stylus-worker', {logId: 'stylus-worker'});</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">1</td><td class="source">function generateSource(context, options, styleConfig) {</td></tr><tr class="hit"><td class="line">38</td><td class="hits">38</td><td class="source"> var includes = (styleConfig.includes || []).concat(options.files),</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> module = options.module;</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">41</td><td class="hits">38</td><td class="source"> var nibLocation = includes.indexOf('nib'),</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> useNib;</td></tr><tr class="hit"><td class="line">43</td><td class="hits">38</td><td class="source"> if (styleConfig.useNib) {</td></tr><tr class="hit"><td class="line">44</td><td class="hits">31</td><td class="source"> useNib = true;</td></tr><tr class="hit"><td class="line">45</td><td class="hits">31</td><td class="source"> includes.unshift('nib');</td></tr><tr class="hit"><td class="line">46</td><td class="hits">7</td><td class="source"> } else if (nibLocation >= 0) {</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> // Special case nib handling to maintain backwards compatibility</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> // WARN: This may be deprecated in future releases</td></tr><tr class="miss"><td class="line">49</td><td class="hits">0</td><td class="source"> useNib = true;</td></tr><tr class="miss"><td class="line">50</td><td class="hits">0</td><td class="source"> includes.splice(nibLocation, 1);</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 class="hit"><td class="line">53</td><td class="hits">38</td><td class="source"> var declare = context.config.platformList().map(function(platform) {</td></tr><tr class="hit"><td class="line">54</td><td class="hits">73</td><td class="source"> return '$' + platform + ' = ' + (platform === context.platform);</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> }).join('\n') + '\n';</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">57</td><td class="hits">38</td><td class="source"> var mixins = [],</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> mixinLUT = {};</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">38</td><td class="source"> var source = declare + includes.map(function(include) {</td></tr><tr class="hit"><td class="line">61</td><td class="hits">127</td><td class="source"> var source = include.library;</td></tr><tr class="hit"><td class="line">62</td><td class="hits">127</td><td class="source"> var statement = '@import ("' + (include.originalSrc || include.src || include) + '")\n';</td></tr><tr class="hit"><td class="line">63</td><td class="hits">127</td><td class="source"> if (source) {</td></tr><tr class="hit"><td class="line">64</td><td class="hits">18</td><td class="source"> var name = '',</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> root = (source.parent || source).root || '',</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> stylusRoot = ((source.parent || source).styles || {}).styleRoot,</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> library = (source.parent || source).name || '';</td></tr><tr class="hit"><td class="line">68</td><td class="hits">18</td><td class="source"> if (source.parent) {</td></tr><tr class="hit"><td class="line">69</td><td class="hits">15</td><td class="source"> name = source.name || '';</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">71</td><td class="hits">18</td><td class="source"> var mixinName = name + '_' + library;</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">18</td><td class="source"> if (!mixinLUT[mixinName]) {</td></tr><tr class="hit"><td class="line">74</td><td class="hits">9</td><td class="source"> var overrides = resources.calcOverrides(source, function(library, src, ret) {</td></tr><tr class="hit"><td class="line">75</td><td class="hits">9</td><td class="source"> if (library && library.root) {</td></tr><tr class="hit"><td class="line">76</td><td class="hits">3</td><td class="source"> ret.root = normalize(library.root);</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 class="hit"><td class="line">79</td><td class="hits">9</td><td class="source"> if (library) {</td></tr><tr class="hit"><td class="line">80</td><td class="hits">3</td><td class="source"> var styles = library.styles || {};</td></tr><tr class="hit"><td class="line">81</td><td class="hits">3</td><td class="source"> ret.stylusRoot = styles.styleRoot;</td></tr><tr class="hit"><td class="line">82</td><td class="hits">3</td><td class="source"> if (ret.styleRoot) {</td></tr><tr class="miss"><td class="line">83</td><td class="hits">0</td><td class="source"> ret.styleRoot = normalize(ret.styleRoot);</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> }</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"> });</td></tr><tr class="hit"><td class="line">87</td><td class="hits">9</td><td class="source"> mixins.push({</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> root: normalize(root),</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> stylusRoot: stylusRoot && normalize(stylusRoot),</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> overrides: overrides</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">92</td><td class="hits">9</td><td class="source"> mixinLUT[mixinName] = mixins.length-1;</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">18</td><td class="source"> mixinName = mixinLUT[mixinName];</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">96</td><td class="hits">18</td><td class="source"> return 'push-mixin("' + mixinName + '")\n'</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> + statement</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> + 'pop-mixin()\n';</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">109</td><td class="source"> return statement;</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"> }).join('');</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">38</td><td class="source"> return {</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> useNib: useNib,</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> source: source,</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> mixins: mixins</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> };</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">1</td><td class="source">function compile(options, callback) {</td></tr><tr class="hit"><td class="line">112</td><td class="hits">38</td><td class="source"> var context = options.context,</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> styleConfig = context.config.attributes.styles || {};</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">116</td><td class="hits">38</td><td class="source"> var loadPrefix = context.config.loadPrefix(),</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> externalPrefix;</td></tr><tr class="hit"><td class="line">118</td><td class="hits">38</td><td class="source"> if (loadPrefix) {</td></tr><tr class="hit"><td class="line">119</td><td class="hits">9</td><td class="source"> externalPrefix = loadPrefix + (context.buildPath.indexOf('/') >= 0 ? path.dirname(context.buildPath) + '/' : '');</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 class="hit"><td class="line">122</td><td class="hits">38</td><td class="source"> var imageOptions = {</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> outdir: path.dirname(context.fileName),</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> resolutions: context.modeCache.pixelDensity,</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> limit: styleConfig.urlSizeLimit,</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> copyFiles: styleConfig.copyFiles,</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> externalPrefix: externalPrefix</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"> </td></tr><tr class="hit"><td class="line">130</td><td class="hits">38</td><td class="source"> var source = generateSource(context, options, styleConfig);</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">132</td><td class="hits">38</td><td class="source"> context.fileUtil.ensureDirs(context.fileName, function(err) {</td></tr><tr class="hit"><td class="line">133</td><td class="hits">38</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">134</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">137</td><td class="hits">38</td><td class="source"> worker.send({</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> plugins: options.plugins,</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"> useNib: source.useNib,</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> imageOptions: imageOptions,</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"> filename: options.filename,</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> minimize: context.options.minimize,</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> source: source.source,</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> mixins: source.mixins,</td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source"> lookupPath: context.fileUtil.lookupPath(),</td></tr><tr><td class="line">150</td><td class="hits"></td><td class="source"> styleRoot: styleConfig.styleRoot && context.fileUtil.resolvePath(styleConfig.styleRoot)</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"> callback);</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">}</td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">156</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> // scripts mode is used also to support inline styles</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> mode: ['styles', 'scripts'],</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> priority: 50,</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"> loadMixin: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">162</td><td class="hits">84</td><td class="source"> var mixinStyles = context.loadedLibrary.styles;</td></tr><tr class="hit"><td class="line">163</td><td class="hits">84</td><td class="source"> if (mixinStyles) {</td></tr><tr class="hit"><td class="line">164</td><td class="hits">22</td><td class="source"> var styles = context.libraries.originalConfig.styles || {},</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> configStyles = _.clone(context.config.attributes.styles || styles),</td></tr><tr><td class="line">166</td><td class="hits"></td><td class="source"> assigned = false;</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">168</td><td class="hits">22</td><td class="source"> ['urlSizeLimit', 'copyFiles', 'useNib'].forEach(function(key) {</td></tr><tr class="hit"><td class="line">169</td><td class="hits">66</td><td class="source"> if ((key in mixinStyles) && !(key in styles)) {</td></tr><tr class="hit"><td class="line">170</td><td class="hits">8</td><td class="source"> configStyles[key] = mixinStyles[key];</td></tr><tr><td class="line">171</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">172</td><td class="hits">8</td><td class="source"> assigned = true;</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">176</td><td class="hits">22</td><td class="source"> if (context.libraries.mergeFiles('includes', styles, mixinStyles, configStyles, context.loadedLibrary)) {</td></tr><tr class="hit"><td class="line">177</td><td class="hits">6</td><td class="source"> assigned = 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 class="hit"><td class="line">180</td><td class="hits">22</td><td class="source"> if (context.libraries.mergeHash('pixelDensity', styles, mixinStyles, configStyles)) {</td></tr><tr class="hit"><td class="line">181</td><td class="hits">3</td><td class="source"> assigned = true;</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"> </td></tr><tr class="hit"><td class="line">184</td><td class="hits">22</td><td class="source"> if (assigned) {</td></tr><tr class="hit"><td class="line">185</td><td class="hits">10</td><td class="source"> context.config.attributes.styles = configStyles;</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">188</td><td class="hits">84</td><td class="source"> next(complete);</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> outputConfigs: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">192</td><td class="hits">201</td><td class="source"> if (!inlineStyles.isInline(context) && context.mode !== 'styles') {</td></tr><tr class="hit"><td class="line">193</td><td class="hits">101</td><td class="source"> return next(complete);</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">195</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">196</td><td class="hits">100</td><td class="source"> next(function(err, files) {</td></tr><tr class="hit"><td class="line">197</td><td class="hits">100</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">198</td><td class="hits">0</td><td class="source"> return complete(err);</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">201</td><td class="hits">100</td><td class="source"> var ret = [],</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> styleConfig = context.config.attributes.styles || {},</td></tr><tr><td class="line">203</td><td class="hits"></td><td class="source"> pixelDensity = styleConfig.pixelDensity || {};</td></tr><tr class="hit"><td class="line">204</td><td class="hits">100</td><td class="source"> if (context.platform) {</td></tr><tr class="hit"><td class="line">205</td><td class="hits">74</td><td class="source"> pixelDensity = pixelDensity[context.platform] || pixelDensity;</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">100</td><td class="source"> if (!_.isArray(pixelDensity)) {</td></tr><tr class="hit"><td class="line">208</td><td class="hits">63</td><td class="source"> pixelDensity = [ 1 ];</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">210</td><td class="hits">100</td><td class="source"> context.modeCache.pixelDensity = pixelDensity;</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"> // Permutation of other configs and ours</td></tr><tr class="hit"><td class="line">213</td><td class="hits">100</td><td class="source"> var primary = true;</td></tr><tr class="hit"><td class="line">214</td><td class="hits">100</td><td class="source"> files.forEach(function(fileConfig) {</td></tr><tr class="hit"><td class="line">215</td><td class="hits">100</td><td class="source"> pixelDensity.forEach(function(density) {</td></tr><tr class="hit"><td class="line">216</td><td class="hits">138</td><td class="source"> var config = _.clone(fileConfig);</td></tr><tr class="hit"><td class="line">217</td><td class="hits">138</td><td class="source"> config.pixelDensity = density;</td></tr><tr class="hit"><td class="line">218</td><td class="hits">138</td><td class="source"> config.isPrimary = primary;</td></tr><tr class="hit"><td class="line">219</td><td class="hits">138</td><td class="source"> primary = false;</td></tr><tr class="hit"><td class="line">220</td><td class="hits">138</td><td class="source"> ret.push(config);</td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">222</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">223</td><td class="hits">100</td><td class="source"> complete(undefined, ret);</td></tr><tr><td class="line">224</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">225</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">226</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> fileName: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">228</td><td class="hits">235</td><td class="source"> if (!inlineStyles.isInline(context) && context.mode !== 'styles') {</td></tr><tr class="hit"><td class="line">229</td><td class="hits">107</td><td class="source"> return next(complete);</td></tr><tr><td class="line">230</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">232</td><td class="hits">128</td><td class="source"> next(function(err, ret) {</td></tr><tr class="hit"><td class="line">233</td><td class="hits">128</td><td class="source"> if (ret && context.fileConfig.pixelDensity !== 1) {</td></tr><tr class="hit"><td class="line">234</td><td class="hits">40</td><td class="source"> ret.path += '@' + context.fileConfig.pixelDensity + 'x';</td></tr><tr><td class="line">235</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">236</td><td class="hits">128</td><td class="source"> complete(err, ret);</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"> },</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"> module: function(moduleContext, next, complete) {</td></tr><tr class="hit"><td class="line">241</td><td class="hits">203</td><td class="source"> next(function(err) {</td></tr><tr><td class="line">242</td><td class="hits"></td><td class="source"> /*jshint eqnull: true */</td></tr><tr class="hit"><td class="line">243</td><td class="hits">203</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">244</td><td class="hits">0</td><td class="source"> return complete(err);</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">246</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">247</td><td class="hits">203</td><td class="source"> function mergeResources(start) {</td></tr><tr class="hit"><td class="line">248</td><td class="hits">56</td><td class="source"> var generator = function(context, callback) {</td></tr><tr class="hit"><td class="line">249</td><td class="hits">56</td><td class="source"> function response(data, density) {</td></tr><tr class="hit"><td class="line">250</td><td class="hits">56</td><td class="source"> if (data) {</td></tr><tr class="hit"><td class="line">251</td><td class="hits">53</td><td class="source"> return {</td></tr><tr><td class="line">252</td><td class="hits"></td><td class="source"> data: data.data[density || 1],</td></tr><tr><td class="line">253</td><td class="hits"></td><td class="source"> inputs: data.inputs,</td></tr><tr><td class="line">254</td><td class="hits"></td><td class="source"> noSeparator: true</td></tr><tr><td class="line">255</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">256</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">257</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">258</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">259</td><td class="hits">56</td><td class="source"> var filename = generator.filename;</td></tr><tr><td class="line">260</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">261</td><td class="hits"></td><td class="source"> // We only want to call stylus once which will generate the css for all of the</td></tr><tr><td class="line">262</td><td class="hits"></td><td class="source"> // resolutions we support on this platform. This ugly bit of code make sure that</td></tr><tr><td class="line">263</td><td class="hits"></td><td class="source"> // we properly handle all of that loading states that can come into play under these</td></tr><tr><td class="line">264</td><td class="hits"></td><td class="source"> // circumstances while still adhering to the output models prescribed by lumbar.</td></tr><tr class="hit"><td class="line">265</td><td class="hits">56</td><td class="source"> var queue = context.modeCache['stylus_' + filename];</td></tr><tr class="hit"><td class="line">266</td><td class="hits">56</td><td class="source"> if (_.isArray(queue)) {</td></tr><tr><td class="line">267</td><td class="hits"></td><td class="source"> // We are currently executing</td></tr><tr class="hit"><td class="line">268</td><td class="hits">18</td><td class="source"> queue.push({density: context.fileConfig.pixelDensity, callback: callback});</td></tr><tr class="hit"><td class="line">269</td><td class="hits">38</td><td class="source"> } else if (_.isObject(queue)) {</td></tr><tr><td class="line">270</td><td class="hits"></td><td class="source"> // We already have data</td></tr><tr class="miss"><td class="line">271</td><td class="hits">0</td><td class="source"> callback(undefined, response(queue, context.fileConfig.pixelDensity));</td></tr><tr><td class="line">272</td><td class="hits"></td><td class="source"> } else {</td></tr><tr><td class="line">273</td><td class="hits"></td><td class="source"> // We need to kick of a stylus build</td></tr><tr class="hit"><td class="line">274</td><td class="hits">38</td><td class="source"> queue = context.modeCache['stylus_' + filename] = [</td></tr><tr><td class="line">275</td><td class="hits"></td><td class="source"> {density: context.fileConfig.pixelDensity, callback: callback}</td></tr><tr><td class="line">276</td><td class="hits"></td><td class="source"> ];</td></tr><tr class="hit"><td class="line">277</td><td class="hits">38</td><td class="source"> var options = {</td></tr><tr><td class="line">278</td><td class="hits"></td><td class="source"> filename: filename,</td></tr><tr><td class="line">279</td><td class="hits"></td><td class="source"> files: generator.inputs,</td></tr><tr><td class="line">280</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">281</td><td class="hits"></td><td class="source"> context: context,</td></tr><tr><td class="line">282</td><td class="hits"></td><td class="source"> module: moduleContext.module, // To play nicely with combined mode</td></tr><tr><td class="line">283</td><td class="hits"></td><td class="source"> plugins: generator.plugins</td></tr><tr><td class="line">284</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">285</td><td class="hits">38</td><td class="source"> compile(options, function(err, data) {</td></tr><tr class="hit"><td class="line">286</td><td class="hits">38</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">287</td><td class="hits">3</td><td class="source"> data = undefined;</td></tr><tr><td class="line">288</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">289</td><td class="hits">38</td><td class="source"> _.each(queue, function(callback) {</td></tr><tr class="hit"><td class="line">290</td><td class="hits">56</td><td class="source"> callback.callback(err, response(data, callback.density));</td></tr><tr><td class="line">291</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">292</td><td class="hits">38</td><td class="source"> context.modeCache['stylus_' + filename] = data;</td></tr><tr><td class="line">293</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">294</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">295</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">296</td><td class="hits">56</td><td class="source"> generator.inputs = resources.splice(start, rangeEnd - start + 1);</td></tr><tr class="hit"><td class="line">297</td><td class="hits">157</td><td class="source"> generator.filename = 'stylus_' + _.map(generator.inputs, function(file) { return file.originalSrc || file.src; }).join(';');</td></tr><tr class="hit"><td class="line">298</td><td class="hits">56</td><td class="source"> generator.style = true;</td></tr><tr class="hit"><td class="line">299</td><td class="hits">56</td><td class="source"> generator.stylus = true;</td></tr><tr class="hit"><td class="line">300</td><td class="hits">56</td><td class="source"> generator.plugins = [];</td></tr><tr><td class="line">301</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">302</td><td class="hits">56</td><td class="source"> resources.splice(start, 0, generator);</td></tr><tr class="hit"><td class="line">303</td><td class="hits">56</td><td class="source"> rangeEnd = undefined;</td></tr><tr><td class="line">304</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">305</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">306</td><td class="hits"></td><td class="source"> // Merge all consequtive stylus files together</td></tr><tr class="hit"><td class="line">307</td><td class="hits">203</td><td class="source"> var resources = moduleContext.moduleResources,</td></tr><tr><td class="line">308</td><td class="hits"></td><td class="source"> len = resources.length,</td></tr><tr><td class="line">309</td><td class="hits"></td><td class="source"> rangeEnd;</td></tr><tr class="hit"><td class="line">310</td><td class="hits">203</td><td class="source"> while (len--) {</td></tr><tr class="hit"><td class="line">311</td><td class="hits">426</td><td class="source"> var resource = resources[len];</td></tr><tr><td class="line">312</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">313</td><td class="hits">426</td><td class="source"> if (/\.styl$/.test(resource.src)) {</td></tr><tr class="hit"><td class="line">314</td><td class="hits">101</td><td class="source"> if (!rangeEnd) {</td></tr><tr class="hit"><td class="line">315</td><td class="hits">56</td><td class="source"> rangeEnd = len;</td></tr><tr><td class="line">316</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">317</td><td class="hits">325</td><td class="source"> } else if (rangeEnd) {</td></tr><tr class="hit"><td class="line">318</td><td class="hits">3</td><td class="source"> mergeResources(len + 1);</td></tr><tr><td class="line">319</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">320</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">321</td><td class="hits">203</td><td class="source"> if (rangeEnd != null) {</td></tr><tr class="hit"><td class="line">322</td><td class="hits">53</td><td class="source"> mergeResources(0);</td></tr><tr><td class="line">323</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">324</td><td class="hits">203</td><td class="source"> complete();</td></tr><tr><td class="line">325</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">326</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">327</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">328</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/template.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/template.js</h2><div id="stats" class="high"><div class="percentage">97%</div><div class="sloc">84</div><div class="hits">82</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">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * Template Plugin : Includes templates associated with a given file when said file is imported.</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"> * Config:</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> * root:</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> * templates:</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> * Key value hash mapping file names to arrays of templates to include</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"> * Special Values:</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> * auto-include: Key value pair mapping a regular expression key to a series of values</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> * to insert. Matching groups in the regular expression may be replaced using $i notation.</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"> * Example: 'js/views/(.*)\\.js': ['templates/$1.handlebars']</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"> * Mixins:</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> * The template plugin will mixin auto-include mappings per item, giving priority to the local version.</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> * File mappings will be mixed in but are executed within the scope of the mixin only. I.e. foo.js</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> * in the local file will not match file mappings for foo.js in a mixin.</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">1</td><td class="source">var _ = require('underscore'),</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> build = require('../build'),</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> resources = require('../util/resources');</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">26</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> mode: 'scripts',</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> priority: 50,</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"> loadMixin: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">31</td><td class="hits">84</td><td class="source"> var mixinTemplates = context.loadedLibrary.templates;</td></tr><tr class="hit"><td class="line">32</td><td class="hits">84</td><td class="source"> if (mixinTemplates) {</td></tr><tr class="hit"><td class="line">33</td><td class="hits">14</td><td class="source"> var templates = context.libraries.originalConfig.templates || {},</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> configTemplates = _.clone(context.config.attributes.templates || templates),</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> assigned = false;</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">14</td><td class="source"> if (context.libraries.mergeHash('auto-include', templates, mixinTemplates, configTemplates)) {</td></tr><tr class="hit"><td class="line">38</td><td class="hits">4</td><td class="source"> assigned = true;</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">41</td><td class="hits">14</td><td class="source"> if (assigned) {</td></tr><tr class="hit"><td class="line">42</td><td class="hits">4</td><td class="source"> context.config.attributes.templates = configTemplates;</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><tr class="hit"><td class="line">45</td><td class="hits">84</td><td class="source"> next(complete);</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"> resourceList: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">49</td><td class="hits">315</td><td class="source"> var library = context.resource.library,</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> attr = (library && library.parent || library) || context.config.attributes;</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">52</td><td class="hits">315</td><td class="source"> next(function(err, ret) {</td></tr><tr class="hit"><td class="line">53</td><td class="hits">315</td><td class="source"> if (err || !ret) {</td></tr><tr class="miss"><td class="line">54</td><td class="hits">0</td><td class="source"> return complete(err);</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"> </td></tr><tr class="hit"><td class="line">57</td><td class="hits">315</td><td class="source"> function pushTemplates(templates) {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">282</td><td class="source"> _.each(templates, function(template) {</td></tr><tr class="hit"><td class="line">59</td><td class="hits">48</td><td class="source"> var src = template.src;</td></tr><tr class="hit"><td class="line">60</td><td class="hits">48</td><td class="source"> if (!src || (template.library && !template.library.attributes)) {</td></tr><tr class="hit"><td class="line">61</td><td class="hits">34</td><td class="source"> var templateLibrary = template.library ? context.libraries.getConfig(template.library) : library;</td></tr><tr class="hit"><td class="line">62</td><td class="hits">34</td><td class="source"> src = mapSrc(template.src || template, templateLibrary, context);</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"> </td></tr><tr class="hit"><td class="line">65</td><td class="hits">48</td><td class="source"> ret.unshift({</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> src: src,</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> name: template.name || template.src || template,</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> library: templateLibrary || template.library || library,</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> template: true</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><tr><td class="line">72</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">74</td><td class="hits">315</td><td class="source"> var views = attr.templates || {},</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> globalConfig = context.config.attributes.templates || {},</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> resource = context.resource.originalSrc || context.resource.src || context.resource,</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> mixinRoot = (context.resource.library && context.resource.library.root) || '';</td></tr><tr class="hit"><td class="line">78</td><td class="hits">315</td><td class="source"> if (_.isString(resource) && resource.indexOf(mixinRoot) === 0) {</td></tr><tr class="hit"><td class="line">79</td><td class="hits">241</td><td class="source"> resource = resource.substring(mixinRoot.length);</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 class="hit"><td class="line">82</td><td class="hits">315</td><td class="source"> var deferComplete;</td></tr><tr class="hit"><td class="line">83</td><td class="hits">315</td><td class="source"> if (build.filterResource(context.resource, context)) {</td></tr><tr class="hit"><td class="line">84</td><td class="hits">271</td><td class="source"> pushTemplates(views[resource]);</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">86</td><td class="hits">271</td><td class="source"> if (globalConfig['auto-include']) {</td></tr><tr class="hit"><td class="line">87</td><td class="hits">12</td><td class="source"> var config = context.configCache['template-auto-include'];</td></tr><tr class="hit"><td class="line">88</td><td class="hits">12</td><td class="source"> if (!config) {</td></tr><tr class="hit"><td class="line">89</td><td class="hits">6</td><td class="source"> config = module.exports.generateMappings(globalConfig['auto-include']);</td></tr><tr class="hit"><td class="line">90</td><td class="hits">6</td><td class="source"> context.configCache['template-auto-include'] = config;</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> }</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">12</td><td class="source"> var autoIncludes = module.exports.autoIncludes(resource, config, context);</td></tr><tr class="hit"><td class="line">94</td><td class="hits">12</td><td class="source"> if (autoIncludes.length) {</td></tr><tr class="hit"><td class="line">95</td><td class="hits">11</td><td class="source"> deferComplete = true;</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">97</td><td class="hits">11</td><td class="source"> context.fileUtil.fileList(autoIncludes, function(err, autoIncludes) {</td></tr><tr class="hit"><td class="line">98</td><td class="hits">11</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">99</td><td class="hits">0</td><td class="source"> return complete(err);</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">102</td><td class="hits">11</td><td class="source"> var watchDirs = [];</td></tr><tr class="hit"><td class="line">103</td><td class="hits">11</td><td class="source"> autoIncludes = _.filter(autoIncludes, function(file) {</td></tr><tr class="hit"><td class="line">104</td><td class="hits">17</td><td class="source"> if (file.enoent) {</td></tr><tr class="hit"><td class="line">105</td><td class="hits">3</td><td class="source"> watchDirs.push({watch: path.dirname(file.src)});</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">14</td><td class="source"> return true;</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> }</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">11</td><td class="source"> if (autoIncludes.length) {</td></tr><tr class="hit"><td class="line">112</td><td class="hits">9</td><td class="source"> context.event.emit('log', 'Autoincludes for "' + resource + '" ' + JSON.stringify(_.pluck(autoIncludes, 'src'), undefined, 2));</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> }</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">11</td><td class="source"> pushTemplates(autoIncludes);</td></tr><tr class="hit"><td class="line">116</td><td class="hits">11</td><td class="source"> ret.unshift.apply(ret, watchDirs);</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">118</td><td class="hits">11</td><td class="source"> complete(undefined, ret);</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 class="hit"><td class="line">123</td><td class="hits">315</td><td class="source"> if (!deferComplete) {</td></tr><tr class="hit"><td class="line">124</td><td class="hits">304</td><td class="source"> complete(undefined, ret);</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"> });</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> },</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"> resource: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">130</td><td class="hits">231</td><td class="source"> var resource = context.resource;</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">132</td><td class="hits">231</td><td class="source"> if (resource.watch) {</td></tr><tr class="hit"><td class="line">133</td><td class="hits">2</td><td class="source"> function generator(buildContext, callback) {</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> // Ensure that the directory actually exists</td></tr><tr class="hit"><td class="line">135</td><td class="hits">2</td><td class="source"> var path = context.fileUtil.resolvePath(resource.watch);</td></tr><tr class="hit"><td class="line">136</td><td class="hits">2</td><td class="source"> context.fileUtil.stat(path, function(err, stat) {</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> // Ignore any errors here</td></tr><tr class="hit"><td class="line">138</td><td class="hits">2</td><td class="source"> var inputs = [];</td></tr><tr class="hit"><td class="line">139</td><td class="hits">2</td><td class="source"> if (stat && stat.isDirectory()) {</td></tr><tr class="hit"><td class="line">140</td><td class="hits">2</td><td class="source"> inputs.push(path);</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">142</td><td class="hits">2</td><td class="source"> callback(undefined, {inputs: inputs, data: '', noSeparator: true});</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">145</td><td class="hits">2</td><td class="source"> complete(undefined, generator);</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">147</td><td class="hits">229</td><td class="source"> next(complete);</td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> }</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"> autoIncludes: function(resource, config, context) {</td></tr><tr class="hit"><td class="line">152</td><td class="hits">12</td><td class="source"> var autoIncludes = [];</td></tr><tr class="hit"><td class="line">153</td><td class="hits">12</td><td class="source"> _.each(config, function(mapping) {</td></tr><tr class="hit"><td class="line">154</td><td class="hits">12</td><td class="source"> var remap = module.exports.remapFile(mapping, resource, context);</td></tr><tr class="hit"><td class="line">155</td><td class="hits">12</td><td class="source"> if (remap) {</td></tr><tr class="hit"><td class="line">156</td><td class="hits">11</td><td class="source"> autoIncludes.push.apply(autoIncludes, remap);</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">159</td><td class="hits">12</td><td class="source"> return autoIncludes;</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"> generateMappings: function(autoInclude) {</td></tr><tr class="hit"><td class="line">162</td><td class="hits">6</td><td class="source"> return _.map(autoInclude, function(templates, source) {</td></tr><tr class="hit"><td class="line">163</td><td class="hits">6</td><td class="source"> if (!_.isArray(templates)) {</td></tr><tr class="hit"><td class="line">164</td><td class="hits">2</td><td class="source"> templates = [templates];</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">166</td><td class="hits">6</td><td class="source"> return {regex: new RegExp(source), templates: templates};</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"> },</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> remapFile: function(mapping, resource, context) {</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> /*jshint boss:true */</td></tr><tr class="hit"><td class="line">171</td><td class="hits">15</td><td class="source"> var match;</td></tr><tr class="hit"><td class="line">172</td><td class="hits">15</td><td class="source"> if (match = mapping.regex.exec(resource)) {</td></tr><tr class="hit"><td class="line">173</td><td class="hits">13</td><td class="source"> return _.map(mapping.templates, function(template) {</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> // Work in reverse so $10 takes priority over $1</td></tr><tr class="hit"><td class="line">175</td><td class="hits">25</td><td class="source"> var i = match.length;</td></tr><tr class="hit"><td class="line">176</td><td class="hits">25</td><td class="source"> while (i--) {</td></tr><tr class="hit"><td class="line">177</td><td class="hits">50</td><td class="source"> template = template.replace('$' + i, match[i]);</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">179</td><td class="hits">25</td><td class="source"> var resource = context.libraries.mapFile(template, template.library || context.resource.library);</td></tr><tr class="hit"><td class="line">180</td><td class="hits">25</td><td class="source"> resource = resources.cast(resource);</td></tr><tr class="hit"><td class="line">181</td><td class="hits">25</td><td class="source"> resource.name = template;</td></tr><tr class="hit"><td class="line">182</td><td class="hits">25</td><td class="source"> return resource;</td></tr><tr><td class="line">183</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">188</td><td class="hits">1</td><td class="source">function mapSrc(template, library, context) {</td></tr><tr class="hit"><td class="line">189</td><td class="hits">34</td><td class="source"> var resource = context.libraries.mapFile(template, library);</td></tr><tr class="hit"><td class="line">190</td><td class="hits">34</td><td class="source"> return _.isString(resource.src) ? resource.src : resource;</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/plugins/update-externals.js">/Users/kpdecker/dev/walmart/lumbar/lib/plugins/update-externals.js</h2><div id="stats" class="high"><div class="percentage">92%</div><div class="sloc">57</div><div class="hits">53</div><div class="misses">4</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> cheerio = require('cheerio'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> basename = path.basename,</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> dirname = path.dirname;</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> mode: 'static',</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> priority: 50,</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"> updateHtmlReferences: function(context, content, callback) {</td></tr><tr class="hit"><td class="line">13</td><td class="hits">15</td><td class="source"> function updateResources(mode, query, create) {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">30</td><td class="source"> return function(callback) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">29</td><td class="source"> async.forEach($(query), function(el, callback) {</td></tr><tr class="hit"><td class="line">16</td><td class="hits">10</td><td class="source"> el = $(el);</td></tr><tr class="hit"><td class="line">17</td><td class="hits">10</td><td class="source"> var module = (el.attr('src') || el.attr('href')).replace(/^module:/, '');</td></tr><tr class="hit"><td class="line">18</td><td class="hits">10</td><td class="source"> context.fileNamesForModule(mode, module, function(err, fileNames) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">10</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">2</td><td class="source"> return callback(err);</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"> </td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> // Generate replacement elements for each of the entries</td></tr><tr class="hit"><td class="line">24</td><td class="hits">8</td><td class="source"> var content = fileNames.map(function(fileName) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">8</td><td class="source"> if (fileName.server) {</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> return '';</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">28</td><td class="hits">8</td><td class="source"> return create(loadDirName + basename(fileName.fileName.path) + '.' + fileName.fileName.extension);</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"> </td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> // Output and kill the original</td></tr><tr class="hit"><td class="line">32</td><td class="hits">8</td><td class="source"> el.replaceWith(content.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">8</td><td class="source"> callback();</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"> callback);</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"> }</td></tr><tr class="hit"><td class="line">40</td><td class="hits">15</td><td class="source"> var $ = cheerio.load(content),</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> loadDirName = '';</td></tr><tr class="hit"><td class="line">42</td><td class="hits">15</td><td class="source"> async.series([</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> function(callback) {</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> // Output the load prefix script we we have a module: script reference</td></tr><tr class="hit"><td class="line">45</td><td class="hits">15</td><td class="source"> var firstScript = $('script[src^="module:"]');</td></tr><tr class="hit"><td class="line">46</td><td class="hits">15</td><td class="source"> if (firstScript) {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">15</td><td class="source"> context.plugins.get('module-map').buildMap(context, function(err, map, loadPrefix) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">15</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">49</td><td class="hits">0</td><td class="source"> return callback(err);</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 class="hit"><td class="line">52</td><td class="hits">15</td><td class="source"> var noFileComponent = !loadPrefix;</td></tr><tr class="hit"><td class="line">53</td><td class="hits">15</td><td class="source"> loadPrefix = context.platformPath + loadPrefix;</td></tr><tr class="hit"><td class="line">54</td><td class="hits">15</td><td class="source"> var dirname = path.dirname(loadPrefix + 'a'); // Force a component for the trailing '/' case</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"> // Only remap load prefix if not defined by the user</td></tr><tr class="hit"><td class="line">57</td><td class="hits">15</td><td class="source"> if (!(loadDirName = context.config.loadPrefix())) {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">14</td><td class="source"> var resourcePath = path.dirname(context.fileName.substring(context.outdir.length + 1));</td></tr><tr class="hit"><td class="line">59</td><td class="hits">14</td><td class="source"> loadPrefix = path.relative(resourcePath, loadPrefix);</td></tr><tr class="hit"><td class="line">60</td><td class="hits">14</td><td class="source"> loadDirName = path.relative(resourcePath, dirname);</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">14</td><td class="source"> if (loadDirName) {</td></tr><tr class="hit"><td class="line">63</td><td class="hits">7</td><td class="source"> loadDirName += '/';</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">14</td><td class="source"> if (loadPrefix && noFileComponent) {</td></tr><tr class="hit"><td class="line">66</td><td class="hits">7</td><td class="source"> loadPrefix += '/';</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> } else {</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> // A load prefix was given, just combine this with the module map prefix</td></tr><tr class="hit"><td class="line">70</td><td class="hits">1</td><td class="source"> loadPrefix = loadDirName + loadPrefix;</td></tr><tr class="hit"><td class="line">71</td><td class="hits">1</td><td class="source"> if (dirname !== '.') {</td></tr><tr class="hit"><td class="line">72</td><td class="hits">1</td><td class="source"> loadDirName += dirname + '/';</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> }</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"> </td></tr><tr class="hit"><td class="line">76</td><td class="hits">15</td><td class="source"> var script = '<script type="text/javascript">var lumbarLoadPrefix = \'' + loadPrefix + '\';</script>';</td></tr><tr class="hit"><td class="line">77</td><td class="hits">15</td><td class="source"> firstScript.before(script);</td></tr><tr class="hit"><td class="line">78</td><td class="hits">15</td><td class="source"> callback();</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"> } else {</td></tr><tr class="miss"><td class="line">81</td><td class="hits">0</td><td class="source"> callback();</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"> updateResources('scripts', 'script[src^="module:"]', function(href) {</td></tr><tr class="hit"><td class="line">85</td><td class="hits">7</td><td class="source"> return '<script type="text/javascript" src="' + href + '"></script>';</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> }),</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> updateResources('styles', 'link[href^="module:"]', function(href) {</td></tr><tr class="hit"><td class="line">88</td><td class="hits">1</td><td class="source"> return '<link rel="stylesheet" type="text/css" href="' + href + '"/>';</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> })</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"> function(err) {</td></tr><tr class="hit"><td class="line">92</td><td class="hits">15</td><td class="source"> callback(err, $.html());</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> resource: function(context, next, complete) {</td></tr><tr class="hit"><td class="line">97</td><td class="hits">28</td><td class="source"> var resource = context.resource;</td></tr><tr class="hit"><td class="line">98</td><td class="hits">28</td><td class="source"> if (resource['update-externals'] || (/\.html?$/.test(resource.src) && resource['update-externals'] !== false)) {</td></tr><tr class="hit"><td class="line">99</td><td class="hits">6</td><td class="source"> next(function(err, resource) {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">6</td><td class="source"> function generator(context, callback) {</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> // Load the source data</td></tr><tr class="hit"><td class="line">102</td><td class="hits">6</td><td class="source"> context.loadResource(resource, function(err, file) {</td></tr><tr class="hit"><td class="line">103</td><td class="hits">6</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">104</td><td class="hits">0</td><td class="source"> return callback(err);</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><td class="line">107</td><td class="hits"></td><td class="source"> // Update the content</td></tr><tr class="hit"><td class="line">108</td><td class="hits">6</td><td class="source"> module.exports.updateHtmlReferences(context, file.content, function(err, data) {</td></tr><tr class="hit"><td class="line">109</td><td class="hits">6</td><td class="source"> callback(err, {</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> data: data,</td></tr><tr><td class="line">111</td><td class="hits"></td><td class="source"> inputs: file.inputs</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> });</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"> </td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> // Include any attributes that may have been defined on the base entry</td></tr><tr class="hit"><td class="line">118</td><td class="hits">6</td><td class="source"> if (!_.isString(resource)) {</td></tr><tr class="hit"><td class="line">119</td><td class="hits">6</td><td class="source"> _.extend(generator, resource);</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">121</td><td class="hits">6</td><td class="source"> complete(undefined, generator);</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"> } else {</td></tr><tr class="hit"><td class="line">124</td><td class="hits">22</td><td class="source"> next(complete);</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"> }</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/state-machine.js">/Users/kpdecker/dev/walmart/lumbar/lib/state-machine.js</h2><div id="stats" class="high"><div class="percentage">97%</div><div class="sloc">143</div><div class="hits">140</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> build = require('./build'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> combine = require('./jsCombine'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> configLoader = require('./config'),</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> Context = require('./context'),</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> fs = require('fs'),</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> fu = require('./fileUtil'),</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> Libraries = require('./libraries'),</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> plugin = require('./plugin'),</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> WatchManager = require('./watch-manager');</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">1</td><td class="source">exports.loadAndInitDir = function(path, event, options, callback) {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">31</td><td class="source"> exports.loadConfig(path, event, options, function(err, context) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">31</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">16</td><td class="hits">0</td><td class="source"> return callback(err);</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 class="hit"><td class="line">19</td><td class="hits">31</td><td class="source"> exports.ensureDirs(context, function(err) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">31</td><td class="source"> return callback(err, context);</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"> });</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><tr class="hit"><td class="line">25</td><td class="hits">1</td><td class="source">exports.loadConfig = function(path, event, options, callback) {</td></tr><tr class="hit"><td class="line">26</td><td class="hits">41</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">27</td><td class="hits">41</td><td class="source"> fu.resetCache();</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">41</td><td class="source"> var config = _.isString(path) ? configLoader.load(path) : configLoader.create(path);</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">31</td><td class="hits">41</td><td class="source"> var plugins = plugin.create(options);</td></tr><tr class="hit"><td class="line">32</td><td class="hits">41</td><td class="source"> plugins.initialize(config);</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">40</td><td class="source"> config.outdir = options.outdir = options.outdir || config.attributes.output;</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">40</td><td class="source"> var libraries = new Libraries(options);</td></tr><tr class="hit"><td class="line">37</td><td class="hits">40</td><td class="source"> var context = new Context(options, config, plugins, libraries, event);</td></tr><tr class="hit"><td class="line">38</td><td class="hits">40</td><td class="source"> context.options = options;</td></tr><tr class="hit"><td class="line">39</td><td class="hits">40</td><td class="source"> context.configCache = {};</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">41</td><td class="hits">40</td><td class="source"> libraries.initialize(context, function(err) {</td></tr><tr class="hit"><td class="line">42</td><td class="hits">40</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">43</td><td class="hits">1</td><td class="source"> return callback(err);</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 class="hit"><td class="line">46</td><td class="hits">39</td><td class="source"> plugins.loadConfig(context, function(err) {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">39</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">1</td><td class="source"> return callback(err);</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 class="hit"><td class="line">51</td><td class="hits">38</td><td class="source"> event.emit('config', context.config);</td></tr><tr class="hit"><td class="line">52</td><td class="hits">38</td><td class="source"> if (options.verbose) {</td></tr><tr class="hit"><td class="line">53</td><td class="hits">1</td><td class="source"> event.emit('log', 'Finalized config ' + JSON.stringify(context.config.serialize(), undefined, 2));</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> }</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">38</td><td class="source"> callback(undefined, context);</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> });</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"> } catch (err) {</td></tr><tr class="hit"><td class="line">60</td><td class="hits">1</td><td class="source"> callback(err);</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">};</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">64</td><td class="hits">1</td><td class="source">exports.ensureDirs = function(context, callback) {</td></tr><tr class="hit"><td class="line">65</td><td class="hits">31</td><td class="source"> var config = context.config;</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"> // Ensure that we have the proper build output</td></tr><tr class="hit"><td class="line">68</td><td class="hits">31</td><td class="source"> if (!config.outdir) {</td></tr><tr class="hit"><td class="line">69</td><td class="hits">1</td><td class="source"> return callback(new Error('Output must be defined on the command line or config file.'));</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">71</td><td class="hits">30</td><td class="source"> context.outdir = config.outdir;</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">30</td><td class="source"> fu.ensureDirs(config.outdir + '/.', function() {</td></tr><tr class="hit"><td class="line">74</td><td class="hits">30</td><td class="source"> var stat = fs.statSync(config.outdir);</td></tr><tr class="hit"><td class="line">75</td><td class="hits">30</td><td class="source"> if (!stat.isDirectory()) {</td></tr><tr class="hit"><td class="line">76</td><td class="hits">1</td><td class="source"> callback(new Error('Output must be a directory'));</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">78</td><td class="hits">29</td><td class="source"> callback();</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 class="hit"><td class="line">83</td><td class="hits">1</td><td class="source">exports.buildPackages = function(rootContext, packageName, modules, callback) {</td></tr><tr class="hit"><td class="line">84</td><td class="hits">33</td><td class="source"> if (!callback) {</td></tr><tr class="hit"><td class="line">85</td><td class="hits">11</td><td class="source"> callback = modules;</td></tr><tr class="hit"><td class="line">86</td><td class="hits">11</td><td class="source"> modules = undefined;</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">89</td><td class="hits">33</td><td class="source"> exports.loadPackages(rootContext, packageName, modules, function(err, contexts) {</td></tr><tr class="hit"><td class="line">90</td><td class="hits">33</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">91</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> }</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">33</td><td class="source"> exports.buildContexts(contexts, callback);</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">98</td><td class="hits">1</td><td class="source">exports.loadPackages = function(rootContext, packageName, modules, callback) {</td></tr><tr class="hit"><td class="line">99</td><td class="hits">42</td><td class="source"> if (!callback) {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">6</td><td class="source"> callback = modules;</td></tr><tr class="hit"><td class="line">101</td><td class="hits">6</td><td class="source"> modules = undefined;</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> // Allow a string or a list as modules input</td></tr><tr class="hit"><td class="line">105</td><td class="hits">42</td><td class="source"> if (!_.isArray(modules)) {</td></tr><tr class="hit"><td class="line">106</td><td class="hits">40</td><td class="source"> modules = [modules];</td></tr><tr class="hit"><td class="line">107</td><td class="hits">2</td><td class="source"> } else if (!modules.length) {</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> // Special case empty array input to build all</td></tr><tr class="hit"><td class="line">109</td><td class="hits">1</td><td class="source"> modules = [undefined];</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 class="hit"><td class="line">112</td><td class="hits">42</td><td class="source"> var options = {};</td></tr><tr class="hit"><td class="line">113</td><td class="hits">42</td><td class="source"> if (typeof packageName === 'object') {</td></tr><tr class="hit"><td class="line">114</td><td class="hits">1</td><td class="source"> options = packageName;</td></tr><tr class="hit"><td class="line">115</td><td class="hits">1</td><td class="source"> packageName = options.package;</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">118</td><td class="hits">42</td><td class="source"> var packages = rootContext.config.packageList();</td></tr><tr class="hit"><td class="line">119</td><td class="hits">42</td><td class="source"> if (packageName && !_.contains(packages, packageName)) {</td></tr><tr class="hit"><td class="line">120</td><td class="hits">1</td><td class="source"> return callback(undefined, {});</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 class="hit"><td class="line">123</td><td class="hits">41</td><td class="source"> var packageNames = packageName ? [packageName] : packages,</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> contexts = [];</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">41</td><td class="source"> packageNames.forEach(function(pkg) {</td></tr><tr class="hit"><td class="line">127</td><td class="hits">46</td><td class="source"> modules.forEach(function(module) {</td></tr><tr class="hit"><td class="line">128</td><td class="hits">47</td><td class="source"> options.package = pkg;</td></tr><tr class="hit"><td class="line">129</td><td class="hits">47</td><td class="source"> options.module = module || undefined; // '' -> undefined</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">131</td><td class="hits">47</td><td class="source"> rootContext.event.emit('debug', 'Load package: ' + pkg);</td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">133</td><td class="hits">47</td><td class="source"> var platforms = rootContext.config.platformList(pkg);</td></tr><tr class="hit"><td class="line">134</td><td class="hits">47</td><td class="source"> platforms.forEach(function(platform) {</td></tr><tr class="hit"><td class="line">135</td><td class="hits">64</td><td class="source"> options.platform = platform;</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">137</td><td class="hits">64</td><td class="source"> var newContext = rootContext.clone(options);</td></tr><tr class="hit"><td class="line">138</td><td class="hits">64</td><td class="source"> contexts.push(newContext);</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"> });</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">143</td><td class="hits">41</td><td class="source"> var ret = {};</td></tr><tr class="hit"><td class="line">144</td><td class="hits">41</td><td class="source"> async.forEach(</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> contexts,</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> function(context, callback) {</td></tr><tr class="hit"><td class="line">147</td><td class="hits">64</td><td class="source"> exports.loadPlatform(context, function(err, contexts) {</td></tr><tr class="hit"><td class="line">148</td><td class="hits">51</td><td class="source"> if (!err) {</td></tr><tr class="hit"><td class="line">149</td><td class="hits">51</td><td class="source"> var pkg = ret[context.package] = ret[context.package] || {};</td></tr><tr class="hit"><td class="line">150</td><td class="hits">51</td><td class="source"> pkg[context.platform] = _.flatten(contexts);</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">51</td><td class="source"> return callback(err);</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"> },</td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> function(err) {</td></tr><tr class="hit"><td class="line">156</td><td class="hits">35</td><td class="source"> callback(err, ret);</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">160</td><td class="hits">1</td><td class="source">exports.loadPlatform = function(context, callback) {</td></tr><tr class="hit"><td class="line">161</td><td class="hits">88</td><td class="source"> context.event.emit('debug', 'Load platform: ' + context.description);</td></tr><tr class="hit"><td class="line">162</td><td class="hits">88</td><td class="source"> var modes = context.mode ? [context.mode] : context.plugins.modes();</td></tr><tr><td class="line">163</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">164</td><td class="hits">88</td><td class="source"> async.map(modes, function(mode, callback) {</td></tr><tr class="hit"><td class="line">165</td><td class="hits">184</td><td class="source"> exports.loadMode(mode, context, callback);</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"> function(err, contexts) {</td></tr><tr class="hit"><td class="line">168</td><td class="hits">86</td><td class="source"> callback(err, contexts && _.flatten(contexts));</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">171</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">172</td><td class="hits">1</td><td class="source">exports.loadMode = function(mode, context, callback) {</td></tr><tr class="hit"><td class="line">173</td><td class="hits">184</td><td class="source"> context.event.emit('debug', 'Load mode: ' + context.description);</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">175</td><td class="hits">184</td><td class="source"> context = context.clone();</td></tr><tr class="hit"><td class="line">176</td><td class="hits">184</td><td class="source"> context.mode = mode;</td></tr><tr class="hit"><td class="line">177</td><td class="hits">184</td><td class="source"> context.modeCache = {};</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">179</td><td class="hits">184</td><td class="source"> if (context.fileConfig) {</td></tr><tr class="hit"><td class="line">180</td><td class="hits">21</td><td class="source"> callback(undefined, [processFileConfig(context.fileConfig)]);</td></tr><tr><td class="line">181</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">182</td><td class="hits">163</td><td class="source"> context.plugins.outputConfigs(context, function(err, configs) {</td></tr><tr class="hit"><td class="line">183</td><td class="hits">163</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">184</td><td class="hits">1</td><td class="source"> return callback(err);</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">187</td><td class="hits">162</td><td class="source"> callback(undefined, _.map(configs, processFileConfig));</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">191</td><td class="hits">184</td><td class="source"> function processFileConfig(fileConfig) {</td></tr><tr class="hit"><td class="line">192</td><td class="hits">194</td><td class="source"> var fileContext = context.clone(true);</td></tr><tr class="hit"><td class="line">193</td><td class="hits">194</td><td class="source"> fileContext.fileConfig = fileConfig;</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">195</td><td class="hits">194</td><td class="source"> return fileContext;</td></tr><tr><td class="line">196</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">199</td><td class="hits">1</td><td class="source">exports.buildContexts = function(configContexts, callback) {</td></tr><tr class="hit"><td class="line">200</td><td class="hits">73</td><td class="source"> if (configContexts instanceof Context) {</td></tr><tr class="miss"><td class="line">201</td><td class="hits">0</td><td class="source"> configContexts = [configContexts];</td></tr><tr class="hit"><td class="line">202</td><td class="hits">73</td><td class="source"> } else if (!_.isArray(configContexts)) {</td></tr><tr class="hit"><td class="line">203</td><td class="hits">33</td><td class="source"> configContexts = _.map(configContexts, function(package) {</td></tr><tr class="hit"><td class="line">204</td><td class="hits">36</td><td class="source"> return _.values(package);</td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">206</td><td class="hits">33</td><td class="source"> configContexts = _.flatten(configContexts);</td></tr><tr><td class="line">207</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">208</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">209</td><td class="hits">73</td><td class="source"> async.forEach(</td></tr><tr><td class="line">210</td><td class="hits"></td><td class="source"> configContexts,</td></tr><tr><td class="line">211</td><td class="hits"></td><td class="source"> function(fileContext, callback) {</td></tr><tr class="hit"><td class="line">212</td><td class="hits">193</td><td class="source"> var modules = fileContext.module ? [fileContext.module] : fileContext.config.moduleList(fileContext.package);</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">214</td><td class="hits">193</td><td class="source"> fileContext.resources = [];</td></tr><tr class="hit"><td class="line">215</td><td class="hits">193</td><td class="source"> fileContext.combineResources = {};</td></tr><tr class="hit"><td class="line">216</td><td class="hits">193</td><td class="source"> fileContext.fileCache = fileContext.combined ? {} : undefined;</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">218</td><td class="hits">193</td><td class="source"> async.forEach(modules, function(module, callback) {</td></tr><tr class="hit"><td class="line">219</td><td class="hits">281</td><td class="source"> var moduleContext = fileContext.clone();</td></tr><tr class="hit"><td class="line">220</td><td class="hits">281</td><td class="source"> moduleContext.module = module;</td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">222</td><td class="hits">281</td><td class="source"> exports.buildModule(moduleContext, callback);</td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">224</td><td class="hits"></td><td class="source"> function(err) {</td></tr><tr class="hit"><td class="line">225</td><td class="hits">189</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">226</td><td class="hits">4</td><td class="source"> return callback(err);</td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">228</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">229</td><td class="hits">185</td><td class="source"> fileContext.plugins.modeComplete(fileContext, callback);</td></tr><tr><td class="line">230</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">232</td><td class="hits"></td><td class="source"> callback);</td></tr><tr><td class="line">233</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">234</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">235</td><td class="hits">1</td><td class="source">exports.buildModule = function(context, callback) {</td></tr><tr class="hit"><td class="line">236</td><td class="hits">275</td><td class="source"> context.event.emit('debug', 'Build module: ' + context.description);</td></tr><tr><td class="line">237</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">238</td><td class="hits">275</td><td class="source"> var module = context.config.module(context.module);</td></tr><tr class="hit"><td class="line">239</td><td class="hits">275</td><td class="source"> if (!module) {</td></tr><tr class="hit"><td class="line">240</td><td class="hits">1</td><td class="source"> return callback(new Error('Unable to find module "' + context.module + '"'));</td></tr><tr><td class="line">241</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">242</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">243</td><td class="hits">274</td><td class="source"> context.module = module;</td></tr><tr class="hit"><td class="line">244</td><td class="hits">274</td><td class="source"> context.moduleCache = {};</td></tr><tr class="hit"><td class="line">245</td><td class="hits">274</td><td class="source"> context.fileCache = context.combined ? context.fileCache : {};</td></tr><tr><td class="line">246</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">247</td><td class="hits">274</td><td class="source"> var resource = context.resource;</td></tr><tr class="hit"><td class="line">248</td><td class="hits">274</td><td class="source"> if (resource) {</td></tr><tr class="hit"><td class="line">249</td><td class="hits">7</td><td class="source"> resource = resource.originalResource || resource;</td></tr><tr class="hit"><td class="line">250</td><td class="hits">7</td><td class="source"> exports.processResources(context, [resource], callback);</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source"> } else {</td></tr><tr><td class="line">252</td><td class="hits"></td><td class="source"> // Load all resources associated with this module</td></tr><tr class="hit"><td class="line">253</td><td class="hits">267</td><td class="source"> build.loadResources(context, function(err, resources) {</td></tr><tr class="hit"><td class="line">254</td><td class="hits">267</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">255</td><td class="hits">1</td><td class="source"> return callback(err);</td></tr><tr><td class="line">256</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">257</td><td class="hits">266</td><td class="source"> exports.processResources(context, resources, callback);</td></tr><tr><td class="line">258</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">259</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">260</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">261</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">262</td><td class="hits">1</td><td class="source">exports.processResources = function(context, resources, callback) {</td></tr><tr class="hit"><td class="line">263</td><td class="hits">273</td><td class="source"> build.processResources(resources, context, function(err, resources) {</td></tr><tr class="hit"><td class="line">264</td><td class="hits">273</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">265</td><td class="hits">1</td><td class="source"> return callback(err);</td></tr><tr><td class="line">266</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">267</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">268</td><td class="hits">272</td><td class="source"> context.moduleResources = resources;</td></tr><tr class="hit"><td class="line">269</td><td class="hits">272</td><td class="source"> context.plugins.module(context, callback);</td></tr><tr><td class="line">270</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">271</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">272</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/templateUtil.js">/Users/kpdecker/dev/walmart/lumbar/lib/templateUtil.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">4</div><div class="hits">4</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">const ESCAPER_LUT = {</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> '\b': '\\b',</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> '\f': '\\f',</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> '\n': '\\n',</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> '\r': '\\r',</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> '\t': '\\t',</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> '\v': '\\v',</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"> '\"': '\\\"',</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">1</td><td class="source">const ESCAPER = /[\b\f\n\r\t\v\'\"\\]/g;</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source">exports.escapeJsString = function(string) {</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> // TODO : Handle unicode escapes</td></tr><tr class="hit"><td class="line">16</td><td class="hits">69</td><td class="source"> return string.replace(ESCAPER, function(c) { return ESCAPER_LUT[c] || c; });</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></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/util/file-map.js">/Users/kpdecker/dev/walmart/lumbar/lib/util/file-map.js</h2><div id="stats" class="high"><div class="percentage">95%</div><div class="sloc">71</div><div class="hits">68</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> async = require('async'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> fu = require('../fileUtil'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> dirname = path.dirname,</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> basename = path.basename,</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> sourceMap,</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> SourceMapConsumer,</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> SourceMapGenerator;</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">try {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source"> sourceMap = require('source-map');</td></tr><tr class="hit"><td class="line">13</td><td class="hits">1</td><td class="source"> SourceMapConsumer = sourceMap.SourceMapConsumer;</td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source"> SourceMapGenerator = sourceMap.SourceMapGenerator;</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source">} catch (err) {</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> /* NOP */</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 class="hit"><td class="line">19</td><td class="hits">1</td><td class="source">const WARNING_CONTEXT = 3,</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> GENERATED = '<generated';</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">1</td><td class="source">module.exports = exports = function(output) {</td></tr><tr class="hit"><td class="line">23</td><td class="hits">121</td><td class="source"> this.output = output;</td></tr><tr class="hit"><td class="line">24</td><td class="hits">121</td><td class="source"> if (SourceMapGenerator) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">121</td><td class="source"> this.generator = new SourceMapGenerator({file: output});</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 class="hit"><td class="line">28</td><td class="hits">121</td><td class="source"> this.contentCache = {};</td></tr><tr class="hit"><td class="line">29</td><td class="hits">121</td><td class="source"> this.line = 1;</td></tr><tr class="hit"><td class="line">30</td><td class="hits">121</td><td class="source"> this.column = 1;</td></tr><tr class="hit"><td class="line">31</td><td class="hits">121</td><td class="source"> this._content = '';</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"> </td></tr><tr class="hit"><td class="line">34</td><td class="hits">1</td><td class="source">exports.prototype.add = function(name, content, context, generated) {</td></tr><tr class="hit"><td class="line">35</td><td class="hits">511</td><td class="source"> this._sourceMap = '';</td></tr><tr class="hit"><td class="line">36</td><td class="hits">511</td><td class="source"> this._consumer = undefined;</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">511</td><td class="source"> var lines = content.split('\n');</td></tr><tr class="hit"><td class="line">39</td><td class="hits">511</td><td class="source"> if (name && !generated) {</td></tr><tr class="hit"><td class="line">40</td><td class="hits">191</td><td class="source"> this.contentCache[name] = {</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> lines: lines,</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> context: context</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><tr><td class="line">45</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">46</td><td class="hits">511</td><td class="source"> if (this.generator) {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">511</td><td class="source"> _.each(lines, function(line, index) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">2822</td><td class="source"> this.generator.addMapping({</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> source: generated && name ? (GENERATED + ':' + name + '>') : (name || GENERATED + '>'),</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> generated: {</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> line: this.line + index,</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> column: index ? 1 : this.column</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"> original: {</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> line: index + 1,</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> column: 1</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> }</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"> }, this);</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 class="hit"><td class="line">62</td><td class="hits">511</td><td class="source"> this.line += lines.length - 1;</td></tr><tr class="hit"><td class="line">63</td><td class="hits">511</td><td class="source"> if (lines.length >= 2) {</td></tr><tr class="hit"><td class="line">64</td><td class="hits">480</td><td class="source"> this.column = 1;</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">66</td><td class="hits">511</td><td class="source"> this.column += lines[lines.length - 1].length;</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">68</td><td class="hits">511</td><td class="source"> this._content += content;</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">1</td><td class="source">exports.prototype.content = function() {</td></tr><tr class="hit"><td class="line">71</td><td class="hits">275</td><td class="source"> return this._content;</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">1</td><td class="source">exports.prototype.sourceMap = function() {</td></tr><tr class="hit"><td class="line">74</td><td class="hits">4</td><td class="source"> this._sourceMap = this._sourceMap || this.generator.toString();</td></tr><tr class="hit"><td class="line">75</td><td class="hits">4</td><td class="source"> return this._sourceMap;</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">78</td><td class="hits">1</td><td class="source">exports.prototype.sourceMapToken = function() {</td></tr><tr class="hit"><td class="line">79</td><td class="hits">3</td><td class="source"> return '//@ sourceMappingURL=' + basename(this.output) + '.map\n';</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 class="hit"><td class="line">82</td><td class="hits">1</td><td class="source">exports.prototype.writeSourceMap = function(options) {</td></tr><tr class="hit"><td class="line">83</td><td class="hits">3</td><td class="source"> var tasks = [],</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> outputDir = dirname(this.output) + '/',</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> self = this;</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">87</td><td class="hits">3</td><td class="source"> tasks.push(function(callback) {</td></tr><tr class="hit"><td class="line">88</td><td class="hits">3</td><td class="source"> fu.writeFile((options.mapDestination || self.output) + '.map', self.sourceMap(), callback);</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">90</td><td class="hits">3</td><td class="source"> if (options.outputSource) {</td></tr><tr class="hit"><td class="line">91</td><td class="hits">1</td><td class="source"> _.each(this.contentCache, function(content, name) {</td></tr><tr class="hit"><td class="line">92</td><td class="hits">2</td><td class="source"> tasks.push(function(callback) {</td></tr><tr class="hit"><td class="line">93</td><td class="hits">2</td><td class="source"> var file = outputDir + name;</td></tr><tr class="hit"><td class="line">94</td><td class="hits">2</td><td class="source"> fu.ensureDirs(dirname(file), function(err) {</td></tr><tr class="hit"><td class="line">95</td><td class="hits">2</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">96</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">98</td><td class="hits">2</td><td class="source"> fu.writeFile(file, content.lines.join('\n'), callback);</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"> });</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"> }</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">3</td><td class="source"> async.parallel(tasks, function(err) {</td></tr><tr class="hit"><td class="line">105</td><td class="hits">3</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">106</td><td class="hits">0</td><td class="source"> throw err;</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">109</td><td class="hits">3</td><td class="source"> self.add(undefined, self.sourceMapToken());</td></tr><tr class="hit"><td class="line">110</td><td class="hits">3</td><td class="source"> options.callback();</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">};</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">114</td><td class="hits">1</td><td class="source">exports.prototype.context = function(line, column) {</td></tr><tr class="hit"><td class="line">115</td><td class="hits">5</td><td class="source"> if (!SourceMapConsumer) {</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"> file: this.output,</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> line: line,</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> column: column</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 class="hit"><td class="line">123</td><td class="hits">5</td><td class="source"> this._consumer = this._consumer || new SourceMapConsumer(this.sourceMap());</td></tr><tr class="hit"><td class="line">124</td><td class="hits">5</td><td class="source"> var original = this._consumer.originalPositionFor({line: line, column: column}),</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> lines;</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">5</td><td class="source"> var content = this.contentCache[original.source];</td></tr><tr class="hit"><td class="line">128</td><td class="hits">5</td><td class="source"> if (content) {</td></tr><tr class="hit"><td class="line">129</td><td class="hits">4</td><td class="source"> var lines = content.lines,</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> line = original.line - 1,</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> start = Math.max(line - WARNING_CONTEXT + 1, 0),</td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> end = Math.min(line + WARNING_CONTEXT, lines.length),</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> gutterWidth = (end + '').length;</td></tr><tr class="hit"><td class="line">134</td><td class="hits">4</td><td class="source"> line = line + 1;</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">4</td><td class="source"> lines = lines.slice(start, end).map(function(value, index) {</td></tr><tr class="hit"><td class="line">137</td><td class="hits">15</td><td class="source"> var lineNum = start + index + 1,</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> lineText = lineNum + '',</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> buffer = '';</td></tr><tr class="hit"><td class="line">140</td><td class="hits">15</td><td class="source"> for (var i = lineText.length; i < gutterWidth; i++) {</td></tr><tr class="hit"><td class="line">141</td><td class="hits">7</td><td class="source"> buffer += ' ';</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">143</td><td class="hits">15</td><td class="source"> buffer += lineText;</td></tr><tr class="hit"><td class="line">144</td><td class="hits">15</td><td class="source"> buffer += (lineNum === line) ? ': ' : ' ';</td></tr><tr class="hit"><td class="line">145</td><td class="hits">15</td><td class="source"> buffer += value;</td></tr><tr class="hit"><td class="line">146</td><td class="hits">15</td><td class="source"> return buffer;</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">149</td><td class="hits">1</td><td class="source"> return;</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 class="hit"><td class="line">152</td><td class="hits">4</td><td class="source"> return {</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> file: original.source,</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> fileContext: content.context,</td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> line: original.line,</td></tr><tr><td class="line">156</td><td class="hits"></td><td class="source"> column: original.column,</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> context: lines</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> };</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"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/util/resources.js">/Users/kpdecker/dev/walmart/lumbar/lib/util/resources.js</h2><div id="stats" class="high"><div class="percentage">98%</div><div class="sloc">62</div><div class="hits">61</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 _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> bower = require('bower'),</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> normalize = path.normalize;</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"> * Standalone helpers for resource lifetime management and mapping.</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">1</td><td class="source">var resources = module.exports = {</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> cast: function(resource) {</td></tr><tr class="hit"><td class="line">11</td><td class="hits">823</td><td class="source"> if (_.isString(resource)) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">268</td><td class="source"> return {src: resource};</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">555</td><td class="source"> return resource;</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><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"> source: function(resource) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">687</td><td class="source"> return resource.src || resource.dir || resource;</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><td class="line">22</td><td class="hits"></td><td class="source"> map: function(resource, library, config) {</td></tr><tr class="hit"><td class="line">23</td><td class="hits">330</td><td class="source"> var bowerPath;</td></tr><tr class="hit"><td class="line">24</td><td class="hits">330</td><td class="source"> if (_.isString(resource.bower)) {</td></tr><tr class="hit"><td class="line">25</td><td class="hits">2</td><td class="source"> bowerPath = path.join(bower.config.directory, resource.bower);</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"> // If no mixin was defined on either side then return the identity</td></tr><tr class="hit"><td class="line">29</td><td class="hits">330</td><td class="source"> if (!library && !bowerPath) {</td></tr><tr class="hit"><td class="line">30</td><td class="hits">225</td><td class="source"> return resource;</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 class="hit"><td class="line">33</td><td class="hits">105</td><td class="source"> resource = resources.cast(_.clone(resource));</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">35</td><td class="hits">105</td><td class="source"> var src = resources.source(resource);</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"> // Include any config information such as env or platform that may have been</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> // specified on the library settings</td></tr><tr class="hit"><td class="line">39</td><td class="hits">105</td><td class="source"> _.extend(resource, _.omit(config, 'overrideLibrary'));</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">41</td><td class="hits">105</td><td class="source"> if (_.isString(src)) {</td></tr><tr class="hit"><td class="line">42</td><td class="hits">103</td><td class="source"> var override = findOverride(library, src),</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> librarySrc = bowerPath || library.root || '';</td></tr><tr class="hit"><td class="line">44</td><td class="hits">103</td><td class="source"> librarySrc = librarySrc ? path.join(librarySrc, src) : src;</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">46</td><td class="hits">103</td><td class="source"> if (override) {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">18</td><td class="source"> resource.originalSrc = librarySrc;</td></tr><tr class="hit"><td class="line">48</td><td class="hits">18</td><td class="source"> librarySrc = _.isString(override.override) ? override.override : src;</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">18</td><td class="source"> if (override.root) {</td></tr><tr class="hit"><td class="line">51</td><td class="hits">6</td><td class="source"> librarySrc = path.join(override.root, librarySrc);</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">53</td><td class="hits">85</td><td class="source"> } else if (override === false) {</td></tr><tr class="hit"><td class="line">54</td><td class="hits">3</td><td class="source"> return;</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"> </td></tr><tr class="hit"><td class="line">57</td><td class="hits">100</td><td class="source"> if (resource.src) {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">99</td><td class="source"> resource.src = librarySrc;</td></tr><tr class="hit"><td class="line">59</td><td class="hits">1</td><td class="source"> } else if (resource.dir) {</td></tr><tr class="hit"><td class="line">60</td><td class="hits">1</td><td class="source"> resource.dir = librarySrc;</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"> }</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">64</td><td class="hits">102</td><td class="source"> resource.library = library;</td></tr><tr class="hit"><td class="line">65</td><td class="hits">102</td><td class="source"> return resource;</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"> </td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> calcOverrides: function(library, extend) {</td></tr><tr class="hit"><td class="line">69</td><td class="hits">9</td><td class="source"> var ret = {};</td></tr><tr class="hit"><td class="line">70</td><td class="hits">9</td><td class="source"> while (library) {</td></tr><tr class="hit"><td class="line">71</td><td class="hits">11</td><td class="source"> _.each(library.overrides, function(override, src) {</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> /*jshint eqnull:true */</td></tr><tr class="hit"><td class="line">73</td><td class="hits">9</td><td class="source"> if (override != null) {</td></tr><tr class="hit"><td class="line">74</td><td class="hits">9</td><td class="source"> ret[src] = {</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> override: override</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">9</td><td class="source"> extend && extend(library.overrideLibrary, src, ret[src]);</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><tr><td class="line">80</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">81</td><td class="hits">11</td><td class="source"> library = library.overrideLibrary;</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">9</td><td class="source"> return ret;</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> },</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"> relativePath: function(src, library) {</td></tr><tr class="hit"><td class="line">87</td><td class="hits">39</td><td class="source"> if (src.indexOf('./') === 0) {</td></tr><tr class="miss"><td class="line">88</td><td class="hits">0</td><td class="source"> src = src.substring(2);</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">90</td><td class="hits">39</td><td class="source"> src = normalize(src);</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> // Attempt to strip either the root of the base or overriding library as we don't know</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> // which we might be</td></tr><tr class="hit"><td class="line">94</td><td class="hits">39</td><td class="source"> while (library) {</td></tr><tr class="hit"><td class="line">95</td><td class="hits">4</td><td class="source"> var mixinRoot = library.root || '';</td></tr><tr class="hit"><td class="line">96</td><td class="hits">4</td><td class="source"> if (src.indexOf(mixinRoot) === 0) {</td></tr><tr class="hit"><td class="line">97</td><td class="hits">3</td><td class="source"> return src.substring(mixinRoot.length);</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 class="hit"><td class="line">100</td><td class="hits">1</td><td class="source"> library = library.overrideLibrary;</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"> </td></tr><tr class="hit"><td class="line">103</td><td class="hits">36</td><td class="source"> return src;</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"> pathToLibrary: function(src, library) {</td></tr><tr class="hit"><td class="line">107</td><td class="hits">39</td><td class="source"> src = resources.relativePath(src, library);</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">109</td><td class="hits">39</td><td class="source"> var overrides = library && library.overrides;</td></tr><tr class="hit"><td class="line">110</td><td class="hits">39</td><td class="source"> if (overrides) {</td></tr><tr class="hit"><td class="line">111</td><td class="hits">1</td><td class="source"> overrides = _.invert(overrides);</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> // Warn not supporting directories at this point in time. Matches must be 1 to 1</td></tr><tr class="hit"><td class="line">114</td><td class="hits">1</td><td class="source"> return overrides[src] || src;</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"> </td></tr><tr class="hit"><td class="line">117</td><td class="hits">38</td><td class="source"> return src;</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 class="hit"><td class="line">121</td><td class="hits">1</td><td class="source">function findOverride(library, src) {</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> /*jshint eqnull:true */</td></tr><tr class="hit"><td class="line">123</td><td class="hits">103</td><td class="source"> var ret;</td></tr><tr class="hit"><td class="line">124</td><td class="hits">103</td><td class="source"> while (library) {</td></tr><tr class="hit"><td class="line">125</td><td class="hits">123</td><td class="source"> var override = library.overrides && library.overrides[src];</td></tr><tr class="hit"><td class="line">126</td><td class="hits">123</td><td class="source"> if (override != null) {</td></tr><tr class="hit"><td class="line">127</td><td class="hits">23</td><td class="source"> ret = {</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> override: override,</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> root: (library.overrideLibrary || {}).root || ''</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> };</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"> </td></tr><tr class="hit"><td class="line">133</td><td class="hits">123</td><td class="source"> library = library.overrideLibrary;</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"> </td></tr><tr class="hit"><td class="line">136</td><td class="hits">103</td><td class="source"> if (ret) {</td></tr><tr class="hit"><td class="line">137</td><td class="hits">21</td><td class="source"> return ret.override === false ? false : ret;</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></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/util/watcher.js">/Users/kpdecker/dev/walmart/lumbar/lib/util/watcher.js</h2><div id="stats" class="high"><div class="percentage">90%</div><div class="sloc">101</div><div class="hits">91</div><div class="misses">10</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">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * Adds dependency watching to the core fs.watchFile implementation.</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var _ = require('underscore'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> fs = require('fs');</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 watchedFiles = {};</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">1</td><td class="source">function notifyWatch(filename, type, sourceChange, trigger) {</td></tr><tr class="hit"><td class="line">10</td><td class="hits">81</td><td class="source"> var watchInfo = watchedFiles[filename];</td></tr><tr class="hit"><td class="line">11</td><td class="hits">81</td><td class="source"> if (watchInfo) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">78</td><td class="source"> var inQueue = _.find(watchInfo.queue, function(entry) {</td></tr><tr class="miss"><td class="line">13</td><td class="hits">0</td><td class="source"> return entry.type === type</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> && entry.filename === filename</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> && entry.sourceChange === sourceChange;</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> });</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">78</td><td class="source"> if (!inQueue) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">78</td><td class="source"> var entry = {type: type, filename: filename, sourceChange: sourceChange};</td></tr><tr class="hit"><td class="line">20</td><td class="hits">78</td><td class="source"> watchInfo.queue.push(entry);</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">78</td><td class="source"> function exec() {</td></tr><tr class="hit"><td class="line">23</td><td class="hits">78</td><td class="source"> watchInfo.queue = _.without(watchInfo.queue, entry);</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">25</td><td class="hits">78</td><td class="source"> if (watchInfo.callback) {</td></tr><tr class="hit"><td class="line">26</td><td class="hits">52</td><td class="source"> watchInfo.callback(type, filename, sourceChange);</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">28</td><td class="hits">78</td><td class="source"> watchInfo.parents.forEach(function(parent) {</td></tr><tr class="hit"><td class="line">29</td><td class="hits">43</td><td class="source"> notifyWatch(parent, type, sourceChange, trigger);</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> });</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 class="hit"><td class="line">33</td><td class="hits">78</td><td class="source"> if (trigger) {</td></tr><tr class="hit"><td class="line">34</td><td class="hits">72</td><td class="source"> exec();</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> } else {</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> // Debounce so we don't output multiple instances of the same event on platforms</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> // such as linux that may send multiple events on write, etc.</td></tr><tr class="hit"><td class="line">38</td><td class="hits">6</td><td class="source"> _.defer(exec, 200);</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> }</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 class="hit"><td class="line">44</td><td class="hits">1</td><td class="source">function watchFile(filename, callback, parent) {</td></tr><tr class="hit"><td class="line">45</td><td class="hits">185</td><td class="source"> var watchInfo = {</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> callback: callback,</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> parents: [],</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> queue: []</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">185</td><td class="source"> if (parent) {</td></tr><tr class="hit"><td class="line">51</td><td class="hits">106</td><td class="source"> watchInfo.parents.push(parent);</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">53</td><td class="hits">185</td><td class="source"> watchedFiles[filename.virtual || filename] = watchInfo;</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">55</td><td class="hits">185</td><td class="source"> if (!filename.virtual) {</td></tr><tr class="hit"><td class="line">56</td><td class="hits">6</td><td class="source"> var hasRetried;</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">6</td><td class="source"> (function watch(ignoreError) {</td></tr><tr class="hit"><td class="line">59</td><td class="hits">7</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">60</td><td class="hits">7</td><td class="source"> var oldStat = fs.statSync(filename),</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> lastType,</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> rewatch;</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">64</td><td class="hits">7</td><td class="source"> var changeHandler = _.debounce(function() {</td></tr><tr class="hit"><td class="line">65</td><td class="hits">3</td><td class="source"> if (rewatch) {</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> // Attempt to reattach on rename</td></tr><tr class="hit"><td class="line">67</td><td class="hits">1</td><td class="source"> watchInfo.watch.close();</td></tr><tr class="hit"><td class="line">68</td><td class="hits">1</td><td class="source"> watch(true);</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">3</td><td class="source"> notifyWatch(filename, lastType, filename);</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> }, 1000);</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">7</td><td class="source"> watchInfo.watch = fs.watch(filename, function(type) {</td></tr><tr class="hit"><td class="line">74</td><td class="hits">8</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">75</td><td class="hits">8</td><td class="source"> var newStat = fs.statSync(filename);</td></tr><tr class="hit"><td class="line">76</td><td class="hits">6</td><td class="source"> if (newStat.isDirectory()) {</td></tr><tr class="hit"><td class="line">77</td><td class="hits">1</td><td class="source"> notifyWatch(filename, 'create', filename);</td></tr><tr class="hit"><td class="line">78</td><td class="hits">5</td><td class="source"> } else if (newStat.size !== oldStat.size || newStat.mtime.getTime() > oldStat.mtime.getTime()) {</td></tr><tr class="hit"><td class="line">79</td><td class="hits">5</td><td class="source"> oldStat = newStat;</td></tr><tr class="hit"><td class="line">80</td><td class="hits">5</td><td class="source"> if (type === 'rename') {</td></tr><tr class="hit"><td class="line">81</td><td class="hits">1</td><td class="source"> rewatch = true;</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">5</td><td class="source"> lastType = type;</td></tr><tr class="hit"><td class="line">84</td><td class="hits">5</td><td class="source"> changeHandler();</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"> } catch (err) {</td></tr><tr class="hit"><td class="line">87</td><td class="hits">2</td><td class="source"> if (err.code === 'ENOENT') {</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> // The file was removed by the time we got to it. This could be a case of it actually being removed</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> // or a race condtion with rewriting APIs.</td></tr><tr class="hit"><td class="line">90</td><td class="hits">2</td><td class="source"> watchInfo.watch.close();</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> // Pause a bit to see if this was a replace that we raced with...</td></tr><tr class="hit"><td class="line">93</td><td class="hits">2</td><td class="source"> setTimeout(function() {</td></tr><tr class="hit"><td class="line">94</td><td class="hits">2</td><td class="source"> try {</td></tr><tr class="hit"><td class="line">95</td><td class="hits">2</td><td class="source"> fs.statSync(filename); // No exception: file still exists, notify and restart the watch</td></tr><tr class="miss"><td class="line">96</td><td class="hits">0</td><td class="source"> notifyWatch(filename, 'change', filename);</td></tr><tr class="miss"><td class="line">97</td><td class="hits">0</td><td class="source"> watch(true);</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> // The file is really gone... or we just got hit with a race condtion twice. Give up.</td></tr><tr class="hit"><td class="line">100</td><td class="hits">2</td><td class="source"> notifyWatch(filename, 'remove', filename);</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"> }, 500);</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">104</td><td class="hits">0</td><td class="source"> throw err;</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><td class="line">107</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr class="miss"><td class="line">109</td><td class="hits">0</td><td class="source"> if (!hasRetried && err.code === 'EMFILE') {</td></tr><tr class="miss"><td class="line">110</td><td class="hits">0</td><td class="source"> hasRetried = true;</td></tr><tr class="miss"><td class="line">111</td><td class="hits">0</td><td class="source"> setTimeout(function() {</td></tr><tr class="miss"><td class="line">112</td><td class="hits">0</td><td class="source"> watch(ignoreError);</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> }, 250);</td></tr><tr class="miss"><td class="line">114</td><td class="hits">0</td><td class="source"> } else if (!ignoreError) {</td></tr><tr class="miss"><td class="line">115</td><td class="hits">0</td><td class="source"> throw err;</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> }</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 class="hit"><td class="line">122</td><td class="hits">1</td><td class="source">exports.watchFile = function(filename, dependencies, callback) {</td></tr><tr class="hit"><td class="line">123</td><td class="hits">102</td><td class="source"> var watch = watchedFiles[filename.virtual || filename];</td></tr><tr class="hit"><td class="line">124</td><td class="hits">102</td><td class="source"> if (!watch) {</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> // Create a watch on this and all others</td></tr><tr class="hit"><td class="line">126</td><td class="hits">79</td><td class="source"> watchFile(filename, callback);</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">128</td><td class="hits">23</td><td class="source"> watch.callback = callback;</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">131</td><td class="hits">102</td><td class="source"> filename = filename.virtual || filename;</td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">133</td><td class="hits">102</td><td class="source"> dependencies.forEach(function(depend) {</td></tr><tr class="hit"><td class="line">134</td><td class="hits">279</td><td class="source"> var watch = watchedFiles[depend.virtual || depend];</td></tr><tr class="hit"><td class="line">135</td><td class="hits">279</td><td class="source"> if (!watch) {</td></tr><tr class="hit"><td class="line">136</td><td class="hits">106</td><td class="source"> watchFile(depend, undefined, filename);</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">138</td><td class="hits">173</td><td class="source"> if (!_.contains(watch.parents, filename)) {</td></tr><tr class="hit"><td class="line">139</td><td class="hits">90</td><td class="source"> watch.parents.push(filename);</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"> }</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">};</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">145</td><td class="hits">1</td><td class="source">exports.trigger = function(type, filename) {</td></tr><tr class="hit"><td class="line">146</td><td class="hits">32</td><td class="source"> notifyWatch(filename, type, filename, true);</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source">};</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">1</td><td class="source">exports.unwatch = function(filename, dependencies) {</td></tr><tr class="hit"><td class="line">150</td><td class="hits">9</td><td class="source"> var watch = watchedFiles[filename.virtual || filename];</td></tr><tr class="hit"><td class="line">151</td><td class="hits">9</td><td class="source"> if (!watch) {</td></tr><tr class="hit"><td class="line">152</td><td class="hits">1</td><td class="source"> return;</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"> </td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> // Remove the callback</td></tr><tr class="hit"><td class="line">156</td><td class="hits">8</td><td class="source"> if (!dependencies) {</td></tr><tr class="hit"><td class="line">157</td><td class="hits">4</td><td class="source"> watch.callback = undefined;</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> }</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"> // For each dependency remove the parent link</td></tr><tr class="hit"><td class="line">161</td><td class="hits">8</td><td class="source"> filename = filename.virtual || filename;</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">163</td><td class="hits">8</td><td class="source"> _.each(dependencies || watchedFiles, function(depend) {</td></tr><tr class="hit"><td class="line">164</td><td class="hits">18</td><td class="source"> var watch = watchedFiles[depend.virtual || depend];</td></tr><tr class="hit"><td class="line">165</td><td class="hits">18</td><td class="source"> if (!watch) {</td></tr><tr class="hit"><td class="line">166</td><td class="hits">14</td><td class="source"> return;</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"> </td></tr><tr class="hit"><td class="line">169</td><td class="hits">4</td><td class="source"> watch.parents = _.without(watch.parents, filename);</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> });</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"> // Kill this watch if it can't trigger or fire</td></tr><tr class="hit"><td class="line">173</td><td class="hits">8</td><td class="source"> var canTrigger = watch.watch || _.some(watchedFiles, function(watch) {</td></tr><tr class="hit"><td class="line">174</td><td class="hits">29</td><td class="source"> return _.contains(watch.parents, filename);</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">176</td><td class="hits">8</td><td class="source"> if (!watch.callback || !canTrigger) {</td></tr><tr class="hit"><td class="line">177</td><td class="hits">5</td><td class="source"> unwatch(filename);</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"> // Kill any other watches that might not be valid anymore</td></tr><tr class="hit"><td class="line">181</td><td class="hits">8</td><td class="source"> _.each(_.clone(watchedFiles), function(watch, name) {</td></tr><tr class="hit"><td class="line">182</td><td class="hits">24</td><td class="source"> if (!watch.callback && !watch.parents.length) {</td></tr><tr class="hit"><td class="line">183</td><td class="hits">4</td><td class="source"> exports.unwatch(name);</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source">};</td></tr><tr class="hit"><td class="line">187</td><td class="hits">1</td><td class="source">exports.unwatchAll = function() {</td></tr><tr class="hit"><td class="line">188</td><td class="hits">60</td><td class="source"> _.each(watchedFiles, function(watch, name) {</td></tr><tr class="hit"><td class="line">189</td><td class="hits">180</td><td class="source"> unwatch(name);</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">193</td><td class="hits">1</td><td class="source">function unwatch(name) {</td></tr><tr class="hit"><td class="line">194</td><td class="hits">185</td><td class="source"> watchedFiles[name].callback = undefined;</td></tr><tr class="hit"><td class="line">195</td><td class="hits">185</td><td class="source"> if (watchedFiles[name].watch) {</td></tr><tr class="hit"><td class="line">196</td><td class="hits">6</td><td class="source"> watchedFiles[name].watch.close();</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">185</td><td class="source"> delete watchedFiles[name];</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/kpdecker/dev/walmart/lumbar/lib/watch-manager.js">/Users/kpdecker/dev/walmart/lumbar/lib/watch-manager.js</h2><div id="stats" class="high"><div class="percentage">95%</div><div class="sloc">42</div><div class="hits">40</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 class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var _ = require('underscore'),</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> EventEmitter = require('events').EventEmitter,</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> fu = require('./fileUtil'),</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> path = require('path'),</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> watcher = require('./util/watcher');</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">function WatchManager() {</td></tr><tr class="hit"><td class="line">8</td><td class="hits">29</td><td class="source"> EventEmitter.call(this);</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">10</td><td class="hits">29</td><td class="source"> this.reset();</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">29</td><td class="source"> this._exec = this.setupExec();</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source">WatchManager.prototype = {</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> configFile: function(path, mixins, callback) {</td></tr><tr class="hit"><td class="line">17</td><td class="hits">18</td><td class="source"> if (_.isFunction(mixins)) {</td></tr><tr class="miss"><td class="line">18</td><td class="hits">0</td><td class="source"> callback = mixins;</td></tr><tr class="miss"><td class="line">19</td><td class="hits">0</td><td class="source"> mixins = undefined;</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">18</td><td class="source"> var self = this;</td></tr><tr class="hit"><td class="line">23</td><td class="hits">18</td><td class="source"> watcher.watchFile(path, mixins || [], function() {</td></tr><tr class="hit"><td class="line">24</td><td class="hits">4</td><td class="source"> self.emit('watch-change', {fileName: path, config: true});</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">26</td><td class="hits">4</td><td class="source"> self.pushChange({callback: callback, fileName: path, config: true});</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><td class="line">29</td><td class="hits"></td><td class="source"> moduleOutput: function(status, callback) {</td></tr><tr class="hit"><td class="line">30</td><td class="hits">77</td><td class="source"> var self = this;</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">77</td><td class="source"> function theWatcher(type, filename, sourceChange) {</td></tr><tr class="hit"><td class="line">33</td><td class="hits">39</td><td class="source"> self.emit('watch-change', {fileName: sourceChange, output: status.fileName});</td></tr><tr class="hit"><td class="line">34</td><td class="hits">39</td><td class="source"> self.pushChange({</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> callback: callback,</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> type: type,</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> fileName: status.fileName,</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> sourceChange: sourceChange</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">42</td><td class="hits">349</td><td class="source"> var input = status.inputs.map(function(input) { return fu.resolvePath(input.dir || input); }),</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> removed = _.difference(this.watching[status.fileName], input);</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">45</td><td class="hits">77</td><td class="source"> if (removed.length) {</td></tr><tr class="hit"><td class="line">46</td><td class="hits">2</td><td class="source"> watcher.unwatch(status.fileName, removed);</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 class="hit"><td class="line">49</td><td class="hits">77</td><td class="source"> watcher.watchFile({ virtual: status.fileName }, input, theWatcher);</td></tr><tr class="hit"><td class="line">50</td><td class="hits">77</td><td class="source"> this.watching[status.fileName] = input;</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"> setupExec: function() {</td></tr><tr class="hit"><td class="line">55</td><td class="hits">11</td><td class="source"> return _.debounce(_.bind(this.flushQueue, this), 500);</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> flushQueue: function() {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">24</td><td class="source"> if (this.queue.length) {</td></tr><tr class="hit"><td class="line">59</td><td class="hits">24</td><td class="source"> _.each(this.queue, function(change) {</td></tr><tr class="hit"><td class="line">60</td><td class="hits">41</td><td class="source"> change.callback();</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">24</td><td class="source"> this.queue = [];</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"> },</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"> reset: function() {</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> // Cleanup what we can, breaking things along the way</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> // WARN: This prevents concurrent execution within the same process.</td></tr><tr class="hit"><td class="line">69</td><td class="hits">52</td><td class="source"> watcher.unwatchAll();</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">71</td><td class="hits">52</td><td class="source"> this.watching = {};</td></tr><tr class="hit"><td class="line">72</td><td class="hits">52</td><td class="source"> this.queue = [];</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> pushChange: function(change) {</td></tr><tr class="hit"><td class="line">75</td><td class="hits">60</td><td class="source"> fu.resetCache(change.sourceChange);</td></tr><tr class="hit"><td class="line">76</td><td class="hits">60</td><td class="source"> if (change.type === 'remove' && change.sourceChange) {</td></tr><tr class="hit"><td class="line">77</td><td class="hits">3</td><td class="source"> fu.resetCache(path.dirname(change.sourceChange));</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><tr class="hit"><td class="line">80</td><td class="hits">60</td><td class="source"> if (_.find(this.queue, function(existing) {</td></tr><tr class="hit"><td class="line">81</td><td class="hits">45</td><td class="source"> return existing.config || (change.fileName && (existing.fileName === change.fileName));</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"> // If we have a pending config change or changes to the same file that has not started then</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> // we can ignore subsequent changes</td></tr><tr class="hit"><td class="line">85</td><td class="hits">7</td><td class="source"> return;</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">88</td><td class="hits">53</td><td class="source"> if (change.config) {</td></tr><tr class="hit"><td class="line">89</td><td class="hits">10</td><td class="source"> this.reset();</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"> </td></tr><tr class="hit"><td class="line">92</td><td class="hits">53</td><td class="source"> this.queue.push(change);</td></tr><tr class="hit"><td class="line">93</td><td class="hits">53</td><td class="source"> this._exec();</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">97</td><td class="hits">1</td><td class="source">WatchManager.prototype.__proto__ = EventEmitter.prototype;</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">1</td><td class="source">exports = module.exports = WatchManager;</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div></div></div></body></html>
|