1 | 'use strict';
|
2 |
|
3 | var has = Object.prototype.hasOwnProperty;
|
4 | var isArray = Array.isArray;
|
5 |
|
6 | var hexTable = (function () {
|
7 | var array = [];
|
8 | for (var i = 0; i < 256; ++i) {
|
9 | array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
|
10 | }
|
11 |
|
12 | return array;
|
13 | }());
|
14 |
|
15 | var compactQueue = function compactQueue(queue) {
|
16 | while (queue.length > 1) {
|
17 | var item = queue.pop();
|
18 | var obj = item.obj[item.prop];
|
19 |
|
20 | if (isArray(obj)) {
|
21 | var compacted = [];
|
22 |
|
23 | for (var j = 0; j < obj.length; ++j) {
|
24 | if (typeof obj[j] !== 'undefined') {
|
25 | compacted.push(obj[j]);
|
26 | }
|
27 | }
|
28 |
|
29 | item.obj[item.prop] = compacted;
|
30 | }
|
31 | }
|
32 | };
|
33 |
|
34 | var arrayToObject = function arrayToObject(source, options) {
|
35 | var obj = options && options.plainObjects ? Object.create(null) : {};
|
36 | for (var i = 0; i < source.length; ++i) {
|
37 | if (typeof source[i] !== 'undefined') {
|
38 | obj[i] = source[i];
|
39 | }
|
40 | }
|
41 |
|
42 | return obj;
|
43 | };
|
44 |
|
45 | var merge = function merge(target, source, options) {
|
46 |
|
47 | if (!source) {
|
48 | return target;
|
49 | }
|
50 |
|
51 | if (typeof source !== 'object') {
|
52 | if (isArray(target)) {
|
53 | target.push(source);
|
54 | } else if (target && typeof target === 'object') {
|
55 | if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
|
56 | target[source] = true;
|
57 | }
|
58 | } else {
|
59 | return [target, source];
|
60 | }
|
61 |
|
62 | return target;
|
63 | }
|
64 |
|
65 | if (!target || typeof target !== 'object') {
|
66 | return [target].concat(source);
|
67 | }
|
68 |
|
69 | var mergeTarget = target;
|
70 | if (isArray(target) && !isArray(source)) {
|
71 | mergeTarget = arrayToObject(target, options);
|
72 | }
|
73 |
|
74 | if (isArray(target) && isArray(source)) {
|
75 | source.forEach(function (item, i) {
|
76 | if (has.call(target, i)) {
|
77 | var targetItem = target[i];
|
78 | if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
|
79 | target[i] = merge(targetItem, item, options);
|
80 | } else {
|
81 | target.push(item);
|
82 | }
|
83 | } else {
|
84 | target[i] = item;
|
85 | }
|
86 | });
|
87 | return target;
|
88 | }
|
89 |
|
90 | return Object.keys(source).reduce(function (acc, key) {
|
91 | var value = source[key];
|
92 |
|
93 | if (has.call(acc, key)) {
|
94 | acc[key] = merge(acc[key], value, options);
|
95 | } else {
|
96 | acc[key] = value;
|
97 | }
|
98 | return acc;
|
99 | }, mergeTarget);
|
100 | };
|
101 |
|
102 | var assign = function assignSingleSource(target, source) {
|
103 | return Object.keys(source).reduce(function (acc, key) {
|
104 | acc[key] = source[key];
|
105 | return acc;
|
106 | }, target);
|
107 | };
|
108 |
|
109 | var decode = function (str, decoder, charset) {
|
110 | var strWithoutPlus = str.replace(/\+/g, ' ');
|
111 | if (charset === 'iso-8859-1') {
|
112 |
|
113 | return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
|
114 | }
|
115 |
|
116 | try {
|
117 | return decodeURIComponent(strWithoutPlus);
|
118 | } catch (e) {
|
119 | return strWithoutPlus;
|
120 | }
|
121 | };
|
122 |
|
123 | var encode = function encode(str, defaultEncoder, charset) {
|
124 |
|
125 |
|
126 | if (str.length === 0) {
|
127 | return str;
|
128 | }
|
129 |
|
130 | var string = str;
|
131 | if (typeof str === 'symbol') {
|
132 | string = Symbol.prototype.toString.call(str);
|
133 | } else if (typeof str !== 'string') {
|
134 | string = String(str);
|
135 | }
|
136 |
|
137 | if (charset === 'iso-8859-1') {
|
138 | return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
|
139 | return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
|
140 | });
|
141 | }
|
142 |
|
143 | var out = '';
|
144 | for (var i = 0; i < string.length; ++i) {
|
145 | var c = string.charCodeAt(i);
|
146 |
|
147 | if (
|
148 | c === 0x2D
|
149 | || c === 0x2E
|
150 | || c === 0x5F
|
151 | || c === 0x7E
|
152 | || (c >= 0x30 && c <= 0x39)
|
153 | || (c >= 0x41 && c <= 0x5A)
|
154 | || (c >= 0x61 && c <= 0x7A)
|
155 | ) {
|
156 | out += string.charAt(i);
|
157 | continue;
|
158 | }
|
159 |
|
160 | if (c < 0x80) {
|
161 | out = out + hexTable[c];
|
162 | continue;
|
163 | }
|
164 |
|
165 | if (c < 0x800) {
|
166 | out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
|
167 | continue;
|
168 | }
|
169 |
|
170 | if (c < 0xD800 || c >= 0xE000) {
|
171 | out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
|
172 | continue;
|
173 | }
|
174 |
|
175 | i += 1;
|
176 | c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
|
177 | out += hexTable[0xF0 | (c >> 18)]
|
178 | + hexTable[0x80 | ((c >> 12) & 0x3F)]
|
179 | + hexTable[0x80 | ((c >> 6) & 0x3F)]
|
180 | + hexTable[0x80 | (c & 0x3F)];
|
181 | }
|
182 |
|
183 | return out;
|
184 | };
|
185 |
|
186 | var compact = function compact(value) {
|
187 | var queue = [{ obj: { o: value }, prop: 'o' }];
|
188 | var refs = [];
|
189 |
|
190 | for (var i = 0; i < queue.length; ++i) {
|
191 | var item = queue[i];
|
192 | var obj = item.obj[item.prop];
|
193 |
|
194 | var keys = Object.keys(obj);
|
195 | for (var j = 0; j < keys.length; ++j) {
|
196 | var key = keys[j];
|
197 | var val = obj[key];
|
198 | if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
|
199 | queue.push({ obj: obj, prop: key });
|
200 | refs.push(val);
|
201 | }
|
202 | }
|
203 | }
|
204 |
|
205 | compactQueue(queue);
|
206 |
|
207 | return value;
|
208 | };
|
209 |
|
210 | var isRegExp = function isRegExp(obj) {
|
211 | return Object.prototype.toString.call(obj) === '[object RegExp]';
|
212 | };
|
213 |
|
214 | var isBuffer = function isBuffer(obj) {
|
215 | if (!obj || typeof obj !== 'object') {
|
216 | return false;
|
217 | }
|
218 |
|
219 | return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
|
220 | };
|
221 |
|
222 | var combine = function combine(a, b) {
|
223 | return [].concat(a, b);
|
224 | };
|
225 |
|
226 | var maybeMap = function maybeMap(val, fn) {
|
227 | if (isArray(val)) {
|
228 | var mapped = [];
|
229 | for (var i = 0; i < val.length; i += 1) {
|
230 | mapped.push(fn(val[i]));
|
231 | }
|
232 | return mapped;
|
233 | }
|
234 | return fn(val);
|
235 | };
|
236 |
|
237 | module.exports = {
|
238 | arrayToObject: arrayToObject,
|
239 | assign: assign,
|
240 | combine: combine,
|
241 | compact: compact,
|
242 | decode: decode,
|
243 | encode: encode,
|
244 | isBuffer: isBuffer,
|
245 | isRegExp: isRegExp,
|
246 | maybeMap: maybeMap,
|
247 | merge: merge
|
248 | };
|