UNPKG

588 kBHTMLView Raw
1Running "mochacov:cov" (mochacov) task
2<!DOCTYPE html><html><head><title>Coverage</title><script>
3
4headings = [];
5
6onload = function(){
7 headings = document.querySelectorAll('h2');
8};
9
10onscroll = function(e){
11 var heading = find(window.scrollY);
12 if (!heading) return;
13 var links = document.querySelectorAll('#menu a')
14 , link;
15
16 for (var i = 0, len = links.length; i < len; ++i) {
17 link = links[i];
18 link.className = link.getAttribute('href') == '#' + heading.id
19 ? 'active'
20 : '';
21 }
22};
23
24function find(y) {
25 var i = headings.length
26 , heading;
27
28 while (i--) {
29 heading = headings[i];
30 if (y >= heading.offsetTop) {
31 return heading;
32 }
33 }
34}
35</script>
36<style>
37
38body {
39 font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif;
40 margin: 0;
41 color: #2C2C2C;
42 border-top: 2px solid #ddd;
43}
44
45#coverage {
46 padding: 60px;
47}
48
49h1 a {
50 color: inherit;
51 font-weight: inherit;
52}
53
54h1 a:hover {
55 text-decoration: none;
56}
57
58.onload h1 {
59 opacity: 1;
60}
61
62h2 {
63 width: 80%;
64 margin-top: 80px;
65 margin-bottom: 0;
66 font-weight: 100;
67 letter-spacing: 1px;
68 border-bottom: 1px solid #eee;
69}
70
71a {
72 color: #8A6343;
73 font-weight: bold;
74 text-decoration: none;
75}
76
77a:hover {
78 text-decoration: underline;
79}
80
81ul {
82 margin-top: 20px;
83 padding: 0 15px;
84 width: 100%;
85}
86
87ul li {
88 float: left;
89 width: 40%;
90 margin-top: 5px;
91 margin-right: 60px;
92 list-style: none;
93 border-bottom: 1px solid #eee;
94 padding: 5px 0;
95 font-size: 12px;
96}
97
98ul::after {
99 content: '.';
100 height: 0;
101 display: block;
102 visibility: hidden;
103 clear: both;
104}
105
106code {
107 font: 12px monaco, monospace;
108}
109
110pre {
111 margin: 30px;
112 padding: 30px;
113 border: 1px solid #eee;
114 border-bottom-color: #ddd;
115 -webkit-border-radius: 2px;
116 -moz-border-radius: 2px;
117 -webkit-box-shadow: inset 0 0 10px #eee;
118 -moz-box-shadow: inset 0 0 10px #eee;
119 overflow-x: auto;
120}
121
122img {
123 margin: 30px;
124 padding: 1px;
125 -webkit-border-radius: 3px;
126 -moz-border-radius: 3px;
127 -webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
128 -moz-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
129 max-width: 100%;
130}
131
132footer {
133 background: #eee;
134 width: 100%;
135 padding: 50px 0;
136 text-align: right;
137 border-top: 1px solid #ddd;
138}
139
140footer span {
141 display: block;
142 margin-right: 30px;
143 color: #888;
144 font-size: 12px;
145}
146
147#menu {
148 position: fixed;
149 font-size: 12px;
150 overflow-y: auto;
151 top: 0;
152 right: 0;
153 margin: 0;
154 height: 100%;
155 padding: 15px 0;
156 text-align: right;
157 border-left: 1px solid #eee;
158 -moz-box-shadow: 0 0 2px #888
159 , inset 5px 0 20px rgba(0,0,0,.5)
160 , inset 5px 0 3px rgba(0,0,0,.3);
161 -webkit-box-shadow: 0 0 2px #888
162 , inset 5px 0 20px rgba(0,0,0,.5)
163 , inset 5px 0 3px rgba(0,0,0,.3);
164 -webkit-font-smoothing: antialiased;
165 background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGYAAABmCAMAAAAOARRQAAABelBMVEUjJSU6OzshIyM5OjoqKy02NjgsLS01NTYjJCUzNTUgISMlJSc0NTUvMDA6PDwlJyg1NjYoKis2NjYrLS02ODkpKyw0NDYrLC04ODovLzA4Ojo0NDUtLy86OjwjIyU4OTosLS82ODgtLS8hIyQvMTEnKCooKSsrKy0qLCwkJSUnKCkrLCwpKiwwMjIxMzMqLC0tLS0pKissLC00NTYwMDIwMTQpKysoKSovMDEtLzA2OTkxMzUrKywvLy8qKyszNTY5OzsqKiw6OjswMDExNDUoKiozNDUvMDIyNDY1Njg2Njk5OTozMzU0NjY4ODkiIyUiIyQ4OTkuMDEmKCowMjQwMTErLS4qKywwMTMhIiMpKiopKy0tLjAkJScxNDQvLzExNDYyNDQmKCk5OTslJig5OjskJSYxMzQrLS8gISIwMTIoKCk1NTUlJSUnJygwMDA4ODgiIiMhISI8PDw6Ojo5OTkpKSojIyQ7OzsyMjIpKSssLCw6Ozw1NjlrfLakAAAg2UlEQVR42jR6i3ea6rYvPgANIAhVXh8WvkQlioUiFlFcBtAmoiRNdzxqu9p0J7vrdK29zuPeex77nnvO/35n1r1ndHRktI0jTOacv/l7lCBK5UqVpOha/YxmWK7BC4TQFKVXrbYsnimqxuuMVlOQ0XltWjUdCwRJ1M+tC1KudOs9q6+da2adUewG0SC0SwELfHtgDds93VEuydEbl3QMWeNoYkR7b/0x1ZRobGI3mLwzAhePqTAwhg6aogjNsGy7/jwQ4rkdqe7CWLxF8k9LfMVFyRS7VJqtkrW8Vt/bkR8FZJao16ipknbC3Yw2lM7laO6HBEOadEZ2tpf65c4v8e3u7FyU6qbiNNyCuzXZ6pawgnwgmrpTT/Q7w2EZmiIJ0dzWDI7mhQ80IfRnMu2kzA5r5r1pIFoia+/d93HRYp1GV8TbrkWoU/+jdI0Ff6yGwTjT1Hn8J+8m1rKpGiYPuNiHnMtNMIv+zpsk84MYTNW1/+DpwXLvckdOCMYowVNPREe0QlM8xRHXXFhcNDzupwsSmb5pH+0t0RP2Qk+QtI7F1Qm6JRC6ZPBtPq/dq/kH+jxtCljn9TIpW6rQIgmSVyj6lPICIw4N/taka41PFUInth0je9+jO6Kt1G4/a7V2LEgG02B0pHVuCZrgltSKMuIl5SyufUv9mYuQi+mFgzbBEtFo2g+Dh4sSTrLNu8JPh00sQydpb00tqXBvqRN7Q7kqzcnIxCGnvZt/WmJacoOEO6Dcn8Qre03pOCSQxbMOXUuDNx9SxuLz4W1I18gvjViQ67zV0rxdWL8Te/TQkuo8STS41DR48W7L6YP2uWIqiUV8rd6Gbf/rnegKZeG8TpAM6afhGze9JAOxbLjsnUXEbrZ9vLYd7MT32cPF5mKKxmjy7huaoD9n62GOxni3iIJwv0IzZAZjdZkUtolCNLVfYZNaquFjGszVVf+J0vrz4CawoKdHnOzb0NMH7CDBOybfYNJ4rfeMyFNjkFYVTzMFs87rnPGXLUOeNKRVc0LnU7/UIgelzsy3CMuth0YfvnY0wsD3vODUL3eJcKqHQpm8yM3XZQWJxO6Un9iYloyyLpOwN2obHy6W6gbpcb44XmyC+mg+itAcaprGcrwZCqMj/GmtKn0zPvpTz/Cv1dw21XwP3cRupg3H3MF/S71eTKj1YrdwKdc2Mw0fRmb2sFf8lW3aU6JbIZSEPqvXvjM7G/aApyXlXeqKfMq0g/Su3rUGJPSPrtGElgknrZM3xUXqsAP6zMCNVn5u8aJnSNpJv2uru7t2jfRziW2+GuhqfldUNbPk71olwo+46ePUo1U3WKk/e5YK07F/wGRgcpODmQnIlVeHCWBE4puBi2jq28UKpqiN1/4UOrGz59TNYrrQHtd+11sG40BGD+pXdelNqGOg4NXe8W4eacJV/NS9/2Umtym6WQqveqR9xdCMElpxnbkalM4Vf9uaEcWZaKdyibEIjWKxJZPN95niCL3GiaXyssIrHxoLkqkzLCXULN46/f2h3tQJgyip+Tk9EAjJ9aJshq7t8X45aowSKspMSvPf7r9R8yxNptIaHS5ozuEm6luPDApugyNP8OaqiQ4BjaequXA54SLC83eHIY2r+CZp4409Xqw8Aa2oI7XkCrQi+in0w5AqF/kLNrcUz+qkl/lAobY1jSnx5OJNhyXIz3qfNFlXc0TKaglNwdWkWYt9QQ1Kr6W8zue21iNrdJk+N5oCr2O9nEtWKC7IS5J/zdDEYrmnAYfg6agCy+qcgz7ZofeDc4PbUWSvkshWuAc7OjiUyLkj+RAtdlwXJcjxdpkTTHDhK8lBCi8+JtvDVL1W6elmOM++YS0LuSlaP1oUvAeiW3cFnvTr8EbTz1tsSMYdGeZe40sRWu5uAfj7q+ZoKv2FNQ0p5XY1lmlcigHZqTPpabufEVrNuNPi165w3uCVQJHyJqmSJ7ZHnguqwtCmwViIJijj04ba2JNYtB+yORf5gg1/9t9iw4vUpeqiunSAbf+IBdj/b+iG2qrHvuNP0Vd/+ThVZT/lrvHYjjgDbbyxaqgHNM2uhxa1GW3UedZYhMMwM4mQhltouK+IV4NdbIQNM+8Yv311RZk9kT4tiYR4LkyFcuPpdcjuhUuFqBAWRZa11lcZ3gEBlXywsNhrt+plISZP5DlsV9l4EgY6J3yZPTUcMrgaWAT3oI79eSbGEbcJpr6BD8kyDiVt+G0/hXosQN4NFXKlfWIfsIs0BHODVok1/IGnKFHJYIquh8Xo+2+bkQNTGgWmN/fZ0Y33LSj6lr1GyV7mWIKg7ZTRZPGuhF/zjRNcQ1UPtSYgnWQxSs0yrVhwNDcdGMNSNe2JT3WuzbAM3HykyAajS3Uphf6STKEqxLas9EnmnhA/lyj9Uj+JoY7SVgVmGLl46Rm2u98sbkap2lzAdKBG4r6LgulQOSSjQv1GWdQ0jtDUK/mAaqM1Uqjpu4k3Rvfvxv7YTxLSK+wN3E5jVIzmF23uZ7hiH/sVP49D7tvoKp4S8b1LuvRlivVB/algbhcFITYVXvDpLzpDfplR2uD5V4XJFxpjmIpLc9Y5sB2TpBRix7Bme6GZIq+06v3XzNeTcA4obQIKxrnT4C2JpOqD92dbmSX8MGazly5EsZVMvSU1f4RZwyu8iQXbVdeLlZrjuTT1jrY1uk5c7iZ7RsvhhluqAkq4JpVQAg7RJFtSu+xgJ8Pv6O1j5DkLxT8mkbfyRW5DrQmG7hiDIjCgBsADbjuof6YHLGeV6a5Q1Smx9joUXPpdaaDx97A/Wq00oJkdR7ZYuQRfS533JtxO1erduqWOYIt3wh0wpbLuCNIYkwxbswbikCUu2CDCS+Q+7rgVtfRcm+SOcdKPRlZ/rE7wNVUEE39KTS5uvUKN1PUnkloPkyzhyGQ8qkouEjJ3H/VXdqG6asSRiw3ecMlBvDDt8dDhBHXMwZ2Cajzjr7/76T+IavqPYvz6r7//E/3X3+N//h/0QozbjPgPiir69P/8X3/9F/yv8b/827/++98WItPu5/Hvwd8YPf5bp/2/lX/T/+Of/0MJ/lYTa+L/Ef+d9vN/3/2T6P/+jyTzu/evf6U7vxN7B6pJkRtAF6jUr8I+P8RsP/ptGhfqFk+pQ/DgAy6NJtRYJdXmp4gK7WLqLKJ+MaKhGjOojvL+SnIWrkpy0SLHDe4QuyNzaEA15mLMCcmE8Em+4HdOihW4/ZWuppJEmzeAwcDtv7MuLc9y2V5atvxXNe3S4DUMt5/Qy2LM9kSYKiVWBuKlfp4nxTntpuW03JbIlkiRvBXmT23g1I2OYe6IizUHPIq6zm6mbfsbteKmi/sg9J+ocQBMctGFO7iljo8TPN+z3jxw4do+ZwfqoR9dkNTKHyM305GpTkfhcHexVkPVGEbUOjuo9f0UMPHBFlGEx0SLvJvVRKTwW7PSew5oPme+E42+frJa9cGt2njS3dK5kIif2eYbhuSEQXEqMVfUjhGIuin0G0/W5ezJyJQy3SpMLai4M0JUWb5u1k9tny5bd1pPwYBpQuDCXZl62xg4CdVEAtflXHs6JKmP/pH6mOl796Lgopj0o8d5kKh00hxG3OSdEE/QBo9Hgr8JJqAeLDwJohG5j/DGh61Rc/+tf22/8kEnxHNCEjo0ElvvGfESZkqmz2BDcKV1H1buSkhkdg7p1IMGs2s17nYjpblrWuE2K9WEO/hcRp5e9oOF/QBmOaDtgil+oaU6szPrdwW65fOB0KUTsVUn7LFU7J8e6cxJIl9+FHw5MQMzuQJ+4oxMH3iW/5GK+hWuG0T+gTLs+fAjdtUd58TmIUq04EeyRCYCjkldow234aIgR5bqwrtZosZ+6YEqAmDqatJ9lWasz4IquKALPtd92hGI3Z2BdzzZue+REl1Om4DIWD+RrtUTOJLI+S0jHowXXdAxsGLSd40zYNuEUlOGhrwL6c7tcOtUOvpJCP7QBQS19H+GvZn05ewjlVLz+IGKoC9TyfQjLMBNmXCuqqtTdOSukZW48B0HqgSTCBrBnlFvF4CG2Su7yFzqmJFURK3UmTT3ru050r0ptUpMilYnBJWfl2Bv6kPlUuE1kxxpdzui9AubsR2N2boVSu81OulAwBqoSr1LZ0LLYOomyZHmjqnXlP72s8LnDouEJjtodBvdHaG1jMySYO7crWd90MpCRyCG14vb5IE7Arupw/y/RcCm/Tm3zK6zYj8PYNaGldiUfkB/LHWcmf2lVM+mwyU27a0qq2tscrQ/vzBjN26DnntIrOyGizzXK35yKQdYnUABkyN4saz3WD/viF+eCcsXnIajdWYJWaYHRstIis9CS+tqnFGmz2j5uzfr3Z4prqgK4XOT/PyftvjZqIm8lhkfxJ7Ol3CJF1piYBGAG8wtAk56Drw1YwmOpcz+NdfkSpSLplRXLXHL0Rquj6YW/gabqgK7Dgr6NwtH0B/AN7XrN+MVJ6AmXmUuqmQulrNNYPmH0RoDogydOKLo/QbfYNARSQQKISRCzRXU+q9WWJFL3LZW6u34CkeG97xC0NNGaJ0bvK6SnZS3zPskr5EtuCgjMWR5o2x5BqhKmDWJPRe7JMEOyRb5uUKlHaGVtq5ivSOaSliSXp9SQm2qk8MRJh10MAp9QQ2H5t59J8rjiwSZtoIfMGjlLPVNdYl/LBR0AO6WLGDmkLkIPRE45Y9MftdAK/yNu1Hn6tzOQTesgQ+8fSzB19wO91vCnO23vOWQdwJ63SJrYjdfKFW6W281PKs2k8iT9ai1cgJ4sa3xqdvmtxR8/+D1B8AKc2u+6JftryRhMWSQtoSBgIyyQGyxcnELuAasXN12oSriU4RMz1DD6RL0TSV+om7i1Yt+jEE/jnawM8cX/UhN4nkiv/w9eALrzNhXuQfOzFL0Fi6SjF7/4Qn8rLYBoa85cvgAnkCEBP+HPbEnquVXCZsMS/yzYw2Vru60P/+nJPYKkzZFjmbykzUoEqV836T5q3fP/L383dF82tx18/AZgZczMAgyeWYKmSZIqtHL+e+O4ZRcq9VI3g/qPeCoiK4pcgEqdbS0S/Be54sbVQOuJVPNBblIghzeasNu7h/g+Sz1IdhI5lCwq1nUb3Ji4OCIcqQZqtqJ5w7rXrg/DA9IgVmEGhDgGecEwnCTHffXcXs0V3OCEVzYDKS1vp/oX+ng+6XVU86UjA6FMO2RXOOOrqY1GgPvrAk9HV/BXtCu5RuwF8qgdGDLsBcui4E33ymdBip1X8uKyhIWT8qNRDsXz+gvO9UiEC0d8RG4Tf2x8H4slljgHtCBcxHLTWOYJm5H/fCPCzOgf9qgOUxTRZ0Pc6ha5yLuLVT9ntvIa6gacE99mCovdUumTQdRP4RPsS9129eEe2uSvvGh0bV4Y3QPPhPZMqhZWSMa5R0Hc1SGO4IVOQc0FrirlibTVfKRrYkD8kz3b+X65/QkUNaZdrdl3mCap0Hf3YcCw/LiouJYNbqz88UqeDYv93yO7vvXtgl4XCyAO4ODkY6W+83+LZU//p3/zXNGGrUKClCiOnL27iJZbNWDF02XXAOeFlB7IaADoMH1Yqr+UP9biyZDEa/iJt4MDeIz6GKTdLVBfWGVtRN4fdT2rgReX8UXwF2zOrradm4J0nyTgdPnai3RvzpZvCKDUqjOwD/QA6EDaMCLewX6QWYVnHY1sx1bd8ovYnPm1ZvPH+rE20lWjOCnZ66/xDt0QAl15FjfBcZp+i9OU0RNPQ0t3x2pSNWo8eiYudwsnuP1Hq6iH1LJCJynkYsfgJ0p3pF6SoQk2l+jqE8CPk+ziGJRSKjs+W5AO185umPdkYzlK4wl7TC9NxyyDP7ZoyYVoXiuS6SjnInlLWrwz1i8bGTKXX0AVQWkSfIlglW3zRJRJ8bg5VgE6ZEnqNu9B++0GNQvDQJvFize4ESNKBJP+8vA3LM4AX5SIBq08Mob+7QMTCZx4nwP/64+4BnlZC+8WtlP/CXw6t1PwMwkJ3jhP1FiXLhDF/3I6FGUzO2DSi9ABxKyyL9paZxSEz40ZCPQToDAJu1959k7QdbVxgB4icsu2s4zsTPJhcEDo+N1GX4zSk/wriRh8AqwL62972i9HJHd1ydaLXVzvKvOfGGw5RVcUVMiKXFH4APdkQU/dc5BX0YfKTNZYXCW9mb8bc8mufoQP6BbdQmT99ZjoYfr/go4TgQX9IDgztim7wyFeGMfbNaeqj8Dzs38pgcqwSv2hbqB3oSGKWKy+sesY7p57wAHldqE6NDudk/W7s/zjrK4rZFlFvaGxnSZdHbc1y47qDN6xkoK8O3bfr2j41dlJZ71rB4dlDqapPFa8N6xBrprUdtenUCHwxKNhw1uuTBh+9uU45k4REpQABN2bAO9DSLqoIL26gNroWgup5pUMxHUNSq4Gyz47vBPvilpo5f9OYI2ddAqTqmnxXERxQJ3UK8fHbVE9HagHi3+tqNRoNsArdmAxHA5LwtQo9ZAaNKUTljnokljo2x8scqVpEEIPc01fPCdHOCg0DeWBz8D5TVAAfx8aRH5X2ZYNI3ebKDZdeJ+oBDAxmRqJ30Eh2/DaeAy5diVNMpEDmXiPDsGTzBLXy8eVDdJoIafgx/gxMyQi454QrW56nCyeELgSuNNEmYkflF+t3CZQOVRWjKhIuCclmQSlAXT3+4JGG75B4t/5hQ+ldMP4LsAW6z3XmU6IJJwpnGVnsgUZhoY1fZlwTR8wSU7xRejf2uCx9Z5trVTRRJP9KnEb134dEieil6eCOGWgboI7xsqsqM99jfJLTePjygKlH2CVxxsse9QRzTBFjD/Kjqitr/CCTBt/SJ6nLxz7cKP9pFqBpp0lN5y+adKNsZjrPuroemZauH9aTTFD3EKHW8S55XBLFQAt1jgxTQCTwxmx/JyfsZDN1RroN3VaxpSenpIX7K+ZbL8VdlQDcI4Cbzg3QJLa9yVqNxUelu+EtxLVqeekaAvSJkO6sSVqbUajxqhKshNpvZqoeApF0k/0P0ikkwUcbdwc4A1ejN7Oo0O15kG7hTMoK3hZRBCX7YYeLW0wvcXx/18n/u37yLgzBYVBUvORGli+sfRcX/74uD6P4hq+7xu54TlWJLFzT63uwUDwuEDdOjJQqx7JV+ZjaEAPi7t0MMrR4Q8Rkf18uxD6RK0RKh0hL8YU+DeL97i4pa5ZSyAfXKwZRS/8gXcxdZXm62RBDj8U3sN8x95b5PpPs/mCBKYvpaA50pN5Ct/499AFTtwQ5vgeSh+NHrKIi4NVpwM/XzRaNfJD856lPE6M21zWPguFsH7jbLVyEDfRmt4VwrhCJ5VTYmcSPfGgO5clfN+vbaDZ7sakU5+2vZ2WCDY031NxJarVytfDDVtiafcTGO2rJ/taoL3zChN2qmjxofczTOYQPPVQPh0JVtYgdUQINcSiNEEy58UdYXX1MpWUCEBx7LbcGtAm8XWRQTVOaoV3ySri4RShhs/B/0m4jX6OAwXOvcA09bNSG4czEGv/Wey6V/jbTCNTW6awXdNTcA1GsPe1E9fZdGl7R0vyoVpIdJtfC6d32NNErrvq/R+d65VG+YOwRXppXxOCYyGNSf1K3x6VxAW/vtz4EC1SgCOSPdN62sLsoIzuDfg8GwZAbquVO8HIuFP/ToVoeUB7nnwMF35a1wK1tI6fkrqFKhQdeJpwyls0pIy8AZde3/6LUUbFaYJthyUJSU/kqDXTLQElnn0Jr4B2RVghNrmNmoEn7pXIeshPguXVsvwoTdmClq49JJU3LWhHyWTrJL9bRP6VKv3tZoA/th77p5Jw++OEENvyvWy/pNeExiDUVQaXIRGh8xySZTI36yueFaSXo1uJY0RnXYgEOoWWOJHeaVuX/bGNhHsh2yinznl/++NJcE9j6fBPRcBdq9hb8awNw8U7Bl6GM7x69EDOIIbX/npZ++amlHR9L/35mE/2Ss4gb0xCcY4VyTFLRE796vHysLAamqcyO+aFQyJIDBNslbH2/MrAvZiSEIedc/cqjmv4fbda2pXbv+F5a2szSsdkm9noiNURXt8edUhGUF6fSZWd1IJaXKFwD+49R6eCXD4Bkef7j9tRtNMVgW8BhRz/Qpy1TmeYk0doyjZoJSbePOReVHgkFsCFuQJ+Lgc4BxeAsK/cOiNDRmdNw0ctYhn/nQ498dYI5znzGLoJi1rav7Cn88rL3wLePVtDK5gl77Tki3gHEsIAQ2+IKgarj7Y8W1IQzV5V9N+0TjLqbg68WfKcOmBCOj3JkwJhVIkwDhc+JorXuZEPMEh0vvH3x7iqf+VAwXgd4diZiaJD1zHL9Snx6Wfg4IugreyhabQkcir+y5XgDtdx3Avs7lkeeCBwDvZoTUCXx5QrZkcEqWfYEiEYRs/EphmRALSNGR1Iclgdr5VFoELpzF4++f35w3/j0t5ucW3n2ch4PQCLuUXupsPRR7UA5FjSKrMtPcKAZJfagO4lGE7FH3YKMjorpK0ZxAv+i2JkJhtAMWWWFej4RhPR/cJ3DxwocCvXDi4SGZU4cu+K32XndiFWgopAl+0GApcwf1XvymJcFs39jExIBO4yUjU9MExBLQYc9H+W7+IgdESPRpciT+rKZPebVtaVq+1GYO/5xTAL3HASjNTGIgMvdjWbgc7JvdE1zIFpuC0U9ESiZyzBixzxWxj4Kwh8My34q+FK3KNLtmsA1qyrmKSNQOXCPUZd+ONelBTvFoUI/CYsqa/RhtKiyMf2CgSFqEPk59Y3uqnlZ8gFpswfSYyko23yVZYxzKGxGm49Zqxg1l8oz5Ra9XaRwHkuxepmgyhm0SoNy2KlbcEqK+9QqS9PNx9Ihm9U7gsR55SSJ1FBDNnkuWKxIZ0SDpXuOGwZdoUbOMDPHP4vBAgz2VlSEJAHZGJVbYIg7l/FO5KfIVvxC8pPPxMGcNMoevFDeStt2iqztE10n2TA4dgJH76YS9HDhKHD3iCx6ieFX84BAI3QQnngh76f5ruPQVbr5qZmck/5UjDc26lfrOvUBWy0Ogl8bCoOkMOns81TnC3cuUS9KW8+9A+fe3XYZOFUPG1u5epSSmDLw0s5s2F0W30ANeo+zJkJQz9SPZgzwYpEoktofhGVfmLOAB20boCbW1QWq/NpET/hnMecw/uSyAH4NJc3ECOU4nnkK1fj3S/i5dwb3R7k00AqQQUwt7Ie1qV0aY/VQX0J8hLPy7eBNXMHYZYDNxHZ2Qh6AuXJxq+AeRec/Q+JLhZV6hpXwQEzw7bf5v9uUf2vpq3qlhmy0IIGTkwYdCfSAFmqbdo+3XvDTDjFJde0mbeQLcn2n31xaAqJ0ixO/CLsT4I4G4DoncVTgRGNBtsCcjISWT+oeXZ4Iedw/8OsJI1aPnNKLX/60VvcZb94uasRxCkqlPQ11u1Sa2hHvB80WQENxVyzjns0/PiEByyil21Te6oisk3mNCEMrhouCFO3yEZTHHOCMy9eb/4Tmi8cVf3Lf7P53SY2hX3PSN033As3ETIMLHWumWEO9JXHA2y2SIBlIPpLGG2qvNsCIlIr+B1SWAqRKm2w6Blf7U+zCSBwJrfHG5i8J5Gax/cVonMlon7aHJX/gSvucIncRP93XCqkv7D8IFKFsLiBgHqUpXhE3pYjEcV1dk/JD9zFVCfEaQIVX8Jmfz7IIofcBKQ4OaG+C3xC2veX9CD+iAFXDNaGg9eTVxvkbJRJlW4Nk9Wk13kn696jWppRDe/8pDrYMO9ZyxZ98ReKSz9kWKLLyk2zCZgAniCkLJVX3n1M9DYbomyahWiv/KixRIV9hj/oFz87I+HLznbPTjpa+D+bZQnMuRsljTpv90vQUt/pK7jCFnA30B/jtroSF2/m/gpWn1aQs5WeA6ghzF8SdqWI20fghdSeDOCSCmLgTkfaGgGDmw7nHFkRzGtag57IHS2na06I+gzEphXo1w/Zx2BM/jKL2nZoFjHggtFQjYi8nSVRSXIE58RPbBObXk7uuIL9+rs/5Zo7suJInEUxgsiZZAWS25iBtpEiZeBgDtghEoAE0sjcayNq85M4tbu/LF5h51335PsGzQ09O875+vUS89lkWMyNOFoip2PuyWyMP/iU2XIZdfCCJNDjebDoBLQdpy7QQZC7s9c0wjHJervQNDu2jWzBW5MSAJMr7bP+Iv92BkS/GGgzjEn7MF1IRKFwwzbjbS4/slGOmhx9cZrFu7HSEefojNv3r0UaKfKOWzXsq1zEugbzlMDFsacRJJI/iJlK3vtkZ+PLZIVMFlKA32wbq2Kd5T0uCLZ1CPkAfCdzkz2EYscjDcZq2AWfziN2covN4kXE1lQXPPLTNM1xx3tbiepcO/t3SWm4w87qfh99SL0ZnY+LKFPLPeXVM2mIIoVWt+9Nk0I7nY4O79iGYqxZ8RVz289an6NVdJWnSKZvJQCAuHNiVaDxPAFoH392t9wot5t0/qmU95eEWNbU2udUW5sN9JVqcYlvAIfLeYC33oUzzxZgSktsv21mA7Uly1FA5VnoJFh6N244Wmv3YJGFv/TCPryaw+ZORlpZjQdq/2DYXr3EZskfed0G61P09ipTKmlTQ1067Rg5+PAk5FlQ9e0SWbGf2B/08kqymOTMVOznsALHHNFH4LFRKl2F/NOiYFl9khNHnSu9Ak5sq26Ynl/i2fdTle29Y1ugqmR5Yj4YT9pvslFyYCbw0mNFr5rVQm1LvkG27QMq9ph3t8fmn6r6SQ4oSbr5tz+J1kIawGzDxb6VYOvvWhobDTXfBeNv3b4aNm5XUinsCGqG2q/45m3+LoCOsddFceYhRx1Tsss9PLdPfJdErFMjYd3gddjiP0+XQjcRadZP6bwNLySvunFf20Czy6JqdEW2a96KxdYdOryBv1BjbuUq2yCHeh+6sk7fGmmPi50pe/1l5TyPe5oHW9oPnhPswLyf2TFDdCyYlhwBCstv5C1HwlW7xWoGT9XZt4qVj5WryLPLLD6h/5cMLEjWzgCeAIKNsLak92aBqBsHl4AJwl2N4jfvbSkBExGimv0nFvv09uDScQbjx+w4kPQjgjlW+g9ws9VEJvI2k8N6XxVu0uIwovgTFdunG24gBtaDi+y1YLQwZ8mwbip5fVlO3k0n0AEr/ETbtu8Vjkm+nNSiEb7X/3fMjBL5A8PdgG+/FnbexbFFExmEfetXAnisEKy5z44WVPpQZjSy/jzeGn4yDRsFGqhh87QPaDBWhlo37IFbe/C0xynS91d2tP/AJoJS0sVF6iwAAAAAElFTkSuQmCC");
166}
167
168#menu::after {
169 display: block;
170 content: '';
171 padding-top: 80px;
172}
173
174#logo {
175 position: fixed;
176 bottom: 10px;
177 right: 10px;
178 background: rgba(255,255,255,.1);
179 font-size: 11px;
180 display: block;
181 width: 20px;
182 height: 20px;
183 line-height: 20px;
184 text-align: center;
185 -webkit-border-radius: 20px;
186 -moz-border-radius: 20px;
187 -webkit-box-shadow: 0 0 3px rgba(0,0,0,.2);
188 -moz-box-shadow: 0 0 3px rgba(0,0,0,.2);
189 color: inherit;
190}
191
192#menu li a {
193 display: block;
194 color: white;
195 padding: 0 35px 0 25px;
196 -webkit-transition: background 300ms;
197 -moz-transition: background 300ms;
198}
199
200#menu li {
201 position: relative;
202 list-style: none;
203}
204
205#menu a:hover,
206#menu a.active {
207 text-decoration: none;
208 background: rgba(255,255,255,.1);
209}
210
211#menu li:hover .cov {
212 opacity: 1;
213}
214
215#menu li .dirname {
216 opacity: .60;
217 padding-right: 2px;
218}
219
220#menu li .basename {
221 opacity: 1;
222}
223
224#menu .cov {
225 background: rgba(0,0,0,.4);
226 position: absolute;
227 top: 0;
228 right: 8px;
229 font-size: 9px;
230 opacity: .6;
231 text-align: left;
232 width: 17px;
233 -webkit-border-radius: 10px;
234 -moz-border-radius: 10px;
235 padding: 2px 3px;
236 text-align: center;
237}
238
239#stats:nth-child(2n) {
240 display: inline-block;
241 margin-top: 15px;
242 border: 1px solid #eee;
243 padding: 10px;
244 -webkit-box-shadow: inset 0 0 2px #eee;
245 -moz-box-shadow: inset 0 0 2px #eee;
246 -webkit-border-radius: 5px;
247 -moz-border-radius: 5px;
248}
249
250#stats div {
251 float: left;
252 padding: 0 5px;
253}
254
255#stats::after {
256 display: block;
257 content: '';
258 clear: both;
259}
260
261#stats .sloc::after {
262 content: ' SLOC';
263 color: #b6b6b6;
264}
265
266#stats .percentage::after {
267 content: ' coverage';
268 color: #b6b6b6;
269}
270
271#stats .hits,
272#stats .misses {
273 display: none;
274}
275
276.high {
277 color: #00d4b4;
278}
279.medium {
280 color: #e87d0d;
281}
282.low {
283 color: #d4081a;
284}
285.terrible {
286 color: #d4081a;
287 font-weight: bold;
288}
289
290table {
291 width: 80%;
292 margin-top: 10px;
293 border-collapse: collapse;
294 border: 1px solid #cbcbcb;
295 color: #363636;
296 -webkit-border-radius: 3px;
297 -moz-border-radius: 3px;
298}
299
300table thead {
301 display: none;
302}
303
304table td.line,
305table td.hits {
306 width: 20px;
307 background: #eaeaea;
308 text-align: center;
309 font-size: 11px;
310 padding: 0 10px;
311 color: #949494;
312}
313
314table td.hits {
315 width: 10px;
316 padding: 2px 5px;
317 color: rgba(0,0,0,.2);
318 background: #f0f0f0;
319}
320
321tr.miss td.line,
322tr.miss td.hits {
323 background: #e6c3c7;
324}
325
326tr.miss td {
327 background: #f8d5d8;
328}
329
330td.source {
331 padding-left: 15px;
332 line-height: 15px;
333 white-space: pre;
334 font: 12px monaco, monospace;
335}
336
337code .comment { color: #ddd }
338code .init { color: #2F6FAD }
339code .string { color: #5890AD }
340code .keyword { color: #8A6343 }
341code .number { color: #2F6FAD }
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"> &amp;&amp; check(context.package, resource.package, resource.packages)</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> &amp;&amp; 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"> &amp;&amp; (!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 &amp;&amp; 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.&lt;Object&gt;} 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 &amp;&amp; config.packages &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; clone.src &amp;&amp; _.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) &amp;&amp; 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 &amp;&amp; this.config.module(moduleName);</td></tr><tr class="hit"><td class="line">43</td><td class="hits">89</td><td class="source"> if (moduleName &amp;&amp; !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 &quot;' + moduleName + '&quot;'));</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 &quot;' + fileInfo.name + '&quot;' + 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 &amp;&amp; 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 &amp;&amp; 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"> &amp;&amp; (pathName[0] !== '/' &amp;&amp; pathName.indexOf(':/') === -1 &amp;&amp; pathName.indexOf(':\\') === -1)</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> &amp;&amp; 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 &amp;&amp; !/\/$/.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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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] !== '.' &amp;&amp; basename !== 'vendor' &amp;&amp; (!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 &gt;= 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 &amp;&amp; (!lastEl || !lastEl.noSeparator) &amp;&amp; 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"> // &quot;Serialize&quot; 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 &amp;&amp; (!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 &amp;&amp; (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 &quot;' + output + '&quot; 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 &amp;&amp; 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 &amp;&amp; !/\/$/.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 &quot;' + root + '&quot; 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"> &amp;&amp; (!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 &lt; 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 &amp;&amp; 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 &quot;' + ((firstInclude &amp;&amp; firstInclude.name) || firstInclude) + '&quot;');</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 &amp;&amp; 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 &gt; 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 &amp;&amp; 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 &quot;' + (name.name || name) + '&quot; 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 &quot;' + (resource.library || resource.mixin) + '&quot; 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 &amp;&amp; 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 &gt; 1 &amp;&amp; !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 &quot;' + (name.name || name) + '&quot;'</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: &quot;' + mixin.parent.name + '&quot;';</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 &quot;' + library + '&quot;');</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 &quot;' + name.name + '&quot; not found in library &quot;' + library + '&quot;');</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.&lt;Function&gt;}</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(&quot;/Users/kpdecker/dev/walmart/lumbar/lib/./fileUtil&quot;);</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"> &amp;&amp; (!context.mode || pluginMode.indexOf(plugin) &lt; 0)</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> &amp;&amp; modeAll.indexOf(plugin) &lt; 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 &amp;&amp; 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 &amp;&amp; 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) &lt; 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) &amp;&amp; !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 &quot;template&quot; 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 = &quot;/* handsfree : {{{name}}}*/\n{{{templateCache}}}['{{{name}}}'] = {{handlebarsCall}}({{{data}}});\n&quot;;</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 &amp;&amp; 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 &quot;' + src + '&quot;\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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 = &quot;'&quot; + templateUtil.escapeJsString(data) + &quot;'&quot;;</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) &amp;&amp; !_.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) &amp;&amp; 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) &amp;&amp; !(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) &amp;&amp; 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 + '(&quot;'</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(/&quot;/g, '\\&quot;')</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> + '&quot;);\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] &amp;&amp; !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 &amp;&amp; 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 &quot;' + name + '&quot;: ' + 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 &lt; 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 &lt; 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 &amp;&amp; context.config.module(module).preload,</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> depends = module &amp;&amp; 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 &lt; 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 &lt; 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 &lt; 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 &amp;&amp; {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 = &quot;{{{name}}} = {{{data}}};\n&quot;;</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 &quot;' + configFile + '&quot;\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 &amp;&amp; {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 = &quot;{{{name}}}&quot;;\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 &amp;&amp; {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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 + &quot;['&quot; + context.module.name + &quot;']&quot;;</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 = /['&quot;\]]/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"> &amp;&amp; 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) &amp;&amp; !('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) &amp;&amp; !('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"> &amp;&amp; !context.resource.global</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> &amp;&amp; !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 &amp;&amp; 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 &lt; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &quot;' + fileContext.fileName + '&quot; 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 &amp;&amp; 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) &amp;&amp; !(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 -&gt; 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 &gt;= 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 (&quot;' + (include.originalSrc || include.src || include) + '&quot;)\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 &amp;&amp; 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 &amp;&amp; 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(&quot;' + mixinName + '&quot;)\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('/') &gt;= 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 &amp;&amp; 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) &amp;&amp; !(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) &amp;&amp; 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) &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; !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 &amp;&amp; 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) &amp;&amp; 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 &quot;' + resource + '&quot; ' + 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 &amp;&amp; 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^=&quot;module:&quot;]');</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 &amp;&amp; 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 = '&lt;script type=&quot;text/javascript&quot;&gt;var lumbarLoadPrefix = \'' + loadPrefix + '\';&lt;/script&gt;';</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^=&quot;module:&quot;]', function(href) {</td></tr><tr class="hit"><td class="line">85</td><td class="hits">7</td><td class="source"> return '&lt;script type=&quot;text/javascript&quot; src=&quot;' + href + '&quot;&gt;&lt;/script&gt;';</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^=&quot;module:&quot;]', function(href) {</td></tr><tr class="hit"><td class="line">88</td><td class="hits">1</td><td class="source"> return '&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;' + href + '&quot;/&gt;';</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) &amp;&amp; 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 &amp;&amp; !_.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; // '' -&gt; 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 &amp;&amp; _.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 &quot;' + context.module + '&quot;'));</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"> '\&quot;': '\\\&quot;',</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\'\&quot;\\]/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 = '&lt;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 &amp;&amp; !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 &amp;&amp; name ? (GENERATED + ':' + name + '&gt;') : (name || GENERATED + '&gt;'),</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 &gt;= 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 &lt; 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 &amp;&amp; !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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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"> &amp;&amp; entry.filename === filename</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> &amp;&amp; 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() &gt; 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 &amp;&amp; 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 &amp;&amp; !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' &amp;&amp; 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 &amp;&amp; (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>
343Done, without errors.