mirror of
				https://github.com/shivammathur/setup-php.git
				synced 2025-10-31 07:16:22 +07:00 
			
		
		
		
	init
This commit is contained in:
		
							
								
								
									
										30
									
								
								node_modules/qs/.editorconfig
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								node_modules/qs/.editorconfig
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| root = true | ||||
|  | ||||
| [*] | ||||
| indent_style = space | ||||
| indent_size = 4 | ||||
| end_of_line = lf | ||||
| charset = utf-8 | ||||
| trim_trailing_whitespace = true | ||||
| insert_final_newline = true | ||||
| max_line_length = 140 | ||||
|  | ||||
| [test/*] | ||||
| max_line_length = off | ||||
|  | ||||
| [*.md] | ||||
| max_line_length = off | ||||
|  | ||||
| [*.json] | ||||
| max_line_length = off | ||||
|  | ||||
| [Makefile] | ||||
| max_line_length = off | ||||
|  | ||||
| [CHANGELOG.md] | ||||
| indent_style = space | ||||
| indent_size = 2 | ||||
|  | ||||
| [LICENSE] | ||||
| indent_size = 2 | ||||
| max_line_length = off | ||||
							
								
								
									
										1
									
								
								node_modules/qs/.eslintignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/qs/.eslintignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| dist | ||||
							
								
								
									
										19
									
								
								node_modules/qs/.eslintrc
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								node_modules/qs/.eslintrc
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| { | ||||
|     "root": true, | ||||
|  | ||||
|     "extends": "@ljharb", | ||||
|  | ||||
|     "rules": { | ||||
|         "complexity": 0, | ||||
|         "consistent-return": 1, | ||||
| 		"func-name-matching": 0, | ||||
|         "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], | ||||
|         "indent": [2, 4], | ||||
|         "max-params": [2, 12], | ||||
|         "max-statements": [2, 45], | ||||
|         "no-continue": 1, | ||||
|         "no-magic-numbers": 0, | ||||
|         "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], | ||||
|         "operator-linebreak": [2, "before"], | ||||
|     } | ||||
| } | ||||
							
								
								
									
										226
									
								
								node_modules/qs/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								node_modules/qs/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,226 @@ | ||||
| ## **6.5.2** | ||||
| - [Fix] use `safer-buffer` instead of `Buffer` constructor | ||||
| - [Refactor] utils: `module.exports` one thing, instead of mutating `exports` (#230) | ||||
| - [Dev Deps] update `browserify`, `eslint`, `iconv-lite`, `safer-buffer`, `tape`, `browserify` | ||||
|  | ||||
| ## **6.5.1** | ||||
| - [Fix] Fix parsing & compacting very deep objects (#224) | ||||
| - [Refactor] name utils functions | ||||
| - [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` | ||||
| - [Tests] up to `node` `v8.4`; use `nvm install-latest-npm` so newer npm doesn’t break older node | ||||
| - [Tests] Use precise dist for Node.js 0.6 runtime (#225) | ||||
| - [Tests] make 0.6 required, now that it’s passing | ||||
| - [Tests] on `node` `v8.2`; fix npm on node 0.6 | ||||
|  | ||||
| ## **6.5.0** | ||||
| - [New] add `utils.assign` | ||||
| - [New] pass default encoder/decoder to custom encoder/decoder functions (#206) | ||||
| - [New] `parse`/`stringify`: add `ignoreQueryPrefix`/`addQueryPrefix` options, respectively (#213) | ||||
| - [Fix] Handle stringifying empty objects with addQueryPrefix (#217) | ||||
| - [Fix] do not mutate `options` argument (#207) | ||||
| - [Refactor] `parse`: cache index to reuse in else statement (#182) | ||||
| - [Docs] add various badges to readme (#208) | ||||
| - [Dev Deps] update `eslint`, `browserify`, `iconv-lite`, `tape` | ||||
| - [Tests] up to `node` `v8.1`, `v7.10`, `v6.11`; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4 | ||||
| - [Tests] add `editorconfig-tools` | ||||
|  | ||||
| ## **6.4.0** | ||||
| - [New] `qs.stringify`: add `encodeValuesOnly` option | ||||
| - [Fix] follow `allowPrototypes` option during merge (#201, #201) | ||||
| - [Fix] support keys starting with brackets (#202, #200) | ||||
| - [Fix] chmod a-x | ||||
| - [Dev Deps] update `eslint` | ||||
| - [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds | ||||
| - [eslint] reduce warnings | ||||
|  | ||||
| ## **6.3.2** | ||||
| - [Fix] follow `allowPrototypes` option during merge (#201, #200) | ||||
| - [Dev Deps] update `eslint` | ||||
| - [Fix] chmod a-x | ||||
| - [Fix] support keys starting with brackets (#202, #200) | ||||
| - [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds | ||||
|  | ||||
| ## **6.3.1** | ||||
| - [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties (thanks, @snyk!) | ||||
| - [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `iconv-lite`, `qs-iconv`, `tape` | ||||
| - [Tests] on all node minors; improve test matrix | ||||
| - [Docs] document stringify option `allowDots` (#195) | ||||
| - [Docs] add empty object and array values example (#195) | ||||
| - [Docs] Fix minor inconsistency/typo (#192) | ||||
| - [Docs] document stringify option `sort` (#191) | ||||
| - [Refactor] `stringify`: throw faster with an invalid encoder | ||||
| - [Refactor] remove unnecessary escapes (#184) | ||||
| - Remove contributing.md, since `qs` is no longer part of `hapi` (#183) | ||||
|  | ||||
| ## **6.3.0** | ||||
| - [New] Add support for RFC 1738 (#174, #173) | ||||
| - [New] `stringify`: Add `serializeDate` option to customize Date serialization (#159) | ||||
| - [Fix] ensure `utils.merge` handles merging two arrays | ||||
| - [Refactor] only constructors should be capitalized | ||||
| - [Refactor] capitalized var names are for constructors only | ||||
| - [Refactor] avoid using a sparse array | ||||
| - [Robustness] `formats`: cache `String#replace` | ||||
| - [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`; add `safe-publish-latest` | ||||
| - [Tests] up to `node` `v6.8`, `v4.6`; improve test matrix | ||||
| - [Tests] flesh out arrayLimit/arrayFormat tests (#107) | ||||
| - [Tests] skip Object.create tests when null objects are not available | ||||
| - [Tests] Turn on eslint for test files (#175) | ||||
|  | ||||
| ## **6.2.3** | ||||
| - [Fix] follow `allowPrototypes` option during merge (#201, #200) | ||||
| - [Fix] chmod a-x | ||||
| - [Fix] support keys starting with brackets (#202, #200) | ||||
| - [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds | ||||
|  | ||||
| ## **6.2.2** | ||||
| - [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties | ||||
|  | ||||
| ## **6.2.1** | ||||
| - [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values | ||||
| - [Refactor] Be explicit and use `Object.prototype.hasOwnProperty.call` | ||||
| - [Tests] remove `parallelshell` since it does not reliably report failures | ||||
| - [Tests] up to `node` `v6.3`, `v5.12` | ||||
| - [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config`, `qs-iconv` | ||||
|  | ||||
| ## [**6.2.0**](https://github.com/ljharb/qs/issues?milestone=36&state=closed) | ||||
| - [New] pass Buffers to the encoder/decoder directly (#161) | ||||
| - [New] add "encoder" and "decoder" options, for custom param encoding/decoding (#160) | ||||
| - [Fix] fix compacting of nested sparse arrays (#150) | ||||
|  | ||||
| ## **6.1.2 | ||||
| - [Fix] follow `allowPrototypes` option during merge (#201, #200) | ||||
| - [Fix] chmod a-x | ||||
| - [Fix] support keys starting with brackets (#202, #200) | ||||
| - [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds | ||||
|  | ||||
| ## **6.1.1** | ||||
| - [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties | ||||
|  | ||||
| ## [**6.1.0**](https://github.com/ljharb/qs/issues?milestone=35&state=closed) | ||||
| - [New] allowDots option for `stringify` (#151) | ||||
| - [Fix] "sort" option should work at a depth of 3 or more (#151) | ||||
| - [Fix] Restore `dist` directory; will be removed in v7 (#148) | ||||
|  | ||||
| ## **6.0.4** | ||||
| - [Fix] follow `allowPrototypes` option during merge (#201, #200) | ||||
| - [Fix] chmod a-x | ||||
| - [Fix] support keys starting with brackets (#202, #200) | ||||
| - [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds | ||||
|  | ||||
| ## **6.0.3** | ||||
| - [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties | ||||
| - [Fix] Restore `dist` directory; will be removed in v7 (#148) | ||||
|  | ||||
| ## [**6.0.2**](https://github.com/ljharb/qs/issues?milestone=33&state=closed) | ||||
| - Revert ES6 requirement and restore support for node down to v0.8. | ||||
|  | ||||
| ## [**6.0.1**](https://github.com/ljharb/qs/issues?milestone=32&state=closed) | ||||
| - [**#127**](https://github.com/ljharb/qs/pull/127) Fix engines definition in package.json | ||||
|  | ||||
| ## [**6.0.0**](https://github.com/ljharb/qs/issues?milestone=31&state=closed) | ||||
| - [**#124**](https://github.com/ljharb/qs/issues/124) Use ES6 and drop support for node < v4 | ||||
|  | ||||
| ## **5.2.1** | ||||
| - [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values | ||||
|  | ||||
| ## [**5.2.0**](https://github.com/ljharb/qs/issues?milestone=30&state=closed) | ||||
| - [**#64**](https://github.com/ljharb/qs/issues/64) Add option to sort object keys in the query string | ||||
|  | ||||
| ## [**5.1.0**](https://github.com/ljharb/qs/issues?milestone=29&state=closed) | ||||
| - [**#117**](https://github.com/ljharb/qs/issues/117) make URI encoding stringified results optional | ||||
| - [**#106**](https://github.com/ljharb/qs/issues/106) Add flag `skipNulls` to optionally skip null values in stringify | ||||
|  | ||||
| ## [**5.0.0**](https://github.com/ljharb/qs/issues?milestone=28&state=closed) | ||||
| - [**#114**](https://github.com/ljharb/qs/issues/114) default allowDots to false | ||||
| - [**#100**](https://github.com/ljharb/qs/issues/100) include dist to npm | ||||
|  | ||||
| ## [**4.0.0**](https://github.com/ljharb/qs/issues?milestone=26&state=closed) | ||||
| - [**#98**](https://github.com/ljharb/qs/issues/98) make returning plain objects and allowing prototype overwriting properties optional | ||||
|  | ||||
| ## [**3.1.0**](https://github.com/ljharb/qs/issues?milestone=24&state=closed) | ||||
| - [**#89**](https://github.com/ljharb/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" | ||||
|  | ||||
| ## [**3.0.0**](https://github.com/ljharb/qs/issues?milestone=23&state=closed) | ||||
| - [**#80**](https://github.com/ljharb/qs/issues/80) qs.parse silently drops properties | ||||
| - [**#77**](https://github.com/ljharb/qs/issues/77) Perf boost | ||||
| - [**#60**](https://github.com/ljharb/qs/issues/60) Add explicit option to disable array parsing | ||||
| - [**#74**](https://github.com/ljharb/qs/issues/74) Bad parse when turning array into object | ||||
| - [**#81**](https://github.com/ljharb/qs/issues/81) Add a `filter` option | ||||
| - [**#68**](https://github.com/ljharb/qs/issues/68) Fixed issue with recursion and passing strings into objects. | ||||
| - [**#66**](https://github.com/ljharb/qs/issues/66) Add mixed array and object dot notation support Closes: #47 | ||||
| - [**#76**](https://github.com/ljharb/qs/issues/76) RFC 3986 | ||||
| - [**#85**](https://github.com/ljharb/qs/issues/85) No equal sign | ||||
| - [**#84**](https://github.com/ljharb/qs/issues/84) update license attribute | ||||
|  | ||||
| ## [**2.4.1**](https://github.com/ljharb/qs/issues?milestone=20&state=closed) | ||||
| - [**#73**](https://github.com/ljharb/qs/issues/73) Property 'hasOwnProperty' of object #<Object> is not a function | ||||
|  | ||||
| ## [**2.4.0**](https://github.com/ljharb/qs/issues?milestone=19&state=closed) | ||||
| - [**#70**](https://github.com/ljharb/qs/issues/70) Add arrayFormat option | ||||
|  | ||||
| ## [**2.3.3**](https://github.com/ljharb/qs/issues?milestone=18&state=closed) | ||||
| - [**#59**](https://github.com/ljharb/qs/issues/59) make sure array indexes are >= 0, closes #57 | ||||
| - [**#58**](https://github.com/ljharb/qs/issues/58) make qs usable for browser loader | ||||
|  | ||||
| ## [**2.3.2**](https://github.com/ljharb/qs/issues?milestone=17&state=closed) | ||||
| - [**#55**](https://github.com/ljharb/qs/issues/55) allow merging a string into an object | ||||
|  | ||||
| ## [**2.3.1**](https://github.com/ljharb/qs/issues?milestone=16&state=closed) | ||||
| - [**#52**](https://github.com/ljharb/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". | ||||
|  | ||||
| ## [**2.3.0**](https://github.com/ljharb/qs/issues?milestone=15&state=closed) | ||||
| - [**#50**](https://github.com/ljharb/qs/issues/50) add option to omit array indices, closes #46 | ||||
|  | ||||
| ## [**2.2.5**](https://github.com/ljharb/qs/issues?milestone=14&state=closed) | ||||
| - [**#39**](https://github.com/ljharb/qs/issues/39) Is there an alternative to Buffer.isBuffer? | ||||
| - [**#49**](https://github.com/ljharb/qs/issues/49) refactor utils.merge, fixes #45 | ||||
| - [**#41**](https://github.com/ljharb/qs/issues/41) avoid browserifying Buffer, for #39 | ||||
|  | ||||
| ## [**2.2.4**](https://github.com/ljharb/qs/issues?milestone=13&state=closed) | ||||
| - [**#38**](https://github.com/ljharb/qs/issues/38) how to handle object keys beginning with a number | ||||
|  | ||||
| ## [**2.2.3**](https://github.com/ljharb/qs/issues?milestone=12&state=closed) | ||||
| - [**#37**](https://github.com/ljharb/qs/issues/37) parser discards first empty value in array | ||||
| - [**#36**](https://github.com/ljharb/qs/issues/36) Update to lab 4.x | ||||
|  | ||||
| ## [**2.2.2**](https://github.com/ljharb/qs/issues?milestone=11&state=closed) | ||||
| - [**#33**](https://github.com/ljharb/qs/issues/33) Error when plain object in a value | ||||
| - [**#34**](https://github.com/ljharb/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty | ||||
| - [**#24**](https://github.com/ljharb/qs/issues/24) Changelog? Semver? | ||||
|  | ||||
| ## [**2.2.1**](https://github.com/ljharb/qs/issues?milestone=10&state=closed) | ||||
| - [**#32**](https://github.com/ljharb/qs/issues/32) account for circular references properly, closes #31 | ||||
| - [**#31**](https://github.com/ljharb/qs/issues/31) qs.parse stackoverflow on circular objects | ||||
|  | ||||
| ## [**2.2.0**](https://github.com/ljharb/qs/issues?milestone=9&state=closed) | ||||
| - [**#26**](https://github.com/ljharb/qs/issues/26) Don't use Buffer global if it's not present | ||||
| - [**#30**](https://github.com/ljharb/qs/issues/30) Bug when merging non-object values into arrays | ||||
| - [**#29**](https://github.com/ljharb/qs/issues/29) Don't call Utils.clone at the top of Utils.merge | ||||
| - [**#23**](https://github.com/ljharb/qs/issues/23) Ability to not limit parameters? | ||||
|  | ||||
| ## [**2.1.0**](https://github.com/ljharb/qs/issues?milestone=8&state=closed) | ||||
| - [**#22**](https://github.com/ljharb/qs/issues/22) Enable using a RegExp as delimiter | ||||
|  | ||||
| ## [**2.0.0**](https://github.com/ljharb/qs/issues?milestone=7&state=closed) | ||||
| - [**#18**](https://github.com/ljharb/qs/issues/18) Why is there arrayLimit? | ||||
| - [**#20**](https://github.com/ljharb/qs/issues/20) Configurable parametersLimit | ||||
| - [**#21**](https://github.com/ljharb/qs/issues/21) make all limits optional, for #18, for #20 | ||||
|  | ||||
| ## [**1.2.2**](https://github.com/ljharb/qs/issues?milestone=6&state=closed) | ||||
| - [**#19**](https://github.com/ljharb/qs/issues/19) Don't overwrite null values | ||||
|  | ||||
| ## [**1.2.1**](https://github.com/ljharb/qs/issues?milestone=5&state=closed) | ||||
| - [**#16**](https://github.com/ljharb/qs/issues/16) ignore non-string delimiters | ||||
| - [**#15**](https://github.com/ljharb/qs/issues/15) Close code block | ||||
|  | ||||
| ## [**1.2.0**](https://github.com/ljharb/qs/issues?milestone=4&state=closed) | ||||
| - [**#12**](https://github.com/ljharb/qs/issues/12) Add optional delim argument | ||||
| - [**#13**](https://github.com/ljharb/qs/issues/13) fix #11: flattened keys in array are now correctly parsed | ||||
|  | ||||
| ## [**1.1.0**](https://github.com/ljharb/qs/issues?milestone=3&state=closed) | ||||
| - [**#7**](https://github.com/ljharb/qs/issues/7) Empty values of a POST array disappear after being submitted | ||||
| - [**#9**](https://github.com/ljharb/qs/issues/9) Should not omit equals signs (=) when value is null | ||||
| - [**#6**](https://github.com/ljharb/qs/issues/6) Minor grammar fix in README | ||||
|  | ||||
| ## [**1.0.2**](https://github.com/ljharb/qs/issues?milestone=2&state=closed) | ||||
| - [**#5**](https://github.com/ljharb/qs/issues/5) array holes incorrectly copied into object on large index | ||||
							
								
								
									
										28
									
								
								node_modules/qs/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								node_modules/qs/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| Copyright (c) 2014 Nathan LaFreniere and other contributors. | ||||
| All rights reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
|     * Redistributions of source code must retain the above copyright | ||||
|       notice, this list of conditions and the following disclaimer. | ||||
|     * Redistributions in binary form must reproduce the above copyright | ||||
|       notice, this list of conditions and the following disclaimer in the | ||||
|       documentation and/or other materials provided with the distribution. | ||||
|     * The names of any contributors may not be used to endorse or promote | ||||
|       products derived from this software without specific prior written | ||||
|       permission. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY | ||||
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
|                                   *   *   * | ||||
|  | ||||
| The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors | ||||
							
								
								
									
										475
									
								
								node_modules/qs/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										475
									
								
								node_modules/qs/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,475 @@ | ||||
| # qs <sup>[![Version Badge][2]][1]</sup> | ||||
|  | ||||
| [![Build Status][3]][4] | ||||
| [![dependency status][5]][6] | ||||
| [![dev dependency status][7]][8] | ||||
| [![License][license-image]][license-url] | ||||
| [![Downloads][downloads-image]][downloads-url] | ||||
|  | ||||
| [![npm badge][11]][1] | ||||
|  | ||||
| A querystring parsing and stringifying library with some added security. | ||||
|  | ||||
| Lead Maintainer: [Jordan Harband](https://github.com/ljharb) | ||||
|  | ||||
| The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| ```javascript | ||||
| var qs = require('qs'); | ||||
| var assert = require('assert'); | ||||
|  | ||||
| var obj = qs.parse('a=c'); | ||||
| assert.deepEqual(obj, { a: 'c' }); | ||||
|  | ||||
| var str = qs.stringify(obj); | ||||
| assert.equal(str, 'a=c'); | ||||
| ``` | ||||
|  | ||||
| ### Parsing Objects | ||||
|  | ||||
| [](#preventEval) | ||||
| ```javascript | ||||
| qs.parse(string, [options]); | ||||
| ``` | ||||
|  | ||||
| **qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`. | ||||
| For example, the string `'foo[bar]=baz'` converts to: | ||||
|  | ||||
| ```javascript | ||||
| assert.deepEqual(qs.parse('foo[bar]=baz'), { | ||||
|     foo: { | ||||
|         bar: 'baz' | ||||
|     } | ||||
| }); | ||||
| ``` | ||||
|  | ||||
| When using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: | ||||
|  | ||||
| ```javascript | ||||
| var nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true }); | ||||
| assert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } }); | ||||
| ``` | ||||
|  | ||||
| By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. | ||||
|  | ||||
| ```javascript | ||||
| var protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }); | ||||
| assert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } }); | ||||
| ``` | ||||
|  | ||||
| URI encoded strings work too: | ||||
|  | ||||
| ```javascript | ||||
| assert.deepEqual(qs.parse('a%5Bb%5D=c'), { | ||||
|     a: { b: 'c' } | ||||
| }); | ||||
| ``` | ||||
|  | ||||
| You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: | ||||
|  | ||||
| ```javascript | ||||
| assert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), { | ||||
|     foo: { | ||||
|         bar: { | ||||
|             baz: 'foobarbaz' | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| ``` | ||||
|  | ||||
| By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like | ||||
| `'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: | ||||
|  | ||||
| ```javascript | ||||
| var expected = { | ||||
|     a: { | ||||
|         b: { | ||||
|             c: { | ||||
|                 d: { | ||||
|                     e: { | ||||
|                         f: { | ||||
|                             '[g][h][i]': 'j' | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| var string = 'a[b][c][d][e][f][g][h][i]=j'; | ||||
| assert.deepEqual(qs.parse(string), expected); | ||||
| ``` | ||||
|  | ||||
| This depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`: | ||||
|  | ||||
| ```javascript | ||||
| var deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); | ||||
| assert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } }); | ||||
| ``` | ||||
|  | ||||
| The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. | ||||
|  | ||||
| For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: | ||||
|  | ||||
| ```javascript | ||||
| var limited = qs.parse('a=b&c=d', { parameterLimit: 1 }); | ||||
| assert.deepEqual(limited, { a: 'b' }); | ||||
| ``` | ||||
|  | ||||
| To bypass the leading question mark, use `ignoreQueryPrefix`: | ||||
|  | ||||
| ```javascript | ||||
| var prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true }); | ||||
| assert.deepEqual(prefixed, { a: 'b', c: 'd' }); | ||||
| ``` | ||||
|  | ||||
| An optional delimiter can also be passed: | ||||
|  | ||||
| ```javascript | ||||
| var delimited = qs.parse('a=b;c=d', { delimiter: ';' }); | ||||
| assert.deepEqual(delimited, { a: 'b', c: 'd' }); | ||||
| ``` | ||||
|  | ||||
| Delimiters can be a regular expression too: | ||||
|  | ||||
| ```javascript | ||||
| var regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); | ||||
| assert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' }); | ||||
| ``` | ||||
|  | ||||
| Option `allowDots` can be used to enable dot notation: | ||||
|  | ||||
| ```javascript | ||||
| var withDots = qs.parse('a.b=c', { allowDots: true }); | ||||
| assert.deepEqual(withDots, { a: { b: 'c' } }); | ||||
| ``` | ||||
|  | ||||
| ### Parsing Arrays | ||||
|  | ||||
| **qs** can also parse arrays using a similar `[]` notation: | ||||
|  | ||||
| ```javascript | ||||
| var withArray = qs.parse('a[]=b&a[]=c'); | ||||
| assert.deepEqual(withArray, { a: ['b', 'c'] }); | ||||
| ``` | ||||
|  | ||||
| You may specify an index as well: | ||||
|  | ||||
| ```javascript | ||||
| var withIndexes = qs.parse('a[1]=c&a[0]=b'); | ||||
| assert.deepEqual(withIndexes, { a: ['b', 'c'] }); | ||||
| ``` | ||||
|  | ||||
| Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number | ||||
| to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving | ||||
| their order: | ||||
|  | ||||
| ```javascript | ||||
| var noSparse = qs.parse('a[1]=b&a[15]=c'); | ||||
| assert.deepEqual(noSparse, { a: ['b', 'c'] }); | ||||
| ``` | ||||
|  | ||||
| Note that an empty string is also a value, and will be preserved: | ||||
|  | ||||
| ```javascript | ||||
| var withEmptyString = qs.parse('a[]=&a[]=b'); | ||||
| assert.deepEqual(withEmptyString, { a: ['', 'b'] }); | ||||
|  | ||||
| var withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c'); | ||||
| assert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] }); | ||||
| ``` | ||||
|  | ||||
| **qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will | ||||
| instead be converted to an object with the index as the key: | ||||
|  | ||||
| ```javascript | ||||
| var withMaxIndex = qs.parse('a[100]=b'); | ||||
| assert.deepEqual(withMaxIndex, { a: { '100': 'b' } }); | ||||
| ``` | ||||
|  | ||||
| This limit can be overridden by passing an `arrayLimit` option: | ||||
|  | ||||
| ```javascript | ||||
| var withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 }); | ||||
| assert.deepEqual(withArrayLimit, { a: { '1': 'b' } }); | ||||
| ``` | ||||
|  | ||||
| To disable array parsing entirely, set `parseArrays` to `false`. | ||||
|  | ||||
| ```javascript | ||||
| var noParsingArrays = qs.parse('a[]=b', { parseArrays: false }); | ||||
| assert.deepEqual(noParsingArrays, { a: { '0': 'b' } }); | ||||
| ``` | ||||
|  | ||||
| If you mix notations, **qs** will merge the two items into an object: | ||||
|  | ||||
| ```javascript | ||||
| var mixedNotation = qs.parse('a[0]=b&a[b]=c'); | ||||
| assert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } }); | ||||
| ``` | ||||
|  | ||||
| You can also create arrays of objects: | ||||
|  | ||||
| ```javascript | ||||
| var arraysOfObjects = qs.parse('a[][b]=c'); | ||||
| assert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] }); | ||||
| ``` | ||||
|  | ||||
| ### Stringifying | ||||
|  | ||||
| [](#preventEval) | ||||
| ```javascript | ||||
| qs.stringify(object, [options]); | ||||
| ``` | ||||
|  | ||||
| When stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect: | ||||
|  | ||||
| ```javascript | ||||
| assert.equal(qs.stringify({ a: 'b' }), 'a=b'); | ||||
| assert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); | ||||
| ``` | ||||
|  | ||||
| This encoding can be disabled by setting the `encode` option to `false`: | ||||
|  | ||||
| ```javascript | ||||
| var unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false }); | ||||
| assert.equal(unencoded, 'a[b]=c'); | ||||
| ``` | ||||
|  | ||||
| Encoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`: | ||||
| ```javascript | ||||
| var encodedValues = qs.stringify( | ||||
|     { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, | ||||
|     { encodeValuesOnly: true } | ||||
| ); | ||||
| assert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h'); | ||||
| ``` | ||||
|  | ||||
| This encoding can also be replaced by a custom encoding method set as `encoder` option: | ||||
|  | ||||
| ```javascript | ||||
| var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) { | ||||
|     // Passed in values `a`, `b`, `c` | ||||
|     return // Return encoded string | ||||
| }}) | ||||
| ``` | ||||
|  | ||||
| _(Note: the `encoder` option does not apply if `encode` is `false`)_ | ||||
|  | ||||
| Analogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values: | ||||
|  | ||||
| ```javascript | ||||
| var decoded = qs.parse('x=z', { decoder: function (str) { | ||||
|     // Passed in values `x`, `z` | ||||
|     return // Return decoded string | ||||
| }}) | ||||
| ``` | ||||
|  | ||||
| Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. | ||||
|  | ||||
| When arrays are stringified, by default they are given explicit indices: | ||||
|  | ||||
| ```javascript | ||||
| qs.stringify({ a: ['b', 'c', 'd'] }); | ||||
| // 'a[0]=b&a[1]=c&a[2]=d' | ||||
| ``` | ||||
|  | ||||
| You may override this by setting the `indices` option to `false`: | ||||
|  | ||||
| ```javascript | ||||
| qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); | ||||
| // 'a=b&a=c&a=d' | ||||
| ``` | ||||
|  | ||||
| You may use the `arrayFormat` option to specify the format of the output array: | ||||
|  | ||||
| ```javascript | ||||
| qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) | ||||
| // 'a[0]=b&a[1]=c' | ||||
| qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) | ||||
| // 'a[]=b&a[]=c' | ||||
| qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) | ||||
| // 'a=b&a=c' | ||||
| ``` | ||||
|  | ||||
| When objects are stringified, by default they use bracket notation: | ||||
|  | ||||
| ```javascript | ||||
| qs.stringify({ a: { b: { c: 'd', e: 'f' } } }); | ||||
| // 'a[b][c]=d&a[b][e]=f' | ||||
| ``` | ||||
|  | ||||
| You may override this to use dot notation by setting the `allowDots` option to `true`: | ||||
|  | ||||
| ```javascript | ||||
| qs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true }); | ||||
| // 'a.b.c=d&a.b.e=f' | ||||
| ``` | ||||
|  | ||||
| Empty strings and null values will omit the value, but the equals sign (=) remains in place: | ||||
|  | ||||
| ```javascript | ||||
| assert.equal(qs.stringify({ a: '' }), 'a='); | ||||
| ``` | ||||
|  | ||||
| Key with no values (such as an empty object or array) will return nothing: | ||||
|  | ||||
| ```javascript | ||||
| assert.equal(qs.stringify({ a: [] }), ''); | ||||
| assert.equal(qs.stringify({ a: {} }), ''); | ||||
| assert.equal(qs.stringify({ a: [{}] }), ''); | ||||
| assert.equal(qs.stringify({ a: { b: []} }), ''); | ||||
| assert.equal(qs.stringify({ a: { b: {}} }), ''); | ||||
| ``` | ||||
|  | ||||
| Properties that are set to `undefined` will be omitted entirely: | ||||
|  | ||||
| ```javascript | ||||
| assert.equal(qs.stringify({ a: null, b: undefined }), 'a='); | ||||
| ``` | ||||
|  | ||||
| The query string may optionally be prepended with a question mark: | ||||
|  | ||||
| ```javascript | ||||
| assert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d'); | ||||
| ``` | ||||
|  | ||||
| The delimiter may be overridden with stringify as well: | ||||
|  | ||||
| ```javascript | ||||
| assert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); | ||||
| ``` | ||||
|  | ||||
| If you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option: | ||||
|  | ||||
| ```javascript | ||||
| var date = new Date(7); | ||||
| assert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A')); | ||||
| assert.equal( | ||||
|     qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }), | ||||
|     'a=7' | ||||
| ); | ||||
| ``` | ||||
|  | ||||
| You may use the `sort` option to affect the order of parameter keys: | ||||
|  | ||||
| ```javascript | ||||
| function alphabeticalSort(a, b) { | ||||
|     return a.localeCompare(b); | ||||
| } | ||||
| assert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y'); | ||||
| ``` | ||||
|  | ||||
| Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. | ||||
| If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you | ||||
| pass an array, it will be used to select properties and array indices for stringification: | ||||
|  | ||||
| ```javascript | ||||
| function filterFunc(prefix, value) { | ||||
|     if (prefix == 'b') { | ||||
|         // Return an `undefined` value to omit a property. | ||||
|         return; | ||||
|     } | ||||
|     if (prefix == 'e[f]') { | ||||
|         return value.getTime(); | ||||
|     } | ||||
|     if (prefix == 'e[g][0]') { | ||||
|         return value * 2; | ||||
|     } | ||||
|     return value; | ||||
| } | ||||
| qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }); | ||||
| // 'a=b&c=d&e[f]=123&e[g][0]=4' | ||||
| qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }); | ||||
| // 'a=b&e=f' | ||||
| qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }); | ||||
| // 'a[0]=b&a[2]=d' | ||||
| ``` | ||||
|  | ||||
| ### Handling of `null` values | ||||
|  | ||||
| By default, `null` values are treated like empty strings: | ||||
|  | ||||
| ```javascript | ||||
| var withNull = qs.stringify({ a: null, b: '' }); | ||||
| assert.equal(withNull, 'a=&b='); | ||||
| ``` | ||||
|  | ||||
| Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. | ||||
|  | ||||
| ```javascript | ||||
| var equalsInsensitive = qs.parse('a&b='); | ||||
| assert.deepEqual(equalsInsensitive, { a: '', b: '' }); | ||||
| ``` | ||||
|  | ||||
| To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` | ||||
| values have no `=` sign: | ||||
|  | ||||
| ```javascript | ||||
| var strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); | ||||
| assert.equal(strictNull, 'a&b='); | ||||
| ``` | ||||
|  | ||||
| To parse values without `=` back to `null` use the `strictNullHandling` flag: | ||||
|  | ||||
| ```javascript | ||||
| var parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true }); | ||||
| assert.deepEqual(parsedStrictNull, { a: null, b: '' }); | ||||
| ``` | ||||
|  | ||||
| To completely skip rendering keys with `null` values, use the `skipNulls` flag: | ||||
|  | ||||
| ```javascript | ||||
| var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true }); | ||||
| assert.equal(nullsSkipped, 'a=b'); | ||||
| ``` | ||||
|  | ||||
| ### Dealing with special character sets | ||||
|  | ||||
| By default the encoding and decoding of characters is done in `utf-8`. If you | ||||
| wish to encode querystrings to a different character set (i.e. | ||||
| [Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the | ||||
| [`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library: | ||||
|  | ||||
| ```javascript | ||||
| var encoder = require('qs-iconv/encoder')('shift_jis'); | ||||
| var shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder }); | ||||
| assert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I'); | ||||
| ``` | ||||
|  | ||||
| This also works for decoding of query strings: | ||||
|  | ||||
| ```javascript | ||||
| var decoder = require('qs-iconv/decoder')('shift_jis'); | ||||
| var obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder }); | ||||
| assert.deepEqual(obj, { a: 'こんにちは!' }); | ||||
| ``` | ||||
|  | ||||
| ### RFC 3986 and RFC 1738 space encoding | ||||
|  | ||||
| RFC3986 used as default option and encodes ' ' to *%20* which is backward compatible. | ||||
| In the same time, output can be stringified as per RFC1738 with ' ' equal to '+'. | ||||
|  | ||||
| ``` | ||||
| assert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); | ||||
| assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c'); | ||||
| assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c'); | ||||
| ``` | ||||
|  | ||||
| [1]: https://npmjs.org/package/qs | ||||
| [2]: http://versionbadg.es/ljharb/qs.svg | ||||
| [3]: https://api.travis-ci.org/ljharb/qs.svg | ||||
| [4]: https://travis-ci.org/ljharb/qs | ||||
| [5]: https://david-dm.org/ljharb/qs.svg | ||||
| [6]: https://david-dm.org/ljharb/qs | ||||
| [7]: https://david-dm.org/ljharb/qs/dev-status.svg | ||||
| [8]: https://david-dm.org/ljharb/qs?type=dev | ||||
| [9]: https://ci.testling.com/ljharb/qs.png | ||||
| [10]: https://ci.testling.com/ljharb/qs | ||||
| [11]: https://nodei.co/npm/qs.png?downloads=true&stars=true | ||||
| [license-image]: http://img.shields.io/npm/l/qs.svg | ||||
| [license-url]: LICENSE | ||||
| [downloads-image]: http://img.shields.io/npm/dm/qs.svg | ||||
| [downloads-url]: http://npm-stat.com/charts.html?package=qs | ||||
							
								
								
									
										638
									
								
								node_modules/qs/dist/qs.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										638
									
								
								node_modules/qs/dist/qs.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,638 @@ | ||||
| (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ | ||||
| 'use strict'; | ||||
|  | ||||
| var replace = String.prototype.replace; | ||||
| var percentTwenties = /%20/g; | ||||
|  | ||||
| module.exports = { | ||||
|     'default': 'RFC3986', | ||||
|     formatters: { | ||||
|         RFC1738: function (value) { | ||||
|             return replace.call(value, percentTwenties, '+'); | ||||
|         }, | ||||
|         RFC3986: function (value) { | ||||
|             return value; | ||||
|         } | ||||
|     }, | ||||
|     RFC1738: 'RFC1738', | ||||
|     RFC3986: 'RFC3986' | ||||
| }; | ||||
|  | ||||
| },{}],2:[function(require,module,exports){ | ||||
| 'use strict'; | ||||
|  | ||||
| var stringify = require('./stringify'); | ||||
| var parse = require('./parse'); | ||||
| var formats = require('./formats'); | ||||
|  | ||||
| module.exports = { | ||||
|     formats: formats, | ||||
|     parse: parse, | ||||
|     stringify: stringify | ||||
| }; | ||||
|  | ||||
| },{"./formats":1,"./parse":3,"./stringify":4}],3:[function(require,module,exports){ | ||||
| 'use strict'; | ||||
|  | ||||
| var utils = require('./utils'); | ||||
|  | ||||
| var has = Object.prototype.hasOwnProperty; | ||||
|  | ||||
| var defaults = { | ||||
|     allowDots: false, | ||||
|     allowPrototypes: false, | ||||
|     arrayLimit: 20, | ||||
|     decoder: utils.decode, | ||||
|     delimiter: '&', | ||||
|     depth: 5, | ||||
|     parameterLimit: 1000, | ||||
|     plainObjects: false, | ||||
|     strictNullHandling: false | ||||
| }; | ||||
|  | ||||
| var parseValues = function parseQueryStringValues(str, options) { | ||||
|     var obj = {}; | ||||
|     var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; | ||||
|     var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; | ||||
|     var parts = cleanStr.split(options.delimiter, limit); | ||||
|  | ||||
|     for (var i = 0; i < parts.length; ++i) { | ||||
|         var part = parts[i]; | ||||
|  | ||||
|         var bracketEqualsPos = part.indexOf(']='); | ||||
|         var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; | ||||
|  | ||||
|         var key, val; | ||||
|         if (pos === -1) { | ||||
|             key = options.decoder(part, defaults.decoder); | ||||
|             val = options.strictNullHandling ? null : ''; | ||||
|         } else { | ||||
|             key = options.decoder(part.slice(0, pos), defaults.decoder); | ||||
|             val = options.decoder(part.slice(pos + 1), defaults.decoder); | ||||
|         } | ||||
|         if (has.call(obj, key)) { | ||||
|             obj[key] = [].concat(obj[key]).concat(val); | ||||
|         } else { | ||||
|             obj[key] = val; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return obj; | ||||
| }; | ||||
|  | ||||
| var parseObject = function (chain, val, options) { | ||||
|     var leaf = val; | ||||
|  | ||||
|     for (var i = chain.length - 1; i >= 0; --i) { | ||||
|         var obj; | ||||
|         var root = chain[i]; | ||||
|  | ||||
|         if (root === '[]') { | ||||
|             obj = []; | ||||
|             obj = obj.concat(leaf); | ||||
|         } else { | ||||
|             obj = options.plainObjects ? Object.create(null) : {}; | ||||
|             var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; | ||||
|             var index = parseInt(cleanRoot, 10); | ||||
|             if ( | ||||
|                 !isNaN(index) | ||||
|                 && root !== cleanRoot | ||||
|                 && String(index) === cleanRoot | ||||
|                 && index >= 0 | ||||
|                 && (options.parseArrays && index <= options.arrayLimit) | ||||
|             ) { | ||||
|                 obj = []; | ||||
|                 obj[index] = leaf; | ||||
|             } else { | ||||
|                 obj[cleanRoot] = leaf; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         leaf = obj; | ||||
|     } | ||||
|  | ||||
|     return leaf; | ||||
| }; | ||||
|  | ||||
| var parseKeys = function parseQueryStringKeys(givenKey, val, options) { | ||||
|     if (!givenKey) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     // Transform dot notation to bracket notation | ||||
|     var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; | ||||
|  | ||||
|     // The regex chunks | ||||
|  | ||||
|     var brackets = /(\[[^[\]]*])/; | ||||
|     var child = /(\[[^[\]]*])/g; | ||||
|  | ||||
|     // Get the parent | ||||
|  | ||||
|     var segment = brackets.exec(key); | ||||
|     var parent = segment ? key.slice(0, segment.index) : key; | ||||
|  | ||||
|     // Stash the parent if it exists | ||||
|  | ||||
|     var keys = []; | ||||
|     if (parent) { | ||||
|         // If we aren't using plain objects, optionally prefix keys | ||||
|         // that would overwrite object prototype properties | ||||
|         if (!options.plainObjects && has.call(Object.prototype, parent)) { | ||||
|             if (!options.allowPrototypes) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         keys.push(parent); | ||||
|     } | ||||
|  | ||||
|     // Loop through children appending to the array until we hit depth | ||||
|  | ||||
|     var i = 0; | ||||
|     while ((segment = child.exec(key)) !== null && i < options.depth) { | ||||
|         i += 1; | ||||
|         if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { | ||||
|             if (!options.allowPrototypes) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|         keys.push(segment[1]); | ||||
|     } | ||||
|  | ||||
|     // If there's a remainder, just add whatever is left | ||||
|  | ||||
|     if (segment) { | ||||
|         keys.push('[' + key.slice(segment.index) + ']'); | ||||
|     } | ||||
|  | ||||
|     return parseObject(keys, val, options); | ||||
| }; | ||||
|  | ||||
| module.exports = function (str, opts) { | ||||
|     var options = opts ? utils.assign({}, opts) : {}; | ||||
|  | ||||
|     if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { | ||||
|         throw new TypeError('Decoder has to be a function.'); | ||||
|     } | ||||
|  | ||||
|     options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; | ||||
|     options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; | ||||
|     options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; | ||||
|     options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; | ||||
|     options.parseArrays = options.parseArrays !== false; | ||||
|     options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; | ||||
|     options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; | ||||
|     options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; | ||||
|     options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; | ||||
|     options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; | ||||
|     options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; | ||||
|  | ||||
|     if (str === '' || str === null || typeof str === 'undefined') { | ||||
|         return options.plainObjects ? Object.create(null) : {}; | ||||
|     } | ||||
|  | ||||
|     var tempObj = typeof str === 'string' ? parseValues(str, options) : str; | ||||
|     var obj = options.plainObjects ? Object.create(null) : {}; | ||||
|  | ||||
|     // Iterate over the keys and setup the new object | ||||
|  | ||||
|     var keys = Object.keys(tempObj); | ||||
|     for (var i = 0; i < keys.length; ++i) { | ||||
|         var key = keys[i]; | ||||
|         var newObj = parseKeys(key, tempObj[key], options); | ||||
|         obj = utils.merge(obj, newObj, options); | ||||
|     } | ||||
|  | ||||
|     return utils.compact(obj); | ||||
| }; | ||||
|  | ||||
| },{"./utils":5}],4:[function(require,module,exports){ | ||||
| 'use strict'; | ||||
|  | ||||
| var utils = require('./utils'); | ||||
| var formats = require('./formats'); | ||||
|  | ||||
| var arrayPrefixGenerators = { | ||||
|     brackets: function brackets(prefix) { // eslint-disable-line func-name-matching | ||||
|         return prefix + '[]'; | ||||
|     }, | ||||
|     indices: function indices(prefix, key) { // eslint-disable-line func-name-matching | ||||
|         return prefix + '[' + key + ']'; | ||||
|     }, | ||||
|     repeat: function repeat(prefix) { // eslint-disable-line func-name-matching | ||||
|         return prefix; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| var toISO = Date.prototype.toISOString; | ||||
|  | ||||
| var defaults = { | ||||
|     delimiter: '&', | ||||
|     encode: true, | ||||
|     encoder: utils.encode, | ||||
|     encodeValuesOnly: false, | ||||
|     serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching | ||||
|         return toISO.call(date); | ||||
|     }, | ||||
|     skipNulls: false, | ||||
|     strictNullHandling: false | ||||
| }; | ||||
|  | ||||
| var stringify = function stringify( // eslint-disable-line func-name-matching | ||||
|     object, | ||||
|     prefix, | ||||
|     generateArrayPrefix, | ||||
|     strictNullHandling, | ||||
|     skipNulls, | ||||
|     encoder, | ||||
|     filter, | ||||
|     sort, | ||||
|     allowDots, | ||||
|     serializeDate, | ||||
|     formatter, | ||||
|     encodeValuesOnly | ||||
| ) { | ||||
|     var obj = object; | ||||
|     if (typeof filter === 'function') { | ||||
|         obj = filter(prefix, obj); | ||||
|     } else if (obj instanceof Date) { | ||||
|         obj = serializeDate(obj); | ||||
|     } else if (obj === null) { | ||||
|         if (strictNullHandling) { | ||||
|             return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; | ||||
|         } | ||||
|  | ||||
|         obj = ''; | ||||
|     } | ||||
|  | ||||
|     if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { | ||||
|         if (encoder) { | ||||
|             var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); | ||||
|             return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))]; | ||||
|         } | ||||
|         return [formatter(prefix) + '=' + formatter(String(obj))]; | ||||
|     } | ||||
|  | ||||
|     var values = []; | ||||
|  | ||||
|     if (typeof obj === 'undefined') { | ||||
|         return values; | ||||
|     } | ||||
|  | ||||
|     var objKeys; | ||||
|     if (Array.isArray(filter)) { | ||||
|         objKeys = filter; | ||||
|     } else { | ||||
|         var keys = Object.keys(obj); | ||||
|         objKeys = sort ? keys.sort(sort) : keys; | ||||
|     } | ||||
|  | ||||
|     for (var i = 0; i < objKeys.length; ++i) { | ||||
|         var key = objKeys[i]; | ||||
|  | ||||
|         if (skipNulls && obj[key] === null) { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (Array.isArray(obj)) { | ||||
|             values = values.concat(stringify( | ||||
|                 obj[key], | ||||
|                 generateArrayPrefix(prefix, key), | ||||
|                 generateArrayPrefix, | ||||
|                 strictNullHandling, | ||||
|                 skipNulls, | ||||
|                 encoder, | ||||
|                 filter, | ||||
|                 sort, | ||||
|                 allowDots, | ||||
|                 serializeDate, | ||||
|                 formatter, | ||||
|                 encodeValuesOnly | ||||
|             )); | ||||
|         } else { | ||||
|             values = values.concat(stringify( | ||||
|                 obj[key], | ||||
|                 prefix + (allowDots ? '.' + key : '[' + key + ']'), | ||||
|                 generateArrayPrefix, | ||||
|                 strictNullHandling, | ||||
|                 skipNulls, | ||||
|                 encoder, | ||||
|                 filter, | ||||
|                 sort, | ||||
|                 allowDots, | ||||
|                 serializeDate, | ||||
|                 formatter, | ||||
|                 encodeValuesOnly | ||||
|             )); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return values; | ||||
| }; | ||||
|  | ||||
| module.exports = function (object, opts) { | ||||
|     var obj = object; | ||||
|     var options = opts ? utils.assign({}, opts) : {}; | ||||
|  | ||||
|     if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { | ||||
|         throw new TypeError('Encoder has to be a function.'); | ||||
|     } | ||||
|  | ||||
|     var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; | ||||
|     var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; | ||||
|     var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; | ||||
|     var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; | ||||
|     var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder; | ||||
|     var sort = typeof options.sort === 'function' ? options.sort : null; | ||||
|     var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; | ||||
|     var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; | ||||
|     var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly; | ||||
|     if (typeof options.format === 'undefined') { | ||||
|         options.format = formats['default']; | ||||
|     } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { | ||||
|         throw new TypeError('Unknown format option provided.'); | ||||
|     } | ||||
|     var formatter = formats.formatters[options.format]; | ||||
|     var objKeys; | ||||
|     var filter; | ||||
|  | ||||
|     if (typeof options.filter === 'function') { | ||||
|         filter = options.filter; | ||||
|         obj = filter('', obj); | ||||
|     } else if (Array.isArray(options.filter)) { | ||||
|         filter = options.filter; | ||||
|         objKeys = filter; | ||||
|     } | ||||
|  | ||||
|     var keys = []; | ||||
|  | ||||
|     if (typeof obj !== 'object' || obj === null) { | ||||
|         return ''; | ||||
|     } | ||||
|  | ||||
|     var arrayFormat; | ||||
|     if (options.arrayFormat in arrayPrefixGenerators) { | ||||
|         arrayFormat = options.arrayFormat; | ||||
|     } else if ('indices' in options) { | ||||
|         arrayFormat = options.indices ? 'indices' : 'repeat'; | ||||
|     } else { | ||||
|         arrayFormat = 'indices'; | ||||
|     } | ||||
|  | ||||
|     var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; | ||||
|  | ||||
|     if (!objKeys) { | ||||
|         objKeys = Object.keys(obj); | ||||
|     } | ||||
|  | ||||
|     if (sort) { | ||||
|         objKeys.sort(sort); | ||||
|     } | ||||
|  | ||||
|     for (var i = 0; i < objKeys.length; ++i) { | ||||
|         var key = objKeys[i]; | ||||
|  | ||||
|         if (skipNulls && obj[key] === null) { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         keys = keys.concat(stringify( | ||||
|             obj[key], | ||||
|             key, | ||||
|             generateArrayPrefix, | ||||
|             strictNullHandling, | ||||
|             skipNulls, | ||||
|             encode ? encoder : null, | ||||
|             filter, | ||||
|             sort, | ||||
|             allowDots, | ||||
|             serializeDate, | ||||
|             formatter, | ||||
|             encodeValuesOnly | ||||
|         )); | ||||
|     } | ||||
|  | ||||
|     var joined = keys.join(delimiter); | ||||
|     var prefix = options.addQueryPrefix === true ? '?' : ''; | ||||
|  | ||||
|     return joined.length > 0 ? prefix + joined : ''; | ||||
| }; | ||||
|  | ||||
| },{"./formats":1,"./utils":5}],5:[function(require,module,exports){ | ||||
| 'use strict'; | ||||
|  | ||||
| var has = Object.prototype.hasOwnProperty; | ||||
|  | ||||
| var hexTable = (function () { | ||||
|     var array = []; | ||||
|     for (var i = 0; i < 256; ++i) { | ||||
|         array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); | ||||
|     } | ||||
|  | ||||
|     return array; | ||||
| }()); | ||||
|  | ||||
| var compactQueue = function compactQueue(queue) { | ||||
|     var obj; | ||||
|  | ||||
|     while (queue.length) { | ||||
|         var item = queue.pop(); | ||||
|         obj = item.obj[item.prop]; | ||||
|  | ||||
|         if (Array.isArray(obj)) { | ||||
|             var compacted = []; | ||||
|  | ||||
|             for (var j = 0; j < obj.length; ++j) { | ||||
|                 if (typeof obj[j] !== 'undefined') { | ||||
|                     compacted.push(obj[j]); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             item.obj[item.prop] = compacted; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return obj; | ||||
| }; | ||||
|  | ||||
| var arrayToObject = function arrayToObject(source, options) { | ||||
|     var obj = options && options.plainObjects ? Object.create(null) : {}; | ||||
|     for (var i = 0; i < source.length; ++i) { | ||||
|         if (typeof source[i] !== 'undefined') { | ||||
|             obj[i] = source[i]; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return obj; | ||||
| }; | ||||
|  | ||||
| var merge = function merge(target, source, options) { | ||||
|     if (!source) { | ||||
|         return target; | ||||
|     } | ||||
|  | ||||
|     if (typeof source !== 'object') { | ||||
|         if (Array.isArray(target)) { | ||||
|             target.push(source); | ||||
|         } else if (typeof target === 'object') { | ||||
|             if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) { | ||||
|                 target[source] = true; | ||||
|             } | ||||
|         } else { | ||||
|             return [target, source]; | ||||
|         } | ||||
|  | ||||
|         return target; | ||||
|     } | ||||
|  | ||||
|     if (typeof target !== 'object') { | ||||
|         return [target].concat(source); | ||||
|     } | ||||
|  | ||||
|     var mergeTarget = target; | ||||
|     if (Array.isArray(target) && !Array.isArray(source)) { | ||||
|         mergeTarget = arrayToObject(target, options); | ||||
|     } | ||||
|  | ||||
|     if (Array.isArray(target) && Array.isArray(source)) { | ||||
|         source.forEach(function (item, i) { | ||||
|             if (has.call(target, i)) { | ||||
|                 if (target[i] && typeof target[i] === 'object') { | ||||
|                     target[i] = merge(target[i], item, options); | ||||
|                 } else { | ||||
|                     target.push(item); | ||||
|                 } | ||||
|             } else { | ||||
|                 target[i] = item; | ||||
|             } | ||||
|         }); | ||||
|         return target; | ||||
|     } | ||||
|  | ||||
|     return Object.keys(source).reduce(function (acc, key) { | ||||
|         var value = source[key]; | ||||
|  | ||||
|         if (has.call(acc, key)) { | ||||
|             acc[key] = merge(acc[key], value, options); | ||||
|         } else { | ||||
|             acc[key] = value; | ||||
|         } | ||||
|         return acc; | ||||
|     }, mergeTarget); | ||||
| }; | ||||
|  | ||||
| var assign = function assignSingleSource(target, source) { | ||||
|     return Object.keys(source).reduce(function (acc, key) { | ||||
|         acc[key] = source[key]; | ||||
|         return acc; | ||||
|     }, target); | ||||
| }; | ||||
|  | ||||
| var decode = function (str) { | ||||
|     try { | ||||
|         return decodeURIComponent(str.replace(/\+/g, ' ')); | ||||
|     } catch (e) { | ||||
|         return str; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| var encode = function encode(str) { | ||||
|     // This code was originally written by Brian White (mscdex) for the io.js core querystring library. | ||||
|     // It has been adapted here for stricter adherence to RFC 3986 | ||||
|     if (str.length === 0) { | ||||
|         return str; | ||||
|     } | ||||
|  | ||||
|     var string = typeof str === 'string' ? str : String(str); | ||||
|  | ||||
|     var out = ''; | ||||
|     for (var i = 0; i < string.length; ++i) { | ||||
|         var c = string.charCodeAt(i); | ||||
|  | ||||
|         if ( | ||||
|             c === 0x2D // - | ||||
|             || c === 0x2E // . | ||||
|             || c === 0x5F // _ | ||||
|             || c === 0x7E // ~ | ||||
|             || (c >= 0x30 && c <= 0x39) // 0-9 | ||||
|             || (c >= 0x41 && c <= 0x5A) // a-z | ||||
|             || (c >= 0x61 && c <= 0x7A) // A-Z | ||||
|         ) { | ||||
|             out += string.charAt(i); | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (c < 0x80) { | ||||
|             out = out + hexTable[c]; | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (c < 0x800) { | ||||
|             out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (c < 0xD800 || c >= 0xE000) { | ||||
|             out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         i += 1; | ||||
|         c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); | ||||
|         out += hexTable[0xF0 | (c >> 18)] | ||||
|             + hexTable[0x80 | ((c >> 12) & 0x3F)] | ||||
|             + hexTable[0x80 | ((c >> 6) & 0x3F)] | ||||
|             + hexTable[0x80 | (c & 0x3F)]; | ||||
|     } | ||||
|  | ||||
|     return out; | ||||
| }; | ||||
|  | ||||
| var compact = function compact(value) { | ||||
|     var queue = [{ obj: { o: value }, prop: 'o' }]; | ||||
|     var refs = []; | ||||
|  | ||||
|     for (var i = 0; i < queue.length; ++i) { | ||||
|         var item = queue[i]; | ||||
|         var obj = item.obj[item.prop]; | ||||
|  | ||||
|         var keys = Object.keys(obj); | ||||
|         for (var j = 0; j < keys.length; ++j) { | ||||
|             var key = keys[j]; | ||||
|             var val = obj[key]; | ||||
|             if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { | ||||
|                 queue.push({ obj: obj, prop: key }); | ||||
|                 refs.push(val); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return compactQueue(queue); | ||||
| }; | ||||
|  | ||||
| var isRegExp = function isRegExp(obj) { | ||||
|     return Object.prototype.toString.call(obj) === '[object RegExp]'; | ||||
| }; | ||||
|  | ||||
| var isBuffer = function isBuffer(obj) { | ||||
|     if (obj === null || typeof obj === 'undefined') { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); | ||||
| }; | ||||
|  | ||||
| module.exports = { | ||||
|     arrayToObject: arrayToObject, | ||||
|     assign: assign, | ||||
|     compact: compact, | ||||
|     decode: decode, | ||||
|     encode: encode, | ||||
|     isBuffer: isBuffer, | ||||
|     isRegExp: isRegExp, | ||||
|     merge: merge | ||||
| }; | ||||
|  | ||||
| },{}]},{},[2])(2) | ||||
| }); | ||||
							
								
								
									
										18
									
								
								node_modules/qs/lib/formats.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								node_modules/qs/lib/formats.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var replace = String.prototype.replace; | ||||
| var percentTwenties = /%20/g; | ||||
|  | ||||
| module.exports = { | ||||
|     'default': 'RFC3986', | ||||
|     formatters: { | ||||
|         RFC1738: function (value) { | ||||
|             return replace.call(value, percentTwenties, '+'); | ||||
|         }, | ||||
|         RFC3986: function (value) { | ||||
|             return value; | ||||
|         } | ||||
|     }, | ||||
|     RFC1738: 'RFC1738', | ||||
|     RFC3986: 'RFC3986' | ||||
| }; | ||||
							
								
								
									
										11
									
								
								node_modules/qs/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								node_modules/qs/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var stringify = require('./stringify'); | ||||
| var parse = require('./parse'); | ||||
| var formats = require('./formats'); | ||||
|  | ||||
| module.exports = { | ||||
|     formats: formats, | ||||
|     parse: parse, | ||||
|     stringify: stringify | ||||
| }; | ||||
							
								
								
									
										174
									
								
								node_modules/qs/lib/parse.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								node_modules/qs/lib/parse.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,174 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var utils = require('./utils'); | ||||
|  | ||||
| var has = Object.prototype.hasOwnProperty; | ||||
|  | ||||
| var defaults = { | ||||
|     allowDots: false, | ||||
|     allowPrototypes: false, | ||||
|     arrayLimit: 20, | ||||
|     decoder: utils.decode, | ||||
|     delimiter: '&', | ||||
|     depth: 5, | ||||
|     parameterLimit: 1000, | ||||
|     plainObjects: false, | ||||
|     strictNullHandling: false | ||||
| }; | ||||
|  | ||||
| var parseValues = function parseQueryStringValues(str, options) { | ||||
|     var obj = {}; | ||||
|     var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; | ||||
|     var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; | ||||
|     var parts = cleanStr.split(options.delimiter, limit); | ||||
|  | ||||
|     for (var i = 0; i < parts.length; ++i) { | ||||
|         var part = parts[i]; | ||||
|  | ||||
|         var bracketEqualsPos = part.indexOf(']='); | ||||
|         var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; | ||||
|  | ||||
|         var key, val; | ||||
|         if (pos === -1) { | ||||
|             key = options.decoder(part, defaults.decoder); | ||||
|             val = options.strictNullHandling ? null : ''; | ||||
|         } else { | ||||
|             key = options.decoder(part.slice(0, pos), defaults.decoder); | ||||
|             val = options.decoder(part.slice(pos + 1), defaults.decoder); | ||||
|         } | ||||
|         if (has.call(obj, key)) { | ||||
|             obj[key] = [].concat(obj[key]).concat(val); | ||||
|         } else { | ||||
|             obj[key] = val; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return obj; | ||||
| }; | ||||
|  | ||||
| var parseObject = function (chain, val, options) { | ||||
|     var leaf = val; | ||||
|  | ||||
|     for (var i = chain.length - 1; i >= 0; --i) { | ||||
|         var obj; | ||||
|         var root = chain[i]; | ||||
|  | ||||
|         if (root === '[]') { | ||||
|             obj = []; | ||||
|             obj = obj.concat(leaf); | ||||
|         } else { | ||||
|             obj = options.plainObjects ? Object.create(null) : {}; | ||||
|             var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; | ||||
|             var index = parseInt(cleanRoot, 10); | ||||
|             if ( | ||||
|                 !isNaN(index) | ||||
|                 && root !== cleanRoot | ||||
|                 && String(index) === cleanRoot | ||||
|                 && index >= 0 | ||||
|                 && (options.parseArrays && index <= options.arrayLimit) | ||||
|             ) { | ||||
|                 obj = []; | ||||
|                 obj[index] = leaf; | ||||
|             } else { | ||||
|                 obj[cleanRoot] = leaf; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         leaf = obj; | ||||
|     } | ||||
|  | ||||
|     return leaf; | ||||
| }; | ||||
|  | ||||
| var parseKeys = function parseQueryStringKeys(givenKey, val, options) { | ||||
|     if (!givenKey) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     // Transform dot notation to bracket notation | ||||
|     var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; | ||||
|  | ||||
|     // The regex chunks | ||||
|  | ||||
|     var brackets = /(\[[^[\]]*])/; | ||||
|     var child = /(\[[^[\]]*])/g; | ||||
|  | ||||
|     // Get the parent | ||||
|  | ||||
|     var segment = brackets.exec(key); | ||||
|     var parent = segment ? key.slice(0, segment.index) : key; | ||||
|  | ||||
|     // Stash the parent if it exists | ||||
|  | ||||
|     var keys = []; | ||||
|     if (parent) { | ||||
|         // If we aren't using plain objects, optionally prefix keys | ||||
|         // that would overwrite object prototype properties | ||||
|         if (!options.plainObjects && has.call(Object.prototype, parent)) { | ||||
|             if (!options.allowPrototypes) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         keys.push(parent); | ||||
|     } | ||||
|  | ||||
|     // Loop through children appending to the array until we hit depth | ||||
|  | ||||
|     var i = 0; | ||||
|     while ((segment = child.exec(key)) !== null && i < options.depth) { | ||||
|         i += 1; | ||||
|         if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { | ||||
|             if (!options.allowPrototypes) { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|         keys.push(segment[1]); | ||||
|     } | ||||
|  | ||||
|     // If there's a remainder, just add whatever is left | ||||
|  | ||||
|     if (segment) { | ||||
|         keys.push('[' + key.slice(segment.index) + ']'); | ||||
|     } | ||||
|  | ||||
|     return parseObject(keys, val, options); | ||||
| }; | ||||
|  | ||||
| module.exports = function (str, opts) { | ||||
|     var options = opts ? utils.assign({}, opts) : {}; | ||||
|  | ||||
|     if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { | ||||
|         throw new TypeError('Decoder has to be a function.'); | ||||
|     } | ||||
|  | ||||
|     options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; | ||||
|     options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; | ||||
|     options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; | ||||
|     options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; | ||||
|     options.parseArrays = options.parseArrays !== false; | ||||
|     options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; | ||||
|     options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; | ||||
|     options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; | ||||
|     options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; | ||||
|     options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; | ||||
|     options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; | ||||
|  | ||||
|     if (str === '' || str === null || typeof str === 'undefined') { | ||||
|         return options.plainObjects ? Object.create(null) : {}; | ||||
|     } | ||||
|  | ||||
|     var tempObj = typeof str === 'string' ? parseValues(str, options) : str; | ||||
|     var obj = options.plainObjects ? Object.create(null) : {}; | ||||
|  | ||||
|     // Iterate over the keys and setup the new object | ||||
|  | ||||
|     var keys = Object.keys(tempObj); | ||||
|     for (var i = 0; i < keys.length; ++i) { | ||||
|         var key = keys[i]; | ||||
|         var newObj = parseKeys(key, tempObj[key], options); | ||||
|         obj = utils.merge(obj, newObj, options); | ||||
|     } | ||||
|  | ||||
|     return utils.compact(obj); | ||||
| }; | ||||
							
								
								
									
										210
									
								
								node_modules/qs/lib/stringify.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								node_modules/qs/lib/stringify.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,210 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var utils = require('./utils'); | ||||
| var formats = require('./formats'); | ||||
|  | ||||
| var arrayPrefixGenerators = { | ||||
|     brackets: function brackets(prefix) { // eslint-disable-line func-name-matching | ||||
|         return prefix + '[]'; | ||||
|     }, | ||||
|     indices: function indices(prefix, key) { // eslint-disable-line func-name-matching | ||||
|         return prefix + '[' + key + ']'; | ||||
|     }, | ||||
|     repeat: function repeat(prefix) { // eslint-disable-line func-name-matching | ||||
|         return prefix; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| var toISO = Date.prototype.toISOString; | ||||
|  | ||||
| var defaults = { | ||||
|     delimiter: '&', | ||||
|     encode: true, | ||||
|     encoder: utils.encode, | ||||
|     encodeValuesOnly: false, | ||||
|     serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching | ||||
|         return toISO.call(date); | ||||
|     }, | ||||
|     skipNulls: false, | ||||
|     strictNullHandling: false | ||||
| }; | ||||
|  | ||||
| var stringify = function stringify( // eslint-disable-line func-name-matching | ||||
|     object, | ||||
|     prefix, | ||||
|     generateArrayPrefix, | ||||
|     strictNullHandling, | ||||
|     skipNulls, | ||||
|     encoder, | ||||
|     filter, | ||||
|     sort, | ||||
|     allowDots, | ||||
|     serializeDate, | ||||
|     formatter, | ||||
|     encodeValuesOnly | ||||
| ) { | ||||
|     var obj = object; | ||||
|     if (typeof filter === 'function') { | ||||
|         obj = filter(prefix, obj); | ||||
|     } else if (obj instanceof Date) { | ||||
|         obj = serializeDate(obj); | ||||
|     } else if (obj === null) { | ||||
|         if (strictNullHandling) { | ||||
|             return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; | ||||
|         } | ||||
|  | ||||
|         obj = ''; | ||||
|     } | ||||
|  | ||||
|     if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { | ||||
|         if (encoder) { | ||||
|             var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); | ||||
|             return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))]; | ||||
|         } | ||||
|         return [formatter(prefix) + '=' + formatter(String(obj))]; | ||||
|     } | ||||
|  | ||||
|     var values = []; | ||||
|  | ||||
|     if (typeof obj === 'undefined') { | ||||
|         return values; | ||||
|     } | ||||
|  | ||||
|     var objKeys; | ||||
|     if (Array.isArray(filter)) { | ||||
|         objKeys = filter; | ||||
|     } else { | ||||
|         var keys = Object.keys(obj); | ||||
|         objKeys = sort ? keys.sort(sort) : keys; | ||||
|     } | ||||
|  | ||||
|     for (var i = 0; i < objKeys.length; ++i) { | ||||
|         var key = objKeys[i]; | ||||
|  | ||||
|         if (skipNulls && obj[key] === null) { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (Array.isArray(obj)) { | ||||
|             values = values.concat(stringify( | ||||
|                 obj[key], | ||||
|                 generateArrayPrefix(prefix, key), | ||||
|                 generateArrayPrefix, | ||||
|                 strictNullHandling, | ||||
|                 skipNulls, | ||||
|                 encoder, | ||||
|                 filter, | ||||
|                 sort, | ||||
|                 allowDots, | ||||
|                 serializeDate, | ||||
|                 formatter, | ||||
|                 encodeValuesOnly | ||||
|             )); | ||||
|         } else { | ||||
|             values = values.concat(stringify( | ||||
|                 obj[key], | ||||
|                 prefix + (allowDots ? '.' + key : '[' + key + ']'), | ||||
|                 generateArrayPrefix, | ||||
|                 strictNullHandling, | ||||
|                 skipNulls, | ||||
|                 encoder, | ||||
|                 filter, | ||||
|                 sort, | ||||
|                 allowDots, | ||||
|                 serializeDate, | ||||
|                 formatter, | ||||
|                 encodeValuesOnly | ||||
|             )); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return values; | ||||
| }; | ||||
|  | ||||
| module.exports = function (object, opts) { | ||||
|     var obj = object; | ||||
|     var options = opts ? utils.assign({}, opts) : {}; | ||||
|  | ||||
|     if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { | ||||
|         throw new TypeError('Encoder has to be a function.'); | ||||
|     } | ||||
|  | ||||
|     var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; | ||||
|     var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; | ||||
|     var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; | ||||
|     var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; | ||||
|     var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder; | ||||
|     var sort = typeof options.sort === 'function' ? options.sort : null; | ||||
|     var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; | ||||
|     var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; | ||||
|     var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly; | ||||
|     if (typeof options.format === 'undefined') { | ||||
|         options.format = formats['default']; | ||||
|     } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { | ||||
|         throw new TypeError('Unknown format option provided.'); | ||||
|     } | ||||
|     var formatter = formats.formatters[options.format]; | ||||
|     var objKeys; | ||||
|     var filter; | ||||
|  | ||||
|     if (typeof options.filter === 'function') { | ||||
|         filter = options.filter; | ||||
|         obj = filter('', obj); | ||||
|     } else if (Array.isArray(options.filter)) { | ||||
|         filter = options.filter; | ||||
|         objKeys = filter; | ||||
|     } | ||||
|  | ||||
|     var keys = []; | ||||
|  | ||||
|     if (typeof obj !== 'object' || obj === null) { | ||||
|         return ''; | ||||
|     } | ||||
|  | ||||
|     var arrayFormat; | ||||
|     if (options.arrayFormat in arrayPrefixGenerators) { | ||||
|         arrayFormat = options.arrayFormat; | ||||
|     } else if ('indices' in options) { | ||||
|         arrayFormat = options.indices ? 'indices' : 'repeat'; | ||||
|     } else { | ||||
|         arrayFormat = 'indices'; | ||||
|     } | ||||
|  | ||||
|     var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; | ||||
|  | ||||
|     if (!objKeys) { | ||||
|         objKeys = Object.keys(obj); | ||||
|     } | ||||
|  | ||||
|     if (sort) { | ||||
|         objKeys.sort(sort); | ||||
|     } | ||||
|  | ||||
|     for (var i = 0; i < objKeys.length; ++i) { | ||||
|         var key = objKeys[i]; | ||||
|  | ||||
|         if (skipNulls && obj[key] === null) { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         keys = keys.concat(stringify( | ||||
|             obj[key], | ||||
|             key, | ||||
|             generateArrayPrefix, | ||||
|             strictNullHandling, | ||||
|             skipNulls, | ||||
|             encode ? encoder : null, | ||||
|             filter, | ||||
|             sort, | ||||
|             allowDots, | ||||
|             serializeDate, | ||||
|             formatter, | ||||
|             encodeValuesOnly | ||||
|         )); | ||||
|     } | ||||
|  | ||||
|     var joined = keys.join(delimiter); | ||||
|     var prefix = options.addQueryPrefix === true ? '?' : ''; | ||||
|  | ||||
|     return joined.length > 0 ? prefix + joined : ''; | ||||
| }; | ||||
							
								
								
									
										213
									
								
								node_modules/qs/lib/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								node_modules/qs/lib/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,213 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var has = Object.prototype.hasOwnProperty; | ||||
|  | ||||
| var hexTable = (function () { | ||||
|     var array = []; | ||||
|     for (var i = 0; i < 256; ++i) { | ||||
|         array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); | ||||
|     } | ||||
|  | ||||
|     return array; | ||||
| }()); | ||||
|  | ||||
| var compactQueue = function compactQueue(queue) { | ||||
|     var obj; | ||||
|  | ||||
|     while (queue.length) { | ||||
|         var item = queue.pop(); | ||||
|         obj = item.obj[item.prop]; | ||||
|  | ||||
|         if (Array.isArray(obj)) { | ||||
|             var compacted = []; | ||||
|  | ||||
|             for (var j = 0; j < obj.length; ++j) { | ||||
|                 if (typeof obj[j] !== 'undefined') { | ||||
|                     compacted.push(obj[j]); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             item.obj[item.prop] = compacted; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return obj; | ||||
| }; | ||||
|  | ||||
| var arrayToObject = function arrayToObject(source, options) { | ||||
|     var obj = options && options.plainObjects ? Object.create(null) : {}; | ||||
|     for (var i = 0; i < source.length; ++i) { | ||||
|         if (typeof source[i] !== 'undefined') { | ||||
|             obj[i] = source[i]; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return obj; | ||||
| }; | ||||
|  | ||||
| var merge = function merge(target, source, options) { | ||||
|     if (!source) { | ||||
|         return target; | ||||
|     } | ||||
|  | ||||
|     if (typeof source !== 'object') { | ||||
|         if (Array.isArray(target)) { | ||||
|             target.push(source); | ||||
|         } else if (typeof target === 'object') { | ||||
|             if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) { | ||||
|                 target[source] = true; | ||||
|             } | ||||
|         } else { | ||||
|             return [target, source]; | ||||
|         } | ||||
|  | ||||
|         return target; | ||||
|     } | ||||
|  | ||||
|     if (typeof target !== 'object') { | ||||
|         return [target].concat(source); | ||||
|     } | ||||
|  | ||||
|     var mergeTarget = target; | ||||
|     if (Array.isArray(target) && !Array.isArray(source)) { | ||||
|         mergeTarget = arrayToObject(target, options); | ||||
|     } | ||||
|  | ||||
|     if (Array.isArray(target) && Array.isArray(source)) { | ||||
|         source.forEach(function (item, i) { | ||||
|             if (has.call(target, i)) { | ||||
|                 if (target[i] && typeof target[i] === 'object') { | ||||
|                     target[i] = merge(target[i], item, options); | ||||
|                 } else { | ||||
|                     target.push(item); | ||||
|                 } | ||||
|             } else { | ||||
|                 target[i] = item; | ||||
|             } | ||||
|         }); | ||||
|         return target; | ||||
|     } | ||||
|  | ||||
|     return Object.keys(source).reduce(function (acc, key) { | ||||
|         var value = source[key]; | ||||
|  | ||||
|         if (has.call(acc, key)) { | ||||
|             acc[key] = merge(acc[key], value, options); | ||||
|         } else { | ||||
|             acc[key] = value; | ||||
|         } | ||||
|         return acc; | ||||
|     }, mergeTarget); | ||||
| }; | ||||
|  | ||||
| var assign = function assignSingleSource(target, source) { | ||||
|     return Object.keys(source).reduce(function (acc, key) { | ||||
|         acc[key] = source[key]; | ||||
|         return acc; | ||||
|     }, target); | ||||
| }; | ||||
|  | ||||
| var decode = function (str) { | ||||
|     try { | ||||
|         return decodeURIComponent(str.replace(/\+/g, ' ')); | ||||
|     } catch (e) { | ||||
|         return str; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| var encode = function encode(str) { | ||||
|     // This code was originally written by Brian White (mscdex) for the io.js core querystring library. | ||||
|     // It has been adapted here for stricter adherence to RFC 3986 | ||||
|     if (str.length === 0) { | ||||
|         return str; | ||||
|     } | ||||
|  | ||||
|     var string = typeof str === 'string' ? str : String(str); | ||||
|  | ||||
|     var out = ''; | ||||
|     for (var i = 0; i < string.length; ++i) { | ||||
|         var c = string.charCodeAt(i); | ||||
|  | ||||
|         if ( | ||||
|             c === 0x2D // - | ||||
|             || c === 0x2E // . | ||||
|             || c === 0x5F // _ | ||||
|             || c === 0x7E // ~ | ||||
|             || (c >= 0x30 && c <= 0x39) // 0-9 | ||||
|             || (c >= 0x41 && c <= 0x5A) // a-z | ||||
|             || (c >= 0x61 && c <= 0x7A) // A-Z | ||||
|         ) { | ||||
|             out += string.charAt(i); | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (c < 0x80) { | ||||
|             out = out + hexTable[c]; | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (c < 0x800) { | ||||
|             out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (c < 0xD800 || c >= 0xE000) { | ||||
|             out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         i += 1; | ||||
|         c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); | ||||
|         out += hexTable[0xF0 | (c >> 18)] | ||||
|             + hexTable[0x80 | ((c >> 12) & 0x3F)] | ||||
|             + hexTable[0x80 | ((c >> 6) & 0x3F)] | ||||
|             + hexTable[0x80 | (c & 0x3F)]; | ||||
|     } | ||||
|  | ||||
|     return out; | ||||
| }; | ||||
|  | ||||
| var compact = function compact(value) { | ||||
|     var queue = [{ obj: { o: value }, prop: 'o' }]; | ||||
|     var refs = []; | ||||
|  | ||||
|     for (var i = 0; i < queue.length; ++i) { | ||||
|         var item = queue[i]; | ||||
|         var obj = item.obj[item.prop]; | ||||
|  | ||||
|         var keys = Object.keys(obj); | ||||
|         for (var j = 0; j < keys.length; ++j) { | ||||
|             var key = keys[j]; | ||||
|             var val = obj[key]; | ||||
|             if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { | ||||
|                 queue.push({ obj: obj, prop: key }); | ||||
|                 refs.push(val); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return compactQueue(queue); | ||||
| }; | ||||
|  | ||||
| var isRegExp = function isRegExp(obj) { | ||||
|     return Object.prototype.toString.call(obj) === '[object RegExp]'; | ||||
| }; | ||||
|  | ||||
| var isBuffer = function isBuffer(obj) { | ||||
|     if (obj === null || typeof obj === 'undefined') { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); | ||||
| }; | ||||
|  | ||||
| module.exports = { | ||||
|     arrayToObject: arrayToObject, | ||||
|     assign: assign, | ||||
|     compact: compact, | ||||
|     decode: decode, | ||||
|     encode: encode, | ||||
|     isBuffer: isBuffer, | ||||
|     isRegExp: isRegExp, | ||||
|     merge: merge | ||||
| }; | ||||
							
								
								
									
										84
									
								
								node_modules/qs/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								node_modules/qs/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,84 @@ | ||||
| { | ||||
|   "_args": [ | ||||
|     [ | ||||
|       "qs@6.5.2", | ||||
|       "E:\\python\\setup-php" | ||||
|     ] | ||||
|   ], | ||||
|   "_development": true, | ||||
|   "_from": "qs@6.5.2", | ||||
|   "_id": "qs@6.5.2", | ||||
|   "_inBundle": false, | ||||
|   "_integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", | ||||
|   "_location": "/qs", | ||||
|   "_phantomChildren": {}, | ||||
|   "_requested": { | ||||
|     "type": "version", | ||||
|     "registry": true, | ||||
|     "raw": "qs@6.5.2", | ||||
|     "name": "qs", | ||||
|     "escapedName": "qs", | ||||
|     "rawSpec": "6.5.2", | ||||
|     "saveSpec": null, | ||||
|     "fetchSpec": "6.5.2" | ||||
|   }, | ||||
|   "_requiredBy": [ | ||||
|     "/request" | ||||
|   ], | ||||
|   "_resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", | ||||
|   "_spec": "6.5.2", | ||||
|   "_where": "E:\\python\\setup-php", | ||||
|   "bugs": { | ||||
|     "url": "https://github.com/ljharb/qs/issues" | ||||
|   }, | ||||
|   "contributors": [ | ||||
|     { | ||||
|       "name": "Jordan Harband", | ||||
|       "email": "ljharb@gmail.com", | ||||
|       "url": "http://ljharb.codes" | ||||
|     } | ||||
|   ], | ||||
|   "dependencies": {}, | ||||
|   "description": "A querystring parser that supports nesting and arrays, with a depth limit", | ||||
|   "devDependencies": { | ||||
|     "@ljharb/eslint-config": "^12.2.1", | ||||
|     "browserify": "^16.2.0", | ||||
|     "covert": "^1.1.0", | ||||
|     "editorconfig-tools": "^0.1.1", | ||||
|     "eslint": "^4.19.1", | ||||
|     "evalmd": "^0.0.17", | ||||
|     "iconv-lite": "^0.4.21", | ||||
|     "mkdirp": "^0.5.1", | ||||
|     "qs-iconv": "^1.0.4", | ||||
|     "safe-publish-latest": "^1.1.1", | ||||
|     "safer-buffer": "^2.1.2", | ||||
|     "tape": "^4.9.0" | ||||
|   }, | ||||
|   "engines": { | ||||
|     "node": ">=0.6" | ||||
|   }, | ||||
|   "homepage": "https://github.com/ljharb/qs", | ||||
|   "keywords": [ | ||||
|     "querystring", | ||||
|     "qs" | ||||
|   ], | ||||
|   "license": "BSD-3-Clause", | ||||
|   "main": "lib/index.js", | ||||
|   "name": "qs", | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git+https://github.com/ljharb/qs.git" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "coverage": "covert test", | ||||
|     "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js", | ||||
|     "lint": "eslint lib/*.js test/*.js", | ||||
|     "prelint": "editorconfig-tools check * lib/* test/*", | ||||
|     "prepublish": "safe-publish-latest && npm run dist", | ||||
|     "pretest": "npm run --silent readme && npm run --silent lint", | ||||
|     "readme": "evalmd README.md", | ||||
|     "test": "npm run --silent coverage", | ||||
|     "tests-only": "node test" | ||||
|   }, | ||||
|   "version": "6.5.2" | ||||
| } | ||||
							
								
								
									
										15
									
								
								node_modules/qs/test/.eslintrc
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								node_modules/qs/test/.eslintrc
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| { | ||||
|     "rules": { | ||||
| 		"array-bracket-newline": 0, | ||||
| 		"array-element-newline": 0, | ||||
| 		"consistent-return": 2, | ||||
|         "max-lines": 0, | ||||
|         "max-nested-callbacks": [2, 3], | ||||
|         "max-statements": 0, | ||||
| 		"no-buffer-constructor": 0, | ||||
|         "no-extend-native": 0, | ||||
|         "no-magic-numbers": 0, | ||||
| 		"object-curly-newline": 0, | ||||
|         "sort-keys": 0 | ||||
|     } | ||||
| } | ||||
							
								
								
									
										7
									
								
								node_modules/qs/test/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								node_modules/qs/test/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| require('./parse'); | ||||
|  | ||||
| require('./stringify'); | ||||
|  | ||||
| require('./utils'); | ||||
							
								
								
									
										574
									
								
								node_modules/qs/test/parse.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										574
									
								
								node_modules/qs/test/parse.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,574 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var test = require('tape'); | ||||
| var qs = require('../'); | ||||
| var utils = require('../lib/utils'); | ||||
| var iconv = require('iconv-lite'); | ||||
| var SaferBuffer = require('safer-buffer').Buffer; | ||||
|  | ||||
| test('parse()', function (t) { | ||||
|     t.test('parses a simple string', function (st) { | ||||
|         st.deepEqual(qs.parse('0=foo'), { 0: 'foo' }); | ||||
|         st.deepEqual(qs.parse('foo=c++'), { foo: 'c  ' }); | ||||
|         st.deepEqual(qs.parse('a[>=]=23'), { a: { '>=': '23' } }); | ||||
|         st.deepEqual(qs.parse('a[<=>]==23'), { a: { '<=>': '=23' } }); | ||||
|         st.deepEqual(qs.parse('a[==]=23'), { a: { '==': '23' } }); | ||||
|         st.deepEqual(qs.parse('foo', { strictNullHandling: true }), { foo: null }); | ||||
|         st.deepEqual(qs.parse('foo'), { foo: '' }); | ||||
|         st.deepEqual(qs.parse('foo='), { foo: '' }); | ||||
|         st.deepEqual(qs.parse('foo=bar'), { foo: 'bar' }); | ||||
|         st.deepEqual(qs.parse(' foo = bar = baz '), { ' foo ': ' bar = baz ' }); | ||||
|         st.deepEqual(qs.parse('foo=bar=baz'), { foo: 'bar=baz' }); | ||||
|         st.deepEqual(qs.parse('foo=bar&bar=baz'), { foo: 'bar', bar: 'baz' }); | ||||
|         st.deepEqual(qs.parse('foo2=bar2&baz2='), { foo2: 'bar2', baz2: '' }); | ||||
|         st.deepEqual(qs.parse('foo=bar&baz', { strictNullHandling: true }), { foo: 'bar', baz: null }); | ||||
|         st.deepEqual(qs.parse('foo=bar&baz'), { foo: 'bar', baz: '' }); | ||||
|         st.deepEqual(qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World'), { | ||||
|             cht: 'p3', | ||||
|             chd: 't:60,40', | ||||
|             chs: '250x100', | ||||
|             chl: 'Hello|World' | ||||
|         }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows enabling dot notation', function (st) { | ||||
|         st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' }); | ||||
|         st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.deepEqual(qs.parse('a[b]=c'), { a: { b: 'c' } }, 'parses a single nested string'); | ||||
|     t.deepEqual(qs.parse('a[b][c]=d'), { a: { b: { c: 'd' } } }, 'parses a double nested string'); | ||||
|     t.deepEqual( | ||||
|         qs.parse('a[b][c][d][e][f][g][h]=i'), | ||||
|         { a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }, | ||||
|         'defaults to a depth of 5' | ||||
|     ); | ||||
|  | ||||
|     t.test('only parses one level when depth = 1', function (st) { | ||||
|         st.deepEqual(qs.parse('a[b][c]=d', { depth: 1 }), { a: { b: { '[c]': 'd' } } }); | ||||
|         st.deepEqual(qs.parse('a[b][c][d]=e', { depth: 1 }), { a: { b: { '[c][d]': 'e' } } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] }, 'parses a simple array'); | ||||
|  | ||||
|     t.test('parses an explicit array', function (st) { | ||||
|         st.deepEqual(qs.parse('a[]=b'), { a: ['b'] }); | ||||
|         st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] }); | ||||
|         st.deepEqual(qs.parse('a[]=b&a[]=c&a[]=d'), { a: ['b', 'c', 'd'] }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses a mix of simple and explicit arrays', function (st) { | ||||
|         st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); | ||||
|         st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); | ||||
|         st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] }); | ||||
|         st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] }); | ||||
|  | ||||
|         st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); | ||||
|         st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); | ||||
|         st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); | ||||
|  | ||||
|         st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); | ||||
|         st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); | ||||
|         st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses a nested array', function (st) { | ||||
|         st.deepEqual(qs.parse('a[b][]=c&a[b][]=d'), { a: { b: ['c', 'd'] } }); | ||||
|         st.deepEqual(qs.parse('a[>=]=25'), { a: { '>=': '25' } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows to specify array indices', function (st) { | ||||
|         st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] }); | ||||
|         st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] }); | ||||
|         st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 20 }), { a: ['c'] }); | ||||
|         st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 0 }), { a: { 1: 'c' } }); | ||||
|         st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('limits specific array indices to arrayLimit', function (st) { | ||||
|         st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] }); | ||||
|         st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { 21: 'a' } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.deepEqual(qs.parse('a[12b]=c'), { a: { '12b': 'c' } }, 'supports keys that begin with a number'); | ||||
|  | ||||
|     t.test('supports encoded = signs', function (st) { | ||||
|         st.deepEqual(qs.parse('he%3Dllo=th%3Dere'), { 'he=llo': 'th=ere' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('is ok with url encoded strings', function (st) { | ||||
|         st.deepEqual(qs.parse('a[b%20c]=d'), { a: { 'b c': 'd' } }); | ||||
|         st.deepEqual(qs.parse('a[b]=c%20d'), { a: { b: 'c d' } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows brackets in the value', function (st) { | ||||
|         st.deepEqual(qs.parse('pets=["tobi"]'), { pets: '["tobi"]' }); | ||||
|         st.deepEqual(qs.parse('operators=[">=", "<="]'), { operators: '[">=", "<="]' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows empty values', function (st) { | ||||
|         st.deepEqual(qs.parse(''), {}); | ||||
|         st.deepEqual(qs.parse(null), {}); | ||||
|         st.deepEqual(qs.parse(undefined), {}); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('transforms arrays to objects', function (st) { | ||||
|         st.deepEqual(qs.parse('foo[0]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); | ||||
|         st.deepEqual(qs.parse('foo[bad]=baz&foo[0]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); | ||||
|         st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); | ||||
|         st.deepEqual(qs.parse('foo[]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); | ||||
|         st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo'), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); | ||||
|         st.deepEqual(qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb'), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); | ||||
|  | ||||
|         st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: false }), { a: { 0: 'b', t: 'u' } }); | ||||
|         st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: true }), { a: { 0: 'b', t: 'u', hasOwnProperty: 'c' } }); | ||||
|         st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: false }), { a: { 0: 'b', x: 'y' } }); | ||||
|         st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: true }), { a: { 0: 'b', hasOwnProperty: 'c', x: 'y' } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('transforms arrays to objects (dot notation)', function (st) { | ||||
|         st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); | ||||
|         st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad.boo=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); | ||||
|         st.deepEqual(qs.parse('foo[0][0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); | ||||
|         st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15'], bar: '2' }] }); | ||||
|         st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15', '16'], bar: '2' }] }); | ||||
|         st.deepEqual(qs.parse('foo.bad=baz&foo[0]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); | ||||
|         st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); | ||||
|         st.deepEqual(qs.parse('foo[]=bar&foo.bad=baz', { allowDots: true }), { foo: { 0: 'bar', bad: 'baz' } }); | ||||
|         st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); | ||||
|         st.deepEqual(qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb', { allowDots: true }), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('correctly prunes undefined values when converting an array to an object', function (st) { | ||||
|         st.deepEqual(qs.parse('a[2]=b&a[99999999]=c'), { a: { 2: 'b', 99999999: 'c' } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('supports malformed uri characters', function (st) { | ||||
|         st.deepEqual(qs.parse('{%:%}', { strictNullHandling: true }), { '{%:%}': null }); | ||||
|         st.deepEqual(qs.parse('{%:%}='), { '{%:%}': '' }); | ||||
|         st.deepEqual(qs.parse('foo=%:%}'), { foo: '%:%}' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('doesn\'t produce empty keys', function (st) { | ||||
|         st.deepEqual(qs.parse('_r=1&'), { _r: '1' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('cannot access Object prototype', function (st) { | ||||
|         qs.parse('constructor[prototype][bad]=bad'); | ||||
|         qs.parse('bad[constructor][prototype][bad]=bad'); | ||||
|         st.equal(typeof Object.prototype.bad, 'undefined'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses arrays of objects', function (st) { | ||||
|         st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); | ||||
|         st.deepEqual(qs.parse('a[0][b]=c'), { a: [{ b: 'c' }] }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows for empty strings in arrays', function (st) { | ||||
|         st.deepEqual(qs.parse('a[]=b&a[]=&a[]=c'), { a: ['b', '', 'c'] }); | ||||
|  | ||||
|         st.deepEqual( | ||||
|             qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true, arrayLimit: 20 }), | ||||
|             { a: ['b', null, 'c', ''] }, | ||||
|             'with arrayLimit 20 + array indices: null then empty string works' | ||||
|         ); | ||||
|         st.deepEqual( | ||||
|             qs.parse('a[]=b&a[]&a[]=c&a[]=', { strictNullHandling: true, arrayLimit: 0 }), | ||||
|             { a: ['b', null, 'c', ''] }, | ||||
|             'with arrayLimit 0 + array brackets: null then empty string works' | ||||
|         ); | ||||
|  | ||||
|         st.deepEqual( | ||||
|             qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true, arrayLimit: 20 }), | ||||
|             { a: ['b', '', 'c', null] }, | ||||
|             'with arrayLimit 20 + array indices: empty string then null works' | ||||
|         ); | ||||
|         st.deepEqual( | ||||
|             qs.parse('a[]=b&a[]=&a[]=c&a[]', { strictNullHandling: true, arrayLimit: 0 }), | ||||
|             { a: ['b', '', 'c', null] }, | ||||
|             'with arrayLimit 0 + array brackets: empty string then null works' | ||||
|         ); | ||||
|  | ||||
|         st.deepEqual( | ||||
|             qs.parse('a[]=&a[]=b&a[]=c'), | ||||
|             { a: ['', 'b', 'c'] }, | ||||
|             'array brackets: empty strings work' | ||||
|         ); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('compacts sparse arrays', function (st) { | ||||
|         st.deepEqual(qs.parse('a[10]=1&a[2]=2', { arrayLimit: 20 }), { a: ['2', '1'] }); | ||||
|         st.deepEqual(qs.parse('a[1][b][2][c]=1', { arrayLimit: 20 }), { a: [{ b: [{ c: '1' }] }] }); | ||||
|         st.deepEqual(qs.parse('a[1][2][3][c]=1', { arrayLimit: 20 }), { a: [[[{ c: '1' }]]] }); | ||||
|         st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { arrayLimit: 20 }), { a: [[[{ c: ['1'] }]]] }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses semi-parsed strings', function (st) { | ||||
|         st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } }); | ||||
|         st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses buffers correctly', function (st) { | ||||
|         var b = SaferBuffer.from('test'); | ||||
|         st.deepEqual(qs.parse({ a: b }), { a: b }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('continues parsing when no parent is found', function (st) { | ||||
|         st.deepEqual(qs.parse('[]=&a=b'), { 0: '', a: 'b' }); | ||||
|         st.deepEqual(qs.parse('[]&a=b', { strictNullHandling: true }), { 0: null, a: 'b' }); | ||||
|         st.deepEqual(qs.parse('[foo]=bar'), { foo: 'bar' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('does not error when parsing a very long array', function (st) { | ||||
|         var str = 'a[]=a'; | ||||
|         while (Buffer.byteLength(str) < 128 * 1024) { | ||||
|             str = str + '&' + str; | ||||
|         } | ||||
|  | ||||
|         st.doesNotThrow(function () { | ||||
|             qs.parse(str); | ||||
|         }); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('should not throw when a native prototype has an enumerable property', { parallel: false }, function (st) { | ||||
|         Object.prototype.crash = ''; | ||||
|         Array.prototype.crash = ''; | ||||
|         st.doesNotThrow(qs.parse.bind(null, 'a=b')); | ||||
|         st.deepEqual(qs.parse('a=b'), { a: 'b' }); | ||||
|         st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c')); | ||||
|         st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); | ||||
|         delete Object.prototype.crash; | ||||
|         delete Array.prototype.crash; | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses a string with an alternative string delimiter', function (st) { | ||||
|         st.deepEqual(qs.parse('a=b;c=d', { delimiter: ';' }), { a: 'b', c: 'd' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses a string with an alternative RegExp delimiter', function (st) { | ||||
|         st.deepEqual(qs.parse('a=b; c=d', { delimiter: /[;,] */ }), { a: 'b', c: 'd' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('does not use non-splittable objects as delimiters', function (st) { | ||||
|         st.deepEqual(qs.parse('a=b&c=d', { delimiter: true }), { a: 'b', c: 'd' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows overriding parameter limit', function (st) { | ||||
|         st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: 1 }), { a: 'b' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows setting the parameter limit to Infinity', function (st) { | ||||
|         st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: Infinity }), { a: 'b', c: 'd' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows overriding array limit', function (st) { | ||||
|         st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } }); | ||||
|         st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } }); | ||||
|         st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows disabling array parsing', function (st) { | ||||
|         st.deepEqual(qs.parse('a[0]=b&a[1]=c', { parseArrays: false }), { a: { 0: 'b', 1: 'c' } }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('allows for query string prefix', function (st) { | ||||
|         st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); | ||||
|         st.deepEqual(qs.parse('foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); | ||||
|         st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: false }), { '?foo': 'bar' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses an object', function (st) { | ||||
|         var input = { | ||||
|             'user[name]': { 'pop[bob]': 3 }, | ||||
|             'user[email]': null | ||||
|         }; | ||||
|  | ||||
|         var expected = { | ||||
|             user: { | ||||
|                 name: { 'pop[bob]': 3 }, | ||||
|                 email: null | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         var result = qs.parse(input); | ||||
|  | ||||
|         st.deepEqual(result, expected); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses an object in dot notation', function (st) { | ||||
|         var input = { | ||||
|             'user.name': { 'pop[bob]': 3 }, | ||||
|             'user.email.': null | ||||
|         }; | ||||
|  | ||||
|         var expected = { | ||||
|             user: { | ||||
|                 name: { 'pop[bob]': 3 }, | ||||
|                 email: null | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         var result = qs.parse(input, { allowDots: true }); | ||||
|  | ||||
|         st.deepEqual(result, expected); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses an object and not child values', function (st) { | ||||
|         var input = { | ||||
|             'user[name]': { 'pop[bob]': { test: 3 } }, | ||||
|             'user[email]': null | ||||
|         }; | ||||
|  | ||||
|         var expected = { | ||||
|             user: { | ||||
|                 name: { 'pop[bob]': { test: 3 } }, | ||||
|                 email: null | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         var result = qs.parse(input); | ||||
|  | ||||
|         st.deepEqual(result, expected); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('does not blow up when Buffer global is missing', function (st) { | ||||
|         var tempBuffer = global.Buffer; | ||||
|         delete global.Buffer; | ||||
|         var result = qs.parse('a=b&c=d'); | ||||
|         global.Buffer = tempBuffer; | ||||
|         st.deepEqual(result, { a: 'b', c: 'd' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('does not crash when parsing circular references', function (st) { | ||||
|         var a = {}; | ||||
|         a.b = a; | ||||
|  | ||||
|         var parsed; | ||||
|  | ||||
|         st.doesNotThrow(function () { | ||||
|             parsed = qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); | ||||
|         }); | ||||
|  | ||||
|         st.equal('foo' in parsed, true, 'parsed has "foo" property'); | ||||
|         st.equal('bar' in parsed.foo, true); | ||||
|         st.equal('baz' in parsed.foo, true); | ||||
|         st.equal(parsed.foo.bar, 'baz'); | ||||
|         st.deepEqual(parsed.foo.baz, a); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('does not crash when parsing deep objects', function (st) { | ||||
|         var parsed; | ||||
|         var str = 'foo'; | ||||
|  | ||||
|         for (var i = 0; i < 5000; i++) { | ||||
|             str += '[p]'; | ||||
|         } | ||||
|  | ||||
|         str += '=bar'; | ||||
|  | ||||
|         st.doesNotThrow(function () { | ||||
|             parsed = qs.parse(str, { depth: 5000 }); | ||||
|         }); | ||||
|  | ||||
|         st.equal('foo' in parsed, true, 'parsed has "foo" property'); | ||||
|  | ||||
|         var depth = 0; | ||||
|         var ref = parsed.foo; | ||||
|         while ((ref = ref.p)) { | ||||
|             depth += 1; | ||||
|         } | ||||
|  | ||||
|         st.equal(depth, 5000, 'parsed is 5000 properties deep'); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses null objects correctly', { skip: !Object.create }, function (st) { | ||||
|         var a = Object.create(null); | ||||
|         a.b = 'c'; | ||||
|  | ||||
|         st.deepEqual(qs.parse(a), { b: 'c' }); | ||||
|         var result = qs.parse({ a: a }); | ||||
|         st.equal('a' in result, true, 'result has "a" property'); | ||||
|         st.deepEqual(result.a, a); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses dates correctly', function (st) { | ||||
|         var now = new Date(); | ||||
|         st.deepEqual(qs.parse({ a: now }), { a: now }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('parses regular expressions correctly', function (st) { | ||||
|         var re = /^test$/; | ||||
|         st.deepEqual(qs.parse({ a: re }), { a: re }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('does not allow overwriting prototype properties', function (st) { | ||||
|         st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: false }), {}); | ||||
|         st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: false }), {}); | ||||
|  | ||||
|         st.deepEqual( | ||||
|             qs.parse('toString', { allowPrototypes: false }), | ||||
|             {}, | ||||
|             'bare "toString" results in {}' | ||||
|         ); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('can allow overwriting prototype properties', function (st) { | ||||
|         st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }), { a: { hasOwnProperty: 'b' } }); | ||||
|         st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: true }), { hasOwnProperty: 'b' }); | ||||
|  | ||||
|         st.deepEqual( | ||||
|             qs.parse('toString', { allowPrototypes: true }), | ||||
|             { toString: '' }, | ||||
|             'bare "toString" results in { toString: "" }' | ||||
|         ); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('params starting with a closing bracket', function (st) { | ||||
|         st.deepEqual(qs.parse(']=toString'), { ']': 'toString' }); | ||||
|         st.deepEqual(qs.parse(']]=toString'), { ']]': 'toString' }); | ||||
|         st.deepEqual(qs.parse(']hello]=toString'), { ']hello]': 'toString' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('params starting with a starting bracket', function (st) { | ||||
|         st.deepEqual(qs.parse('[=toString'), { '[': 'toString' }); | ||||
|         st.deepEqual(qs.parse('[[=toString'), { '[[': 'toString' }); | ||||
|         st.deepEqual(qs.parse('[hello[=toString'), { '[hello[': 'toString' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('add keys to objects', function (st) { | ||||
|         st.deepEqual( | ||||
|             qs.parse('a[b]=c&a=d'), | ||||
|             { a: { b: 'c', d: true } }, | ||||
|             'can add keys to objects' | ||||
|         ); | ||||
|  | ||||
|         st.deepEqual( | ||||
|             qs.parse('a[b]=c&a=toString'), | ||||
|             { a: { b: 'c' } }, | ||||
|             'can not overwrite prototype' | ||||
|         ); | ||||
|  | ||||
|         st.deepEqual( | ||||
|             qs.parse('a[b]=c&a=toString', { allowPrototypes: true }), | ||||
|             { a: { b: 'c', toString: true } }, | ||||
|             'can overwrite prototype with allowPrototypes true' | ||||
|         ); | ||||
|  | ||||
|         st.deepEqual( | ||||
|             qs.parse('a[b]=c&a=toString', { plainObjects: true }), | ||||
|             { a: { b: 'c', toString: true } }, | ||||
|             'can overwrite prototype with plainObjects true' | ||||
|         ); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('can return null objects', { skip: !Object.create }, function (st) { | ||||
|         var expected = Object.create(null); | ||||
|         expected.a = Object.create(null); | ||||
|         expected.a.b = 'c'; | ||||
|         expected.a.hasOwnProperty = 'd'; | ||||
|         st.deepEqual(qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true }), expected); | ||||
|         st.deepEqual(qs.parse(null, { plainObjects: true }), Object.create(null)); | ||||
|         var expectedArray = Object.create(null); | ||||
|         expectedArray.a = Object.create(null); | ||||
|         expectedArray.a[0] = 'b'; | ||||
|         expectedArray.a.c = 'd'; | ||||
|         st.deepEqual(qs.parse('a[]=b&a[c]=d', { plainObjects: true }), expectedArray); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('can parse with custom encoding', function (st) { | ||||
|         st.deepEqual(qs.parse('%8c%a7=%91%e5%8d%e3%95%7b', { | ||||
|             decoder: function (str) { | ||||
|                 var reg = /%([0-9A-F]{2})/ig; | ||||
|                 var result = []; | ||||
|                 var parts = reg.exec(str); | ||||
|                 while (parts) { | ||||
|                     result.push(parseInt(parts[1], 16)); | ||||
|                     parts = reg.exec(str); | ||||
|                 } | ||||
|                 return iconv.decode(SaferBuffer.from(result), 'shift_jis').toString(); | ||||
|             } | ||||
|         }), { 県: '大阪府' }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('receives the default decoder as a second argument', function (st) { | ||||
|         st.plan(1); | ||||
|         qs.parse('a', { | ||||
|             decoder: function (str, defaultDecoder) { | ||||
|                 st.equal(defaultDecoder, utils.decode); | ||||
|             } | ||||
|         }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('throws error with wrong decoder', function (st) { | ||||
|         st['throws'](function () { | ||||
|             qs.parse({}, { decoder: 'string' }); | ||||
|         }, new TypeError('Decoder has to be a function.')); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('does not mutate the options argument', function (st) { | ||||
|         var options = {}; | ||||
|         qs.parse('a[b]=true', options); | ||||
|         st.deepEqual(options, {}); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.end(); | ||||
| }); | ||||
							
								
								
									
										597
									
								
								node_modules/qs/test/stringify.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										597
									
								
								node_modules/qs/test/stringify.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,597 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var test = require('tape'); | ||||
| var qs = require('../'); | ||||
| var utils = require('../lib/utils'); | ||||
| var iconv = require('iconv-lite'); | ||||
| var SaferBuffer = require('safer-buffer').Buffer; | ||||
|  | ||||
| test('stringify()', function (t) { | ||||
|     t.test('stringifies a querystring object', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b' }), 'a=b'); | ||||
|         st.equal(qs.stringify({ a: 1 }), 'a=1'); | ||||
|         st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2'); | ||||
|         st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z'); | ||||
|         st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC'); | ||||
|         st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80'); | ||||
|         st.equal(qs.stringify({ a: 'א' }), 'a=%D7%90'); | ||||
|         st.equal(qs.stringify({ a: '𐐷' }), 'a=%F0%90%90%B7'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('adds query prefix', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b' }, { addQueryPrefix: true }), '?a=b'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('with query prefix, outputs blank string given an empty object', function (st) { | ||||
|         st.equal(qs.stringify({}, { addQueryPrefix: true }), ''); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies a nested object', function (st) { | ||||
|         st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); | ||||
|         st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies a nested object with dots notation', function (st) { | ||||
|         st.equal(qs.stringify({ a: { b: 'c' } }, { allowDots: true }), 'a.b=c'); | ||||
|         st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }, { allowDots: true }), 'a.b.c.d=e'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies an array value', function (st) { | ||||
|         st.equal( | ||||
|             qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'indices' }), | ||||
|             'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', | ||||
|             'indices => indices' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'brackets' }), | ||||
|             'a%5B%5D=b&a%5B%5D=c&a%5B%5D=d', | ||||
|             'brackets => brackets' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify({ a: ['b', 'c', 'd'] }), | ||||
|             'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', | ||||
|             'default => indices' | ||||
|         ); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('omits nulls when asked', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('omits nested nulls when asked', function (st) { | ||||
|         st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('omits array indices when asked', function (st) { | ||||
|         st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies a nested array value', function (st) { | ||||
|         st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); | ||||
|         st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d'); | ||||
|         st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies a nested array value with dots notation', function (st) { | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: { b: ['c', 'd'] } }, | ||||
|                 { allowDots: true, encode: false, arrayFormat: 'indices' } | ||||
|             ), | ||||
|             'a.b[0]=c&a.b[1]=d', | ||||
|             'indices: stringifies with dots + indices' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: { b: ['c', 'd'] } }, | ||||
|                 { allowDots: true, encode: false, arrayFormat: 'brackets' } | ||||
|             ), | ||||
|             'a.b[]=c&a.b[]=d', | ||||
|             'brackets: stringifies with dots + brackets' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: { b: ['c', 'd'] } }, | ||||
|                 { allowDots: true, encode: false } | ||||
|             ), | ||||
|             'a.b[0]=c&a.b[1]=d', | ||||
|             'default: stringifies with dots + indices' | ||||
|         ); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies an object inside an array', function (st) { | ||||
|         st.equal( | ||||
|             qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'indices' }), | ||||
|             'a%5B0%5D%5Bb%5D=c', | ||||
|             'indices => brackets' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }), | ||||
|             'a%5B%5D%5Bb%5D=c', | ||||
|             'brackets => brackets' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify({ a: [{ b: 'c' }] }), | ||||
|             'a%5B0%5D%5Bb%5D=c', | ||||
|             'default => indices' | ||||
|         ); | ||||
|  | ||||
|         st.equal( | ||||
|             qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'indices' }), | ||||
|             'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', | ||||
|             'indices => indices' | ||||
|         ); | ||||
|  | ||||
|         st.equal( | ||||
|             qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'brackets' }), | ||||
|             'a%5B%5D%5Bb%5D%5Bc%5D%5B%5D=1', | ||||
|             'brackets => brackets' | ||||
|         ); | ||||
|  | ||||
|         st.equal( | ||||
|             qs.stringify({ a: [{ b: { c: [1] } }] }), | ||||
|             'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', | ||||
|             'default => indices' | ||||
|         ); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies an array with mixed objects and primitives', function (st) { | ||||
|         st.equal( | ||||
|             qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }), | ||||
|             'a[0][b]=1&a[1]=2&a[2]=3', | ||||
|             'indices => indices' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }), | ||||
|             'a[][b]=1&a[]=2&a[]=3', | ||||
|             'brackets => brackets' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), | ||||
|             'a[0][b]=1&a[1]=2&a[2]=3', | ||||
|             'default => indices' | ||||
|         ); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies an object inside an array with dots notation', function (st) { | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: [{ b: 'c' }] }, | ||||
|                 { allowDots: true, encode: false, arrayFormat: 'indices' } | ||||
|             ), | ||||
|             'a[0].b=c', | ||||
|             'indices => indices' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: [{ b: 'c' }] }, | ||||
|                 { allowDots: true, encode: false, arrayFormat: 'brackets' } | ||||
|             ), | ||||
|             'a[].b=c', | ||||
|             'brackets => brackets' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: [{ b: 'c' }] }, | ||||
|                 { allowDots: true, encode: false } | ||||
|             ), | ||||
|             'a[0].b=c', | ||||
|             'default => indices' | ||||
|         ); | ||||
|  | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: [{ b: { c: [1] } }] }, | ||||
|                 { allowDots: true, encode: false, arrayFormat: 'indices' } | ||||
|             ), | ||||
|             'a[0].b.c[0]=1', | ||||
|             'indices => indices' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: [{ b: { c: [1] } }] }, | ||||
|                 { allowDots: true, encode: false, arrayFormat: 'brackets' } | ||||
|             ), | ||||
|             'a[].b.c[]=1', | ||||
|             'brackets => brackets' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: [{ b: { c: [1] } }] }, | ||||
|                 { allowDots: true, encode: false } | ||||
|             ), | ||||
|             'a[0].b.c[0]=1', | ||||
|             'default => indices' | ||||
|         ); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('does not omit object keys when indices = false', function (st) { | ||||
|         st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('uses indices notation for arrays when indices=true', function (st) { | ||||
|         st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) { | ||||
|         st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) { | ||||
|         st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) { | ||||
|         st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) { | ||||
|         st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies a complicated object', function (st) { | ||||
|         st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies an empty value', function (st) { | ||||
|         st.equal(qs.stringify({ a: '' }), 'a='); | ||||
|         st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a'); | ||||
|  | ||||
|         st.equal(qs.stringify({ a: '', b: '' }), 'a=&b='); | ||||
|         st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b='); | ||||
|  | ||||
|         st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D='); | ||||
|         st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D'); | ||||
|         st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D='); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies a null object', { skip: !Object.create }, function (st) { | ||||
|         var obj = Object.create(null); | ||||
|         obj.a = 'b'; | ||||
|         st.equal(qs.stringify(obj), 'a=b'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('returns an empty string for invalid input', function (st) { | ||||
|         st.equal(qs.stringify(undefined), ''); | ||||
|         st.equal(qs.stringify(false), ''); | ||||
|         st.equal(qs.stringify(null), ''); | ||||
|         st.equal(qs.stringify(''), ''); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies an object with a null object as a child', { skip: !Object.create }, function (st) { | ||||
|         var obj = { a: Object.create(null) }; | ||||
|  | ||||
|         obj.a.b = 'c'; | ||||
|         st.equal(qs.stringify(obj), 'a%5Bb%5D=c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('drops keys with a value of undefined', function (st) { | ||||
|         st.equal(qs.stringify({ a: undefined }), ''); | ||||
|  | ||||
|         st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D'); | ||||
|         st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D='); | ||||
|         st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D='); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('url encodes values', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies a date', function (st) { | ||||
|         var now = new Date(); | ||||
|         var str = 'a=' + encodeURIComponent(now.toISOString()); | ||||
|         st.equal(qs.stringify({ a: now }), str); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies the weird object from qs', function (st) { | ||||
|         st.equal(qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('skips properties that are part of the object prototype', function (st) { | ||||
|         Object.prototype.crash = 'test'; | ||||
|         st.equal(qs.stringify({ a: 'b' }), 'a=b'); | ||||
|         st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); | ||||
|         delete Object.prototype.crash; | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies boolean values', function (st) { | ||||
|         st.equal(qs.stringify({ a: true }), 'a=true'); | ||||
|         st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true'); | ||||
|         st.equal(qs.stringify({ b: false }), 'b=false'); | ||||
|         st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies buffer values', function (st) { | ||||
|         st.equal(qs.stringify({ a: SaferBuffer.from('test') }), 'a=test'); | ||||
|         st.equal(qs.stringify({ a: { b: SaferBuffer.from('test') } }), 'a%5Bb%5D=test'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('stringifies an object using an alternative delimiter', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('doesn\'t blow up when Buffer global is missing', function (st) { | ||||
|         var tempBuffer = global.Buffer; | ||||
|         delete global.Buffer; | ||||
|         var result = qs.stringify({ a: 'b', c: 'd' }); | ||||
|         global.Buffer = tempBuffer; | ||||
|         st.equal(result, 'a=b&c=d'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('selects properties when filter=array', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b'); | ||||
|         st.equal(qs.stringify({ a: 1 }, { filter: [] }), ''); | ||||
|  | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, | ||||
|                 { filter: ['a', 'b', 0, 2], arrayFormat: 'indices' } | ||||
|             ), | ||||
|             'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', | ||||
|             'indices => indices' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, | ||||
|                 { filter: ['a', 'b', 0, 2], arrayFormat: 'brackets' } | ||||
|             ), | ||||
|             'a%5Bb%5D%5B%5D=1&a%5Bb%5D%5B%5D=3', | ||||
|             'brackets => brackets' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, | ||||
|                 { filter: ['a', 'b', 0, 2] } | ||||
|             ), | ||||
|             'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', | ||||
|             'default => indices' | ||||
|         ); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('supports custom representations when filter=function', function (st) { | ||||
|         var calls = 0; | ||||
|         var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; | ||||
|         var filterFunc = function (prefix, value) { | ||||
|             calls += 1; | ||||
|             if (calls === 1) { | ||||
|                 st.equal(prefix, '', 'prefix is empty'); | ||||
|                 st.equal(value, obj); | ||||
|             } else if (prefix === 'c') { | ||||
|                 return void 0; | ||||
|             } else if (value instanceof Date) { | ||||
|                 st.equal(prefix, 'e[f]'); | ||||
|                 return value.getTime(); | ||||
|             } | ||||
|             return value; | ||||
|         }; | ||||
|  | ||||
|         st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000'); | ||||
|         st.equal(calls, 5); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('can disable uri encoding', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b'); | ||||
|         st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c'); | ||||
|         st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('can sort the keys', function (st) { | ||||
|         var sort = function (a, b) { | ||||
|             return a.localeCompare(b); | ||||
|         }; | ||||
|         st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y'); | ||||
|         st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('can sort the keys at depth 3 or more too', function (st) { | ||||
|         var sort = function (a, b) { | ||||
|             return a.localeCompare(b); | ||||
|         }; | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, | ||||
|                 { sort: sort, encode: false } | ||||
|             ), | ||||
|             'a=a&b=b&z[zi][zia]=zia&z[zi][zib]=zib&z[zj][zja]=zja&z[zj][zjb]=zjb' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, | ||||
|                 { sort: null, encode: false } | ||||
|             ), | ||||
|             'a=a&z[zj][zjb]=zjb&z[zj][zja]=zja&z[zi][zib]=zib&z[zi][zia]=zia&b=b' | ||||
|         ); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('can stringify with custom encoding', function (st) { | ||||
|         st.equal(qs.stringify({ 県: '大阪府', '': '' }, { | ||||
|             encoder: function (str) { | ||||
|                 if (str.length === 0) { | ||||
|                     return ''; | ||||
|                 } | ||||
|                 var buf = iconv.encode(str, 'shiftjis'); | ||||
|                 var result = []; | ||||
|                 for (var i = 0; i < buf.length; ++i) { | ||||
|                     result.push(buf.readUInt8(i).toString(16)); | ||||
|                 } | ||||
|                 return '%' + result.join('%'); | ||||
|             } | ||||
|         }), '%8c%a7=%91%e5%8d%e3%95%7b&='); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('receives the default encoder as a second argument', function (st) { | ||||
|         st.plan(2); | ||||
|         qs.stringify({ a: 1 }, { | ||||
|             encoder: function (str, defaultEncoder) { | ||||
|                 st.equal(defaultEncoder, utils.encode); | ||||
|             } | ||||
|         }); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('throws error with wrong encoder', function (st) { | ||||
|         st['throws'](function () { | ||||
|             qs.stringify({}, { encoder: 'string' }); | ||||
|         }, new TypeError('Encoder has to be a function.')); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('can use custom encoder for a buffer object', { skip: typeof Buffer === 'undefined' }, function (st) { | ||||
|         st.equal(qs.stringify({ a: SaferBuffer.from([1]) }, { | ||||
|             encoder: function (buffer) { | ||||
|                 if (typeof buffer === 'string') { | ||||
|                     return buffer; | ||||
|                 } | ||||
|                 return String.fromCharCode(buffer.readUInt8(0) + 97); | ||||
|             } | ||||
|         }), 'a=b'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('serializeDate option', function (st) { | ||||
|         var date = new Date(); | ||||
|         st.equal( | ||||
|             qs.stringify({ a: date }), | ||||
|             'a=' + date.toISOString().replace(/:/g, '%3A'), | ||||
|             'default is toISOString' | ||||
|         ); | ||||
|  | ||||
|         var mutatedDate = new Date(); | ||||
|         mutatedDate.toISOString = function () { | ||||
|             throw new SyntaxError(); | ||||
|         }; | ||||
|         st['throws'](function () { | ||||
|             mutatedDate.toISOString(); | ||||
|         }, SyntaxError); | ||||
|         st.equal( | ||||
|             qs.stringify({ a: mutatedDate }), | ||||
|             'a=' + Date.prototype.toISOString.call(mutatedDate).replace(/:/g, '%3A'), | ||||
|             'toISOString works even when method is not locally present' | ||||
|         ); | ||||
|  | ||||
|         var specificDate = new Date(6); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: specificDate }, | ||||
|                 { serializeDate: function (d) { return d.getTime() * 7; } } | ||||
|             ), | ||||
|             'a=42', | ||||
|             'custom serializeDate function called' | ||||
|         ); | ||||
|  | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('RFC 1738 spaces serialization', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC1738 }), 'a=b+c'); | ||||
|         st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC1738 }), 'a+b=c+d'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('RFC 3986 spaces serialization', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC3986 }), 'a=b%20c'); | ||||
|         st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC3986 }), 'a%20b=c%20d'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('Backward compatibility to RFC 3986', function (st) { | ||||
|         st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('Edge cases and unknown formats', function (st) { | ||||
|         ['UFO1234', false, 1234, null, {}, []].forEach( | ||||
|             function (format) { | ||||
|                 st['throws']( | ||||
|                     function () { | ||||
|                         qs.stringify({ a: 'b c' }, { format: format }); | ||||
|                     }, | ||||
|                     new TypeError('Unknown format option provided.') | ||||
|                 ); | ||||
|             } | ||||
|         ); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('encodeValuesOnly', function (st) { | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, | ||||
|                 { encodeValuesOnly: true } | ||||
|             ), | ||||
|             'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h' | ||||
|         ); | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: 'b', c: ['d', 'e'], f: [['g'], ['h']] } | ||||
|             ), | ||||
|             'a=b&c%5B0%5D=d&c%5B1%5D=e&f%5B0%5D%5B0%5D=g&f%5B1%5D%5B0%5D=h' | ||||
|         ); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('encodeValuesOnly - strictNullHandling', function (st) { | ||||
|         st.equal( | ||||
|             qs.stringify( | ||||
|                 { a: { b: null } }, | ||||
|                 { encodeValuesOnly: true, strictNullHandling: true } | ||||
|             ), | ||||
|             'a[b]' | ||||
|         ); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.test('does not mutate the options argument', function (st) { | ||||
|         var options = {}; | ||||
|         qs.stringify({}, options); | ||||
|         st.deepEqual(options, {}); | ||||
|         st.end(); | ||||
|     }); | ||||
|  | ||||
|     t.end(); | ||||
| }); | ||||
							
								
								
									
										34
									
								
								node_modules/qs/test/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								node_modules/qs/test/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var test = require('tape'); | ||||
| var utils = require('../lib/utils'); | ||||
|  | ||||
| test('merge()', function (t) { | ||||
|     t.deepEqual(utils.merge({ a: 'b' }, { a: 'c' }), { a: ['b', 'c'] }, 'merges two objects with the same key'); | ||||
|  | ||||
|     var oneMerged = utils.merge({ foo: 'bar' }, { foo: { first: '123' } }); | ||||
|     t.deepEqual(oneMerged, { foo: ['bar', { first: '123' }] }, 'merges a standalone and an object into an array'); | ||||
|  | ||||
|     var twoMerged = utils.merge({ foo: ['bar', { first: '123' }] }, { foo: { second: '456' } }); | ||||
|     t.deepEqual(twoMerged, { foo: { 0: 'bar', 1: { first: '123' }, second: '456' } }, 'merges a standalone and two objects into an array'); | ||||
|  | ||||
|     var sandwiched = utils.merge({ foo: ['bar', { first: '123', second: '456' }] }, { foo: 'baz' }); | ||||
|     t.deepEqual(sandwiched, { foo: ['bar', { first: '123', second: '456' }, 'baz'] }, 'merges an object sandwiched by two standalones into an array'); | ||||
|  | ||||
|     var nestedArrays = utils.merge({ foo: ['baz'] }, { foo: ['bar', 'xyzzy'] }); | ||||
|     t.deepEqual(nestedArrays, { foo: ['baz', 'bar', 'xyzzy'] }); | ||||
|  | ||||
|     t.end(); | ||||
| }); | ||||
|  | ||||
| test('assign()', function (t) { | ||||
|     var target = { a: 1, b: 2 }; | ||||
|     var source = { b: 3, c: 4 }; | ||||
|     var result = utils.assign(target, source); | ||||
|  | ||||
|     t.equal(result, target, 'returns the target'); | ||||
|     t.deepEqual(target, { a: 1, b: 3, c: 4 }, 'target and source are merged'); | ||||
|     t.deepEqual(source, { b: 3, c: 4 }, 'source is untouched'); | ||||
|  | ||||
|     t.end(); | ||||
| }); | ||||
		Reference in New Issue
	
	Block a user
	 Shivam Mathur
					Shivam Mathur