Parcourir la Source

Add unit tests and fix bugs

Matt Coles il y a 9 ans
Parent
commit
5ebb3af60c

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
1
+node_modules/

+ 6 - 0
.travis.yml

@@ -0,0 +1,6 @@
1
+language: node_js
2
+node_js:
3
+  - "4"
4
+  - "5"
5
+after_script:
6
+    - cat /home/travis/build/Alpha-Atom/js-query-string/coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf /home/travis/build/Alpha-Atom/js-query-string/coverage/

BIN
coverage/.DS_Store


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
coverage/coverage.json


+ 212 - 0
coverage/lcov-report/base.css

@@ -0,0 +1,212 @@
1
+body, html {
2
+  margin:0; padding: 0;
3
+  height: 100%;
4
+}
5
+body {
6
+    font-family: Helvetica Neue, Helvetica, Arial;
7
+    font-size: 14px;
8
+    color:#333;
9
+}
10
+.small { font-size: 12px; }
11
+*, *:after, *:before {
12
+  -webkit-box-sizing:border-box;
13
+     -moz-box-sizing:border-box;
14
+          box-sizing:border-box;
15
+  }
16
+h1 { font-size: 20px; margin: 0;}
17
+h2 { font-size: 14px; }
18
+pre {
19
+    font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
+    margin: 0;
21
+    padding: 0;
22
+    -moz-tab-size: 2;
23
+    -o-tab-size:  2;
24
+    tab-size: 2;
25
+}
26
+a { color:#0074D9; text-decoration:none; }
27
+a:hover { text-decoration:underline; }
28
+.strong { font-weight: bold; }
29
+.space-top1 { padding: 10px 0 0 0; }
30
+.pad2y { padding: 20px 0; }
31
+.pad1y { padding: 10px 0; }
32
+.pad2x { padding: 0 20px; }
33
+.pad2 { padding: 20px; }
34
+.pad1 { padding: 10px; }
35
+.space-left2 { padding-left:55px; }
36
+.space-right2 { padding-right:20px; }
37
+.center { text-align:center; }
38
+.clearfix { display:block; }
39
+.clearfix:after {
40
+  content:'';
41
+  display:block;
42
+  height:0;
43
+  clear:both;
44
+  visibility:hidden;
45
+  }
46
+.fl { float: left; }
47
+@media only screen and (max-width:640px) {
48
+  .col3 { width:100%; max-width:100%; }
49
+  .hide-mobile { display:none!important; }
50
+}
51
+
52
+.quiet {
53
+  color: #7f7f7f;
54
+  color: rgba(0,0,0,0.5);
55
+}
56
+.quiet a { opacity: 0.7; }
57
+
58
+.fraction {
59
+  font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
+  font-size: 10px;
61
+  color: #555;
62
+  background: #E8E8E8;
63
+  padding: 4px 5px;
64
+  border-radius: 3px;
65
+  vertical-align: middle;
66
+}
67
+
68
+div.path a:link, div.path a:visited { color: #333; }
69
+table.coverage {
70
+  border-collapse: collapse;
71
+  margin: 10px 0 0 0;
72
+  padding: 0;
73
+}
74
+
75
+table.coverage td {
76
+  margin: 0;
77
+  padding: 0;
78
+  vertical-align: top;
79
+}
80
+table.coverage td.line-count {
81
+    text-align: right;
82
+    padding: 0 5px 0 20px;
83
+}
84
+table.coverage td.line-coverage {
85
+    text-align: right;
86
+    padding-right: 10px;
87
+    min-width:20px;
88
+}
89
+
90
+table.coverage td span.cline-any {
91
+    display: inline-block;
92
+    padding: 0 5px;
93
+    width: 100%;
94
+}
95
+.missing-if-branch {
96
+    display: inline-block;
97
+    margin-right: 5px;
98
+    border-radius: 3px;
99
+    position: relative;
100
+    padding: 0 4px;
101
+    background: #333;
102
+    color: yellow;
103
+}
104
+
105
+.skip-if-branch {
106
+    display: none;
107
+    margin-right: 10px;
108
+    position: relative;
109
+    padding: 0 4px;
110
+    background: #ccc;
111
+    color: white;
112
+}
113
+.missing-if-branch .typ, .skip-if-branch .typ {
114
+    color: inherit !important;
115
+}
116
+.coverage-summary {
117
+  border-collapse: collapse;
118
+  width: 100%;
119
+}
120
+.coverage-summary tr { border-bottom: 1px solid #bbb; }
121
+.keyline-all { border: 1px solid #ddd; }
122
+.coverage-summary td, .coverage-summary th { padding: 10px; }
123
+.coverage-summary tbody { border: 1px solid #bbb; }
124
+.coverage-summary td { border-right: 1px solid #bbb; }
125
+.coverage-summary td:last-child { border-right: none; }
126
+.coverage-summary th {
127
+  text-align: left;
128
+  font-weight: normal;
129
+  white-space: nowrap;
130
+}
131
+.coverage-summary th.file { border-right: none !important; }
132
+.coverage-summary th.pct { }
133
+.coverage-summary th.pic,
134
+.coverage-summary th.abs,
135
+.coverage-summary td.pct,
136
+.coverage-summary td.abs { text-align: right; }
137
+.coverage-summary td.file { white-space: nowrap;  }
138
+.coverage-summary td.pic { min-width: 120px !important;  }
139
+.coverage-summary tfoot td { }
140
+
141
+.coverage-summary .sorter {
142
+    height: 10px;
143
+    width: 7px;
144
+    display: inline-block;
145
+    margin-left: 0.5em;
146
+    background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
+}
148
+.coverage-summary .sorted .sorter {
149
+    background-position: 0 -20px;
150
+}
151
+.coverage-summary .sorted-desc .sorter {
152
+    background-position: 0 -10px;
153
+}
154
+.status-line {  height: 10px; }
155
+/* dark red */
156
+.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
157
+.low .chart { border:1px solid #C21F39 }
158
+/* medium red */
159
+.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
160
+/* light red */
161
+.low, .cline-no { background:#FCE1E5 }
162
+/* light green */
163
+.high, .cline-yes { background:rgb(230,245,208) }
164
+/* medium green */
165
+.cstat-yes { background:rgb(161,215,106) }
166
+/* dark green */
167
+.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
168
+.high .chart { border:1px solid rgb(77,146,33) }
169
+
170
+
171
+.medium .chart { border:1px solid #666; }
172
+.medium .cover-fill { background: #666; }
173
+
174
+.cbranch-no { background:  yellow !important; color: #111; }
175
+
176
+.cstat-skip { background: #ddd; color: #111; }
177
+.fstat-skip { background: #ddd; color: #111 !important; }
178
+.cbranch-skip { background: #ddd !important; color: #111; }
179
+
180
+span.cline-neutral { background: #eaeaea; }
181
+.medium { background: #eaeaea; }
182
+
183
+.cover-fill, .cover-empty {
184
+  display:inline-block;
185
+  height: 12px;
186
+}
187
+.chart {
188
+  line-height: 0;
189
+}
190
+.cover-empty {
191
+    background: white;
192
+}
193
+.cover-full {
194
+    border-right: none !important;
195
+}
196
+pre.prettyprint {
197
+    border: none !important;
198
+    padding: 0 !important;
199
+    margin: 0 !important;
200
+}
201
+.com { color: #999 !important; }
202
+.ignore-none { color: #999; font-weight: normal; }
203
+
204
+.wrapper {
205
+  min-height: 100%;
206
+  height: auto !important;
207
+  height: 100%;
208
+  margin: 0 auto -48px;
209
+}
210
+.footer, .push {
211
+  height: 48px;
212
+}

+ 119 - 0
coverage/lcov-report/index.html

@@ -0,0 +1,119 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+    <title>Code coverage report for All files</title>
5
+    <meta charset="utf-8" />
6
+    <link rel="stylesheet" href="prettify.css" />
7
+    <link rel="stylesheet" href="base.css" />
8
+    <meta name="viewport" content="width=device-width, initial-scale=1">
9
+    <style type='text/css'>
10
+        .coverage-summary .sorter {
11
+            background-image: url(sort-arrow-sprite.png);
12
+        }
13
+    </style>
14
+</head>
15
+<body>
16
+<div class='wrapper'>
17
+  <div class='pad1'>
18
+    <h1>
19
+      /
20
+    </h1>
21
+    <div class='clearfix'>
22
+      <div class='fl pad1y space-right2'>
23
+        <span class="strong">96.7% </span>
24
+        <span class="quiet">Statements</span>
25
+        <span class='fraction'>88/91</span>
26
+      </div>
27
+      <div class='fl pad1y space-right2'>
28
+        <span class="strong">74.42% </span>
29
+        <span class="quiet">Branches</span>
30
+        <span class='fraction'>32/43</span>
31
+      </div>
32
+      <div class='fl pad1y space-right2'>
33
+        <span class="strong">86.36% </span>
34
+        <span class="quiet">Functions</span>
35
+        <span class='fraction'>19/22</span>
36
+      </div>
37
+      <div class='fl pad1y space-right2'>
38
+        <span class="strong">98.86% </span>
39
+        <span class="quiet">Lines</span>
40
+        <span class='fraction'>87/88</span>
41
+      </div>
42
+    </div>
43
+  </div>
44
+  <div class='status-line high'></div>
45
+<div class="pad1">
46
+<table class="coverage-summary">
47
+<thead>
48
+<tr>
49
+   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
50
+   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
51
+   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
52
+   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
53
+   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
54
+   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
55
+   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
56
+   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
57
+   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
58
+   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
59
+</tr>
60
+</thead>
61
+<tbody><tr>
62
+	<td class="file high" data-value="js-query-string/"><a href="js-query-string/index.html">js-query-string/</a></td>
63
+	<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
64
+	<td data-value="100" class="pct high">100%</td>
65
+	<td data-value="8" class="abs high">8/8</td>
66
+	<td data-value="100" class="pct high">100%</td>
67
+	<td data-value="0" class="abs high">0/0</td>
68
+	<td data-value="100" class="pct high">100%</td>
69
+	<td data-value="1" class="abs high">1/1</td>
70
+	<td data-value="100" class="pct high">100%</td>
71
+	<td data-value="8" class="abs high">8/8</td>
72
+	</tr>
73
+
74
+<tr>
75
+	<td class="file high" data-value="js-query-string/lib/"><a href="js-query-string/lib/index.html">js-query-string/lib/</a></td>
76
+	<td data-value="97.67" class="pic high"><div class="chart"><div class="cover-fill" style="width: 97%;"></div><div class="cover-empty" style="width:3%;"></div></div></td>
77
+	<td data-value="97.67" class="pct high">97.67%</td>
78
+	<td data-value="43" class="abs high">42/43</td>
79
+	<td data-value="74.42" class="pct medium">74.42%</td>
80
+	<td data-value="43" class="abs medium">32/43</td>
81
+	<td data-value="85.71" class="pct high">85.71%</td>
82
+	<td data-value="7" class="abs high">6/7</td>
83
+	<td data-value="100" class="pct high">100%</td>
84
+	<td data-value="41" class="abs high">41/41</td>
85
+	</tr>
86
+
87
+<tr>
88
+	<td class="file high" data-value="js-query-string/spec/"><a href="js-query-string/spec/index.html">js-query-string/spec/</a></td>
89
+	<td data-value="95" class="pic high"><div class="chart"><div class="cover-fill" style="width: 95%;"></div><div class="cover-empty" style="width:5%;"></div></div></td>
90
+	<td data-value="95" class="pct high">95%</td>
91
+	<td data-value="40" class="abs high">38/40</td>
92
+	<td data-value="100" class="pct high">100%</td>
93
+	<td data-value="0" class="abs high">0/0</td>
94
+	<td data-value="85.71" class="pct high">85.71%</td>
95
+	<td data-value="14" class="abs high">12/14</td>
96
+	<td data-value="97.44" class="pct high">97.44%</td>
97
+	<td data-value="39" class="abs high">38/39</td>
98
+	</tr>
99
+
100
+</tbody>
101
+</table>
102
+</div><div class='push'></div><!-- for sticky footer -->
103
+</div><!-- /wrapper -->
104
+<div class='footer quiet pad2 space-top1 center small'>
105
+  Code coverage
106
+  generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Apr 22 2016 22:58:07 GMT+0100 (BST)
107
+</div>
108
+</div>
109
+<script src="prettify.js"></script>
110
+<script>
111
+window.onload = function () {
112
+        if (typeof prettyPrint === 'function') {
113
+            prettyPrint();
114
+        }
115
+};
116
+</script>
117
+<script src="sorter.js"></script>
118
+</body>
119
+</html>

+ 93 - 0
coverage/lcov-report/js-query-string/index.html

@@ -0,0 +1,93 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+    <title>Code coverage report for js-query-string/</title>
5
+    <meta charset="utf-8" />
6
+    <link rel="stylesheet" href="../prettify.css" />
7
+    <link rel="stylesheet" href="../base.css" />
8
+    <meta name="viewport" content="width=device-width, initial-scale=1">
9
+    <style type='text/css'>
10
+        .coverage-summary .sorter {
11
+            background-image: url(../sort-arrow-sprite.png);
12
+        }
13
+    </style>
14
+</head>
15
+<body>
16
+<div class='wrapper'>
17
+  <div class='pad1'>
18
+    <h1>
19
+      <a href="../index.html">all files</a> js-query-string/
20
+    </h1>
21
+    <div class='clearfix'>
22
+      <div class='fl pad1y space-right2'>
23
+        <span class="strong">100% </span>
24
+        <span class="quiet">Statements</span>
25
+        <span class='fraction'>8/8</span>
26
+      </div>
27
+      <div class='fl pad1y space-right2'>
28
+        <span class="strong">100% </span>
29
+        <span class="quiet">Branches</span>
30
+        <span class='fraction'>0/0</span>
31
+      </div>
32
+      <div class='fl pad1y space-right2'>
33
+        <span class="strong">100% </span>
34
+        <span class="quiet">Functions</span>
35
+        <span class='fraction'>1/1</span>
36
+      </div>
37
+      <div class='fl pad1y space-right2'>
38
+        <span class="strong">100% </span>
39
+        <span class="quiet">Lines</span>
40
+        <span class='fraction'>8/8</span>
41
+      </div>
42
+    </div>
43
+  </div>
44
+  <div class='status-line high'></div>
45
+<div class="pad1">
46
+<table class="coverage-summary">
47
+<thead>
48
+<tr>
49
+   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
50
+   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
51
+   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
52
+   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
53
+   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
54
+   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
55
+   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
56
+   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
57
+   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
58
+   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
59
+</tr>
60
+</thead>
61
+<tbody><tr>
62
+	<td class="file high" data-value="jasmine-runner.js"><a href="jasmine-runner.js.html">jasmine-runner.js</a></td>
63
+	<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
64
+	<td data-value="100" class="pct high">100%</td>
65
+	<td data-value="8" class="abs high">8/8</td>
66
+	<td data-value="100" class="pct high">100%</td>
67
+	<td data-value="0" class="abs high">0/0</td>
68
+	<td data-value="100" class="pct high">100%</td>
69
+	<td data-value="1" class="abs high">1/1</td>
70
+	<td data-value="100" class="pct high">100%</td>
71
+	<td data-value="8" class="abs high">8/8</td>
72
+	</tr>
73
+
74
+</tbody>
75
+</table>
76
+</div><div class='push'></div><!-- for sticky footer -->
77
+</div><!-- /wrapper -->
78
+<div class='footer quiet pad2 space-top1 center small'>
79
+  Code coverage
80
+  generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Apr 22 2016 22:58:07 GMT+0100 (BST)
81
+</div>
82
+</div>
83
+<script src="../prettify.js"></script>
84
+<script>
85
+window.onload = function () {
86
+        if (typeof prettyPrint === 'function') {
87
+            prettyPrint();
88
+        }
89
+};
90
+</script>
91
+<script src="../sorter.js"></script>
92
+</body>
93
+</html>

+ 92 - 0
coverage/lcov-report/js-query-string/jasmine-runner.js.html

@@ -0,0 +1,92 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+    <title>Code coverage report for js-query-string/jasmine-runner.js</title>
5
+    <meta charset="utf-8" />
6
+    <link rel="stylesheet" href="../prettify.css" />
7
+    <link rel="stylesheet" href="../base.css" />
8
+    <meta name="viewport" content="width=device-width, initial-scale=1">
9
+    <style type='text/css'>
10
+        .coverage-summary .sorter {
11
+            background-image: url(../sort-arrow-sprite.png);
12
+        }
13
+    </style>
14
+</head>
15
+<body>
16
+<div class='wrapper'>
17
+  <div class='pad1'>
18
+    <h1>
19
+      <a href="../index.html">all files</a> / <a href="index.html">js-query-string/</a> jasmine-runner.js
20
+    </h1>
21
+    <div class='clearfix'>
22
+      <div class='fl pad1y space-right2'>
23
+        <span class="strong">100% </span>
24
+        <span class="quiet">Statements</span>
25
+        <span class='fraction'>8/8</span>
26
+      </div>
27
+      <div class='fl pad1y space-right2'>
28
+        <span class="strong">100% </span>
29
+        <span class="quiet">Branches</span>
30
+        <span class='fraction'>0/0</span>
31
+      </div>
32
+      <div class='fl pad1y space-right2'>
33
+        <span class="strong">100% </span>
34
+        <span class="quiet">Functions</span>
35
+        <span class='fraction'>1/1</span>
36
+      </div>
37
+      <div class='fl pad1y space-right2'>
38
+        <span class="strong">100% </span>
39
+        <span class="quiet">Lines</span>
40
+        <span class='fraction'>8/8</span>
41
+      </div>
42
+    </div>
43
+  </div>
44
+  <div class='status-line high'></div>
45
+<pre><table class="coverage">
46
+<tr><td class="line-count quiet">1
47
+2
48
+3
49
+4
50
+5
51
+6
52
+7
53
+8
54
+9
55
+10</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1×</span>
56
+<span class="cline-any cline-yes">1×</span>
57
+<span class="cline-any cline-yes">1×</span>
58
+<span class="cline-any cline-neutral">&nbsp;</span>
59
+<span class="cline-any cline-yes">1×</span>
60
+<span class="cline-any cline-yes">1×</span>
61
+<span class="cline-any cline-yes">1×</span>
62
+<span class="cline-any cline-yes">1×</span>
63
+<span class="cline-any cline-yes">1×</span>
64
+<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">var Jasmine = require('jasmine');
65
+var SpecReporter = require('jasmine-spec-reporter');
66
+var noop = function() {};
67
+&nbsp;
68
+var jrunner = new Jasmine();
69
+jrunner.configureDefaultReporter({print: noop});    // remove default reporter logs
70
+jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'all'}));   // add jasmine-spec-reporter
71
+jrunner.loadConfigFile();                           // load jasmine.json configuration
72
+jrunner.execute();
73
+&nbsp;</pre></td></tr>
74
+</table></pre>
75
+<div class='push'></div><!-- for sticky footer -->
76
+</div><!-- /wrapper -->
77
+<div class='footer quiet pad2 space-top1 center small'>
78
+  Code coverage
79
+  generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Apr 22 2016 22:58:07 GMT+0100 (BST)
80
+</div>
81
+</div>
82
+<script src="../prettify.js"></script>
83
+<script>
84
+window.onload = function () {
85
+        if (typeof prettyPrint === 'function') {
86
+            prettyPrint();
87
+        }
88
+};
89
+</script>
90
+<script src="../sorter.js"></script>
91
+</body>
92
+</html>

+ 93 - 0
coverage/lcov-report/js-query-string/lib/index.html

@@ -0,0 +1,93 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+    <title>Code coverage report for js-query-string/lib/</title>
5
+    <meta charset="utf-8" />
6
+    <link rel="stylesheet" href="../../prettify.css" />
7
+    <link rel="stylesheet" href="../../base.css" />
8
+    <meta name="viewport" content="width=device-width, initial-scale=1">
9
+    <style type='text/css'>
10
+        .coverage-summary .sorter {
11
+            background-image: url(../../sort-arrow-sprite.png);
12
+        }
13
+    </style>
14
+</head>
15
+<body>
16
+<div class='wrapper'>
17
+  <div class='pad1'>
18
+    <h1>
19
+      <a href="../../index.html">all files</a> js-query-string/lib/
20
+    </h1>
21
+    <div class='clearfix'>
22
+      <div class='fl pad1y space-right2'>
23
+        <span class="strong">97.67% </span>
24
+        <span class="quiet">Statements</span>
25
+        <span class='fraction'>42/43</span>
26
+      </div>
27
+      <div class='fl pad1y space-right2'>
28
+        <span class="strong">74.42% </span>
29
+        <span class="quiet">Branches</span>
30
+        <span class='fraction'>32/43</span>
31
+      </div>
32
+      <div class='fl pad1y space-right2'>
33
+        <span class="strong">85.71% </span>
34
+        <span class="quiet">Functions</span>
35
+        <span class='fraction'>6/7</span>
36
+      </div>
37
+      <div class='fl pad1y space-right2'>
38
+        <span class="strong">100% </span>
39
+        <span class="quiet">Lines</span>
40
+        <span class='fraction'>41/41</span>
41
+      </div>
42
+    </div>
43
+  </div>
44
+  <div class='status-line high'></div>
45
+<div class="pad1">
46
+<table class="coverage-summary">
47
+<thead>
48
+<tr>
49
+   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
50
+   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
51
+   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
52
+   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
53
+   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
54
+   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
55
+   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
56
+   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
57
+   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
58
+   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
59
+</tr>
60
+</thead>
61
+<tbody><tr>
62
+	<td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td>
63
+	<td data-value="97.67" class="pic high"><div class="chart"><div class="cover-fill" style="width: 97%;"></div><div class="cover-empty" style="width:3%;"></div></div></td>
64
+	<td data-value="97.67" class="pct high">97.67%</td>
65
+	<td data-value="43" class="abs high">42/43</td>
66
+	<td data-value="74.42" class="pct medium">74.42%</td>
67
+	<td data-value="43" class="abs medium">32/43</td>
68
+	<td data-value="85.71" class="pct high">85.71%</td>
69
+	<td data-value="7" class="abs high">6/7</td>
70
+	<td data-value="100" class="pct high">100%</td>
71
+	<td data-value="41" class="abs high">41/41</td>
72
+	</tr>
73
+
74
+</tbody>
75
+</table>
76
+</div><div class='push'></div><!-- for sticky footer -->
77
+</div><!-- /wrapper -->
78
+<div class='footer quiet pad2 space-top1 center small'>
79
+  Code coverage
80
+  generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Apr 22 2016 22:58:07 GMT+0100 (BST)
81
+</div>
82
+</div>
83
+<script src="../../prettify.js"></script>
84
+<script>
85
+window.onload = function () {
86
+        if (typeof prettyPrint === 'function') {
87
+            prettyPrint();
88
+        }
89
+};
90
+</script>
91
+<script src="../../sorter.js"></script>
92
+</body>
93
+</html>

+ 266 - 0
coverage/lcov-report/js-query-string/lib/index.js.html

@@ -0,0 +1,266 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+    <title>Code coverage report for js-query-string/lib/index.js</title>
5
+    <meta charset="utf-8" />
6
+    <link rel="stylesheet" href="../../prettify.css" />
7
+    <link rel="stylesheet" href="../../base.css" />
8
+    <meta name="viewport" content="width=device-width, initial-scale=1">
9
+    <style type='text/css'>
10
+        .coverage-summary .sorter {
11
+            background-image: url(../../sort-arrow-sprite.png);
12
+        }
13
+    </style>
14
+</head>
15
+<body>
16
+<div class='wrapper'>
17
+  <div class='pad1'>
18
+    <h1>
19
+      <a href="../../index.html">all files</a> / <a href="index.html">js-query-string/lib/</a> index.js
20
+    </h1>
21
+    <div class='clearfix'>
22
+      <div class='fl pad1y space-right2'>
23
+        <span class="strong">97.67% </span>
24
+        <span class="quiet">Statements</span>
25
+        <span class='fraction'>42/43</span>
26
+      </div>
27
+      <div class='fl pad1y space-right2'>
28
+        <span class="strong">74.42% </span>
29
+        <span class="quiet">Branches</span>
30
+        <span class='fraction'>32/43</span>
31
+      </div>
32
+      <div class='fl pad1y space-right2'>
33
+        <span class="strong">85.71% </span>
34
+        <span class="quiet">Functions</span>
35
+        <span class='fraction'>6/7</span>
36
+      </div>
37
+      <div class='fl pad1y space-right2'>
38
+        <span class="strong">100% </span>
39
+        <span class="quiet">Lines</span>
40
+        <span class='fraction'>41/41</span>
41
+      </div>
42
+    </div>
43
+  </div>
44
+  <div class='status-line high'></div>
45
+<pre><table class="coverage">
46
+<tr><td class="line-count quiet">1
47
+2
48
+3
49
+4
50
+5
51
+6
52
+7
53
+8
54
+9
55
+10
56
+11
57
+12
58
+13
59
+14
60
+15
61
+16
62
+17
63
+18
64
+19
65
+20
66
+21
67
+22
68
+23
69
+24
70
+25
71
+26
72
+27
73
+28
74
+29
75
+30
76
+31
77
+32
78
+33
79
+34
80
+35
81
+36
82
+37
83
+38
84
+39
85
+40
86
+41
87
+42
88
+43
89
+44
90
+45
91
+46
92
+47
93
+48
94
+49
95
+50
96
+51
97
+52
98
+53
99
+54
100
+55
101
+56
102
+57
103
+58
104
+59
105
+60
106
+61
107
+62
108
+63
109
+64
110
+65
111
+66
112
+67
113
+68</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
114
+<span class="cline-any cline-neutral">&nbsp;</span>
115
+<span class="cline-any cline-yes">18×</span>
116
+<span class="cline-any cline-neutral">&nbsp;</span>
117
+<span class="cline-any cline-yes">1×</span>
118
+<span class="cline-any cline-neutral">&nbsp;</span>
119
+<span class="cline-any cline-neutral">&nbsp;</span>
120
+<span class="cline-any cline-neutral">&nbsp;</span>
121
+<span class="cline-any cline-neutral">&nbsp;</span>
122
+<span class="cline-any cline-neutral">&nbsp;</span>
123
+<span class="cline-any cline-neutral">&nbsp;</span>
124
+<span class="cline-any cline-yes">12×</span>
125
+<span class="cline-any cline-yes">9×</span>
126
+<span class="cline-any cline-yes">6×</span>
127
+<span class="cline-any cline-neutral">&nbsp;</span>
128
+<span class="cline-any cline-yes">9×</span>
129
+<span class="cline-any cline-yes">9×</span>
130
+<span class="cline-any cline-yes">9×</span>
131
+<span class="cline-any cline-yes">19×</span>
132
+<span class="cline-any cline-yes">19×</span>
133
+<span class="cline-any cline-yes">19×</span>
134
+<span class="cline-any cline-yes">1×</span>
135
+<span class="cline-any cline-yes">1×</span>
136
+<span class="cline-any cline-neutral">&nbsp;</span>
137
+<span class="cline-any cline-yes">18×</span>
138
+<span class="cline-any cline-yes">3×</span>
139
+<span class="cline-any cline-yes">15×</span>
140
+<span class="cline-any cline-yes">2×</span>
141
+<span class="cline-any cline-yes">13×</span>
142
+<span class="cline-any cline-yes">4×</span>
143
+<span class="cline-any cline-yes">9×</span>
144
+<span class="cline-any cline-yes">2×</span>
145
+<span class="cline-any cline-yes">7×</span>
146
+<span class="cline-any cline-yes">4×</span>
147
+<span class="cline-any cline-yes">3×</span>
148
+<span class="cline-any cline-yes">1×</span>
149
+<span class="cline-any cline-yes">1×</span>
150
+<span class="cline-any cline-neutral">&nbsp;</span>
151
+<span class="cline-any cline-neutral">&nbsp;</span>
152
+<span class="cline-any cline-yes">2×</span>
153
+<span class="cline-any cline-yes">2×</span>
154
+<span class="cline-any cline-neutral">&nbsp;</span>
155
+<span class="cline-any cline-neutral">&nbsp;</span>
156
+<span class="cline-any cline-yes">19×</span>
157
+<span class="cline-any cline-yes">15×</span>
158
+<span class="cline-any cline-yes">15×</span>
159
+<span class="cline-any cline-neutral">&nbsp;</span>
160
+<span class="cline-any cline-neutral">&nbsp;</span>
161
+<span class="cline-any cline-yes">9×</span>
162
+<span class="cline-any cline-neutral">&nbsp;</span>
163
+<span class="cline-any cline-yes">3×</span>
164
+<span class="cline-any cline-yes">3×</span>
165
+<span class="cline-any cline-yes">3×</span>
166
+<span class="cline-any cline-neutral">&nbsp;</span>
167
+<span class="cline-any cline-neutral">&nbsp;</span>
168
+<span class="cline-any cline-neutral">&nbsp;</span>
169
+<span class="cline-any cline-neutral">&nbsp;</span>
170
+<span class="cline-any cline-neutral">&nbsp;</span>
171
+<span class="cline-any cline-yes">9×</span>
172
+<span class="cline-any cline-yes">9×</span>
173
+<span class="cline-any cline-yes">9×</span>
174
+<span class="cline-any cline-neutral">&nbsp;</span>
175
+<span class="cline-any cline-yes">9×</span>
176
+<span class="cline-any cline-yes">3×</span>
177
+<span class="cline-any cline-neutral">&nbsp;</span>
178
+<span class="cline-any cline-yes">9×</span>
179
+<span class="cline-any cline-neutral">&nbsp;</span>
180
+<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
181
+&nbsp;
182
+var _typeof = typeof Symbol === "function" &amp;&amp; typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : <span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >function (obj) {</span> <span class="cstat-no" title="statement not covered" >return obj &amp;&amp; typeof Symbol === "function" &amp;&amp; obj.constructor === Symbol ? "symbol" : typeof obj; </span>};</span>
183
+&nbsp;
184
+module.exports = {
185
+&nbsp;
186
+  _defaults: {
187
+    "warn_on_invalid": false
188
+  },
189
+&nbsp;
190
+  convert: function convert(data, options) {
191
+    if ((typeof data === "undefined" ? <span class="branch-0 cbranch-no" title="branch not covered" >"undefined" </span>: _typeof(data)) === 'object') {
192
+      if (options === undefined) {
193
+        options = {};
194
+      }
195
+      options = this._merge_options(this._defaults, options);
196
+      var result = "?";
197
+      Object.keys(data).map(function (query_key) {
198
+        var query_data = data[query_key];
199
+        var query_data_processed = void 0;
200
+        if (query_data === null) {
201
+          <span class="missing-if-branch" title="else path not taken" >E</span>if (options.warn_on_invalid) {
202
+            console.warn("Attempted to convert null to query string!");
203
+          }
204
+        } else if (typeof query_data === 'number') {
205
+          query_data_processed = query_data.toString();
206
+        } else if (query_data instanceof RegExp) {
207
+          query_data_processed = query_data.toString();
208
+        } else if (typeof query_data === 'string') {
209
+          query_data_processed = query_data;
210
+        } else if (typeof query_data === 'boolean') {
211
+          query_data_processed = query_data.toString();
212
+        } else if ((typeof query_data === "undefined" ? "undefined" : _typeof(query_data)) === 'object') {
213
+          query_data_processed = JSON.stringify(query_data);
214
+        } else if (typeof query_data === 'undefined') {
215
+          <span class="missing-if-branch" title="else path not taken" >E</span>if (options.warn_on_invalid) {
216
+            console.warn("Attempted to convert undefined to query string!");
217
+          }
218
+        } else {
219
+          <span class="missing-if-branch" title="else path not taken" >E</span>if (options.warn_on_invalid) {
220
+            console.warn("Attempted to convert function or symbol to query string!");
221
+          }
222
+        }
223
+        if (query_data_processed !== undefined) {
224
+          var append = query_key + "=" + encodeURIComponent(query_data_processed) + "&amp;";
225
+          result += append;
226
+        }
227
+      });
228
+      return result === "?" ? "" : result.substring(0, result.length - 1);
229
+    } else {
230
+      <span class="missing-if-branch" title="else path not taken" >E</span>if (options.warn_on_invalid) {
231
+        console.warn("Attempted to convert non-object to query string!");
232
+        return "";
233
+      }
234
+    }
235
+  },
236
+&nbsp;
237
+  _merge_options: function _merge_options(obj1, obj2) {
238
+    var obj3 = {};
239
+    Object.keys(obj1).map(function (attrname) {
240
+      obj3[attrname] = obj1[attrname];
241
+    });
242
+    Object.keys(obj2).map(function (attrname) {
243
+      obj3[attrname] = obj2[attrname];
244
+    });
245
+    return obj3;
246
+  }
247
+};</pre></td></tr>
248
+</table></pre>
249
+<div class='push'></div><!-- for sticky footer -->
250
+</div><!-- /wrapper -->
251
+<div class='footer quiet pad2 space-top1 center small'>
252
+  Code coverage
253
+  generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Apr 22 2016 22:58:07 GMT+0100 (BST)
254
+</div>
255
+</div>
256
+<script src="../../prettify.js"></script>
257
+<script>
258
+window.onload = function () {
259
+        if (typeof prettyPrint === 'function') {
260
+            prettyPrint();
261
+        }
262
+};
263
+</script>
264
+<script src="../../sorter.js"></script>
265
+</body>
266
+</html>

+ 106 - 0
coverage/lcov-report/js-query-string/spec/index.html

@@ -0,0 +1,106 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+    <title>Code coverage report for js-query-string/spec/</title>
5
+    <meta charset="utf-8" />
6
+    <link rel="stylesheet" href="../../prettify.css" />
7
+    <link rel="stylesheet" href="../../base.css" />
8
+    <meta name="viewport" content="width=device-width, initial-scale=1">
9
+    <style type='text/css'>
10
+        .coverage-summary .sorter {
11
+            background-image: url(../../sort-arrow-sprite.png);
12
+        }
13
+    </style>
14
+</head>
15
+<body>
16
+<div class='wrapper'>
17
+  <div class='pad1'>
18
+    <h1>
19
+      <a href="../../index.html">all files</a> js-query-string/spec/
20
+    </h1>
21
+    <div class='clearfix'>
22
+      <div class='fl pad1y space-right2'>
23
+        <span class="strong">95% </span>
24
+        <span class="quiet">Statements</span>
25
+        <span class='fraction'>38/40</span>
26
+      </div>
27
+      <div class='fl pad1y space-right2'>
28
+        <span class="strong">100% </span>
29
+        <span class="quiet">Branches</span>
30
+        <span class='fraction'>0/0</span>
31
+      </div>
32
+      <div class='fl pad1y space-right2'>
33
+        <span class="strong">85.71% </span>
34
+        <span class="quiet">Functions</span>
35
+        <span class='fraction'>12/14</span>
36
+      </div>
37
+      <div class='fl pad1y space-right2'>
38
+        <span class="strong">97.44% </span>
39
+        <span class="quiet">Lines</span>
40
+        <span class='fraction'>38/39</span>
41
+      </div>
42
+    </div>
43
+  </div>
44
+  <div class='status-line high'></div>
45
+<div class="pad1">
46
+<table class="coverage-summary">
47
+<thead>
48
+<tr>
49
+   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
50
+   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
51
+   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
52
+   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
53
+   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
54
+   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
55
+   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
56
+   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
57
+   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
58
+   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
59
+</tr>
60
+</thead>
61
+<tbody><tr>
62
+	<td class="file high" data-value="js-query-error-spec.js"><a href="js-query-error-spec.js.html">js-query-error-spec.js</a></td>
63
+	<td data-value="90" class="pic high"><div class="chart"><div class="cover-fill" style="width: 90%;"></div><div class="cover-empty" style="width:10%;"></div></div></td>
64
+	<td data-value="90" class="pct high">90%</td>
65
+	<td data-value="20" class="abs high">18/20</td>
66
+	<td data-value="100" class="pct high">100%</td>
67
+	<td data-value="0" class="abs high">0/0</td>
68
+	<td data-value="71.43" class="pct medium">71.43%</td>
69
+	<td data-value="7" class="abs medium">5/7</td>
70
+	<td data-value="94.74" class="pct high">94.74%</td>
71
+	<td data-value="19" class="abs high">18/19</td>
72
+	</tr>
73
+
74
+<tr>
75
+	<td class="file high" data-value="js-query-string-spec.js"><a href="js-query-string-spec.js.html">js-query-string-spec.js</a></td>
76
+	<td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td>
77
+	<td data-value="100" class="pct high">100%</td>
78
+	<td data-value="20" class="abs high">20/20</td>
79
+	<td data-value="100" class="pct high">100%</td>
80
+	<td data-value="0" class="abs high">0/0</td>
81
+	<td data-value="100" class="pct high">100%</td>
82
+	<td data-value="7" class="abs high">7/7</td>
83
+	<td data-value="100" class="pct high">100%</td>
84
+	<td data-value="20" class="abs high">20/20</td>
85
+	</tr>
86
+
87
+</tbody>
88
+</table>
89
+</div><div class='push'></div><!-- for sticky footer -->
90
+</div><!-- /wrapper -->
91
+<div class='footer quiet pad2 space-top1 center small'>
92
+  Code coverage
93
+  generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Apr 22 2016 22:58:07 GMT+0100 (BST)
94
+</div>
95
+</div>
96
+<script src="../../prettify.js"></script>
97
+<script>
98
+window.onload = function () {
99
+        if (typeof prettyPrint === 'function') {
100
+            prettyPrint();
101
+        }
102
+};
103
+</script>
104
+<script src="../../sorter.js"></script>
105
+</body>
106
+</html>

+ 179 - 0
coverage/lcov-report/js-query-string/spec/js-query-error-spec.js.html

@@ -0,0 +1,179 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+    <title>Code coverage report for js-query-string/spec/js-query-error-spec.js</title>
5
+    <meta charset="utf-8" />
6
+    <link rel="stylesheet" href="../../prettify.css" />
7
+    <link rel="stylesheet" href="../../base.css" />
8
+    <meta name="viewport" content="width=device-width, initial-scale=1">
9
+    <style type='text/css'>
10
+        .coverage-summary .sorter {
11
+            background-image: url(../../sort-arrow-sprite.png);
12
+        }
13
+    </style>
14
+</head>
15
+<body>
16
+<div class='wrapper'>
17
+  <div class='pad1'>
18
+    <h1>
19
+      <a href="../../index.html">all files</a> / <a href="index.html">js-query-string/spec/</a> js-query-error-spec.js
20
+    </h1>
21
+    <div class='clearfix'>
22
+      <div class='fl pad1y space-right2'>
23
+        <span class="strong">90% </span>
24
+        <span class="quiet">Statements</span>
25
+        <span class='fraction'>18/20</span>
26
+      </div>
27
+      <div class='fl pad1y space-right2'>
28
+        <span class="strong">100% </span>
29
+        <span class="quiet">Branches</span>
30
+        <span class='fraction'>0/0</span>
31
+      </div>
32
+      <div class='fl pad1y space-right2'>
33
+        <span class="strong">71.43% </span>
34
+        <span class="quiet">Functions</span>
35
+        <span class='fraction'>5/7</span>
36
+      </div>
37
+      <div class='fl pad1y space-right2'>
38
+        <span class="strong">94.74% </span>
39
+        <span class="quiet">Lines</span>
40
+        <span class='fraction'>18/19</span>
41
+      </div>
42
+    </div>
43
+  </div>
44
+  <div class='status-line high'></div>
45
+<pre><table class="coverage">
46
+<tr><td class="line-count quiet">1
47
+2
48
+3
49
+4
50
+5
51
+6
52
+7
53
+8
54
+9
55
+10
56
+11
57
+12
58
+13
59
+14
60
+15
61
+16
62
+17
63
+18
64
+19
65
+20
66
+21
67
+22
68
+23
69
+24
70
+25
71
+26
72
+27
73
+28
74
+29
75
+30
76
+31
77
+32
78
+33
79
+34
80
+35
81
+36
82
+37
83
+38
84
+39</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1×</span>
85
+<span class="cline-any cline-neutral">&nbsp;</span>
86
+<span class="cline-any cline-yes">1×</span>
87
+<span class="cline-any cline-neutral">&nbsp;</span>
88
+<span class="cline-any cline-yes">1×</span>
89
+<span class="cline-any cline-yes">1×</span>
90
+<span class="cline-any cline-no">&nbsp;</span>
91
+<span class="cline-any cline-neutral">&nbsp;</span>
92
+<span class="cline-any cline-neutral">&nbsp;</span>
93
+<span class="cline-any cline-yes">1×</span>
94
+<span class="cline-any cline-neutral">&nbsp;</span>
95
+<span class="cline-any cline-neutral">&nbsp;</span>
96
+<span class="cline-any cline-yes">1×</span>
97
+<span class="cline-any cline-yes">1×</span>
98
+<span class="cline-any cline-neutral">&nbsp;</span>
99
+<span class="cline-any cline-neutral">&nbsp;</span>
100
+<span class="cline-any cline-neutral">&nbsp;</span>
101
+<span class="cline-any cline-yes">1×</span>
102
+<span class="cline-any cline-neutral">&nbsp;</span>
103
+<span class="cline-any cline-neutral">&nbsp;</span>
104
+<span class="cline-any cline-yes">1×</span>
105
+<span class="cline-any cline-yes">1×</span>
106
+<span class="cline-any cline-neutral">&nbsp;</span>
107
+<span class="cline-any cline-neutral">&nbsp;</span>
108
+<span class="cline-any cline-neutral">&nbsp;</span>
109
+<span class="cline-any cline-yes">1×</span>
110
+<span class="cline-any cline-neutral">&nbsp;</span>
111
+<span class="cline-any cline-neutral">&nbsp;</span>
112
+<span class="cline-any cline-yes">1×</span>
113
+<span class="cline-any cline-yes">1×</span>
114
+<span class="cline-any cline-yes">1×</span>
115
+<span class="cline-any cline-yes">1×</span>
116
+<span class="cline-any cline-yes">1×</span>
117
+<span class="cline-any cline-yes">1×</span>
118
+<span class="cline-any cline-yes">1×</span>
119
+<span class="cline-any cline-neutral">&nbsp;</span>
120
+<span class="cline-any cline-neutral">&nbsp;</span>
121
+<span class="cline-any cline-neutral">&nbsp;</span>
122
+<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">var querify = require("../lib/index.js");
123
+&nbsp;
124
+describe("Object -&gt; Query String W/ Errors", function () {
125
+&nbsp;
126
+  it("Should fail with functions or Symbols", function () {
127
+    var qs_object = {
128
+      f: <span class="fstat-no" title="function not covered" >function() {</span> <span class="cstat-no" title="statement not covered" >console.log("Hello World!"); </span>},
129
+      s: Symbol("foo")
130
+    };
131
+    expect(querify.convert(qs_object, { warn_on_invalid: true })).toBe("");
132
+  });
133
+&nbsp;
134
+  it("Should fail for nulls", function () {
135
+    var qs_object = {
136
+      str: "mystr",
137
+      second_str: null
138
+    };
139
+    expect(querify.convert(qs_object, { warn_on_invalid: true })).toBe("?str=mystr");
140
+  });
141
+&nbsp;
142
+  it("Should fail for undefined", function () {
143
+    var qs_object = {
144
+      str: "a string",
145
+      second_str: undefined
146
+    };
147
+    expect(querify.convert(qs_object, { warn_on_invalid: true })).toBe("?str=a%20string");
148
+  });
149
+&nbsp;
150
+  it("Should fail when trying to use non-objects", function () {
151
+    var qs_object = "str";
152
+    var qs_object2 = 2;
153
+    var qs_object3 = <span class="fstat-no" title="function not covered" >function () {</span> <span class="cstat-no" title="statement not covered" >console.log("Hello World!"); </span>};
154
+    expect(querify.convert(qs_object, { warn_on_invalid: true })).toBe("");
155
+    expect(querify.convert(qs_object2, { warn_on_invalid: true })).toBe("");
156
+    expect(querify.convert(qs_object3, { warn_on_invalid: true })).toBe("");
157
+  });
158
+&nbsp;
159
+});
160
+&nbsp;</pre></td></tr>
161
+</table></pre>
162
+<div class='push'></div><!-- for sticky footer -->
163
+</div><!-- /wrapper -->
164
+<div class='footer quiet pad2 space-top1 center small'>
165
+  Code coverage
166
+  generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Apr 22 2016 22:58:07 GMT+0100 (BST)
167
+</div>
168
+</div>
169
+<script src="../../prettify.js"></script>
170
+<script>
171
+window.onload = function () {
172
+        if (typeof prettyPrint === 'function') {
173
+            prettyPrint();
174
+        }
175
+};
176
+</script>
177
+<script src="../../sorter.js"></script>
178
+</body>
179
+</html>

+ 245 - 0
coverage/lcov-report/js-query-string/spec/js-query-string-spec.js.html

@@ -0,0 +1,245 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+    <title>Code coverage report for js-query-string/spec/js-query-string-spec.js</title>
5
+    <meta charset="utf-8" />
6
+    <link rel="stylesheet" href="../../prettify.css" />
7
+    <link rel="stylesheet" href="../../base.css" />
8
+    <meta name="viewport" content="width=device-width, initial-scale=1">
9
+    <style type='text/css'>
10
+        .coverage-summary .sorter {
11
+            background-image: url(../../sort-arrow-sprite.png);
12
+        }
13
+    </style>
14
+</head>
15
+<body>
16
+<div class='wrapper'>
17
+  <div class='pad1'>
18
+    <h1>
19
+      <a href="../../index.html">all files</a> / <a href="index.html">js-query-string/spec/</a> js-query-string-spec.js
20
+    </h1>
21
+    <div class='clearfix'>
22
+      <div class='fl pad1y space-right2'>
23
+        <span class="strong">100% </span>
24
+        <span class="quiet">Statements</span>
25
+        <span class='fraction'>20/20</span>
26
+      </div>
27
+      <div class='fl pad1y space-right2'>
28
+        <span class="strong">100% </span>
29
+        <span class="quiet">Branches</span>
30
+        <span class='fraction'>0/0</span>
31
+      </div>
32
+      <div class='fl pad1y space-right2'>
33
+        <span class="strong">100% </span>
34
+        <span class="quiet">Functions</span>
35
+        <span class='fraction'>7/7</span>
36
+      </div>
37
+      <div class='fl pad1y space-right2'>
38
+        <span class="strong">100% </span>
39
+        <span class="quiet">Lines</span>
40
+        <span class='fraction'>20/20</span>
41
+      </div>
42
+    </div>
43
+  </div>
44
+  <div class='status-line high'></div>
45
+<pre><table class="coverage">
46
+<tr><td class="line-count quiet">1
47
+2
48
+3
49
+4
50
+5
51
+6
52
+7
53
+8
54
+9
55
+10
56
+11
57
+12
58
+13
59
+14
60
+15
61
+16
62
+17
63
+18
64
+19
65
+20
66
+21
67
+22
68
+23
69
+24
70
+25
71
+26
72
+27
73
+28
74
+29
75
+30
76
+31
77
+32
78
+33
79
+34
80
+35
81
+36
82
+37
83
+38
84
+39
85
+40
86
+41
87
+42
88
+43
89
+44
90
+45
91
+46
92
+47
93
+48
94
+49
95
+50
96
+51
97
+52
98
+53
99
+54
100
+55
101
+56
102
+57
103
+58
104
+59
105
+60
106
+61</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1×</span>
107
+<span class="cline-any cline-neutral">&nbsp;</span>
108
+<span class="cline-any cline-yes">1×</span>
109
+<span class="cline-any cline-neutral">&nbsp;</span>
110
+<span class="cline-any cline-yes">1×</span>
111
+<span class="cline-any cline-yes">1×</span>
112
+<span class="cline-any cline-neutral">&nbsp;</span>
113
+<span class="cline-any cline-neutral">&nbsp;</span>
114
+<span class="cline-any cline-neutral">&nbsp;</span>
115
+<span class="cline-any cline-yes">1×</span>
116
+<span class="cline-any cline-neutral">&nbsp;</span>
117
+<span class="cline-any cline-neutral">&nbsp;</span>
118
+<span class="cline-any cline-yes">1×</span>
119
+<span class="cline-any cline-yes">1×</span>
120
+<span class="cline-any cline-neutral">&nbsp;</span>
121
+<span class="cline-any cline-neutral">&nbsp;</span>
122
+<span class="cline-any cline-neutral">&nbsp;</span>
123
+<span class="cline-any cline-neutral">&nbsp;</span>
124
+<span class="cline-any cline-yes">1×</span>
125
+<span class="cline-any cline-neutral">&nbsp;</span>
126
+<span class="cline-any cline-neutral">&nbsp;</span>
127
+<span class="cline-any cline-yes">1×</span>
128
+<span class="cline-any cline-yes">1×</span>
129
+<span class="cline-any cline-neutral">&nbsp;</span>
130
+<span class="cline-any cline-neutral">&nbsp;</span>
131
+<span class="cline-any cline-neutral">&nbsp;</span>
132
+<span class="cline-any cline-yes">1×</span>
133
+<span class="cline-any cline-neutral">&nbsp;</span>
134
+<span class="cline-any cline-neutral">&nbsp;</span>
135
+<span class="cline-any cline-yes">1×</span>
136
+<span class="cline-any cline-yes">1×</span>
137
+<span class="cline-any cline-neutral">&nbsp;</span>
138
+<span class="cline-any cline-neutral">&nbsp;</span>
139
+<span class="cline-any cline-neutral">&nbsp;</span>
140
+<span class="cline-any cline-yes">1×</span>
141
+<span class="cline-any cline-neutral">&nbsp;</span>
142
+<span class="cline-any cline-neutral">&nbsp;</span>
143
+<span class="cline-any cline-yes">1×</span>
144
+<span class="cline-any cline-yes">1×</span>
145
+<span class="cline-any cline-neutral">&nbsp;</span>
146
+<span class="cline-any cline-neutral">&nbsp;</span>
147
+<span class="cline-any cline-neutral">&nbsp;</span>
148
+<span class="cline-any cline-neutral">&nbsp;</span>
149
+<span class="cline-any cline-neutral">&nbsp;</span>
150
+<span class="cline-any cline-neutral">&nbsp;</span>
151
+<span class="cline-any cline-neutral">&nbsp;</span>
152
+<span class="cline-any cline-neutral">&nbsp;</span>
153
+<span class="cline-any cline-neutral">&nbsp;</span>
154
+<span class="cline-any cline-yes">1×</span>
155
+<span class="cline-any cline-neutral">&nbsp;</span>
156
+<span class="cline-any cline-neutral">&nbsp;</span>
157
+<span class="cline-any cline-yes">1×</span>
158
+<span class="cline-any cline-yes">1×</span>
159
+<span class="cline-any cline-neutral">&nbsp;</span>
160
+<span class="cline-any cline-neutral">&nbsp;</span>
161
+<span class="cline-any cline-neutral">&nbsp;</span>
162
+<span class="cline-any cline-yes">1×</span>
163
+<span class="cline-any cline-neutral">&nbsp;</span>
164
+<span class="cline-any cline-neutral">&nbsp;</span>
165
+<span class="cline-any cline-neutral">&nbsp;</span>
166
+<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">var querify = require("../lib/index.js");
167
+&nbsp;
168
+describe("Object -&gt; Query String", function () {
169
+&nbsp;
170
+  it("Should work for objects with strings", function () {
171
+    var qs_object = {
172
+      str: "mystr",
173
+      second_str: "myotherstr"
174
+    };
175
+    expect(querify.convert(qs_object)).toBe("?str=mystr&amp;second_str=myotherstr");
176
+  });
177
+&nbsp;
178
+  it("Should work with numbers", function () {
179
+    var qs_object = {
180
+      num: 5,
181
+      othernum: 4000,
182
+      neg_number: -20
183
+    };
184
+    expect(querify.convert(qs_object)).toBe("?num=5&amp;othernum=4000&amp;neg_number=-20");
185
+  });
186
+&nbsp;
187
+  it("Should work with booleans", function () {
188
+    var qs_object = {
189
+      bool_t: true,
190
+      bool_f: false
191
+    };
192
+    expect(querify.convert(qs_object)).toBe("?bool_t=true&amp;bool_f=false");
193
+  });
194
+&nbsp;
195
+  it("Should work with arrays", function () {
196
+    var qs_object = {
197
+      arr: [1,2,3],
198
+      arr_two: [8,"string",true]
199
+    };
200
+    expect(querify.convert(qs_object)).toBe("?arr=%5B1%2C2%2C3%5D&amp;arr_two=%5B8%2C%22string%22%2Ctrue%5D");
201
+  });
202
+&nbsp;
203
+  it("Should work with objects", function () {
204
+    var qs_object = {
205
+      obj1: {
206
+        a: 1,
207
+        b: "string"
208
+      },
209
+      obj2: {
210
+        c: true,
211
+        b: [1,2]
212
+      }
213
+    };
214
+    expect(querify.convert(qs_object)).toBe("?obj1=%7B%22a%22%3A1%2C%22b%22%3A%22string%22%7D&amp;obj2=%7B%22c%22%3Atrue%2C%22b%22%3A%5B1%2C2%5D%7D");
215
+  });
216
+&nbsp;
217
+  it("Should work with RegExp", function () {
218
+    var qs_object = {
219
+      reg: /[^a-zA-Z]/,
220
+      reg2: /0/
221
+    };
222
+    expect(querify.convert(qs_object)).toBe("?reg=%2F%5B%5Ea-zA-Z%5D%2F&amp;reg2=%2F0%2F");
223
+  });
224
+&nbsp;
225
+});
226
+&nbsp;</pre></td></tr>
227
+</table></pre>
228
+<div class='push'></div><!-- for sticky footer -->
229
+</div><!-- /wrapper -->
230
+<div class='footer quiet pad2 space-top1 center small'>
231
+  Code coverage
232
+  generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Apr 22 2016 22:58:07 GMT+0100 (BST)
233
+</div>
234
+</div>
235
+<script src="../../prettify.js"></script>
236
+<script>
237
+window.onload = function () {
238
+        if (typeof prettyPrint === 'function') {
239
+            prettyPrint();
240
+        }
241
+};
242
+</script>
243
+<script src="../../sorter.js"></script>
244
+</body>
245
+</html>

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
coverage/lcov-report/prettify.css


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
coverage/lcov-report/prettify.js


BIN
coverage/lcov-report/sort-arrow-sprite.png


+ 158 - 0
coverage/lcov-report/sorter.js

@@ -0,0 +1,158 @@
1
+var addSorting = (function () {
2
+    "use strict";
3
+    var cols,
4
+        currentSort = {
5
+            index: 0,
6
+            desc: false
7
+        };
8
+
9
+    // returns the summary table element
10
+    function getTable() { return document.querySelector('.coverage-summary'); }
11
+    // returns the thead element of the summary table
12
+    function getTableHeader() { return getTable().querySelector('thead tr'); }
13
+    // returns the tbody element of the summary table
14
+    function getTableBody() { return getTable().querySelector('tbody'); }
15
+    // returns the th element for nth column
16
+    function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; }
17
+
18
+    // loads all columns
19
+    function loadColumns() {
20
+        var colNodes = getTableHeader().querySelectorAll('th'),
21
+            colNode,
22
+            cols = [],
23
+            col,
24
+            i;
25
+
26
+        for (i = 0; i < colNodes.length; i += 1) {
27
+            colNode = colNodes[i];
28
+            col = {
29
+                key: colNode.getAttribute('data-col'),
30
+                sortable: !colNode.getAttribute('data-nosort'),
31
+                type: colNode.getAttribute('data-type') || 'string'
32
+            };
33
+            cols.push(col);
34
+            if (col.sortable) {
35
+                col.defaultDescSort = col.type === 'number';
36
+                colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>';
37
+            }
38
+        }
39
+        return cols;
40
+    }
41
+    // attaches a data attribute to every tr element with an object
42
+    // of data values keyed by column name
43
+    function loadRowData(tableRow) {
44
+        var tableCols = tableRow.querySelectorAll('td'),
45
+            colNode,
46
+            col,
47
+            data = {},
48
+            i,
49
+            val;
50
+        for (i = 0; i < tableCols.length; i += 1) {
51
+            colNode = tableCols[i];
52
+            col = cols[i];
53
+            val = colNode.getAttribute('data-value');
54
+            if (col.type === 'number') {
55
+                val = Number(val);
56
+            }
57
+            data[col.key] = val;
58
+        }
59
+        return data;
60
+    }
61
+    // loads all row data
62
+    function loadData() {
63
+        var rows = getTableBody().querySelectorAll('tr'),
64
+            i;
65
+
66
+        for (i = 0; i < rows.length; i += 1) {
67
+            rows[i].data = loadRowData(rows[i]);
68
+        }
69
+    }
70
+    // sorts the table using the data for the ith column
71
+    function sortByIndex(index, desc) {
72
+        var key = cols[index].key,
73
+            sorter = function (a, b) {
74
+                a = a.data[key];
75
+                b = b.data[key];
76
+                return a < b ? -1 : a > b ? 1 : 0;
77
+            },
78
+            finalSorter = sorter,
79
+            tableBody = document.querySelector('.coverage-summary tbody'),
80
+            rowNodes = tableBody.querySelectorAll('tr'),
81
+            rows = [],
82
+            i;
83
+
84
+        if (desc) {
85
+            finalSorter = function (a, b) {
86
+                return -1 * sorter(a, b);
87
+            };
88
+        }
89
+
90
+        for (i = 0; i < rowNodes.length; i += 1) {
91
+            rows.push(rowNodes[i]);
92
+            tableBody.removeChild(rowNodes[i]);
93
+        }
94
+
95
+        rows.sort(finalSorter);
96
+
97
+        for (i = 0; i < rows.length; i += 1) {
98
+            tableBody.appendChild(rows[i]);
99
+        }
100
+    }
101
+    // removes sort indicators for current column being sorted
102
+    function removeSortIndicators() {
103
+        var col = getNthColumn(currentSort.index),
104
+            cls = col.className;
105
+
106
+        cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
107
+        col.className = cls;
108
+    }
109
+    // adds sort indicators for current column being sorted
110
+    function addSortIndicators() {
111
+        getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted';
112
+    }
113
+    // adds event listeners for all sorter widgets
114
+    function enableUI() {
115
+        var i,
116
+            el,
117
+            ithSorter = function ithSorter(i) {
118
+                var col = cols[i];
119
+
120
+                return function () {
121
+                    var desc = col.defaultDescSort;
122
+
123
+                    if (currentSort.index === i) {
124
+                        desc = !currentSort.desc;
125
+                    }
126
+                    sortByIndex(i, desc);
127
+                    removeSortIndicators();
128
+                    currentSort.index = i;
129
+                    currentSort.desc = desc;
130
+                    addSortIndicators();
131
+                };
132
+            };
133
+        for (i =0 ; i < cols.length; i += 1) {
134
+            if (cols[i].sortable) {
135
+                // add the click event handler on the th so users
136
+                // dont have to click on those tiny arrows
137
+                el = getNthColumn(i).querySelector('.sorter').parentElement;
138
+                if (el.addEventListener) {
139
+                    el.addEventListener('click', ithSorter(i));
140
+                } else {
141
+                    el.attachEvent('onclick', ithSorter(i));
142
+                }
143
+            }
144
+        }
145
+    }
146
+    // adds sorting functionality to the UI
147
+    return function () {
148
+        if (!getTable()) {
149
+            return;
150
+        }
151
+        cols = loadColumns();
152
+        loadData(cols);
153
+        addSortIndicators();
154
+        enableUI();
155
+    };
156
+})();
157
+
158
+window.addEventListener('load', addSorting);

+ 211 - 0
coverage/lcov.info

@@ -0,0 +1,211 @@
1
+TN:
2
+SF:/Users/Matt/Work/js-query-string/jasmine-runner.js
3
+FN:3,(anonymous_1)
4
+FNF:1
5
+FNH:1
6
+FNDA:19,(anonymous_1)
7
+DA:1,1
8
+DA:2,1
9
+DA:3,1
10
+DA:5,1
11
+DA:6,1
12
+DA:7,1
13
+DA:8,1
14
+DA:9,1
15
+LF:8
16
+LH:8
17
+BRF:0
18
+BRH:0
19
+end_of_record
20
+TN:
21
+SF:/Users/Matt/Work/js-query-string/spec/js-query-string-spec.js
22
+FN:3,(anonymous_1)
23
+FN:5,(anonymous_2)
24
+FN:13,(anonymous_3)
25
+FN:22,(anonymous_4)
26
+FN:30,(anonymous_5)
27
+FN:38,(anonymous_6)
28
+FN:52,(anonymous_7)
29
+FNF:7
30
+FNH:7
31
+FNDA:1,(anonymous_1)
32
+FNDA:1,(anonymous_2)
33
+FNDA:1,(anonymous_3)
34
+FNDA:1,(anonymous_4)
35
+FNDA:1,(anonymous_5)
36
+FNDA:1,(anonymous_6)
37
+FNDA:1,(anonymous_7)
38
+DA:1,1
39
+DA:3,1
40
+DA:5,1
41
+DA:6,1
42
+DA:10,1
43
+DA:13,1
44
+DA:14,1
45
+DA:19,1
46
+DA:22,1
47
+DA:23,1
48
+DA:27,1
49
+DA:30,1
50
+DA:31,1
51
+DA:35,1
52
+DA:38,1
53
+DA:39,1
54
+DA:49,1
55
+DA:52,1
56
+DA:53,1
57
+DA:57,1
58
+LF:20
59
+LH:20
60
+BRF:0
61
+BRH:0
62
+end_of_record
63
+TN:
64
+SF:/Users/Matt/Work/js-query-string/lib/index.js
65
+FN:3,(anonymous_1)
66
+FN:3,(anonymous_2)
67
+FN:11,convert
68
+FN:18,(anonymous_4)
69
+FN:58,_merge_options
70
+FN:60,(anonymous_6)
71
+FN:63,(anonymous_7)
72
+FNF:7
73
+FNH:6
74
+FNDA:18,(anonymous_1)
75
+FNDA:0,(anonymous_2)
76
+FNDA:12,convert
77
+FNDA:19,(anonymous_4)
78
+FNDA:9,_merge_options
79
+FNDA:9,(anonymous_6)
80
+FNDA:3,(anonymous_7)
81
+DA:3,18
82
+DA:5,1
83
+DA:12,12
84
+DA:13,9
85
+DA:14,6
86
+DA:16,9
87
+DA:17,9
88
+DA:18,9
89
+DA:19,19
90
+DA:20,19
91
+DA:21,19
92
+DA:22,1
93
+DA:23,1
94
+DA:25,18
95
+DA:26,3
96
+DA:27,15
97
+DA:28,2
98
+DA:29,13
99
+DA:30,4
100
+DA:31,9
101
+DA:32,2
102
+DA:33,7
103
+DA:34,4
104
+DA:35,3
105
+DA:36,1
106
+DA:37,1
107
+DA:40,2
108
+DA:41,2
109
+DA:44,19
110
+DA:45,15
111
+DA:46,15
112
+DA:49,9
113
+DA:51,3
114
+DA:52,3
115
+DA:53,3
116
+DA:59,9
117
+DA:60,9
118
+DA:61,9
119
+DA:63,9
120
+DA:64,3
121
+DA:66,9
122
+LF:41
123
+LH:41
124
+BRDA:3,1,0,1
125
+BRDA:3,1,1,0
126
+BRDA:3,2,0,1
127
+BRDA:3,2,1,1
128
+BRDA:3,3,0,0
129
+BRDA:3,3,1,0
130
+BRDA:3,4,0,0
131
+BRDA:3,4,1,0
132
+BRDA:3,4,2,0
133
+BRDA:12,5,0,9
134
+BRDA:12,5,1,3
135
+BRDA:12,6,0,0
136
+BRDA:12,6,1,12
137
+BRDA:13,7,0,6
138
+BRDA:13,7,1,3
139
+BRDA:21,8,0,1
140
+BRDA:21,8,1,18
141
+BRDA:22,9,0,1
142
+BRDA:22,9,1,0
143
+BRDA:25,10,0,3
144
+BRDA:25,10,1,15
145
+BRDA:27,11,0,2
146
+BRDA:27,11,1,13
147
+BRDA:29,12,0,4
148
+BRDA:29,12,1,9
149
+BRDA:31,13,0,2
150
+BRDA:31,13,1,7
151
+BRDA:33,14,0,4
152
+BRDA:33,14,1,3
153
+BRDA:33,15,0,1
154
+BRDA:33,15,1,6
155
+BRDA:35,16,0,1
156
+BRDA:35,16,1,2
157
+BRDA:36,17,0,1
158
+BRDA:36,17,1,0
159
+BRDA:40,18,0,2
160
+BRDA:40,18,1,0
161
+BRDA:44,19,0,15
162
+BRDA:44,19,1,4
163
+BRDA:49,20,0,1
164
+BRDA:49,20,1,8
165
+BRDA:51,21,0,3
166
+BRDA:51,21,1,0
167
+BRF:43
168
+BRH:32
169
+end_of_record
170
+TN:
171
+SF:/Users/Matt/Work/js-query-string/spec/js-query-error-spec.js
172
+FN:3,(anonymous_1)
173
+FN:5,(anonymous_2)
174
+FN:7,(anonymous_3)
175
+FN:13,(anonymous_4)
176
+FN:21,(anonymous_5)
177
+FN:29,(anonymous_6)
178
+FN:32,(anonymous_7)
179
+FNF:7
180
+FNH:5
181
+FNDA:1,(anonymous_1)
182
+FNDA:1,(anonymous_2)
183
+FNDA:0,(anonymous_3)
184
+FNDA:1,(anonymous_4)
185
+FNDA:1,(anonymous_5)
186
+FNDA:1,(anonymous_6)
187
+FNDA:0,(anonymous_7)
188
+DA:1,1
189
+DA:3,1
190
+DA:5,1
191
+DA:6,1
192
+DA:7,0
193
+DA:10,1
194
+DA:13,1
195
+DA:14,1
196
+DA:18,1
197
+DA:21,1
198
+DA:22,1
199
+DA:26,1
200
+DA:29,1
201
+DA:30,1
202
+DA:31,1
203
+DA:32,1
204
+DA:33,1
205
+DA:34,1
206
+DA:35,1
207
+LF:19
208
+LH:18
209
+BRF:0
210
+BRH:0
211
+end_of_record

+ 9 - 0
jasmine-runner.js

@@ -0,0 +1,9 @@
1
+var Jasmine = require('jasmine');
2
+var SpecReporter = require('jasmine-spec-reporter');
3
+var noop = function() {};
4
+
5
+var jrunner = new Jasmine();
6
+jrunner.configureDefaultReporter({print: noop});    // remove default reporter logs
7
+jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'all'}));   // add jasmine-spec-reporter
8
+jrunner.loadConfigFile();                           // load jasmine.json configuration
9
+jrunner.execute();

+ 10 - 5
lib/index.js

@@ -5,22 +5,27 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol
5 5
 module.exports = {
6 6
 
7 7
   _defaults: {
8
-    "warn_on_invalid": true
8
+    "warn_on_invalid": false
9 9
   },
10 10
 
11 11
   convert: function convert(data, options) {
12 12
     if ((typeof data === "undefined" ? "undefined" : _typeof(data)) === 'object') {
13
-      this._merge_options(this._defaults, options);
13
+      if (options === undefined) {
14
+        options = {};
15
+      }
16
+      options = this._merge_options(this._defaults, options);
14 17
       var result = "?";
15 18
       Object.keys(data).map(function (query_key) {
16 19
         var query_data = data[query_key];
17 20
         var query_data_processed = void 0;
18
-        if (query_data === 'null') {
21
+        if (query_data === null) {
19 22
           if (options.warn_on_invalid) {
20 23
             console.warn("Attempted to convert null to query string!");
21 24
           }
22 25
         } else if (typeof query_data === 'number') {
23 26
           query_data_processed = query_data.toString();
27
+        } else if (query_data instanceof RegExp) {
28
+          query_data_processed = query_data.toString();
24 29
         } else if (typeof query_data === 'string') {
25 30
           query_data_processed = query_data;
26 31
         } else if (typeof query_data === 'boolean') {
@@ -36,12 +41,12 @@ module.exports = {
36 41
             console.warn("Attempted to convert function or symbol to query string!");
37 42
           }
38 43
         }
39
-        if (query_data_processed !== 'undefined') {
44
+        if (query_data_processed !== undefined) {
40 45
           var append = query_key + "=" + encodeURIComponent(query_data_processed) + "&";
41 46
           result += append;
42 47
         }
43 48
       });
44
-      return result.substring(0, result.length - 1);
49
+      return result === "?" ? "" : result.substring(0, result.length - 1);
45 50
     } else {
46 51
       if (options.warn_on_invalid) {
47 52
         console.warn("Attempted to convert non-object to query string!");

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
lib/index.min.js


+ 5 - 1
package.json

@@ -5,7 +5,8 @@
5 5
   "main": "lib/index.js",
6 6
   "scripts": {
7 7
     "build": "babel src -d lib && jshint lib/index.js && uglifyjs lib/index.js > lib/index.min.js",
8
-    "test": "echo \"Error: no test specified\" && exit 1"
8
+    "pretest": "npm run build",
9
+    "test": "istanbul cover jasmine-runner.js"
9 10
   },
10 11
   "repository": {
11 12
     "type": "git",
@@ -20,7 +21,10 @@
20 21
   "devDependencies": {
21 22
     "babel-cli": "^6.7.5",
22 23
     "babel-preset-es2015": "^6.6.0",
24
+    "coveralls": "^2.11.9",
25
+    "istanbul": "^0.4.3",
23 26
     "jasmine": "^2.4.1",
27
+    "jasmine-spec-reporter": "^2.4.0",
24 28
     "jshint": "^2.9.1",
25 29
     "uglify-js": "^2.6.2"
26 30
   }

+ 38 - 0
spec/js-query-error-spec.js

@@ -0,0 +1,38 @@
1
+var querify = require("../lib/index.js");
2
+
3
+describe("Object -> Query String W/ Errors", function () {
4
+
5
+  it("Should fail with functions or Symbols", function () {
6
+    var qs_object = {
7
+      f: function() { console.log("Hello World!"); },
8
+      s: Symbol("foo")
9
+    };
10
+    expect(querify.convert(qs_object, { warn_on_invalid: true })).toBe("");
11
+  });
12
+
13
+  it("Should fail for nulls", function () {
14
+    var qs_object = {
15
+      str: "mystr",
16
+      second_str: null
17
+    };
18
+    expect(querify.convert(qs_object, { warn_on_invalid: true })).toBe("?str=mystr");
19
+  });
20
+
21
+  it("Should fail for undefined", function () {
22
+    var qs_object = {
23
+      str: "a string",
24
+      second_str: undefined
25
+    };
26
+    expect(querify.convert(qs_object, { warn_on_invalid: true })).toBe("?str=a%20string");
27
+  });
28
+
29
+  it("Should fail when trying to use non-objects", function () {
30
+    var qs_object = "str";
31
+    var qs_object2 = 2;
32
+    var qs_object3 = function () { console.log("Hello World!"); };
33
+    expect(querify.convert(qs_object, { warn_on_invalid: true })).toBe("");
34
+    expect(querify.convert(qs_object2, { warn_on_invalid: true })).toBe("");
35
+    expect(querify.convert(qs_object3, { warn_on_invalid: true })).toBe("");
36
+  });
37
+
38
+});

+ 60 - 0
spec/js-query-string-spec.js

@@ -0,0 +1,60 @@
1
+var querify = require("../lib/index.js");
2
+
3
+describe("Object -> Query String", function () {
4
+
5
+  it("Should work for objects with strings", function () {
6
+    var qs_object = {
7
+      str: "mystr",
8
+      second_str: "myotherstr"
9
+    };
10
+    expect(querify.convert(qs_object)).toBe("?str=mystr&second_str=myotherstr");
11
+  });
12
+
13
+  it("Should work with numbers", function () {
14
+    var qs_object = {
15
+      num: 5,
16
+      othernum: 4000,
17
+      neg_number: -20
18
+    };
19
+    expect(querify.convert(qs_object)).toBe("?num=5&othernum=4000&neg_number=-20");
20
+  });
21
+
22
+  it("Should work with booleans", function () {
23
+    var qs_object = {
24
+      bool_t: true,
25
+      bool_f: false
26
+    };
27
+    expect(querify.convert(qs_object)).toBe("?bool_t=true&bool_f=false");
28
+  });
29
+
30
+  it("Should work with arrays", function () {
31
+    var qs_object = {
32
+      arr: [1,2,3],
33
+      arr_two: [8,"string",true]
34
+    };
35
+    expect(querify.convert(qs_object)).toBe("?arr=%5B1%2C2%2C3%5D&arr_two=%5B8%2C%22string%22%2Ctrue%5D");
36
+  });
37
+
38
+  it("Should work with objects", function () {
39
+    var qs_object = {
40
+      obj1: {
41
+        a: 1,
42
+        b: "string"
43
+      },
44
+      obj2: {
45
+        c: true,
46
+        b: [1,2]
47
+      }
48
+    };
49
+    expect(querify.convert(qs_object)).toBe("?obj1=%7B%22a%22%3A1%2C%22b%22%3A%22string%22%7D&obj2=%7B%22c%22%3Atrue%2C%22b%22%3A%5B1%2C2%5D%7D");
50
+  });
51
+
52
+  it("Should work with RegExp", function () {
53
+    var qs_object = {
54
+      reg: /[^a-zA-Z]/,
55
+      reg2: /0/
56
+    };
57
+    expect(querify.convert(qs_object)).toBe("?reg=%2F%5B%5Ea-zA-Z%5D%2F&reg2=%2F0%2F");
58
+  });
59
+
60
+});

+ 0 - 9
spec/js-query-string.js

@@ -1,9 +0,0 @@
1
-var querify = require("./lib/index.js");
2
-
3
-describe("Object -> Query String", function () {
4
-
5
-  it("Should work for objects with strings", function () {
6
-    var querystring = 
7
-  });
8
-
9
-});

+ 2 - 2
spec/support/jasmine.json

@@ -1,10 +1,10 @@
1 1
 {
2 2
   "spec_dir": "spec",
3 3
   "spec_files": [
4
-    "**/*[sS]pec.js"
4
+      "js-query-string-spec.js",
5
+      "js-query-error-spec.js"
5 6
   ],
6 7
   "helpers": [
7
-    "helpers/**/*.js"
8 8
   ],
9 9
   "stopSpecOnExpectationFailure": false,
10 10
   "random": false

+ 10 - 5
src/index.js

@@ -2,22 +2,27 @@
2 2
 module.exports = {
3 3
 
4 4
   _defaults: {
5
-    "warn_on_invalid": true
5
+    "warn_on_invalid": false
6 6
   },
7 7
 
8 8
   convert: function (data, options) {
9 9
     if (typeof data === 'object') {
10
-      this._merge_options(this._defaults, options);
10
+      if (options === undefined) {
11
+        options = {};
12
+      }
13
+      options = this._merge_options(this._defaults, options);
11 14
       let result = "?";
12 15
       Object.keys(data).map(function (query_key) {
13 16
         let query_data = data[query_key];
14 17
         let query_data_processed;
15
-        if (query_data === 'null') {
18
+        if (query_data === null) {
16 19
           if (options.warn_on_invalid) {
17 20
             console.warn("Attempted to convert null to query string!");
18 21
           }
19 22
         } else if (typeof query_data === 'number') {
20 23
           query_data_processed = query_data.toString();
24
+        } else if (query_data instanceof RegExp) {
25
+          query_data_processed = query_data.toString();
21 26
         } else if (typeof query_data === 'string') {
22 27
           query_data_processed = query_data;
23 28
         } else if (typeof query_data === 'boolean') {
@@ -33,12 +38,12 @@ module.exports = {
33 38
             console.warn("Attempted to convert function or symbol to query string!");
34 39
           }
35 40
         }
36
-        if (query_data_processed !== 'undefined') {
41
+        if (query_data_processed !== undefined) {
37 42
           let append = query_key + "=" + encodeURIComponent(query_data_processed) + "&";
38 43
           result += append;
39 44
         }
40 45
       });
41
-      return result.substring(0, result.length-1);
46
+      return result === "?" ? "" : result.substring(0, result.length-1);
42 47
     } else {
43 48
       if (options.warn_on_invalid) {
44 49
         console.warn("Attempted to convert non-object to query string!");