Coverage

100%
29
29
0

lib/ui-state.js

100%
29
29
0
LineHitsSource
11'use strict';
2
3
41var querystring = require('querystring');
5
6
7function encoder(key, value) {
8
9 if (typeof value === 'number') {
103 return ['\\', value].join('');
11 }
12
13 if (value === true) {
143 return '\\true';
15 }
16 if (value === false) {
174 return '\\false';
18 }
19 if (value === null) {
204 return '\\null';
21 }
22 if (value === undefined) {
234 return '\\undefined';
24 }
25
2652 return value;
27}
28
29function decoder(value) {
3092 var parsed;
31
32 if (value === '\\true') {
333 return true;
34 }
35
36 if (value === '\\false') {
374 return false;
38 }
39
40 if (value === '\\null') {
414 return null;
42 }
43
44 if (value === '\\undefined') {
454 return undefined;
46 }
47
48 if (value.substr(0, 1) === '\\') {
494 parsed = parseFloat(value.substr(1));
50 if (String(parsed) === value.substr(1)) {
514 return parsed;
52 }
53 }
54
5573 return value;
56}
57
58function passThrough(value) {
5986 return value;
60}
61
62
63function decode(query) {
6419 var obj = querystring.decode(query, '&', '=', {decodeURIComponent: decoder});
65
6619 Object.keys(obj).forEach(function (key) {
67 if (typeof(obj[key]) === 'string' && obj[key].match(/\:/)) {
6813 obj[key] = querystring.decode(obj[key], ',', ':', {decodeURIComponent: decoder});
69 }
70 });
71
7219 return obj;
73}
74
75
76function encode(obj) {
77
7819 obj = JSON.parse(JSON.stringify(obj, encoder));
79
8019 Object.keys(obj).forEach(function (key) {
81 if (obj[key] !== null && typeof obj[key] === 'object') {
82
8314 Object.keys(obj[key]).forEach(function (key2) {
84 if (obj[key][key2] !== null && typeof obj[key][key2] === 'object') {
852 throw new Error('Maximum allowed object depth is 2');
86 }
87 });
88
8912 obj[key] = querystring.stringify(obj[key], ',', ':', {encodeURIComponent: passThrough});
90 }
91 });
92
9317 return querystring.stringify(obj, '&', '=', {encodeURIComponent: passThrough});
94
95}
96
971exports.decode = decode;
981exports.encode = encode;
99