step-node-agent 3.25.4 → 3.26.0

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.
Files changed (289) hide show
  1. package/AgentConf.yaml +13 -0
  2. package/api/controllers/controller.js +4 -0
  3. package/api/routes/routes.js +1 -0
  4. package/node_modules/aws4/aws4.js +1 -1
  5. package/node_modules/aws4/package.json +2 -2
  6. package/node_modules/body-parser/HISTORY.md +7 -0
  7. package/node_modules/body-parser/README.md +11 -0
  8. package/node_modules/body-parser/lib/types/urlencoded.js +30 -7
  9. package/node_modules/body-parser/package.json +2 -2
  10. package/node_modules/encodeurl/README.md +19 -38
  11. package/node_modules/encodeurl/index.js +1 -1
  12. package/node_modules/encodeurl/package.json +7 -7
  13. package/node_modules/express/History.md +27 -0
  14. package/node_modules/express/Readme.md +100 -6
  15. package/node_modules/express/lib/response.js +11 -10
  16. package/node_modules/express/package.json +11 -11
  17. package/node_modules/finalhandler/HISTORY.md +15 -0
  18. package/node_modules/finalhandler/README.md +2 -2
  19. package/node_modules/finalhandler/index.js +7 -2
  20. package/node_modules/finalhandler/package.json +8 -7
  21. package/node_modules/get-fqdn/LICENSE +21 -0
  22. package/node_modules/get-fqdn/README.md +83 -0
  23. package/node_modules/get-fqdn/index.js +17 -0
  24. package/node_modules/get-fqdn/package.json +73 -0
  25. package/node_modules/is-core-module/CHANGELOG.md +10 -0
  26. package/node_modules/is-core-module/core.json +2 -2
  27. package/node_modules/is-core-module/package.json +4 -4
  28. package/node_modules/is-core-module/test/index.js +17 -1
  29. package/node_modules/merge-descriptors/README.md +4 -3
  30. package/node_modules/merge-descriptors/index.js +3 -3
  31. package/node_modules/merge-descriptors/package.json +14 -7
  32. package/node_modules/path-to-regexp/index.js +57 -40
  33. package/node_modules/path-to-regexp/package.json +2 -2
  34. package/node_modules/qs/.editorconfig +3 -0
  35. package/node_modules/qs/.eslintrc +2 -2
  36. package/node_modules/qs/CHANGELOG.md +59 -5
  37. package/node_modules/qs/README.md +133 -49
  38. package/node_modules/qs/dist/qs.js +56 -2020
  39. package/node_modules/qs/lib/parse.js +46 -13
  40. package/node_modules/qs/lib/stringify.js +53 -28
  41. package/node_modules/qs/lib/utils.js +47 -34
  42. package/node_modules/qs/package.json +26 -12
  43. package/node_modules/qs/test/empty-keys-cases.js +267 -0
  44. package/node_modules/qs/test/parse.js +347 -32
  45. package/node_modules/qs/test/stringify.js +436 -47
  46. package/node_modules/send/HISTORY.md +5 -0
  47. package/node_modules/send/index.js +1 -2
  48. package/node_modules/send/node_modules/encodeurl/LICENSE +22 -0
  49. package/node_modules/send/node_modules/encodeurl/README.md +128 -0
  50. package/node_modules/send/node_modules/encodeurl/index.js +60 -0
  51. package/node_modules/send/node_modules/encodeurl/package.json +40 -0
  52. package/node_modules/send/package.json +1 -1
  53. package/node_modules/serve-static/HISTORY.md +16 -0
  54. package/node_modules/serve-static/index.js +1 -2
  55. package/node_modules/serve-static/package.json +3 -3
  56. package/node_modules/yaml/LICENSE +13 -0
  57. package/node_modules/yaml/README.md +155 -0
  58. package/node_modules/yaml/bin.mjs +11 -0
  59. package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  60. package/node_modules/yaml/browser/dist/compose/compose-doc.js +42 -0
  61. package/node_modules/yaml/browser/dist/compose/compose-node.js +92 -0
  62. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +80 -0
  63. package/node_modules/yaml/browser/dist/compose/composer.js +217 -0
  64. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +113 -0
  65. package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  66. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +47 -0
  67. package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  68. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +203 -0
  69. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +223 -0
  70. package/node_modules/yaml/browser/dist/compose/resolve-props.js +148 -0
  71. package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  72. package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +27 -0
  73. package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  74. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +17 -0
  75. package/node_modules/yaml/browser/dist/doc/Document.js +334 -0
  76. package/node_modules/yaml/browser/dist/doc/anchors.js +72 -0
  77. package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  78. package/node_modules/yaml/browser/dist/doc/createNode.js +89 -0
  79. package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  80. package/node_modules/yaml/browser/dist/errors.js +57 -0
  81. package/node_modules/yaml/browser/dist/index.js +17 -0
  82. package/node_modules/yaml/browser/dist/log.js +14 -0
  83. package/node_modules/yaml/browser/dist/nodes/Alias.js +101 -0
  84. package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  85. package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  86. package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  87. package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  88. package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  89. package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  90. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +104 -0
  91. package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  92. package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  93. package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  94. package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  95. package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  96. package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  97. package/node_modules/yaml/browser/dist/parse/lexer.js +717 -0
  98. package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  99. package/node_modules/yaml/browser/dist/parse/parser.js +954 -0
  100. package/node_modules/yaml/browser/dist/public-api.js +99 -0
  101. package/node_modules/yaml/browser/dist/schema/Schema.js +38 -0
  102. package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  103. package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  104. package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  105. package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  106. package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  107. package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  108. package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  109. package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  110. package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  111. package/node_modules/yaml/browser/dist/schema/tags.js +83 -0
  112. package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +66 -0
  113. package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  114. package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  115. package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  116. package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  117. package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  118. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +37 -0
  119. package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  120. package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  121. package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  122. package/node_modules/yaml/browser/dist/stringify/stringify.js +124 -0
  123. package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +143 -0
  124. package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  125. package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  126. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +24 -0
  127. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  128. package/node_modules/yaml/browser/dist/stringify/stringifyString.js +328 -0
  129. package/node_modules/yaml/browser/dist/util.js +11 -0
  130. package/node_modules/yaml/browser/dist/visit.js +233 -0
  131. package/node_modules/yaml/browser/index.js +5 -0
  132. package/node_modules/yaml/browser/package.json +3 -0
  133. package/node_modules/yaml/dist/cli.d.ts +8 -0
  134. package/node_modules/yaml/dist/cli.mjs +199 -0
  135. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  136. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  137. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  138. package/node_modules/yaml/dist/compose/compose-doc.js +44 -0
  139. package/node_modules/yaml/dist/compose/compose-node.d.ts +28 -0
  140. package/node_modules/yaml/dist/compose/compose-node.js +95 -0
  141. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  142. package/node_modules/yaml/dist/compose/compose-scalar.js +82 -0
  143. package/node_modules/yaml/dist/compose/composer.d.ts +62 -0
  144. package/node_modules/yaml/dist/compose/composer.js +221 -0
  145. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  146. package/node_modules/yaml/dist/compose/resolve-block-map.js +115 -0
  147. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  148. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  149. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  150. package/node_modules/yaml/dist/compose/resolve-block-seq.js +49 -0
  151. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  152. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  153. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  154. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +205 -0
  155. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  156. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +225 -0
  157. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  158. package/node_modules/yaml/dist/compose/resolve-props.js +150 -0
  159. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  160. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  161. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  162. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +29 -0
  163. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  164. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  165. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  166. package/node_modules/yaml/dist/compose/util-map-includes.js +19 -0
  167. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  168. package/node_modules/yaml/dist/doc/Document.js +336 -0
  169. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  170. package/node_modules/yaml/dist/doc/anchors.js +77 -0
  171. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  172. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  173. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  174. package/node_modules/yaml/dist/doc/createNode.js +91 -0
  175. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  176. package/node_modules/yaml/dist/doc/directives.js +178 -0
  177. package/node_modules/yaml/dist/errors.d.ts +21 -0
  178. package/node_modules/yaml/dist/errors.js +62 -0
  179. package/node_modules/yaml/dist/index.d.ts +22 -0
  180. package/node_modules/yaml/dist/index.js +50 -0
  181. package/node_modules/yaml/dist/log.d.ts +3 -0
  182. package/node_modules/yaml/dist/log.js +17 -0
  183. package/node_modules/yaml/dist/nodes/Alias.d.ts +28 -0
  184. package/node_modules/yaml/dist/nodes/Alias.js +103 -0
  185. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  186. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  187. package/node_modules/yaml/dist/nodes/Node.d.ts +47 -0
  188. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  189. package/node_modules/yaml/dist/nodes/Pair.d.ts +21 -0
  190. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  191. package/node_modules/yaml/dist/nodes/Scalar.d.ts +42 -0
  192. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  193. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  194. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  195. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  196. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  197. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  198. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +106 -0
  199. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  200. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  201. package/node_modules/yaml/dist/nodes/toJS.d.ts +27 -0
  202. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  203. package/node_modules/yaml/dist/options.d.ts +338 -0
  204. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  205. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  206. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  207. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  208. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  209. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  210. package/node_modules/yaml/dist/parse/cst.d.ts +108 -0
  211. package/node_modules/yaml/dist/parse/cst.js +112 -0
  212. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  213. package/node_modules/yaml/dist/parse/lexer.js +719 -0
  214. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  215. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  216. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  217. package/node_modules/yaml/dist/parse/parser.js +958 -0
  218. package/node_modules/yaml/dist/public-api.d.ts +43 -0
  219. package/node_modules/yaml/dist/public-api.js +104 -0
  220. package/node_modules/yaml/dist/schema/Schema.d.ts +18 -0
  221. package/node_modules/yaml/dist/schema/Schema.js +40 -0
  222. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  223. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  224. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  225. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  226. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  227. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  228. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  229. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  230. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  231. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  232. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  233. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  234. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  235. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  236. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  237. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  238. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  239. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  240. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  241. package/node_modules/yaml/dist/schema/tags.d.ts +40 -0
  242. package/node_modules/yaml/dist/schema/tags.js +86 -0
  243. package/node_modules/yaml/dist/schema/types.d.ts +90 -0
  244. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  245. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +68 -0
  246. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  247. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  248. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  249. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  250. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  251. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  252. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +28 -0
  253. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  254. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  255. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  256. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  257. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +39 -0
  258. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  259. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  260. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  261. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  262. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  263. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  264. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  265. package/node_modules/yaml/dist/stringify/stringify.js +127 -0
  266. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  267. package/node_modules/yaml/dist/stringify/stringifyCollection.js +145 -0
  268. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  269. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  270. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  271. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  272. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  273. package/node_modules/yaml/dist/stringify/stringifyNumber.js +26 -0
  274. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  275. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  276. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  277. package/node_modules/yaml/dist/stringify/stringifyString.js +330 -0
  278. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  279. package/node_modules/yaml/dist/test-events.js +134 -0
  280. package/node_modules/yaml/dist/util.d.ts +12 -0
  281. package/node_modules/yaml/dist/util.js +28 -0
  282. package/node_modules/yaml/dist/visit.d.ts +102 -0
  283. package/node_modules/yaml/dist/visit.js +236 -0
  284. package/node_modules/yaml/package.json +96 -0
  285. package/node_modules/yaml/util.js +2 -0
  286. package/package.json +7 -3
  287. package/server.js +50 -23
  288. package/node_modules/path-to-regexp/History.md +0 -36
  289. /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 qs = require('../');
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('arrayFormat: brackets allows only explicit arrays', function (st) {
36
- st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'brackets' }), { a: ['b', 'c'] });
37
- st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'brackets' }), { a: ['b', 'c'] });
38
- st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'brackets' }), { a: 'b,c' });
39
- st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'brackets' }), { a: ['b', '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('arrayFormat: indices allows only indexed arrays', function (st) {
44
- st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'indices' }), { a: ['b', 'c'] });
45
- st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'indices' }), { a: ['b', 'c'] });
46
- st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'indices' }), { a: 'b,c' });
47
- st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'indices' }), { a: ['b', '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('arrayFormat: comma allows only comma-separated arrays', function (st) {
52
- st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'comma' }), { a: ['b', 'c'] });
53
- st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'comma' }), { a: ['b', 'c'] });
54
- st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'comma' }), { a: 'b,c' });
55
- st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'comma' }), { a: ['b', 'c'] });
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('arrayFormat: repeat allows only repeated values', function (st) {
60
- st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'repeat' }), { a: ['b', 'c'] });
61
- st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'repeat' }), { a: ['b', 'c'] });
62
- st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'repeat' }), { a: 'b,c' });
63
- st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'repeat' }), { a: ['b', 'c'] });
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('allows enabling dot notation', function (st) {
68
- st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' });
69
- st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } });
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.crash = '';
326
- Array.prototype.crash = '';
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
- delete Object.prototype.crash;
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 tempBuffer = global.Buffer;
503
- delete global.Buffer;
639
+ var restore = mockProperty(global, 'Buffer', { 'delete': true });
640
+
504
641
  var result = qs.parse('a=b&c=d');
505
- global.Buffer = tempBuffer;
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
+ });