├── .gitignore ├── .npmignore ├── .travis.yml ├── LICENSE.txt ├── Makefile ├── README.md ├── bower.json ├── build ├── url-search-params.amd.js ├── url-search-params.js ├── url-search-params.max.amd.js ├── url-search-params.max.js └── url-search-params.node.js ├── index.html ├── package-lock.json ├── package.json ├── src ├── upgrades.js ├── url-search-params-sort.js ├── url-search-params.js └── utilities.js ├── template ├── amd.after ├── amd.before ├── copyright ├── license.after ├── license.before ├── md.after ├── md.before ├── node.after ├── node.before ├── var.after └── var.before └── test ├── .test.js └── url-search-params.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/* 2 | test/* 3 | template/* 4 | node_modules/* 5 | Makefile 6 | index.html 7 | .travis.yml 8 | bower.json 9 | template/license.* 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 0.10 4 | - 0.12 5 | git: 6 | depth: 1 7 | branches: 8 | only: 9 | - master -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (C) 2015-2017 Andrea Giammarchi - @WebReflection 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: build duk var node amd size hint clean test web preview pages dependencies 2 | 3 | # repository name 4 | REPO = url-search-params 5 | 6 | # make var files 7 | VAR = src/$(REPO).js \ 8 | src/utilities.js\ 9 | src/upgrades.js 10 | 11 | # make node files 12 | NODE = src/$(REPO).js 13 | 14 | # make amd files 15 | AMD = $(VAR) 16 | 17 | # README constant 18 | 19 | 20 | # default build task 21 | build: 22 | make clean 23 | make var 24 | make node 25 | make amd 26 | make test 27 | make hint 28 | make size 29 | 30 | # build generic version 31 | var: 32 | mkdir -p build 33 | cat template/var.before $(VAR) template/var.after src/$(REPO)-sort.js >build/no-copy.$(REPO).max.js 34 | node node_modules/uglify-js/bin/uglifyjs --ie8 --verbose build/no-copy.$(REPO).max.js >build/no-copy.$(REPO).js 35 | cat template/license.before LICENSE.txt template/license.after build/no-copy.$(REPO).max.js >build/$(REPO).max.js 36 | cat template/copyright build/no-copy.$(REPO).js >build/$(REPO).js 37 | rm build/no-copy.$(REPO).max.js 38 | rm build/no-copy.$(REPO).js 39 | 40 | # build node.js version 41 | node: 42 | mkdir -p build 43 | cat template/license.before LICENSE.txt template/license.after template/node.before $(NODE) template/node.after src/$(REPO)-sort.js >build/$(REPO).node.js 44 | 45 | # build AMD version 46 | amd: 47 | mkdir -p build 48 | cat template/amd.before $(AMD) src/$(REPO)-sort.js template/amd.after >build/no-copy.$(REPO).max.amd.js 49 | node node_modules/uglify-js/bin/uglifyjs --ie8 --verbose build/no-copy.$(REPO).max.amd.js >build/no-copy.$(REPO).amd.js 50 | cat template/license.before LICENSE.txt template/license.after build/no-copy.$(REPO).max.amd.js >build/$(REPO).max.amd.js 51 | cat template/copyright build/no-copy.$(REPO).amd.js >build/$(REPO).amd.js 52 | rm build/no-copy.$(REPO).max.amd.js 53 | rm build/no-copy.$(REPO).amd.js 54 | 55 | # build self executable for duktape 56 | duk: 57 | node -e 'var fs=require("fs");\ 58 | fs.writeFileSync(\ 59 | "test/duk.js",\ 60 | fs.readFileSync("node_modules/wru/build/wru.console.js") +\ 61 | "\n" +\ 62 | fs.readFileSync("build/$(REPO).js") +\ 63 | "\n" +\ 64 | fs.readFileSync("test/$(REPO).js").toString().replace(/^[^\x00]+?\/\/:remove\s*/,"")\ 65 | );' 66 | 67 | 68 | size: 69 | wc -c build/$(REPO).max.js 70 | gzip -c build/$(REPO).js | wc -c 71 | 72 | # hint built file 73 | hint: 74 | node node_modules/jshint/bin/jshint build/$(REPO).max.js 75 | 76 | # clean/remove build folder 77 | clean: 78 | rm -rf build 79 | 80 | # tests, as usual and of course 81 | test: 82 | npm test 83 | 84 | # launch tiny-cdn (ctrl+click to open the page) 85 | web: 86 | node node_modules/.bin/tiny-cdn run 87 | 88 | # markdown the readme and view it 89 | preview: 90 | node_modules/markdown/bin/md2html.js README.md >README.md.htm 91 | cat template/md.before README.md.htm template/md.after >README.md.html 92 | open README.md.html 93 | sleep 3 94 | rm README.md.htm README.md.html 95 | 96 | pages: 97 | git pull --rebase 98 | make var 99 | mkdir -p ~/tmp 100 | mkdir -p ~/tmp/$(REPO) 101 | cp .gitignore ~/tmp/ 102 | cp -rf src ~/tmp/$(REPO) 103 | cp -rf build ~/tmp/$(REPO) 104 | cp -rf test ~/tmp/$(REPO) 105 | cp index.html ~/tmp/$(REPO) 106 | git checkout gh-pages 107 | cp ~/tmp/.gitignore ./ 108 | mkdir -p test 109 | rm -rf test 110 | cp -rf ~/tmp/$(REPO) test 111 | git add .gitignore 112 | git add test 113 | git add test/. 114 | git commit -m 'automatic test generator' 115 | git push 116 | git checkout master 117 | rm -r ~/tmp/$(REPO) 118 | 119 | # modules used in this repo 120 | dependencies: 121 | rm -rf node_modules 122 | mkdir node_modules 123 | npm install wru 124 | npm install tiny-cdn 125 | npm install uglify-js@1 126 | npm install jshint 127 | npm install markdown 128 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | url-search-params 2 | ================= 3 | 4 | [![build status](https://secure.travis-ci.org/WebReflection/url-search-params.svg)](http://travis-ci.org/WebReflection/url-search-params) [![CDNJS version](https://img.shields.io/cdnjs/v/url-search-params.svg)](https://cdnjs.com/libraries/url-search-params) [![donate](https://img.shields.io/badge/$-donate-ff69b4.svg?maxAge=2592000&style=flat)](https://github.com/WebReflection/donate) 5 | 6 | # Deprecated 7 | 8 | This polyfill has been improved, better tested, and moved under the [ungap](https://ungap.github.io) umbrella. 9 | 10 | The new version is available as [@ungap/url-search-params](https://github.com/ungap/url-search-params). 11 | 12 | - - - 13 | 14 | This is a polyfill for the [URLSearchParams API](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams). 15 | 16 | It is possible to simply include [build/url-search-params.js](build/url-search-params.js) or grab it via npm. 17 | 18 | ``` 19 | npm install url-search-params 20 | ``` 21 | 22 | The function is exported directly. 23 | ```js 24 | var URLSearchParams = require('url-search-params'); 25 | ``` 26 | 27 | MIT Style License 28 | 29 | ### iOS 10 + other platforms bug 30 | 31 | In case you'd like to replace the broken global native constructor, you can check some well known issue before including this polyfill on your project/page. 32 | 33 | ```html 34 | 41 | ``` 42 | 43 | #### About HTMLAnchorElement.prototype.searchParams 44 | This property is already implemented in Firefox and polyfilled here only for browsers that exposes getters and setters 45 | through the `HTMLAnchorElement.prototype`. 46 | 47 | In order to know if such property is supported, you **must** do the check as such: 48 | ``` 49 | if ('searchParams' in HTMLAnchorElement.prototype) { 50 | // polyfill for links supported 51 | } 52 | ``` 53 | If you do this check instead: 54 | ```js 55 | if (HTMLAnchorElement.prototype.searchParams) { 56 | // throws a TypeError 57 | } 58 | ``` 59 | this polyfill will reflect native behavior, throwing a type error due access to a property in a non instance of `HTMLAnchorElement`. 60 | 61 | Nothing new to learn here, [just a reminder](http://webreflection.blogspot.co.uk/2011/08/please-stop-reassigning-for-no-reason.html). 62 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "url-search-params", 3 | "description": "Simple polyfill for URLSearchParams standard", 4 | "main": "./build/url-search-params.max.js", 5 | "authors": [ 6 | "Andrea Giammarchi" 7 | ], 8 | "license": "MIT", 9 | "keywords": [ 10 | "DOM", 11 | "URLSearchParams", 12 | "polyfill", 13 | "shim" 14 | ], 15 | "homepage": "https://github.com/WebReflection/url-search-params", 16 | "moduleType": [ 17 | "amd", 18 | "globals", 19 | "node" 20 | ], 21 | "ignore": [ 22 | "**/.*", 23 | "node_modules", 24 | "bower_components", 25 | "test", 26 | "tests" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /build/url-search-params.amd.js: -------------------------------------------------------------------------------- 1 | /*! (C) Andrea Giammarchi - Mit Style License */ 2 | define(function(){"use strict";function URLSearchParams(query){var index,key,value,pairs,i,length,dict=Object.create(null);this[secret]=dict;if(!query)return;if(typeof query==="string"){if(query.charAt(0)==="?"){query=query.slice(1)}for(pairs=query.split("&"),i=0,length=pairs.length;i 2 | 3 | 4 | wru test 5 | 6 | 7 | 8 | 9 | 13 | 54 | 55 | 56 | 88 | 89 | 90 |
91 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "url-search-params", 3 | "version": "1.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ajv": { 8 | "version": "5.5.2", 9 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 10 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 11 | "dev": true, 12 | "optional": true, 13 | "requires": { 14 | "co": "^4.6.0", 15 | "fast-deep-equal": "^1.0.0", 16 | "fast-json-stable-stringify": "^2.0.0", 17 | "json-schema-traverse": "^0.3.0" 18 | } 19 | }, 20 | "asn1": { 21 | "version": "0.2.4", 22 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 23 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 24 | "dev": true, 25 | "optional": true, 26 | "requires": { 27 | "safer-buffer": "~2.1.0" 28 | } 29 | }, 30 | "assert-plus": { 31 | "version": "1.0.0", 32 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 33 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 34 | "dev": true 35 | }, 36 | "async": { 37 | "version": "1.0.0", 38 | "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", 39 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", 40 | "dev": true, 41 | "optional": true 42 | }, 43 | "asynckit": { 44 | "version": "0.4.0", 45 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 46 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 47 | "dev": true, 48 | "optional": true 49 | }, 50 | "aws-sign2": { 51 | "version": "0.7.0", 52 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 53 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 54 | "dev": true, 55 | "optional": true 56 | }, 57 | "aws4": { 58 | "version": "1.8.0", 59 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 60 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 61 | "dev": true, 62 | "optional": true 63 | }, 64 | "balanced-match": { 65 | "version": "1.0.0", 66 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 67 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 68 | "dev": true 69 | }, 70 | "bcrypt-pbkdf": { 71 | "version": "1.0.2", 72 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 73 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 74 | "dev": true, 75 | "optional": true, 76 | "requires": { 77 | "tweetnacl": "^0.14.3" 78 | } 79 | }, 80 | "brace-expansion": { 81 | "version": "1.1.11", 82 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 83 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 84 | "dev": true, 85 | "requires": { 86 | "balanced-match": "^1.0.0", 87 | "concat-map": "0.0.1" 88 | } 89 | }, 90 | "buffer-from": { 91 | "version": "1.1.1", 92 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 93 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 94 | "dev": true, 95 | "optional": true 96 | }, 97 | "caseless": { 98 | "version": "0.12.0", 99 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 100 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 101 | "dev": true, 102 | "optional": true 103 | }, 104 | "cli": { 105 | "version": "1.0.1", 106 | "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", 107 | "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", 108 | "dev": true, 109 | "requires": { 110 | "exit": "0.1.2", 111 | "glob": "^7.1.1" 112 | } 113 | }, 114 | "co": { 115 | "version": "4.6.0", 116 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 117 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 118 | "dev": true, 119 | "optional": true 120 | }, 121 | "colors": { 122 | "version": "1.0.3", 123 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 124 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", 125 | "dev": true, 126 | "optional": true 127 | }, 128 | "combined-stream": { 129 | "version": "1.0.6", 130 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 131 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 132 | "dev": true, 133 | "requires": { 134 | "delayed-stream": "~1.0.0" 135 | } 136 | }, 137 | "commander": { 138 | "version": "2.17.1", 139 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", 140 | "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", 141 | "dev": true 142 | }, 143 | "concat-map": { 144 | "version": "0.0.1", 145 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 146 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 147 | "dev": true 148 | }, 149 | "concat-stream": { 150 | "version": "1.6.2", 151 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 152 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 153 | "dev": true, 154 | "optional": true, 155 | "requires": { 156 | "buffer-from": "^1.0.0", 157 | "inherits": "^2.0.3", 158 | "readable-stream": "^2.2.2", 159 | "typedarray": "^0.0.6" 160 | }, 161 | "dependencies": { 162 | "isarray": { 163 | "version": "1.0.0", 164 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 165 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 166 | "dev": true, 167 | "optional": true 168 | }, 169 | "readable-stream": { 170 | "version": "2.3.6", 171 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 172 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 173 | "dev": true, 174 | "optional": true, 175 | "requires": { 176 | "core-util-is": "~1.0.0", 177 | "inherits": "~2.0.3", 178 | "isarray": "~1.0.0", 179 | "process-nextick-args": "~2.0.0", 180 | "safe-buffer": "~5.1.1", 181 | "string_decoder": "~1.1.1", 182 | "util-deprecate": "~1.0.1" 183 | } 184 | }, 185 | "string_decoder": { 186 | "version": "1.1.1", 187 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 188 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 189 | "dev": true, 190 | "optional": true, 191 | "requires": { 192 | "safe-buffer": "~5.1.0" 193 | } 194 | } 195 | } 196 | }, 197 | "console-browserify": { 198 | "version": "1.1.0", 199 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 200 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 201 | "dev": true, 202 | "requires": { 203 | "date-now": "^0.1.4" 204 | } 205 | }, 206 | "core-util-is": { 207 | "version": "1.0.2", 208 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 209 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 210 | "dev": true 211 | }, 212 | "cycle": { 213 | "version": "1.0.3", 214 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 215 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", 216 | "dev": true, 217 | "optional": true 218 | }, 219 | "dashdash": { 220 | "version": "1.14.1", 221 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 222 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 223 | "dev": true, 224 | "optional": true, 225 | "requires": { 226 | "assert-plus": "^1.0.0" 227 | } 228 | }, 229 | "date-now": { 230 | "version": "0.1.4", 231 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 232 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 233 | "dev": true 234 | }, 235 | "debug": { 236 | "version": "2.6.9", 237 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 238 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 239 | "dev": true, 240 | "optional": true, 241 | "requires": { 242 | "ms": "2.0.0" 243 | } 244 | }, 245 | "delayed-stream": { 246 | "version": "1.0.0", 247 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 248 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 249 | "dev": true 250 | }, 251 | "dom-serializer": { 252 | "version": "0.1.0", 253 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 254 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 255 | "dev": true, 256 | "requires": { 257 | "domelementtype": "~1.1.1", 258 | "entities": "~1.1.1" 259 | }, 260 | "dependencies": { 261 | "domelementtype": { 262 | "version": "1.1.3", 263 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 264 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", 265 | "dev": true 266 | }, 267 | "entities": { 268 | "version": "1.1.1", 269 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", 270 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", 271 | "dev": true 272 | } 273 | } 274 | }, 275 | "domelementtype": { 276 | "version": "1.3.0", 277 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", 278 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", 279 | "dev": true 280 | }, 281 | "domhandler": { 282 | "version": "2.3.0", 283 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", 284 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", 285 | "dev": true, 286 | "requires": { 287 | "domelementtype": "1" 288 | } 289 | }, 290 | "domutils": { 291 | "version": "1.5.1", 292 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 293 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 294 | "dev": true, 295 | "requires": { 296 | "dom-serializer": "0", 297 | "domelementtype": "1" 298 | } 299 | }, 300 | "ecc-jsbn": { 301 | "version": "0.1.2", 302 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 303 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 304 | "dev": true, 305 | "optional": true, 306 | "requires": { 307 | "jsbn": "~0.1.0", 308 | "safer-buffer": "^2.1.0" 309 | } 310 | }, 311 | "entities": { 312 | "version": "1.0.0", 313 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", 314 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", 315 | "dev": true 316 | }, 317 | "es6-promise": { 318 | "version": "4.2.4", 319 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", 320 | "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", 321 | "dev": true, 322 | "optional": true 323 | }, 324 | "exit": { 325 | "version": "0.1.2", 326 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 327 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 328 | "dev": true 329 | }, 330 | "extend": { 331 | "version": "3.0.2", 332 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 333 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 334 | "dev": true, 335 | "optional": true 336 | }, 337 | "extract-zip": { 338 | "version": "1.6.7", 339 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", 340 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", 341 | "dev": true, 342 | "optional": true, 343 | "requires": { 344 | "concat-stream": "1.6.2", 345 | "debug": "2.6.9", 346 | "mkdirp": "0.5.1", 347 | "yauzl": "2.4.1" 348 | } 349 | }, 350 | "extsprintf": { 351 | "version": "1.3.0", 352 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 353 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 354 | "dev": true 355 | }, 356 | "eyes": { 357 | "version": "0.1.8", 358 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 359 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", 360 | "dev": true, 361 | "optional": true 362 | }, 363 | "fast-deep-equal": { 364 | "version": "1.1.0", 365 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 366 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 367 | "dev": true, 368 | "optional": true 369 | }, 370 | "fast-json-stable-stringify": { 371 | "version": "2.0.0", 372 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 373 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 374 | "dev": true, 375 | "optional": true 376 | }, 377 | "fd-slicer": { 378 | "version": "1.0.1", 379 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 380 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 381 | "dev": true, 382 | "optional": true, 383 | "requires": { 384 | "pend": "~1.2.0" 385 | } 386 | }, 387 | "forever-agent": { 388 | "version": "0.6.1", 389 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 390 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 391 | "dev": true, 392 | "optional": true 393 | }, 394 | "form-data": { 395 | "version": "2.3.2", 396 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 397 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 398 | "dev": true, 399 | "optional": true, 400 | "requires": { 401 | "asynckit": "^0.4.0", 402 | "combined-stream": "1.0.6", 403 | "mime-types": "^2.1.12" 404 | } 405 | }, 406 | "fs-extra": { 407 | "version": "1.0.0", 408 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", 409 | "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", 410 | "dev": true, 411 | "optional": true, 412 | "requires": { 413 | "graceful-fs": "^4.1.2", 414 | "jsonfile": "^2.1.0", 415 | "klaw": "^1.0.0" 416 | } 417 | }, 418 | "fs.realpath": { 419 | "version": "1.0.0", 420 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 421 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 422 | "dev": true 423 | }, 424 | "getpass": { 425 | "version": "0.1.7", 426 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 427 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 428 | "dev": true, 429 | "optional": true, 430 | "requires": { 431 | "assert-plus": "^1.0.0" 432 | } 433 | }, 434 | "glob": { 435 | "version": "7.1.3", 436 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 437 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 438 | "dev": true, 439 | "requires": { 440 | "fs.realpath": "^1.0.0", 441 | "inflight": "^1.0.4", 442 | "inherits": "2", 443 | "minimatch": "^3.0.4", 444 | "once": "^1.3.0", 445 | "path-is-absolute": "^1.0.0" 446 | } 447 | }, 448 | "graceful-fs": { 449 | "version": "4.1.11", 450 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 451 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 452 | "dev": true, 453 | "optional": true 454 | }, 455 | "har-schema": { 456 | "version": "2.0.0", 457 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 458 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 459 | "dev": true, 460 | "optional": true 461 | }, 462 | "har-validator": { 463 | "version": "5.1.0", 464 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 465 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 466 | "dev": true, 467 | "optional": true, 468 | "requires": { 469 | "ajv": "^5.3.0", 470 | "har-schema": "^2.0.0" 471 | } 472 | }, 473 | "hasha": { 474 | "version": "2.2.0", 475 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", 476 | "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", 477 | "dev": true, 478 | "optional": true, 479 | "requires": { 480 | "is-stream": "^1.0.1", 481 | "pinkie-promise": "^2.0.0" 482 | } 483 | }, 484 | "holdon": { 485 | "version": "0.2.1", 486 | "resolved": "https://registry.npmjs.org/holdon/-/holdon-0.2.1.tgz", 487 | "integrity": "sha1-dO2aSM04MmKl18qnczBI2GRT5as=", 488 | "dev": true 489 | }, 490 | "htmlparser2": { 491 | "version": "3.8.3", 492 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", 493 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", 494 | "dev": true, 495 | "requires": { 496 | "domelementtype": "1", 497 | "domhandler": "2.3", 498 | "domutils": "1.5", 499 | "entities": "1.0", 500 | "readable-stream": "1.1" 501 | } 502 | }, 503 | "http-signature": { 504 | "version": "1.2.0", 505 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 506 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 507 | "dev": true, 508 | "optional": true, 509 | "requires": { 510 | "assert-plus": "^1.0.0", 511 | "jsprim": "^1.2.2", 512 | "sshpk": "^1.7.0" 513 | } 514 | }, 515 | "inflight": { 516 | "version": "1.0.6", 517 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 518 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 519 | "dev": true, 520 | "requires": { 521 | "once": "^1.3.0", 522 | "wrappy": "1" 523 | } 524 | }, 525 | "inherits": { 526 | "version": "2.0.3", 527 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 528 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 529 | "dev": true 530 | }, 531 | "is-stream": { 532 | "version": "1.1.0", 533 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 534 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 535 | "dev": true, 536 | "optional": true 537 | }, 538 | "is-typedarray": { 539 | "version": "1.0.0", 540 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 541 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 542 | "dev": true, 543 | "optional": true 544 | }, 545 | "isarray": { 546 | "version": "0.0.1", 547 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 548 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 549 | "dev": true 550 | }, 551 | "isexe": { 552 | "version": "2.0.0", 553 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 554 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 555 | "dev": true, 556 | "optional": true 557 | }, 558 | "isstream": { 559 | "version": "0.1.2", 560 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 561 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 562 | "dev": true 563 | }, 564 | "jsbn": { 565 | "version": "0.1.1", 566 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 567 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 568 | "dev": true, 569 | "optional": true 570 | }, 571 | "jshint": { 572 | "version": "2.9.6", 573 | "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz", 574 | "integrity": "sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==", 575 | "dev": true, 576 | "requires": { 577 | "cli": "~1.0.0", 578 | "console-browserify": "1.1.x", 579 | "exit": "0.1.x", 580 | "htmlparser2": "3.8.x", 581 | "lodash": "~4.17.10", 582 | "minimatch": "~3.0.2", 583 | "phantom": "~4.0.1", 584 | "phantomjs-prebuilt": "~2.1.7", 585 | "shelljs": "0.3.x", 586 | "strip-json-comments": "1.0.x", 587 | "unicode-5.2.0": "^0.7.5" 588 | } 589 | }, 590 | "json-schema": { 591 | "version": "0.2.3", 592 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 593 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 594 | "dev": true, 595 | "optional": true 596 | }, 597 | "json-schema-traverse": { 598 | "version": "0.3.1", 599 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 600 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 601 | "dev": true, 602 | "optional": true 603 | }, 604 | "json-stringify-safe": { 605 | "version": "5.0.1", 606 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 607 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 608 | "dev": true, 609 | "optional": true 610 | }, 611 | "jsonfile": { 612 | "version": "2.4.0", 613 | "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", 614 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", 615 | "dev": true, 616 | "optional": true, 617 | "requires": { 618 | "graceful-fs": "^4.1.6" 619 | } 620 | }, 621 | "jsprim": { 622 | "version": "1.4.1", 623 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 624 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 625 | "dev": true, 626 | "optional": true, 627 | "requires": { 628 | "assert-plus": "1.0.0", 629 | "extsprintf": "1.3.0", 630 | "json-schema": "0.2.3", 631 | "verror": "1.10.0" 632 | } 633 | }, 634 | "kew": { 635 | "version": "0.7.0", 636 | "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", 637 | "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", 638 | "dev": true, 639 | "optional": true 640 | }, 641 | "klaw": { 642 | "version": "1.3.1", 643 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", 644 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", 645 | "dev": true, 646 | "optional": true, 647 | "requires": { 648 | "graceful-fs": "^4.1.9" 649 | } 650 | }, 651 | "lodash": { 652 | "version": "4.17.10", 653 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", 654 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", 655 | "dev": true 656 | }, 657 | "mime-db": { 658 | "version": "1.29.0", 659 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", 660 | "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", 661 | "dev": true 662 | }, 663 | "mime-types": { 664 | "version": "2.1.16", 665 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", 666 | "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", 667 | "dev": true, 668 | "requires": { 669 | "mime-db": "~1.29.0" 670 | } 671 | }, 672 | "minimatch": { 673 | "version": "3.0.4", 674 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 675 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 676 | "dev": true, 677 | "requires": { 678 | "brace-expansion": "^1.1.7" 679 | } 680 | }, 681 | "minimist": { 682 | "version": "0.0.8", 683 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 684 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 685 | "dev": true, 686 | "optional": true 687 | }, 688 | "mkdirp": { 689 | "version": "0.5.1", 690 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 691 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 692 | "dev": true, 693 | "optional": true, 694 | "requires": { 695 | "minimist": "0.0.8" 696 | } 697 | }, 698 | "ms": { 699 | "version": "2.0.0", 700 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 701 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 702 | "dev": true, 703 | "optional": true 704 | }, 705 | "oauth-sign": { 706 | "version": "0.9.0", 707 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 708 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 709 | "dev": true, 710 | "optional": true 711 | }, 712 | "once": { 713 | "version": "1.4.0", 714 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 715 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 716 | "dev": true, 717 | "requires": { 718 | "wrappy": "1" 719 | } 720 | }, 721 | "path-is-absolute": { 722 | "version": "1.0.1", 723 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 724 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 725 | "dev": true 726 | }, 727 | "pend": { 728 | "version": "1.2.0", 729 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 730 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 731 | "dev": true, 732 | "optional": true 733 | }, 734 | "performance-now": { 735 | "version": "2.1.0", 736 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 737 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 738 | "dev": true, 739 | "optional": true 740 | }, 741 | "phantom": { 742 | "version": "4.0.12", 743 | "resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz", 744 | "integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==", 745 | "dev": true, 746 | "optional": true, 747 | "requires": { 748 | "phantomjs-prebuilt": "^2.1.16", 749 | "split": "^1.0.1", 750 | "winston": "^2.4.0" 751 | } 752 | }, 753 | "phantomjs-prebuilt": { 754 | "version": "2.1.16", 755 | "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", 756 | "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", 757 | "dev": true, 758 | "optional": true, 759 | "requires": { 760 | "es6-promise": "^4.0.3", 761 | "extract-zip": "^1.6.5", 762 | "fs-extra": "^1.0.0", 763 | "hasha": "^2.2.0", 764 | "kew": "^0.7.0", 765 | "progress": "^1.1.8", 766 | "request": "^2.81.0", 767 | "request-progress": "^2.0.1", 768 | "which": "^1.2.10" 769 | } 770 | }, 771 | "pinkie": { 772 | "version": "2.0.4", 773 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 774 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 775 | "dev": true, 776 | "optional": true 777 | }, 778 | "pinkie-promise": { 779 | "version": "2.0.1", 780 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 781 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 782 | "dev": true, 783 | "optional": true, 784 | "requires": { 785 | "pinkie": "^2.0.0" 786 | } 787 | }, 788 | "process-nextick-args": { 789 | "version": "2.0.0", 790 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 791 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 792 | "dev": true, 793 | "optional": true 794 | }, 795 | "progress": { 796 | "version": "1.1.8", 797 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 798 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 799 | "dev": true, 800 | "optional": true 801 | }, 802 | "psl": { 803 | "version": "1.1.29", 804 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 805 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", 806 | "dev": true, 807 | "optional": true 808 | }, 809 | "punycode": { 810 | "version": "1.4.1", 811 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 812 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 813 | "dev": true, 814 | "optional": true 815 | }, 816 | "qs": { 817 | "version": "6.5.2", 818 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 819 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 820 | "dev": true, 821 | "optional": true 822 | }, 823 | "readable-stream": { 824 | "version": "1.1.14", 825 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 826 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 827 | "dev": true, 828 | "requires": { 829 | "core-util-is": "~1.0.0", 830 | "inherits": "~2.0.1", 831 | "isarray": "0.0.1", 832 | "string_decoder": "~0.10.x" 833 | } 834 | }, 835 | "request": { 836 | "version": "2.88.0", 837 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 838 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 839 | "dev": true, 840 | "optional": true, 841 | "requires": { 842 | "aws-sign2": "~0.7.0", 843 | "aws4": "^1.8.0", 844 | "caseless": "~0.12.0", 845 | "combined-stream": "~1.0.6", 846 | "extend": "~3.0.2", 847 | "forever-agent": "~0.6.1", 848 | "form-data": "~2.3.2", 849 | "har-validator": "~5.1.0", 850 | "http-signature": "~1.2.0", 851 | "is-typedarray": "~1.0.0", 852 | "isstream": "~0.1.2", 853 | "json-stringify-safe": "~5.0.1", 854 | "mime-types": "~2.1.19", 855 | "oauth-sign": "~0.9.0", 856 | "performance-now": "^2.1.0", 857 | "qs": "~6.5.2", 858 | "safe-buffer": "^5.1.2", 859 | "tough-cookie": "~2.4.3", 860 | "tunnel-agent": "^0.6.0", 861 | "uuid": "^3.3.2" 862 | }, 863 | "dependencies": { 864 | "mime-db": { 865 | "version": "1.36.0", 866 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", 867 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", 868 | "dev": true, 869 | "optional": true 870 | }, 871 | "mime-types": { 872 | "version": "2.1.20", 873 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", 874 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", 875 | "dev": true, 876 | "optional": true, 877 | "requires": { 878 | "mime-db": "~1.36.0" 879 | } 880 | } 881 | } 882 | }, 883 | "request-progress": { 884 | "version": "2.0.1", 885 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", 886 | "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", 887 | "dev": true, 888 | "optional": true, 889 | "requires": { 890 | "throttleit": "^1.0.0" 891 | } 892 | }, 893 | "safe-buffer": { 894 | "version": "5.1.2", 895 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 896 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 897 | "dev": true 898 | }, 899 | "safer-buffer": { 900 | "version": "2.1.2", 901 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 902 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 903 | "dev": true 904 | }, 905 | "shelljs": { 906 | "version": "0.3.0", 907 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", 908 | "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", 909 | "dev": true 910 | }, 911 | "source-map": { 912 | "version": "0.6.1", 913 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 914 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 915 | "dev": true 916 | }, 917 | "split": { 918 | "version": "1.0.1", 919 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 920 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 921 | "dev": true, 922 | "optional": true, 923 | "requires": { 924 | "through": "2" 925 | } 926 | }, 927 | "sshpk": { 928 | "version": "1.14.2", 929 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", 930 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", 931 | "dev": true, 932 | "optional": true, 933 | "requires": { 934 | "asn1": "~0.2.3", 935 | "assert-plus": "^1.0.0", 936 | "bcrypt-pbkdf": "^1.0.0", 937 | "dashdash": "^1.12.0", 938 | "ecc-jsbn": "~0.1.1", 939 | "getpass": "^0.1.1", 940 | "jsbn": "~0.1.0", 941 | "safer-buffer": "^2.0.2", 942 | "tweetnacl": "~0.14.0" 943 | } 944 | }, 945 | "stack-trace": { 946 | "version": "0.0.10", 947 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 948 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", 949 | "dev": true, 950 | "optional": true 951 | }, 952 | "string_decoder": { 953 | "version": "0.10.31", 954 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 955 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 956 | "dev": true 957 | }, 958 | "strip-json-comments": { 959 | "version": "1.0.4", 960 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", 961 | "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", 962 | "dev": true 963 | }, 964 | "throttleit": { 965 | "version": "1.0.0", 966 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 967 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 968 | "dev": true, 969 | "optional": true 970 | }, 971 | "through": { 972 | "version": "2.3.8", 973 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 974 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 975 | "dev": true, 976 | "optional": true 977 | }, 978 | "tiny-cdn": { 979 | "version": "0.7.0", 980 | "resolved": "https://registry.npmjs.org/tiny-cdn/-/tiny-cdn-0.7.0.tgz", 981 | "integrity": "sha1-NqxMHkPDFab+oB0bBKqq8sXGE5A=", 982 | "dev": true, 983 | "requires": { 984 | "holdon": "*", 985 | "mime-types": "*" 986 | } 987 | }, 988 | "tough-cookie": { 989 | "version": "2.4.3", 990 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 991 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 992 | "dev": true, 993 | "optional": true, 994 | "requires": { 995 | "psl": "^1.1.24", 996 | "punycode": "^1.4.1" 997 | } 998 | }, 999 | "tunnel-agent": { 1000 | "version": "0.6.0", 1001 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1002 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1003 | "dev": true, 1004 | "optional": true, 1005 | "requires": { 1006 | "safe-buffer": "^5.0.1" 1007 | } 1008 | }, 1009 | "tweetnacl": { 1010 | "version": "0.14.5", 1011 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1012 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1013 | "dev": true, 1014 | "optional": true 1015 | }, 1016 | "typedarray": { 1017 | "version": "0.0.6", 1018 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1019 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1020 | "dev": true, 1021 | "optional": true 1022 | }, 1023 | "uglify-js": { 1024 | "version": "3.4.9", 1025 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", 1026 | "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", 1027 | "dev": true, 1028 | "requires": { 1029 | "commander": "~2.17.1", 1030 | "source-map": "~0.6.1" 1031 | } 1032 | }, 1033 | "unicode-5.2.0": { 1034 | "version": "0.7.5", 1035 | "resolved": "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz", 1036 | "integrity": "sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==", 1037 | "dev": true 1038 | }, 1039 | "util-deprecate": { 1040 | "version": "1.0.2", 1041 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1042 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1043 | "dev": true, 1044 | "optional": true 1045 | }, 1046 | "uuid": { 1047 | "version": "3.3.2", 1048 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1049 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 1050 | "dev": true, 1051 | "optional": true 1052 | }, 1053 | "verror": { 1054 | "version": "1.10.0", 1055 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1056 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1057 | "dev": true, 1058 | "optional": true, 1059 | "requires": { 1060 | "assert-plus": "^1.0.0", 1061 | "core-util-is": "1.0.2", 1062 | "extsprintf": "^1.2.0" 1063 | } 1064 | }, 1065 | "which": { 1066 | "version": "1.3.1", 1067 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1068 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1069 | "dev": true, 1070 | "optional": true, 1071 | "requires": { 1072 | "isexe": "^2.0.0" 1073 | } 1074 | }, 1075 | "winston": { 1076 | "version": "2.4.4", 1077 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", 1078 | "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", 1079 | "dev": true, 1080 | "optional": true, 1081 | "requires": { 1082 | "async": "~1.0.0", 1083 | "colors": "1.0.x", 1084 | "cycle": "1.0.x", 1085 | "eyes": "0.1.x", 1086 | "isstream": "0.1.x", 1087 | "stack-trace": "0.0.x" 1088 | } 1089 | }, 1090 | "wrappy": { 1091 | "version": "1.0.2", 1092 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1093 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1094 | "dev": true 1095 | }, 1096 | "wru": { 1097 | "version": "0.3.0", 1098 | "resolved": "https://registry.npmjs.org/wru/-/wru-0.3.0.tgz", 1099 | "integrity": "sha1-LwQgjH6vwhFRLaXwR/BqoAMrTDg=", 1100 | "dev": true 1101 | }, 1102 | "yauzl": { 1103 | "version": "2.4.1", 1104 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 1105 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 1106 | "dev": true, 1107 | "optional": true, 1108 | "requires": { 1109 | "fd-slicer": "~1.0.1" 1110 | } 1111 | } 1112 | } 1113 | } 1114 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.1.0", 3 | "license": "MIT", 4 | "name": "url-search-params", 5 | "description": "Simple polyfill for URLSearchParams standard", 6 | "homepage": "https://github.com/WebReflection/url-search-params", 7 | "keywords": [ 8 | "DOM", 9 | "URLSearchParams", 10 | "polyfill", 11 | "shim" 12 | ], 13 | "author": { 14 | "name": "Andrea Giammarchi", 15 | "web": "http://webreflection.blogspot.com/" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git://github.com/WebReflection/url-search-params.git" 20 | }, 21 | "unpkg": "build/url-search-params.js", 22 | "main": "build/url-search-params.node.js", 23 | "scripts": { 24 | "test": "node test/.test.js" 25 | }, 26 | "devDependencies": { 27 | "jshint": "^2.9.6", 28 | "tiny-cdn": "^0.7.0", 29 | "uglify-js": "^3.4.9", 30 | "wru": "^0.3.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/upgrades.js: -------------------------------------------------------------------------------- 1 | 2 | upgradeClass(HTMLAnchorElement); 3 | if (/^function|object$/.test(typeof URL) && URL.prototype) upgradeClass(URL); 4 | 5 | /* 6 | 7 | function spUpdate(a) { 8 | var 9 | search = this.toString(), 10 | password = a.password, 11 | username = a.username 12 | ; 13 | a.href = ''.concat( 14 | a.protocol, '//', 15 | username, 16 | password ? (':' + password) : '', 17 | username ? '@' : '', 18 | a.host, 19 | a.pathname, 20 | search ? ('?' + search) : '', 21 | a.hash 22 | ); 23 | } 24 | 25 | */ 26 | -------------------------------------------------------------------------------- /src/url-search-params-sort.js: -------------------------------------------------------------------------------- 1 | 2 | (function (URLSearchParamsProto) { 3 | 4 | var iterable = (function () { 5 | try { 6 | return !!Symbol.iterator; 7 | } catch(error) { 8 | return false; 9 | } 10 | }()); 11 | 12 | // mostly related to issue #24 13 | if (!('forEach' in URLSearchParamsProto)) { 14 | URLSearchParamsProto.forEach = function forEach(callback, thisArg) { 15 | var names = Object.create(null); 16 | this.toString() 17 | .replace(/=[\s\S]*?(?:&|$)/g, '=') 18 | .split('=') 19 | .forEach(function (name) { 20 | if (!name.length || name in names) return; 21 | (names[name] = this.getAll(name)).forEach(function(value) { 22 | callback.call(thisArg, value, name, this); 23 | }, this); 24 | }, this); 25 | }; 26 | } 27 | 28 | if (!('keys' in URLSearchParamsProto)) { 29 | URLSearchParamsProto.keys = function keys() { 30 | var items = []; 31 | this.forEach(function(value, name) { items.push(name); }); 32 | var iterator = { 33 | next: function() { 34 | var value = items.shift(); 35 | return {done: value === undefined, value: value}; 36 | } 37 | }; 38 | 39 | if (iterable) { 40 | iterator[Symbol.iterator] = function() { 41 | return iterator; 42 | }; 43 | } 44 | 45 | return iterator; 46 | }; 47 | } 48 | 49 | if (!('values' in URLSearchParamsProto)) { 50 | URLSearchParamsProto.values = function values() { 51 | var items = []; 52 | this.forEach(function(value) { items.push(value); }); 53 | var iterator = { 54 | next: function() { 55 | var value = items.shift(); 56 | return {done: value === undefined, value: value}; 57 | } 58 | }; 59 | 60 | if (iterable) { 61 | iterator[Symbol.iterator] = function() { 62 | return iterator; 63 | }; 64 | } 65 | 66 | return iterator; 67 | }; 68 | } 69 | 70 | if (!('entries' in URLSearchParamsProto)) { 71 | URLSearchParamsProto.entries = function entries() { 72 | var items = []; 73 | this.forEach(function(value, name) { items.push([name, value]); }); 74 | var iterator = { 75 | next: function() { 76 | var value = items.shift(); 77 | return {done: value === undefined, value: value}; 78 | } 79 | }; 80 | 81 | if (iterable) { 82 | iterator[Symbol.iterator] = function() { 83 | return iterator; 84 | }; 85 | } 86 | 87 | return iterator; 88 | }; 89 | } 90 | 91 | if (iterable && !(Symbol.iterator in URLSearchParamsProto)) { 92 | URLSearchParamsProto[Symbol.iterator] = URLSearchParamsProto.entries; 93 | } 94 | 95 | if (!('sort' in URLSearchParamsProto)) { 96 | URLSearchParamsProto.sort = function sort() { 97 | var 98 | entries = this.entries(), 99 | entry = entries.next(), 100 | done = entry.done, 101 | keys = [], 102 | values = Object.create(null), 103 | i, key, value 104 | ; 105 | while (!done) { 106 | value = entry.value; 107 | key = value[0]; 108 | keys.push(key); 109 | if (!(key in values)) { 110 | values[key] = []; 111 | } 112 | values[key].push(value[1]); 113 | entry = entries.next(); 114 | done = entry.done; 115 | } 116 | // not the champion in efficiency 117 | // but these two bits just do the job 118 | keys.sort(); 119 | for (i = 0; i < keys.length; i++) { 120 | this.delete(keys[i]); 121 | } 122 | for (i = 0; i < keys.length; i++) { 123 | key = keys[i]; 124 | this.append(key, values[key].shift()); 125 | } 126 | }; 127 | } 128 | 129 | }(URLSearchParams.prototype)); 130 | -------------------------------------------------------------------------------- /src/url-search-params.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function URLSearchParams(query) { 4 | var 5 | index, key, value, 6 | pairs, i, length, 7 | dict = Object.create(null) 8 | ; 9 | this[secret] = dict; 10 | if (!query) return; 11 | if (typeof query === 'string') { 12 | if (query.charAt(0) === '?') { 13 | query = query.slice(1); 14 | } 15 | for ( 16 | pairs = query.split('&'), 17 | i = 0, 18 | length = pairs.length; i < length; i++ 19 | ) { 20 | value = pairs[i]; 21 | index = value.indexOf('='); 22 | if (-1 < index) { 23 | appendTo( 24 | dict, 25 | decode(value.slice(0, index)), 26 | decode(value.slice(index + 1)) 27 | ); 28 | } else if (value.length){ 29 | appendTo( 30 | dict, 31 | decode(value), 32 | '' 33 | ); 34 | } 35 | } 36 | } else { 37 | if (isArray(query)) { 38 | for ( 39 | i = 0, 40 | length = query.length; i < length; i++ 41 | ) { 42 | value = query[i]; 43 | appendTo(dict, value[0], value[1]); 44 | } 45 | } else if (query.forEach) { 46 | query.forEach(addEach, dict); 47 | } else { 48 | for (key in query) { 49 | appendTo(dict, key, query[key]); 50 | } 51 | } 52 | } 53 | } 54 | 55 | var 56 | isArray = Array.isArray, 57 | URLSearchParamsProto = URLSearchParams.prototype, 58 | find = /[!'\(\)~]|%20|%00/g, 59 | plus = /\+/g, 60 | replace = { 61 | '!': '%21', 62 | "'": '%27', 63 | '(': '%28', 64 | ')': '%29', 65 | '~': '%7E', 66 | '%20': '+', 67 | '%00': '\x00' 68 | }, 69 | replacer = function (match) { 70 | return replace[match]; 71 | }, 72 | secret = '__URLSearchParams__:' + Math.random() 73 | ; 74 | 75 | function addEach(value, key) { 76 | /* jshint validthis:true */ 77 | appendTo(this, key, value); 78 | } 79 | 80 | function appendTo(dict, name, value) { 81 | var res = isArray(value) ? value.join(',') : value; 82 | if (name in dict) 83 | dict[name].push(res); 84 | else 85 | dict[name] = [res]; 86 | } 87 | 88 | function decode(str) { 89 | return decodeURIComponent(str.replace(plus, ' ')); 90 | } 91 | 92 | function encode(str) { 93 | return encodeURIComponent(str).replace(find, replacer); 94 | } 95 | 96 | URLSearchParamsProto.append = function append(name, value) { 97 | appendTo(this[secret], name, value); 98 | }; 99 | 100 | URLSearchParamsProto.delete = function del(name) { 101 | delete this[secret][name]; 102 | }; 103 | 104 | URLSearchParamsProto.get = function get(name) { 105 | var dict = this[secret]; 106 | return name in dict ? dict[name][0] : null; 107 | }; 108 | 109 | URLSearchParamsProto.getAll = function getAll(name) { 110 | var dict = this[secret]; 111 | return name in dict ? dict[name].slice(0) : []; 112 | }; 113 | 114 | URLSearchParamsProto.has = function has(name) { 115 | return name in this[secret]; 116 | }; 117 | 118 | URLSearchParamsProto.set = function set(name, value) { 119 | this[secret][name] = ['' + value]; 120 | }; 121 | 122 | URLSearchParamsProto.forEach = function forEach(callback, thisArg) { 123 | var dict = this[secret]; 124 | Object.getOwnPropertyNames(dict).forEach(function(name) { 125 | dict[name].forEach(function(value) { 126 | callback.call(thisArg, value, name, this); 127 | }, this); 128 | }, this); 129 | }; 130 | 131 | /* 132 | URLSearchParamsProto.toBody = function() { 133 | return new Blob( 134 | [this.toString()], 135 | {type: 'application/x-www-form-urlencoded'} 136 | ); 137 | }; 138 | */ 139 | 140 | URLSearchParamsProto.toJSON = function toJSON() { 141 | return {}; 142 | }; 143 | 144 | URLSearchParamsProto.toString = function toString() { 145 | var dict = this[secret], query = [], i, key, name, value; 146 | for (key in dict) { 147 | name = encode(key); 148 | for ( 149 | i = 0, 150 | value = dict[key]; 151 | i < value.length; i++ 152 | ) { 153 | query.push(name + '=' + encode(value[i])); 154 | } 155 | } 156 | return query.join('&'); 157 | }; 158 | -------------------------------------------------------------------------------- /src/utilities.js: -------------------------------------------------------------------------------- 1 | var 2 | dP = Object.defineProperty, 3 | gOPD = Object.getOwnPropertyDescriptor, 4 | createSearchParamsPollute = function (search) { 5 | /*jshint validthis:true */ 6 | function append(name, value) { 7 | URLSearchParamsProto.append.call(this, name, value); 8 | name = this.toString(); 9 | search.set.call(this._usp, name ? ('?' + name) : ''); 10 | } 11 | function del(name) { 12 | URLSearchParamsProto.delete.call(this, name); 13 | name = this.toString(); 14 | search.set.call(this._usp, name ? ('?' + name) : ''); 15 | } 16 | function set(name, value) { 17 | URLSearchParamsProto.set.call(this, name, value); 18 | name = this.toString(); 19 | search.set.call(this._usp, name ? ('?' + name) : ''); 20 | } 21 | return function (sp, value) { 22 | sp.append = append; 23 | sp.delete = del; 24 | sp.set = set; 25 | return dP(sp, '_usp', { 26 | configurable: true, 27 | writable: true, 28 | value: value 29 | }); 30 | }; 31 | }, 32 | createSearchParamsCreate = function (polluteSearchParams) { 33 | return function (obj, sp) { 34 | dP( 35 | obj, '_searchParams', { 36 | configurable: true, 37 | writable: true, 38 | value: polluteSearchParams(sp, obj) 39 | } 40 | ); 41 | return sp; 42 | }; 43 | }, 44 | updateSearchParams = function (sp) { 45 | var append = sp.append; 46 | sp.append = URLSearchParamsProto.append; 47 | URLSearchParams.call(sp, sp._usp.search.slice(1)); 48 | sp.append = append; 49 | }, 50 | verifySearchParams = function (obj, Class) { 51 | if (!(obj instanceof Class)) throw new TypeError( 52 | "'searchParams' accessed on an object that " + 53 | "does not implement interface " + Class.name 54 | ); 55 | }, 56 | upgradeClass = function(Class){ 57 | var 58 | ClassProto = Class.prototype, 59 | searchParams = gOPD(ClassProto, 'searchParams'), 60 | href = gOPD(ClassProto, 'href'), 61 | search = gOPD(ClassProto, 'search'), 62 | createSearchParams 63 | ; 64 | if (!searchParams && search && search.set) { 65 | createSearchParams = createSearchParamsCreate( 66 | createSearchParamsPollute(search) 67 | ); 68 | Object.defineProperties( 69 | ClassProto, 70 | { 71 | href: { 72 | get: function () { 73 | return href.get.call(this); 74 | }, 75 | set: function (value) { 76 | var sp = this._searchParams; 77 | href.set.call(this, value); 78 | if (sp) updateSearchParams(sp); 79 | } 80 | }, 81 | search: { 82 | get: function () { 83 | return search.get.call(this); 84 | }, 85 | set: function (value) { 86 | var sp = this._searchParams; 87 | search.set.call(this, value); 88 | if (sp) updateSearchParams(sp); 89 | } 90 | }, 91 | searchParams: { 92 | get: function () { 93 | verifySearchParams(this, Class); 94 | return this._searchParams || createSearchParams( 95 | this, 96 | new URLSearchParams(this.search.slice(1)) 97 | ); 98 | }, 99 | set: function (sp) { 100 | verifySearchParams(this, Class); 101 | createSearchParams(this, sp); 102 | } 103 | } 104 | } 105 | ); 106 | } 107 | 108 | } 109 | ; -------------------------------------------------------------------------------- /template/amd.after: -------------------------------------------------------------------------------- 1 | 2 | return URLSearchParams; 3 | }); -------------------------------------------------------------------------------- /template/amd.before: -------------------------------------------------------------------------------- 1 | define(function () { 2 | -------------------------------------------------------------------------------- /template/copyright: -------------------------------------------------------------------------------- 1 | /*! (C) Andrea Giammarchi - Mit Style License */ 2 | -------------------------------------------------------------------------------- /template/license.after: -------------------------------------------------------------------------------- 1 | 2 | */ 3 | -------------------------------------------------------------------------------- /template/license.before: -------------------------------------------------------------------------------- 1 | /*! 2 | -------------------------------------------------------------------------------- /template/md.after: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/md.before: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 31 | 32 | -------------------------------------------------------------------------------- /template/node.after: -------------------------------------------------------------------------------- 1 | 2 | URLSearchParams = (module.exports = global.URLSearchParams || URLSearchParams); 3 | -------------------------------------------------------------------------------- /template/node.before: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebReflection/url-search-params/814161e99f1dd4453f3c1dc594bc73da2bd61838/template/node.before -------------------------------------------------------------------------------- /template/var.after: -------------------------------------------------------------------------------- 1 | 2 | return URLSearchParams; 3 | }()); -------------------------------------------------------------------------------- /template/var.before: -------------------------------------------------------------------------------- 1 | var URLSearchParams = URLSearchParams || (function () { 2 | -------------------------------------------------------------------------------- /test/.test.js: -------------------------------------------------------------------------------- 1 | var 2 | fs = require('fs'), 3 | path = require('path'), 4 | spawn = require('child_process').spawn, 5 | modules = path.join(__dirname, '..', 'node_modules', 'wru', 'node', 'program.js'), 6 | tests = [], 7 | ext = /\.js$/, 8 | code = 0, 9 | many = 0; 10 | 11 | function exit($code) { 12 | if ($code) { 13 | code = $code; 14 | } 15 | if (!--many) { 16 | if (!code) { 17 | fs.writeFileSync( 18 | path.join(__dirname, '..', 'index.html'), 19 | fs.readFileSync( 20 | path.join(__dirname, '..', 'index.html'), 21 | 'utf-8' 22 | ).replace(/var TESTS = \[.*?\];/, 'var TESTS = ' + JSON.stringify(tests) + ';'), 23 | 'utf-8' 24 | ); 25 | } 26 | process.exit(code); 27 | } 28 | } 29 | 30 | fs.readdirSync(__dirname).filter(function(file){ 31 | if (ext.test(file) && (fs.existsSync || path.existsSync)(path.join(__dirname, '..', 'src', file))) { 32 | ++many; 33 | tests.push(file.replace(ext, '')); 34 | spawn( 35 | 'node', [modules, path.join('test', file)], { 36 | detached: false, 37 | stdio: [process.stdin, process.stdout, process.stderr] 38 | }).on('exit', exit); 39 | } 40 | }); -------------------------------------------------------------------------------- /test/url-search-params.js: -------------------------------------------------------------------------------- 1 | //remove: 2 | var URLSearchParams = require('../build/url-search-params.node.js'); 3 | //:remove 4 | 5 | wru.test([ 6 | { 7 | name: "main", 8 | test: function () { 9 | wru.assert(/^function|object$/.test(typeof URLSearchParams)); 10 | } 11 | }, { 12 | name: 'basics (including parameters without values)', 13 | test: function () { 14 | var usp = new URLSearchParams('a=1&b=2&c'); 15 | wru.assert('has keys', usp.has('a') && usp.has('b') && usp.has('c')); 16 | wru.assert('a returns right value', usp.get('a') === '1'); 17 | wru.assert('b returns right value', usp.get('b') === '2'); 18 | wru.assert('c returns right value', usp.get('c') === ''); 19 | wru.assert('a getAll returns right value', usp.getAll('a').join(',') === '1'); 20 | wru.assert('b getAll returns right value', usp.getAll('b').join(',') === '2'); 21 | wru.assert('c getAll returns right value', usp.getAll('c').join(',') === ''); 22 | usp.append('a', '3'); 23 | wru.assert('append adds values', usp.getAll('a').join(',') === '1,3'); 24 | wru.assert('append preserves get', usp.get('a') === '1'); 25 | wru.assert('append does not affect others', usp.getAll('b').join(',') === '2' && usp.getAll('c').join(',') === ''); 26 | usp.set('a', '4'); 27 | wru.assert('set overwrites known values', usp.getAll('a').join(',') === '4'); 28 | usp['delete']('a'); 29 | wru.assert('usp can delete', usp.has('a') === false); 30 | wru.assert('usp can return null', usp.get('a') === null); 31 | wru.assert('usp to string works as expected', usp.toString() === 'b=2&c='); 32 | } 33 | }, { 34 | name: 'basics with leading "?"', 35 | test: function () { 36 | var usp = new URLSearchParams('?a=1&b=2'); 37 | wru.assert('has keys', usp.has('a') && usp.has('b')); 38 | wru.assert('a returns right value', usp.get('a') === '1'); 39 | wru.assert('b returns right value', usp.get('b') === '2'); 40 | wru.assert('a getAll returns right value', usp.getAll('a').join(',') === '1'); 41 | wru.assert('b getAll returns right value', usp.getAll('b').join(',') === '2'); 42 | usp.append('a', '3'); 43 | wru.assert('append adds values', usp.getAll('a').join(',') === '1,3'); 44 | wru.assert('append preserves get', usp.get('a') === '1'); 45 | wru.assert('append does not affect others', usp.getAll('b').join(',') === '2'); 46 | usp.set('a', '4'); 47 | wru.assert('set overwrites known values', usp.getAll('a').join(',') === '4'); 48 | usp['delete']('a'); 49 | wru.assert('usp can delete', usp.has('a') === false); 50 | wru.assert('usp can return null', usp.get('a') === null); 51 | wru.assert('usp to string works as expected', usp.toString() === 'b=2'); 52 | } 53 | }, { 54 | name: 'edge cases', 55 | test: function () { 56 | var usp = new URLSearchParams(); 57 | var badString = '\x20\x21\x27\x28\x29\x7E'; 58 | usp.append('a', badString); 59 | wru.assert('correct a value', usp.get('a') === badString); 60 | wru.assert('correct a escaping', usp.toString() === 'a=+%21%27%28%29%7E'); 61 | usp.append(badString, badString); 62 | wru.assert('correct badString value', usp.get(badString) === badString); 63 | usp['delete']('a'); 64 | wru.assert('usp can delete', usp.has('a') === false); 65 | wru.assert('usp can return null', usp.get('a') === null); 66 | wru.assert('correct badString escaping', usp.toString() === '+%21%27%28%29%7E=+%21%27%28%29%7E'); 67 | } 68 | }, { 69 | name: 'parsing when creating', 70 | test: function () { 71 | var unescaped = '!'; 72 | var escaped = encodeURIComponent(unescaped); 73 | var usp = new URLSearchParams(escaped + '=' + unescaped); 74 | wru.assert('correct ! escaping', usp.toString() === '%21=%21'); 75 | wru.assert('correct ! key', usp.has('!')); 76 | wru.assert('correct ! value', usp.get('!') === '!'); 77 | unescaped = '&'; 78 | escaped = encodeURIComponent(unescaped); 79 | usp = new URLSearchParams(escaped + '=' + unescaped); 80 | wru.assert('correct & escaping', usp.toString() === '%26='); 81 | wru.assert('correct & key', usp.has('&')); 82 | wru.assert('correct & value', usp.get('&') === ''); 83 | usp = new URLSearchParams('a=12=3'); 84 | wru.assert('correct escaping', usp.toString() === 'a=12%3D3'); 85 | wru.assert('correct value', usp.get('a') === '12=3'); 86 | } 87 | }, { 88 | name: 'iterating with keys', 89 | test: function () { 90 | var usp = new URLSearchParams('a=1&a=2&b=3'); 91 | var iterator = usp.keys() 92 | 93 | var next = iterator.next(); 94 | wru.assert('correct iterator value', !next.done); 95 | wru.assert('correct iterator value', next.value === 'a'); 96 | 97 | next = iterator.next(); 98 | wru.assert('correct iterator value', !next.done); 99 | wru.assert('correct iterator value', next.value === 'a'); 100 | 101 | next = iterator.next(); 102 | wru.assert('correct iterator value', !next.done); 103 | wru.assert('correct iterator value', next.value === 'b'); 104 | 105 | next = iterator.next(); 106 | wru.assert('correct iterator value', next.done); 107 | wru.assert('correct iterator value', next.value === undefined); 108 | } 109 | }, { 110 | name: 'iterating with values', 111 | test: function () { 112 | var usp = new URLSearchParams('a=1&a=2&b=3'); 113 | var iterator = usp.values() 114 | 115 | var next = iterator.next(); 116 | wru.assert('correct iterator value', !next.done); 117 | wru.assert('correct iterator value', next.value === '1'); 118 | 119 | next = iterator.next(); 120 | wru.assert('correct iterator value', !next.done); 121 | wru.assert('correct iterator value', next.value === '2'); 122 | 123 | next = iterator.next(); 124 | wru.assert('correct iterator value', !next.done); 125 | wru.assert('correct iterator value', next.value === '3'); 126 | 127 | next = iterator.next(); 128 | wru.assert('correct iterator value', next.done); 129 | wru.assert('correct iterator value', next.value === undefined); 130 | } 131 | }, { 132 | name: 'iterating with entries', 133 | test: function () { 134 | var usp = new URLSearchParams('a=1&a=2&b=3'); 135 | var iterator = usp.entries() 136 | 137 | var next = iterator.next(); 138 | wru.assert('correct iterator value', !next.done); 139 | wru.assert('correct iterator value', next.value[0] === 'a' && next.value[1] === '1'); 140 | 141 | next = iterator.next(); 142 | wru.assert('correct iterator value', !next.done); 143 | wru.assert('correct iterator value', next.value[0] === 'a' && next.value[1] === '2'); 144 | 145 | next = iterator.next(); 146 | wru.assert('correct iterator value', !next.done); 147 | wru.assert('correct iterator value', next.value[0] === 'b' && next.value[1] === '3'); 148 | 149 | next = iterator.next(); 150 | wru.assert('correct iterator value', next.done); 151 | wru.assert('correct iterator value', next.value === undefined); 152 | } 153 | }, { 154 | name: 'iterating with forEach', 155 | test: function () { 156 | var usp = new URLSearchParams('a=1&a=2&b=3'); 157 | 158 | var results = []; 159 | usp.forEach(function(value, key, object) { 160 | results.push({value: value, key: key, object: object}); 161 | }); 162 | 163 | wru.assert('correct loop count', results.length === 3); 164 | 165 | wru.assert('correct loop key', results[0].key === 'a'); 166 | wru.assert('correct loop value', results[0].value === '1'); 167 | wru.assert('correct loop object', results[0].object === usp); 168 | 169 | wru.assert('correct loop key', results[1].key === 'a'); 170 | wru.assert('correct loop value', results[1].value === '2'); 171 | wru.assert('correct loop object', results[1].object === usp); 172 | 173 | wru.assert('correct loop key', results[2].key === 'b'); 174 | wru.assert('correct loop value', results[2].value === '3'); 175 | wru.assert('correct loop object', results[2].object === usp); 176 | } 177 | }, { 178 | name: '.sort()', 179 | test: function () { 180 | var usp = new URLSearchParams(); 181 | usp.append('a', 3); 182 | usp.append('b', 2); 183 | usp.append('a', 1); 184 | usp.sort(); 185 | wru.assert('preserved order', usp.toString() === 'a=3&a=1&b=2'); 186 | 187 | // https://url.spec.whatwg.org/#example-searchparams-sort 188 | usp = new URLSearchParams(); 189 | usp.append('q', '🏳️‍🌈'); 190 | usp.append('key', 'e1f7bc78'); 191 | usp.sort(); 192 | wru.assert('correct sort', usp.toString() === 'key=e1f7bc78&q=%F0%9F%8F%B3%EF%B8%8F%E2%80%8D%F0%9F%8C%88'); 193 | } 194 | }, { 195 | name: 'sequence', 196 | test: function () { 197 | var usp = new URLSearchParams([['a', '1'], ['b', '3'], ['a', '2']]); 198 | 199 | var results = []; 200 | usp.forEach(function(value, key, object) { 201 | results.push({value: value, key: key, object: object}); 202 | }); 203 | 204 | wru.assert('correct loop count', results.length === 3); 205 | 206 | results.sort(function (a, b) { 207 | return a.key < b.key ? -1 : (a.key === b.key ? 0 : 1); 208 | }); 209 | 210 | wru.assert('correct loop key', results[0].key === 'a'); 211 | wru.assert('correct loop value', results[0].value === '1'); 212 | wru.assert('correct loop object', results[0].object === usp); 213 | 214 | wru.assert('correct loop key', results[1].key === 'a'); 215 | wru.assert('correct loop value', results[1].value === '2'); 216 | wru.assert('correct loop object', results[1].object === usp); 217 | 218 | wru.assert('correct loop key', results[2].key === 'b'); 219 | wru.assert('correct loop value', results[2].value === '3'); 220 | wru.assert('correct loop object', results[2].object === usp); 221 | } 222 | }, { 223 | name: 'record', 224 | test: function () { 225 | var usp = new URLSearchParams({a: ['1', '2'], b: '3'}); 226 | 227 | var results = []; 228 | usp.forEach(function(value, key, object) { 229 | results.push({value: value, key: key, object: object}); 230 | }); 231 | 232 | wru.assert('correct loop count', results.length === 2); 233 | 234 | wru.assert('correct loop key', results[0].key === 'a'); 235 | wru.assert('correct loop value', results[0].value === '1,2'); 236 | wru.assert('correct loop object', results[0].object === usp); 237 | 238 | wru.assert('correct loop key', results[1].key === 'b'); 239 | wru.assert('correct loop value', results[1].value === '3'); 240 | wru.assert('correct loop object', results[1].object === usp); 241 | } 242 | } 243 | ].concat( 244 | /^function|object$/.test(typeof HTMLAnchorElement) && ('searchParams' in HTMLAnchorElement.prototype) ? 245 | [{ 246 | name: 'HTMLAnchorElement', 247 | test: function () { 248 | var a = document.createElement('a'); 249 | var sp = a.searchParams; 250 | wru.assert('instance exists', sp instanceof URLSearchParams); 251 | wru.assert('sp is an empty string', sp.toString() === ''); 252 | a.href = '?a=1'; 253 | wru.assert('sp changed', sp.toString() === 'a=1'); 254 | sp.append('other', 'value'); 255 | wru.assert('a changed', a.search === '?a=1&other=value'); 256 | } 257 | }] : [] 258 | ).concat( 259 | typeof FormData === 'function' && FormData.prototype.forEach ? 260 | [{ 261 | name: 'FormData', 262 | test: function () { 263 | var formData = new FormData(); 264 | formData.append('some-key', 'some-value'); 265 | formData.append('some-key', 'some-other'); 266 | var sp = new URLSearchParams(formData); 267 | wru.assert('correct values', sp.getAll('some-key').join(',') === 'some-value,some-other'); 268 | } 269 | }] : [] 270 | )); 271 | --------------------------------------------------------------------------------