node-red-contrib-web-worldmap 4.9.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/README.md +7 -3
- package/examples/{feedback.json → Feedback.json} +1 -9
- package/examples/MouseCoordinates.json +159 -0
- package/examples/sidcEdgeIcon.json +158 -0
- package/node_modules/@turf/bezier-spline/README.md +15 -21
- package/node_modules/@turf/bezier-spline/dist/cjs/index.cjs +165 -0
- package/node_modules/@turf/bezier-spline/dist/cjs/index.cjs.map +1 -0
- package/node_modules/@turf/bezier-spline/dist/{es/index.js → cjs/index.d.cts} +9 -30
- package/node_modules/@turf/bezier-spline/dist/{js → esm}/index.d.ts +5 -3
- package/node_modules/@turf/bezier-spline/dist/esm/index.js +165 -0
- package/node_modules/@turf/bezier-spline/dist/esm/index.js.map +1 -0
- package/node_modules/@turf/bezier-spline/package.json +33 -25
- package/node_modules/@turf/helpers/README.md +231 -219
- package/node_modules/@turf/helpers/dist/cjs/index.cjs +308 -0
- package/node_modules/@turf/helpers/dist/cjs/index.cjs.map +1 -0
- package/node_modules/@turf/helpers/dist/{es/index.js → cjs/index.d.cts} +103 -303
- package/node_modules/@turf/helpers/dist/{js → esm}/index.d.ts +67 -53
- package/node_modules/@turf/helpers/dist/esm/index.js +308 -0
- package/node_modules/@turf/helpers/dist/esm/index.js.map +1 -0
- package/node_modules/@turf/helpers/package.json +32 -22
- package/node_modules/@turf/invariant/README.md +47 -58
- package/node_modules/@turf/invariant/dist/cjs/index.cjs +127 -0
- package/node_modules/@turf/invariant/dist/cjs/index.cjs.map +1 -0
- package/node_modules/@turf/invariant/dist/cjs/index.d.cts +108 -0
- package/node_modules/@turf/invariant/dist/{js → esm}/index.d.ts +12 -9
- package/node_modules/@turf/invariant/dist/esm/index.js +127 -0
- package/node_modules/@turf/invariant/dist/esm/index.js.map +1 -0
- package/node_modules/@turf/invariant/package.json +31 -22
- package/node_modules/@types/geojson/LICENSE +21 -0
- package/node_modules/@types/geojson/README.md +15 -0
- package/node_modules/@types/geojson/index.d.ts +165 -0
- package/node_modules/@types/geojson/package.json +45 -0
- package/node_modules/body-parser/HISTORY.md +7 -0
- package/node_modules/body-parser/README.md +11 -0
- package/node_modules/body-parser/lib/types/urlencoded.js +30 -7
- package/node_modules/body-parser/package.json +2 -2
- package/node_modules/encodeurl/README.md +19 -38
- package/node_modules/encodeurl/index.js +1 -1
- package/node_modules/encodeurl/package.json +7 -7
- package/node_modules/express/History.md +27 -0
- package/node_modules/express/Readme.md +100 -6
- package/node_modules/express/lib/response.js +11 -10
- package/node_modules/express/package.json +11 -11
- package/node_modules/finalhandler/HISTORY.md +15 -0
- package/node_modules/finalhandler/README.md +2 -2
- package/node_modules/finalhandler/index.js +7 -2
- package/node_modules/finalhandler/package.json +8 -7
- package/node_modules/merge-descriptors/README.md +4 -3
- package/node_modules/merge-descriptors/index.js +3 -3
- package/node_modules/merge-descriptors/package.json +14 -7
- package/node_modules/mime-db/HISTORY.md +14 -0
- package/node_modules/mime-db/README.md +27 -24
- package/node_modules/mime-db/db.json +646 -62
- package/node_modules/mime-db/package.json +9 -13
- package/node_modules/mime-types/node_modules/mime-db/HISTORY.md +507 -0
- package/node_modules/mime-types/node_modules/mime-db/LICENSE +23 -0
- package/node_modules/mime-types/node_modules/mime-db/README.md +100 -0
- package/node_modules/mime-types/node_modules/mime-db/db.json +8519 -0
- package/node_modules/mime-types/node_modules/mime-db/index.js +12 -0
- package/node_modules/mime-types/node_modules/mime-db/package.json +60 -0
- package/node_modules/object-inspect/CHANGELOG.md +15 -0
- package/node_modules/object-inspect/index.js +4 -1
- package/node_modules/object-inspect/package.json +14 -9
- package/node_modules/object-inspect/readme.markdown +9 -11
- package/node_modules/path-to-regexp/index.js +57 -40
- package/node_modules/path-to-regexp/package.json +2 -2
- package/node_modules/qs/.editorconfig +3 -0
- package/node_modules/qs/.eslintrc +2 -2
- package/node_modules/qs/CHANGELOG.md +59 -5
- package/node_modules/qs/README.md +133 -49
- package/node_modules/qs/dist/qs.js +56 -2020
- package/node_modules/qs/lib/parse.js +46 -13
- package/node_modules/qs/lib/stringify.js +53 -28
- package/node_modules/qs/lib/utils.js +47 -34
- package/node_modules/qs/package.json +26 -12
- package/node_modules/qs/test/empty-keys-cases.js +267 -0
- package/node_modules/qs/test/parse.js +347 -32
- package/node_modules/qs/test/stringify.js +436 -47
- package/node_modules/send/HISTORY.md +5 -0
- package/node_modules/send/index.js +1 -2
- package/node_modules/send/node_modules/encodeurl/LICENSE +22 -0
- package/node_modules/send/node_modules/encodeurl/README.md +128 -0
- package/node_modules/send/node_modules/encodeurl/index.js +60 -0
- package/node_modules/send/node_modules/encodeurl/package.json +40 -0
- package/node_modules/send/package.json +1 -1
- package/node_modules/serve-static/HISTORY.md +16 -0
- package/node_modules/serve-static/index.js +1 -2
- package/node_modules/serve-static/package.json +3 -3
- package/node_modules/tslib/CopyrightNotice.txt +15 -0
- package/node_modules/tslib/LICENSE.txt +12 -0
- package/node_modules/tslib/README.md +164 -0
- package/node_modules/tslib/SECURITY.md +41 -0
- package/node_modules/tslib/modules/index.d.ts +37 -0
- package/node_modules/tslib/modules/index.js +68 -0
- package/node_modules/tslib/modules/package.json +3 -0
- package/node_modules/tslib/package.json +47 -0
- package/node_modules/tslib/tslib.d.ts +453 -0
- package/node_modules/tslib/tslib.es6.html +1 -0
- package/node_modules/tslib/tslib.es6.js +379 -0
- package/node_modules/tslib/tslib.es6.mjs +378 -0
- package/node_modules/tslib/tslib.html +1 -0
- package/node_modules/tslib/tslib.js +429 -0
- package/package.json +5 -5
- package/worldmap/index.html +1 -1
- package/worldmap/leaflet/leaflet.mousecoordinate.js +3 -3
- package/worldmap/worldmap.js +123 -36
- package/worldmap.html +1 -1
- package/worldmap.js +23 -4
- package/node_modules/@turf/bezier-spline/dist/es/lib/spline.js +0 -158
- package/node_modules/@turf/bezier-spline/dist/es/package.json +0 -1
- package/node_modules/@turf/bezier-spline/dist/js/index.js +0 -65
- package/node_modules/@turf/bezier-spline/dist/js/lib/spline.d.ts +0 -62
- package/node_modules/@turf/bezier-spline/dist/js/lib/spline.js +0 -160
- package/node_modules/@turf/helpers/dist/es/lib/geojson.js +0 -7
- package/node_modules/@turf/helpers/dist/es/package.json +0 -1
- package/node_modules/@turf/helpers/dist/js/index.js +0 -724
- package/node_modules/@turf/helpers/dist/js/lib/geojson.d.ts +0 -193
- package/node_modules/@turf/helpers/dist/js/lib/geojson.js +0 -9
- package/node_modules/@turf/invariant/dist/es/index.js +0 -223
- package/node_modules/@turf/invariant/dist/es/package.json +0 -1
- package/node_modules/@turf/invariant/dist/js/index.js +0 -233
- package/node_modules/path-to-regexp/History.md +0 -36
- /package/node_modules/{encodeurl → send/node_modules/encodeurl}/HISTORY.md +0 -0
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var test = require('tape');
|
|
4
|
-
var
|
|
5
|
-
var utils = require('../lib/utils');
|
|
4
|
+
var hasPropertyDescriptors = require('has-property-descriptors')();
|
|
6
5
|
var iconv = require('iconv-lite');
|
|
6
|
+
var mockProperty = require('mock-property');
|
|
7
|
+
var hasOverrideMistake = require('has-override-mistake')();
|
|
7
8
|
var SaferBuffer = require('safer-buffer').Buffer;
|
|
9
|
+
var v = require('es-value-fixtures');
|
|
10
|
+
var inspect = require('object-inspect');
|
|
11
|
+
var emptyTestCases = require('./empty-keys-cases').emptyTestCases;
|
|
12
|
+
|
|
13
|
+
var qs = require('../');
|
|
14
|
+
var utils = require('../lib/utils');
|
|
8
15
|
|
|
9
16
|
test('parse()', function (t) {
|
|
10
17
|
t.test('parses a simple string', function (st) {
|
|
@@ -32,41 +39,156 @@ test('parse()', function (t) {
|
|
|
32
39
|
st.end();
|
|
33
40
|
});
|
|
34
41
|
|
|
35
|
-
t.test('
|
|
36
|
-
st.deepEqual(qs.parse('a[]=b&a[]=c'
|
|
37
|
-
st.deepEqual(qs.parse('a[0]=b&a[1]=c'
|
|
38
|
-
st.deepEqual(qs.parse('a=b,c'
|
|
39
|
-
st.deepEqual(qs.parse('a=b&a=c'
|
|
42
|
+
t.test('comma: false', function (st) {
|
|
43
|
+
st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] });
|
|
44
|
+
st.deepEqual(qs.parse('a[0]=b&a[1]=c'), { a: ['b', 'c'] });
|
|
45
|
+
st.deepEqual(qs.parse('a=b,c'), { a: 'b,c' });
|
|
46
|
+
st.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] });
|
|
40
47
|
st.end();
|
|
41
48
|
});
|
|
42
49
|
|
|
43
|
-
t.test('
|
|
44
|
-
st.deepEqual(qs.parse('a[]=b&a[]=c', {
|
|
45
|
-
st.deepEqual(qs.parse('a[0]=b&a[1]=c', {
|
|
46
|
-
st.deepEqual(qs.parse('a=b,c', {
|
|
47
|
-
st.deepEqual(qs.parse('a=b&a=c', {
|
|
50
|
+
t.test('comma: true', function (st) {
|
|
51
|
+
st.deepEqual(qs.parse('a[]=b&a[]=c', { comma: true }), { a: ['b', 'c'] });
|
|
52
|
+
st.deepEqual(qs.parse('a[0]=b&a[1]=c', { comma: true }), { a: ['b', 'c'] });
|
|
53
|
+
st.deepEqual(qs.parse('a=b,c', { comma: true }), { a: ['b', 'c'] });
|
|
54
|
+
st.deepEqual(qs.parse('a=b&a=c', { comma: true }), { a: ['b', 'c'] });
|
|
55
|
+
st.end();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
t.test('allows enabling dot notation', function (st) {
|
|
59
|
+
st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' });
|
|
60
|
+
st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } });
|
|
61
|
+
|
|
48
62
|
st.end();
|
|
49
63
|
});
|
|
50
64
|
|
|
51
|
-
t.test('
|
|
52
|
-
st.deepEqual(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
65
|
+
t.test('decode dot keys correctly', function (st) {
|
|
66
|
+
st.deepEqual(
|
|
67
|
+
qs.parse('name%252Eobj.first=John&name%252Eobj.last=Doe', { allowDots: false, decodeDotInKeys: false }),
|
|
68
|
+
{ 'name%2Eobj.first': 'John', 'name%2Eobj.last': 'Doe' },
|
|
69
|
+
'with allowDots false and decodeDotInKeys false'
|
|
70
|
+
);
|
|
71
|
+
st.deepEqual(
|
|
72
|
+
qs.parse('name.obj.first=John&name.obj.last=Doe', { allowDots: true, decodeDotInKeys: false }),
|
|
73
|
+
{ name: { obj: { first: 'John', last: 'Doe' } } },
|
|
74
|
+
'with allowDots false and decodeDotInKeys false'
|
|
75
|
+
);
|
|
76
|
+
st.deepEqual(
|
|
77
|
+
qs.parse('name%252Eobj.first=John&name%252Eobj.last=Doe', { allowDots: true, decodeDotInKeys: false }),
|
|
78
|
+
{ 'name%2Eobj': { first: 'John', last: 'Doe' } },
|
|
79
|
+
'with allowDots true and decodeDotInKeys false'
|
|
80
|
+
);
|
|
81
|
+
st.deepEqual(
|
|
82
|
+
qs.parse('name%252Eobj.first=John&name%252Eobj.last=Doe', { allowDots: true, decodeDotInKeys: true }),
|
|
83
|
+
{ 'name.obj': { first: 'John', last: 'Doe' } },
|
|
84
|
+
'with allowDots true and decodeDotInKeys true'
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
st.deepEqual(
|
|
88
|
+
qs.parse(
|
|
89
|
+
'name%252Eobj%252Esubobject.first%252Egodly%252Ename=John&name%252Eobj%252Esubobject.last=Doe',
|
|
90
|
+
{ allowDots: false, decodeDotInKeys: false }
|
|
91
|
+
),
|
|
92
|
+
{ 'name%2Eobj%2Esubobject.first%2Egodly%2Ename': 'John', 'name%2Eobj%2Esubobject.last': 'Doe' },
|
|
93
|
+
'with allowDots false and decodeDotInKeys false'
|
|
94
|
+
);
|
|
95
|
+
st.deepEqual(
|
|
96
|
+
qs.parse(
|
|
97
|
+
'name.obj.subobject.first.godly.name=John&name.obj.subobject.last=Doe',
|
|
98
|
+
{ allowDots: true, decodeDotInKeys: false }
|
|
99
|
+
),
|
|
100
|
+
{ name: { obj: { subobject: { first: { godly: { name: 'John' } }, last: 'Doe' } } } },
|
|
101
|
+
'with allowDots true and decodeDotInKeys false'
|
|
102
|
+
);
|
|
103
|
+
st.deepEqual(
|
|
104
|
+
qs.parse(
|
|
105
|
+
'name%252Eobj%252Esubobject.first%252Egodly%252Ename=John&name%252Eobj%252Esubobject.last=Doe',
|
|
106
|
+
{ allowDots: true, decodeDotInKeys: true }
|
|
107
|
+
),
|
|
108
|
+
{ 'name.obj.subobject': { 'first.godly.name': 'John', last: 'Doe' } },
|
|
109
|
+
'with allowDots true and decodeDotInKeys true'
|
|
110
|
+
);
|
|
111
|
+
st.deepEqual(
|
|
112
|
+
qs.parse('name%252Eobj.first=John&name%252Eobj.last=Doe'),
|
|
113
|
+
{ 'name%2Eobj.first': 'John', 'name%2Eobj.last': 'Doe' },
|
|
114
|
+
'with allowDots and decodeDotInKeys undefined'
|
|
115
|
+
);
|
|
116
|
+
|
|
56
117
|
st.end();
|
|
57
118
|
});
|
|
58
119
|
|
|
59
|
-
t.test('
|
|
60
|
-
st.deepEqual(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
120
|
+
t.test('should decode dot in key of object, and allow enabling dot notation when decodeDotInKeys is set to true and allowDots is undefined', function (st) {
|
|
121
|
+
st.deepEqual(
|
|
122
|
+
qs.parse(
|
|
123
|
+
'name%252Eobj%252Esubobject.first%252Egodly%252Ename=John&name%252Eobj%252Esubobject.last=Doe',
|
|
124
|
+
{ decodeDotInKeys: true }
|
|
125
|
+
),
|
|
126
|
+
{ 'name.obj.subobject': { 'first.godly.name': 'John', last: 'Doe' } },
|
|
127
|
+
'with allowDots undefined and decodeDotInKeys true'
|
|
128
|
+
);
|
|
129
|
+
|
|
64
130
|
st.end();
|
|
65
131
|
});
|
|
66
132
|
|
|
67
|
-
t.test('
|
|
68
|
-
st
|
|
69
|
-
|
|
133
|
+
t.test('should throw when decodeDotInKeys is not of type boolean', function (st) {
|
|
134
|
+
st['throws'](
|
|
135
|
+
function () { qs.parse('foo[]&bar=baz', { decodeDotInKeys: 'foobar' }); },
|
|
136
|
+
TypeError
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
st['throws'](
|
|
140
|
+
function () { qs.parse('foo[]&bar=baz', { decodeDotInKeys: 0 }); },
|
|
141
|
+
TypeError
|
|
142
|
+
);
|
|
143
|
+
st['throws'](
|
|
144
|
+
function () { qs.parse('foo[]&bar=baz', { decodeDotInKeys: NaN }); },
|
|
145
|
+
TypeError
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
st['throws'](
|
|
149
|
+
function () { qs.parse('foo[]&bar=baz', { decodeDotInKeys: null }); },
|
|
150
|
+
TypeError
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
st.end();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
t.test('allows empty arrays in obj values', function (st) {
|
|
157
|
+
st.deepEqual(qs.parse('foo[]&bar=baz', { allowEmptyArrays: true }), { foo: [], bar: 'baz' });
|
|
158
|
+
st.deepEqual(qs.parse('foo[]&bar=baz', { allowEmptyArrays: false }), { foo: [''], bar: 'baz' });
|
|
159
|
+
|
|
160
|
+
st.end();
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
t.test('should throw when allowEmptyArrays is not of type boolean', function (st) {
|
|
164
|
+
st['throws'](
|
|
165
|
+
function () { qs.parse('foo[]&bar=baz', { allowEmptyArrays: 'foobar' }); },
|
|
166
|
+
TypeError
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
st['throws'](
|
|
170
|
+
function () { qs.parse('foo[]&bar=baz', { allowEmptyArrays: 0 }); },
|
|
171
|
+
TypeError
|
|
172
|
+
);
|
|
173
|
+
st['throws'](
|
|
174
|
+
function () { qs.parse('foo[]&bar=baz', { allowEmptyArrays: NaN }); },
|
|
175
|
+
TypeError
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
st['throws'](
|
|
179
|
+
function () { qs.parse('foo[]&bar=baz', { allowEmptyArrays: null }); },
|
|
180
|
+
TypeError
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
st.end();
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
t.test('allowEmptyArrays + strictNullHandling', function (st) {
|
|
187
|
+
st.deepEqual(
|
|
188
|
+
qs.parse('testEmptyArray[]', { strictNullHandling: true, allowEmptyArrays: true }),
|
|
189
|
+
{ testEmptyArray: [] }
|
|
190
|
+
);
|
|
191
|
+
|
|
70
192
|
st.end();
|
|
71
193
|
});
|
|
72
194
|
|
|
@@ -322,14 +444,14 @@ test('parse()', function (t) {
|
|
|
322
444
|
});
|
|
323
445
|
|
|
324
446
|
t.test('should not throw when a native prototype has an enumerable property', function (st) {
|
|
325
|
-
Object.prototype
|
|
326
|
-
Array.prototype
|
|
447
|
+
st.intercept(Object.prototype, 'crash', { value: '' });
|
|
448
|
+
st.intercept(Array.prototype, 'crash', { value: '' });
|
|
449
|
+
|
|
327
450
|
st.doesNotThrow(qs.parse.bind(null, 'a=b'));
|
|
328
451
|
st.deepEqual(qs.parse('a=b'), { a: 'b' });
|
|
329
452
|
st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c'));
|
|
330
453
|
st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] });
|
|
331
|
-
|
|
332
|
-
delete Array.prototype.crash;
|
|
454
|
+
|
|
333
455
|
st.end();
|
|
334
456
|
});
|
|
335
457
|
|
|
@@ -360,8 +482,14 @@ test('parse()', function (t) {
|
|
|
360
482
|
|
|
361
483
|
t.test('allows overriding array limit', function (st) {
|
|
362
484
|
st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } });
|
|
485
|
+
st.deepEqual(qs.parse('a[0]=b', { arrayLimit: 0 }), { a: ['b'] });
|
|
486
|
+
|
|
363
487
|
st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } });
|
|
488
|
+
st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: 0 }), { a: { '-1': 'b' } });
|
|
489
|
+
|
|
490
|
+
st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: -1 }), { a: { 0: 'b', 1: 'c' } });
|
|
364
491
|
st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } });
|
|
492
|
+
|
|
365
493
|
st.end();
|
|
366
494
|
});
|
|
367
495
|
|
|
@@ -452,6 +580,15 @@ test('parse()', function (t) {
|
|
|
452
580
|
st.end();
|
|
453
581
|
});
|
|
454
582
|
|
|
583
|
+
t.test('parses url-encoded brackets holds array of arrays when having two parts of strings with comma as array divider', function (st) {
|
|
584
|
+
st.deepEqual(qs.parse('foo%5B%5D=1,2,3&foo%5B%5D=4,5,6', { comma: true }), { foo: [['1', '2', '3'], ['4', '5', '6']] });
|
|
585
|
+
st.deepEqual(qs.parse('foo%5B%5D=1,2,3&foo%5B%5D=', { comma: true }), { foo: [['1', '2', '3'], ''] });
|
|
586
|
+
st.deepEqual(qs.parse('foo%5B%5D=1,2,3&foo%5B%5D=,', { comma: true }), { foo: [['1', '2', '3'], ['', '']] });
|
|
587
|
+
st.deepEqual(qs.parse('foo%5B%5D=1,2,3&foo%5B%5D=a', { comma: true }), { foo: [['1', '2', '3'], 'a'] });
|
|
588
|
+
|
|
589
|
+
st.end();
|
|
590
|
+
});
|
|
591
|
+
|
|
455
592
|
t.test('parses comma delimited array while having percent-encoded comma treated as normal text', function (st) {
|
|
456
593
|
st.deepEqual(qs.parse('foo=a%2Cb', { comma: true }), { foo: 'a,b' });
|
|
457
594
|
st.deepEqual(qs.parse('foo=a%2C%20b,d', { comma: true }), { foo: ['a, b', 'd'] });
|
|
@@ -499,10 +636,12 @@ test('parse()', function (t) {
|
|
|
499
636
|
});
|
|
500
637
|
|
|
501
638
|
t.test('does not blow up when Buffer global is missing', function (st) {
|
|
502
|
-
var
|
|
503
|
-
|
|
639
|
+
var restore = mockProperty(global, 'Buffer', { 'delete': true });
|
|
640
|
+
|
|
504
641
|
var result = qs.parse('a=b&c=d');
|
|
505
|
-
|
|
642
|
+
|
|
643
|
+
restore();
|
|
644
|
+
|
|
506
645
|
st.deepEqual(result, { a: 'b', c: 'd' });
|
|
507
646
|
st.end();
|
|
508
647
|
});
|
|
@@ -601,6 +740,34 @@ test('parse()', function (t) {
|
|
|
601
740
|
st.end();
|
|
602
741
|
});
|
|
603
742
|
|
|
743
|
+
t.test('does not crash when the global Object prototype is frozen', { skip: !hasPropertyDescriptors || !hasOverrideMistake }, function (st) {
|
|
744
|
+
// We can't actually freeze the global Object prototype as that will interfere with other tests, and once an object is frozen, it
|
|
745
|
+
// can't be unfrozen. Instead, we add a new non-writable property to simulate this.
|
|
746
|
+
st.teardown(mockProperty(Object.prototype, 'frozenProp', { value: 'foo', nonWritable: true, nonEnumerable: true }));
|
|
747
|
+
|
|
748
|
+
st['throws'](
|
|
749
|
+
function () {
|
|
750
|
+
var obj = {};
|
|
751
|
+
obj.frozenProp = 'bar';
|
|
752
|
+
},
|
|
753
|
+
// node < 6 has a different error message
|
|
754
|
+
/^TypeError: Cannot assign to read only property 'frozenProp' of (?:object '#<Object>'|#<Object>)/,
|
|
755
|
+
'regular assignment of an inherited non-writable property throws'
|
|
756
|
+
);
|
|
757
|
+
|
|
758
|
+
var parsed;
|
|
759
|
+
st.doesNotThrow(
|
|
760
|
+
function () {
|
|
761
|
+
parsed = qs.parse('frozenProp', { allowPrototypes: false });
|
|
762
|
+
},
|
|
763
|
+
'parsing a nonwritable Object.prototype property does not throw'
|
|
764
|
+
);
|
|
765
|
+
|
|
766
|
+
st.deepEqual(parsed, {}, 'bare "frozenProp" results in {}');
|
|
767
|
+
|
|
768
|
+
st.end();
|
|
769
|
+
});
|
|
770
|
+
|
|
604
771
|
t.test('params starting with a closing bracket', function (st) {
|
|
605
772
|
st.deepEqual(qs.parse(']=toString'), { ']': 'toString' });
|
|
606
773
|
st.deepEqual(qs.parse(']]=toString'), { ']]': 'toString' });
|
|
@@ -853,3 +1020,151 @@ test('parse()', function (t) {
|
|
|
853
1020
|
|
|
854
1021
|
t.end();
|
|
855
1022
|
});
|
|
1023
|
+
|
|
1024
|
+
test('parses empty keys', function (t) {
|
|
1025
|
+
emptyTestCases.forEach(function (testCase) {
|
|
1026
|
+
t.test('skips empty string key with ' + testCase.input, function (st) {
|
|
1027
|
+
st.deepEqual(qs.parse(testCase.input), testCase.noEmptyKeys);
|
|
1028
|
+
|
|
1029
|
+
st.end();
|
|
1030
|
+
});
|
|
1031
|
+
});
|
|
1032
|
+
});
|
|
1033
|
+
|
|
1034
|
+
test('`duplicates` option', function (t) {
|
|
1035
|
+
v.nonStrings.concat('not a valid option').forEach(function (invalidOption) {
|
|
1036
|
+
if (typeof invalidOption !== 'undefined') {
|
|
1037
|
+
t['throws'](
|
|
1038
|
+
function () { qs.parse('', { duplicates: invalidOption }); },
|
|
1039
|
+
TypeError,
|
|
1040
|
+
'throws on invalid option: ' + inspect(invalidOption)
|
|
1041
|
+
);
|
|
1042
|
+
}
|
|
1043
|
+
});
|
|
1044
|
+
|
|
1045
|
+
t.deepEqual(
|
|
1046
|
+
qs.parse('foo=bar&foo=baz'),
|
|
1047
|
+
{ foo: ['bar', 'baz'] },
|
|
1048
|
+
'duplicates: default, combine'
|
|
1049
|
+
);
|
|
1050
|
+
|
|
1051
|
+
t.deepEqual(
|
|
1052
|
+
qs.parse('foo=bar&foo=baz', { duplicates: 'combine' }),
|
|
1053
|
+
{ foo: ['bar', 'baz'] },
|
|
1054
|
+
'duplicates: combine'
|
|
1055
|
+
);
|
|
1056
|
+
|
|
1057
|
+
t.deepEqual(
|
|
1058
|
+
qs.parse('foo=bar&foo=baz', { duplicates: 'first' }),
|
|
1059
|
+
{ foo: 'bar' },
|
|
1060
|
+
'duplicates: first'
|
|
1061
|
+
);
|
|
1062
|
+
|
|
1063
|
+
t.deepEqual(
|
|
1064
|
+
qs.parse('foo=bar&foo=baz', { duplicates: 'last' }),
|
|
1065
|
+
{ foo: 'baz' },
|
|
1066
|
+
'duplicates: last'
|
|
1067
|
+
);
|
|
1068
|
+
|
|
1069
|
+
t.end();
|
|
1070
|
+
});
|
|
1071
|
+
|
|
1072
|
+
test('qs strictDepth option - throw cases', function (t) {
|
|
1073
|
+
t.test('throws an exception when depth exceeds the limit with strictDepth: true', function (st) {
|
|
1074
|
+
st['throws'](
|
|
1075
|
+
function () {
|
|
1076
|
+
qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1, strictDepth: true });
|
|
1077
|
+
},
|
|
1078
|
+
RangeError,
|
|
1079
|
+
'Should throw RangeError'
|
|
1080
|
+
);
|
|
1081
|
+
st.end();
|
|
1082
|
+
});
|
|
1083
|
+
|
|
1084
|
+
t.test('throws an exception for multiple nested arrays with strictDepth: true', function (st) {
|
|
1085
|
+
st['throws'](
|
|
1086
|
+
function () {
|
|
1087
|
+
qs.parse('a[0][1][2][3][4]=b', { depth: 3, strictDepth: true });
|
|
1088
|
+
},
|
|
1089
|
+
RangeError,
|
|
1090
|
+
'Should throw RangeError'
|
|
1091
|
+
);
|
|
1092
|
+
st.end();
|
|
1093
|
+
});
|
|
1094
|
+
|
|
1095
|
+
t.test('throws an exception for nested objects and arrays with strictDepth: true', function (st) {
|
|
1096
|
+
st['throws'](
|
|
1097
|
+
function () {
|
|
1098
|
+
qs.parse('a[b][c][0][d][e]=f', { depth: 3, strictDepth: true });
|
|
1099
|
+
},
|
|
1100
|
+
RangeError,
|
|
1101
|
+
'Should throw RangeError'
|
|
1102
|
+
);
|
|
1103
|
+
st.end();
|
|
1104
|
+
});
|
|
1105
|
+
|
|
1106
|
+
t.test('throws an exception for different types of values with strictDepth: true', function (st) {
|
|
1107
|
+
st['throws'](
|
|
1108
|
+
function () {
|
|
1109
|
+
qs.parse('a[b][c][d][e]=true&a[b][c][d][f]=42', { depth: 3, strictDepth: true });
|
|
1110
|
+
},
|
|
1111
|
+
RangeError,
|
|
1112
|
+
'Should throw RangeError'
|
|
1113
|
+
);
|
|
1114
|
+
st.end();
|
|
1115
|
+
});
|
|
1116
|
+
|
|
1117
|
+
});
|
|
1118
|
+
|
|
1119
|
+
test('qs strictDepth option - non-throw cases', function (t) {
|
|
1120
|
+
t.test('when depth is 0 and strictDepth true, do not throw', function (st) {
|
|
1121
|
+
st.doesNotThrow(
|
|
1122
|
+
function () {
|
|
1123
|
+
qs.parse('a[b][c][d][e]=true&a[b][c][d][f]=42', { depth: 0, strictDepth: true });
|
|
1124
|
+
},
|
|
1125
|
+
RangeError,
|
|
1126
|
+
'Should not throw RangeError'
|
|
1127
|
+
);
|
|
1128
|
+
st.end();
|
|
1129
|
+
});
|
|
1130
|
+
|
|
1131
|
+
t.test('parses successfully when depth is within the limit with strictDepth: true', function (st) {
|
|
1132
|
+
st.doesNotThrow(
|
|
1133
|
+
function () {
|
|
1134
|
+
var result = qs.parse('a[b]=c', { depth: 1, strictDepth: true });
|
|
1135
|
+
st.deepEqual(result, { a: { b: 'c' } }, 'Should parse correctly');
|
|
1136
|
+
}
|
|
1137
|
+
);
|
|
1138
|
+
st.end();
|
|
1139
|
+
});
|
|
1140
|
+
|
|
1141
|
+
t.test('does not throw an exception when depth exceeds the limit with strictDepth: false', function (st) {
|
|
1142
|
+
st.doesNotThrow(
|
|
1143
|
+
function () {
|
|
1144
|
+
var result = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });
|
|
1145
|
+
st.deepEqual(result, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } }, 'Should parse with depth limit');
|
|
1146
|
+
}
|
|
1147
|
+
);
|
|
1148
|
+
st.end();
|
|
1149
|
+
});
|
|
1150
|
+
|
|
1151
|
+
t.test('parses successfully when depth is within the limit with strictDepth: false', function (st) {
|
|
1152
|
+
st.doesNotThrow(
|
|
1153
|
+
function () {
|
|
1154
|
+
var result = qs.parse('a[b]=c', { depth: 1 });
|
|
1155
|
+
st.deepEqual(result, { a: { b: 'c' } }, 'Should parse correctly');
|
|
1156
|
+
}
|
|
1157
|
+
);
|
|
1158
|
+
st.end();
|
|
1159
|
+
});
|
|
1160
|
+
|
|
1161
|
+
t.test('does not throw when depth is exactly at the limit with strictDepth: true', function (st) {
|
|
1162
|
+
st.doesNotThrow(
|
|
1163
|
+
function () {
|
|
1164
|
+
var result = qs.parse('a[b][c]=d', { depth: 2, strictDepth: true });
|
|
1165
|
+
st.deepEqual(result, { a: { b: { c: 'd' } } }, 'Should parse correctly');
|
|
1166
|
+
}
|
|
1167
|
+
);
|
|
1168
|
+
st.end();
|
|
1169
|
+
});
|
|
1170
|
+
});
|