├── .github └── workflows │ └── nodejs.yml ├── .gitignore ├── Gruntfile.js ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── selector-set.d.ts ├── selector-set.js ├── selector-set.js.flow ├── selector-set.next.d.ts ├── selector-set.next.js ├── selector-set.next.js.flow └── test ├── exemplar-selector-set.js ├── fuzz.js ├── perf.html ├── perf.js ├── test-exemplar.html ├── test-fuzz.html ├── test.html └── unit ├── add.js ├── matches.js └── queryall.js /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/checkout@v1 11 | - name: Use Node.js 10.x 12 | uses: actions/setup-node@v1 13 | with: 14 | node-version: 10.x 15 | - name: npm install 16 | run: npm ci 17 | - name: npm test 18 | run: npm test 19 | env: 20 | CI: true 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 'use strict'; 3 | 4 | grunt.initConfig({ 5 | pkg: grunt.file.readJSON('package.json'), 6 | jshint: { 7 | options: { 8 | curly: true, 9 | eqeqeq: true, 10 | es3: true, 11 | immed: true, 12 | indent: 2, 13 | latedef: true, 14 | newcap: true, 15 | noarg: true, 16 | quotmark: true, 17 | undef: true, 18 | unused: true, 19 | strict: true, 20 | trailing: true, 21 | boss: true, 22 | eqnull: true, 23 | browser: true 24 | }, 25 | grunt: { 26 | src: ['Gruntfile.js'], 27 | options: { 28 | node: true 29 | } 30 | }, 31 | src: { 32 | src: ['selector-set.js'], 33 | options: { 34 | strict: false, 35 | globals: { 36 | define: false, 37 | module: false 38 | } 39 | } 40 | }, 41 | test: { 42 | options: { 43 | globals: { 44 | SelectorSet: false, 45 | module: false, 46 | test: false, 47 | ok: false, 48 | equal: false 49 | } 50 | }, 51 | src: ['test/unit/*.js'] 52 | }, 53 | fuzz: { 54 | options: { 55 | globals: { 56 | SelectorSet: false, 57 | ExemplarSelectorSet: false, 58 | QUnit: false 59 | } 60 | }, 61 | src: ['test/fuzz.js'] 62 | }, 63 | perf: { 64 | options: { 65 | globals: { 66 | Benchmark: false, 67 | d3: false, 68 | SelectorSet: false, 69 | ExemplarSelectorSet: false 70 | } 71 | }, 72 | src: ['test/perf.js'] 73 | } 74 | }, 75 | prettier: { 76 | options: { 77 | singleQuote: true 78 | }, 79 | all: { 80 | src: [ 81 | '.github/**/*.yml', 82 | '*.flow', 83 | '*.js', 84 | '*.json', 85 | '*.md', 86 | '*.ts', 87 | 'test/**/*.html', 88 | 'test/**/*.js' 89 | ] 90 | } 91 | }, 92 | qunit: { 93 | all: ['test/test-exemplar.html', 'test/test.html'], 94 | fuzz: ['test/test-fuzz.html'] 95 | } 96 | }); 97 | 98 | grunt.loadNpmTasks('grunt-contrib-jshint'); 99 | grunt.loadNpmTasks('grunt-contrib-qunit'); 100 | grunt.loadNpmTasks('grunt-prettier'); 101 | 102 | grunt.registerTask('test', ['jshint', 'qunit:all']); 103 | grunt.registerTask('fuzz', ['jshint:fuzz', 'qunit:fuzz']); 104 | grunt.registerTask('default', ['prettier', 'jshint']); 105 | }; 106 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 Joshua Peek 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SelectorSet 2 | 3 | An efficient data structure for matching and querying elements against a large set of CSS selectors. 4 | 5 | ## Usage 6 | 7 | ```javascript 8 | var set = new SelectorSet(); 9 | set.add('#logo'); 10 | set.add('.post'); 11 | set.add('h1'); 12 | 13 | var el = document.createElement('h1'); 14 | set.matches(el); 15 | // => [ { selector: 'h1' } ] 16 | 17 | document.body.appendChild(el); 18 | set.queryAll(document.body); 19 | // => [ { selector: 'h1': elements: [el] } ] 20 | ``` 21 | 22 | An arbitrary `data` object can be associated with each selector to help identify matches. 23 | 24 | ```javascript 25 | var set = new SelectorSet(); 26 | 27 | var data = function setupForm() {}; 28 | set.add('form', data); 29 | 30 | var el = document.createElement('form'); 31 | set.matches(el); 32 | // => [ { selector: 'form', data: setupForm } ] 33 | ``` 34 | 35 | ## Installation 36 | 37 | Available on npm as **selector-set**. 38 | 39 | ``` 40 | $ npm install selector-set 41 | ``` 42 | 43 | Alternatively you can download the single `selector-set.js` file. There are no additional dependencies. 44 | 45 | ``` 46 | $ curl -O https://raw.github.com/josh/selector-set/master/selector-set.js 47 | ``` 48 | 49 | ## Use cases 50 | 51 | ### Batch find calls 52 | 53 | Typical web apps run a bunch of `querySelector` calls on load. 54 | 55 | ```javascript 56 | document.addEventListener('DOMContentLoaded', function() { 57 | var el; 58 | 59 | if ((el = document.querySelector('form.signup'))) { 60 | // ... 61 | } 62 | 63 | if ((el = document.querySelector('#sidebar'))) { 64 | // ... 65 | } 66 | 67 | if ((el = document.querySelector('.menu'))) { 68 | // ... 69 | } 70 | }); 71 | ``` 72 | 73 | Large numbers of `querySelectorAll` calls they are usually made on page load can be batched up for efficiency. Having them in a set also makes it convenient to rerun on changed content. 74 | 75 | ```javascript 76 | var set = new SelectorSet(); 77 | set.add('form.signup', function(form) { 78 | // ... 79 | }); 80 | set.add('#sidebar', function(sidebar) { 81 | // ... 82 | }); 83 | set.add('.menu', function(menu) { 84 | // ... 85 | }); 86 | 87 | document.addEventListener('DOMContentLoaded', function() { 88 | set.queryAll(document).forEach(function(match) { 89 | match.elements.forEach(function(el) { 90 | match.data.call(el, el); 91 | }); 92 | }); 93 | }); 94 | ``` 95 | 96 | ### Match delegated events 97 | 98 | Having a large number of delegated handlers on for a single event can slow it down on every dispatch. Doing one set match against an element is much faster than attempting to iterate and match every selector again and again. 99 | 100 | ```javascript 101 | var handlers = new SelectorSet(); 102 | handlers.add('.menu', function(event) { 103 | // ... 104 | }); 105 | handlers.add('.modal', function(event) { 106 | // ... 107 | }); 108 | 109 | document.addEventListener( 110 | 'click', 111 | function(event) { 112 | handlers.matches(event.target).forEach(function(rule) { 113 | rule.data.call(event.target, event); 114 | }); 115 | }, 116 | false 117 | ); 118 | ``` 119 | 120 | _(This is a trivialized example that doesn't handle propagated matches)_ 121 | 122 | ### Apply CSS rules 123 | 124 | For fun, we could implement CSS style matching and application in pure JS. 125 | 126 | ```javascript 127 | var styles = new SelectorSet(); 128 | styles.add('p', { 129 | fontSize: '12px', 130 | color: 'red' 131 | }); 132 | styles.add('p.item', { 133 | background: 'white' 134 | }); 135 | 136 | // apply matching styles 137 | styles.matches(el).forEach(function(rule) { 138 | for (name in rule.data) el.style[name] = rule.data[name]; 139 | }); 140 | ``` 141 | 142 | Okay, you wouldn't want to ever actually do this. But consider the use case of implementing some sort of CSS property polyfill in pure JS. 143 | 144 | ## Browser Support 145 | 146 | Chrome (latest), Safari (6.0+), Firefox (latest) and IE 9+. 147 | 148 | The main requirement is `querySelectorAll` and some sort of `prefixMatchesSelector` support. You can support older browser versions by supplying your own fallback versions of these functions. 149 | 150 | ```javascript 151 | // Use Sizzle's match and query functions 152 | SelectorSet.prototype.querySelectorAll = Sizzle; 153 | SelectorSet.prototype.matchesSelector = Sizzle.matchesSelector; 154 | 155 | // Or use jQuery's internal Sizzle 156 | SelectorSet.prototype.querySelectorAll = jQuery.find; 157 | SelectorSet.prototype.matchesSelector = jQuery.find.matchesSelector; 158 | ``` 159 | 160 | Using Sizzle will also allow you to use more advanced selectors like `:first`, `:has`, `:input` that do not exist in native `querySelector`. 161 | 162 | ## Development 163 | 164 | Clone the repository from GitHub. 165 | 166 | ``` 167 | $ git clone https://github.com/josh/selector-set 168 | ``` 169 | 170 | You'll need to have [Grunt](http://gruntjs.com) installed. If you don't have the `grunt` executable available, you can install it with: 171 | 172 | ``` 173 | $ npm install -g grunt-cli 174 | ``` 175 | 176 | Now just `cd` into the directory and install the local npm dependencies. 177 | 178 | ``` 179 | $ cd selector-set/ 180 | $ npm install 181 | ``` 182 | 183 | Use `grunt test` to run the test suite. 184 | 185 | ``` 186 | $ grunt test 187 | Running "jshint:all" (jshint) task 188 | >> 5 files lint free. 189 | 190 | Running "qunit:all" (qunit) task 191 | Testing test/test.html .....................OK 192 | >> 100 assertions passed (50ms) 193 | 194 | Done, without errors. 195 | ``` 196 | 197 | ## Implementation 198 | 199 | Actually matching a group of selectors against an element via `Element#matches` or `Sizzle` can actually be slow when you get to matching 100+ selectors. Real world applications tend to follow common selector patterns. This fact and the knowledge of a group of selectors ahead of time allows us to apply some optimizations. 200 | 201 | First, selectors added to the set are quickly analyzed and indexed under a key. This key is derived from a significant part of the right most side of the selector. If the selector targets an id, the id name is used as the key. If theres a class, the class name is used and so forth. The selector is then put into a map indexed by this key. Looking up the key is constant time. 202 | 203 | When its time to match the element against the group. The element's properties are examined for possible keys. These keys are then looked up in the mapping which returns a smaller set of selectors which then perform a full matches test against the element. 204 | 205 | ### Inspired by browsers 206 | 207 | The grouping technique isn't a new idea. In fact, it's how WebKit and Firefox work already. In order to calculate the styles of a single element, a huge number of CSS rules need to be considered. Browsers don't just iterate over every selector and test it. That would be way too slow. 208 | 209 | WebKit has a [`RuleSet`](https://github.com/WebKit/webkit/blob/c0885665302c752230987427d4021b6df634087d/Source/WebCore/css/RuleSet.cpp) class that very much inspired this library. Checkout it's definition of [`RuleSet::findBestRuleSetAndAdd`](https://github.com/WebKit/webkit/blob/c0885665302c752230987427d4021b6df634087d/Source/WebCore/css/RuleSet.cpp#L180-L231) to see how it groups CSS rules by selector category. 210 | 211 | In the future I hope something like WebKit's `RuleSet` could be made directly available to the browser. Not only would be writing it in C++ be faster, having access to a real CSS parser would make it much more robust than this library's hacky regexp matchers. 212 | 213 | ### Profile 214 | 215 | This graph compares selector-set match time to a naive loop that tests each selector every time. 216 | 217 | ![](https://f.cloud.github.com/assets/137/1523467/9370cb62-4bb6-11e3-9649-bce7f24b7042.png) 218 | 219 | As you can see, the set-selector is mostly constant time as the number of selectors in the set grows O(1). But matching every selector every time is linear as to the number selectors O(N). There is a slight overhead to using selector-set when there are only a few selectors (<5). This is something that can be improved, but it maybe pointless to use the set if you only want to match one or two selectors. 220 | 221 | Here is a jsPerf test matching a single element to all of the selectors on github.com. 222 | 223 | http://jsperf.com/selectorset-match 224 | 225 | ### Custom indexes 226 | 227 | Currently, only first class attributes like `id`, `class` and the tag name are indexed. But if you have some sort of application specific attribute you frequently use, you can write your own custom index on the attribute. 228 | 229 | ```javascript 230 | SelectorSet.prototype.indexes.push({ 231 | name: 'data-behavior~=', 232 | selector: function(sel) { 233 | var m; 234 | if ((m = sel.match(/\[data-behaviors~=(\w+)\]/))) { 235 | return m[1]; 236 | } 237 | }, 238 | element: function(el) { 239 | var behaviors = el.getAttribute('data-behavior'); 240 | if (behaviors) { 241 | return behaviors.split(/\s+/); 242 | } 243 | } 244 | }); 245 | ``` 246 | 247 | ## License 248 | 249 | Copyright (c) 2013 Joshua Peek 250 | 251 | Distributed under an MIT-style license. See LICENSE for details. 252 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "selector-set", 3 | "version": "1.1.4", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 11 | "dev": true 12 | }, 13 | "agent-base": { 14 | "version": "4.3.0", 15 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 16 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 17 | "dev": true, 18 | "requires": { 19 | "es6-promisify": "^5.0.0" 20 | } 21 | }, 22 | "ajv": { 23 | "version": "6.10.2", 24 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 25 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 26 | "dev": true, 27 | "requires": { 28 | "fast-deep-equal": "^2.0.1", 29 | "fast-json-stable-stringify": "^2.0.0", 30 | "json-schema-traverse": "^0.4.1", 31 | "uri-js": "^4.2.2" 32 | } 33 | }, 34 | "ansi-styles": { 35 | "version": "3.2.1", 36 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 37 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 38 | "dev": true, 39 | "requires": { 40 | "color-convert": "^1.9.0" 41 | } 42 | }, 43 | "argparse": { 44 | "version": "1.0.10", 45 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 46 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 47 | "dev": true, 48 | "requires": { 49 | "sprintf-js": "~1.0.2" 50 | }, 51 | "dependencies": { 52 | "sprintf-js": { 53 | "version": "1.0.3", 54 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 55 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 56 | "dev": true 57 | } 58 | } 59 | }, 60 | "arr-diff": { 61 | "version": "4.0.0", 62 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 63 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", 64 | "dev": true 65 | }, 66 | "arr-flatten": { 67 | "version": "1.1.0", 68 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 69 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 70 | "dev": true 71 | }, 72 | "arr-union": { 73 | "version": "3.1.0", 74 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 75 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", 76 | "dev": true 77 | }, 78 | "array-each": { 79 | "version": "1.0.1", 80 | "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", 81 | "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", 82 | "dev": true 83 | }, 84 | "array-find-index": { 85 | "version": "1.0.2", 86 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 87 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", 88 | "dev": true 89 | }, 90 | "array-slice": { 91 | "version": "1.1.0", 92 | "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", 93 | "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", 94 | "dev": true 95 | }, 96 | "array-unique": { 97 | "version": "0.3.2", 98 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 99 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", 100 | "dev": true 101 | }, 102 | "asn1": { 103 | "version": "0.2.4", 104 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 105 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 106 | "dev": true, 107 | "requires": { 108 | "safer-buffer": "~2.1.0" 109 | } 110 | }, 111 | "assert-plus": { 112 | "version": "1.0.0", 113 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 114 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 115 | "dev": true 116 | }, 117 | "assign-symbols": { 118 | "version": "1.0.0", 119 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 120 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", 121 | "dev": true 122 | }, 123 | "async": { 124 | "version": "1.5.2", 125 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 126 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 127 | "dev": true 128 | }, 129 | "async-limiter": { 130 | "version": "1.0.1", 131 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 132 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", 133 | "dev": true 134 | }, 135 | "asynckit": { 136 | "version": "0.4.0", 137 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 138 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 139 | "dev": true 140 | }, 141 | "atob": { 142 | "version": "2.1.2", 143 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 144 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", 145 | "dev": true 146 | }, 147 | "aws-sign2": { 148 | "version": "0.7.0", 149 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 150 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 151 | "dev": true 152 | }, 153 | "aws4": { 154 | "version": "1.8.0", 155 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 156 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 157 | "dev": true 158 | }, 159 | "balanced-match": { 160 | "version": "1.0.0", 161 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 162 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 163 | "dev": true 164 | }, 165 | "base": { 166 | "version": "0.11.2", 167 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 168 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 169 | "dev": true, 170 | "requires": { 171 | "cache-base": "^1.0.1", 172 | "class-utils": "^0.3.5", 173 | "component-emitter": "^1.2.1", 174 | "define-property": "^1.0.0", 175 | "isobject": "^3.0.1", 176 | "mixin-deep": "^1.2.0", 177 | "pascalcase": "^0.1.1" 178 | }, 179 | "dependencies": { 180 | "define-property": { 181 | "version": "1.0.0", 182 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 183 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 184 | "dev": true, 185 | "requires": { 186 | "is-descriptor": "^1.0.0" 187 | } 188 | }, 189 | "is-accessor-descriptor": { 190 | "version": "1.0.0", 191 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 192 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 193 | "dev": true, 194 | "requires": { 195 | "kind-of": "^6.0.0" 196 | } 197 | }, 198 | "is-data-descriptor": { 199 | "version": "1.0.0", 200 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 201 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 202 | "dev": true, 203 | "requires": { 204 | "kind-of": "^6.0.0" 205 | } 206 | }, 207 | "is-descriptor": { 208 | "version": "1.0.2", 209 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 210 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 211 | "dev": true, 212 | "requires": { 213 | "is-accessor-descriptor": "^1.0.0", 214 | "is-data-descriptor": "^1.0.0", 215 | "kind-of": "^6.0.2" 216 | } 217 | } 218 | } 219 | }, 220 | "bcrypt-pbkdf": { 221 | "version": "1.0.2", 222 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 223 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 224 | "dev": true, 225 | "requires": { 226 | "tweetnacl": "^0.14.3" 227 | } 228 | }, 229 | "benchmark": { 230 | "version": "1.0.0", 231 | "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", 232 | "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", 233 | "dev": true 234 | }, 235 | "brace-expansion": { 236 | "version": "1.1.11", 237 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 238 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 239 | "dev": true, 240 | "requires": { 241 | "balanced-match": "^1.0.0", 242 | "concat-map": "0.0.1" 243 | } 244 | }, 245 | "braces": { 246 | "version": "2.3.2", 247 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 248 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 249 | "dev": true, 250 | "requires": { 251 | "arr-flatten": "^1.1.0", 252 | "array-unique": "^0.3.2", 253 | "extend-shallow": "^2.0.1", 254 | "fill-range": "^4.0.0", 255 | "isobject": "^3.0.1", 256 | "repeat-element": "^1.1.2", 257 | "snapdragon": "^0.8.1", 258 | "snapdragon-node": "^2.0.1", 259 | "split-string": "^3.0.2", 260 | "to-regex": "^3.0.1" 261 | }, 262 | "dependencies": { 263 | "extend-shallow": { 264 | "version": "2.0.1", 265 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 266 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 267 | "dev": true, 268 | "requires": { 269 | "is-extendable": "^0.1.0" 270 | } 271 | } 272 | } 273 | }, 274 | "buffer-from": { 275 | "version": "1.1.1", 276 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 277 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 278 | "dev": true 279 | }, 280 | "cache-base": { 281 | "version": "1.0.1", 282 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 283 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 284 | "dev": true, 285 | "requires": { 286 | "collection-visit": "^1.0.0", 287 | "component-emitter": "^1.2.1", 288 | "get-value": "^2.0.6", 289 | "has-value": "^1.0.0", 290 | "isobject": "^3.0.1", 291 | "set-value": "^2.0.0", 292 | "to-object-path": "^0.3.0", 293 | "union-value": "^1.0.0", 294 | "unset-value": "^1.0.0" 295 | } 296 | }, 297 | "camelcase": { 298 | "version": "2.1.1", 299 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 300 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", 301 | "dev": true 302 | }, 303 | "camelcase-keys": { 304 | "version": "2.1.0", 305 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 306 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 307 | "dev": true, 308 | "requires": { 309 | "camelcase": "^2.0.0", 310 | "map-obj": "^1.0.0" 311 | } 312 | }, 313 | "caseless": { 314 | "version": "0.12.0", 315 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 316 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 317 | "dev": true 318 | }, 319 | "chalk": { 320 | "version": "2.4.2", 321 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 322 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 323 | "dev": true, 324 | "requires": { 325 | "ansi-styles": "^3.2.1", 326 | "escape-string-regexp": "^1.0.5", 327 | "supports-color": "^5.3.0" 328 | } 329 | }, 330 | "class-utils": { 331 | "version": "0.3.6", 332 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 333 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 334 | "dev": true, 335 | "requires": { 336 | "arr-union": "^3.1.0", 337 | "define-property": "^0.2.5", 338 | "isobject": "^3.0.0", 339 | "static-extend": "^0.1.1" 340 | }, 341 | "dependencies": { 342 | "define-property": { 343 | "version": "0.2.5", 344 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 345 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 346 | "dev": true, 347 | "requires": { 348 | "is-descriptor": "^0.1.0" 349 | } 350 | } 351 | } 352 | }, 353 | "cli": { 354 | "version": "1.0.1", 355 | "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", 356 | "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", 357 | "dev": true, 358 | "requires": { 359 | "exit": "0.1.2", 360 | "glob": "^7.1.1" 361 | } 362 | }, 363 | "coffeescript": { 364 | "version": "1.10.0", 365 | "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", 366 | "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", 367 | "dev": true 368 | }, 369 | "collection-visit": { 370 | "version": "1.0.0", 371 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 372 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 373 | "dev": true, 374 | "requires": { 375 | "map-visit": "^1.0.0", 376 | "object-visit": "^1.0.0" 377 | } 378 | }, 379 | "color-convert": { 380 | "version": "1.9.3", 381 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 382 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 383 | "dev": true, 384 | "requires": { 385 | "color-name": "1.1.3" 386 | } 387 | }, 388 | "color-name": { 389 | "version": "1.1.3", 390 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 391 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 392 | "dev": true 393 | }, 394 | "colors": { 395 | "version": "1.1.2", 396 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 397 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", 398 | "dev": true 399 | }, 400 | "combined-stream": { 401 | "version": "1.0.8", 402 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 403 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 404 | "dev": true, 405 | "requires": { 406 | "delayed-stream": "~1.0.0" 407 | } 408 | }, 409 | "component-emitter": { 410 | "version": "1.3.0", 411 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 412 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", 413 | "dev": true 414 | }, 415 | "concat-map": { 416 | "version": "0.0.1", 417 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 418 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 419 | "dev": true 420 | }, 421 | "concat-stream": { 422 | "version": "1.6.2", 423 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 424 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 425 | "dev": true, 426 | "requires": { 427 | "buffer-from": "^1.0.0", 428 | "inherits": "^2.0.3", 429 | "readable-stream": "^2.2.2", 430 | "typedarray": "^0.0.6" 431 | }, 432 | "dependencies": { 433 | "isarray": { 434 | "version": "1.0.0", 435 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 436 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 437 | "dev": true 438 | }, 439 | "readable-stream": { 440 | "version": "2.3.6", 441 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 442 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 443 | "dev": true, 444 | "requires": { 445 | "core-util-is": "~1.0.0", 446 | "inherits": "~2.0.3", 447 | "isarray": "~1.0.0", 448 | "process-nextick-args": "~2.0.0", 449 | "safe-buffer": "~5.1.1", 450 | "string_decoder": "~1.1.1", 451 | "util-deprecate": "~1.0.1" 452 | } 453 | }, 454 | "string_decoder": { 455 | "version": "1.1.1", 456 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 457 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 458 | "dev": true, 459 | "requires": { 460 | "safe-buffer": "~5.1.0" 461 | } 462 | } 463 | } 464 | }, 465 | "console-browserify": { 466 | "version": "1.1.0", 467 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 468 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 469 | "dev": true, 470 | "requires": { 471 | "date-now": "^0.1.4" 472 | } 473 | }, 474 | "copy-descriptor": { 475 | "version": "0.1.1", 476 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 477 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", 478 | "dev": true 479 | }, 480 | "core-util-is": { 481 | "version": "1.0.2", 482 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 483 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 484 | "dev": true 485 | }, 486 | "currently-unhandled": { 487 | "version": "0.4.1", 488 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 489 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 490 | "dev": true, 491 | "requires": { 492 | "array-find-index": "^1.0.1" 493 | } 494 | }, 495 | "d3": { 496 | "version": "3.5.17", 497 | "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", 498 | "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", 499 | "dev": true 500 | }, 501 | "dashdash": { 502 | "version": "1.14.1", 503 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 504 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 505 | "dev": true, 506 | "requires": { 507 | "assert-plus": "^1.0.0" 508 | } 509 | }, 510 | "date-now": { 511 | "version": "0.1.4", 512 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 513 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 514 | "dev": true 515 | }, 516 | "dateformat": { 517 | "version": "1.0.12", 518 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", 519 | "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", 520 | "dev": true, 521 | "requires": { 522 | "get-stdin": "^4.0.1", 523 | "meow": "^3.3.0" 524 | } 525 | }, 526 | "debug": { 527 | "version": "4.1.1", 528 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 529 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 530 | "dev": true, 531 | "requires": { 532 | "ms": "^2.1.1" 533 | } 534 | }, 535 | "decamelize": { 536 | "version": "1.2.0", 537 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 538 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 539 | "dev": true 540 | }, 541 | "decode-uri-component": { 542 | "version": "0.2.0", 543 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 544 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 545 | "dev": true 546 | }, 547 | "define-property": { 548 | "version": "2.0.2", 549 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 550 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 551 | "dev": true, 552 | "requires": { 553 | "is-descriptor": "^1.0.2", 554 | "isobject": "^3.0.1" 555 | }, 556 | "dependencies": { 557 | "is-accessor-descriptor": { 558 | "version": "1.0.0", 559 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 560 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 561 | "dev": true, 562 | "requires": { 563 | "kind-of": "^6.0.0" 564 | } 565 | }, 566 | "is-data-descriptor": { 567 | "version": "1.0.0", 568 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 569 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 570 | "dev": true, 571 | "requires": { 572 | "kind-of": "^6.0.0" 573 | } 574 | }, 575 | "is-descriptor": { 576 | "version": "1.0.2", 577 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 578 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 579 | "dev": true, 580 | "requires": { 581 | "is-accessor-descriptor": "^1.0.0", 582 | "is-data-descriptor": "^1.0.0", 583 | "kind-of": "^6.0.2" 584 | } 585 | } 586 | } 587 | }, 588 | "delayed-stream": { 589 | "version": "1.0.0", 590 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 591 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 592 | "dev": true 593 | }, 594 | "detect-file": { 595 | "version": "1.0.0", 596 | "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", 597 | "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", 598 | "dev": true 599 | }, 600 | "dom-serializer": { 601 | "version": "0.2.1", 602 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", 603 | "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", 604 | "dev": true, 605 | "requires": { 606 | "domelementtype": "^2.0.1", 607 | "entities": "^2.0.0" 608 | }, 609 | "dependencies": { 610 | "domelementtype": { 611 | "version": "2.0.1", 612 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", 613 | "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", 614 | "dev": true 615 | }, 616 | "entities": { 617 | "version": "2.0.0", 618 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", 619 | "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", 620 | "dev": true 621 | } 622 | } 623 | }, 624 | "domelementtype": { 625 | "version": "1.3.1", 626 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", 627 | "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", 628 | "dev": true 629 | }, 630 | "domhandler": { 631 | "version": "2.3.0", 632 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", 633 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", 634 | "dev": true, 635 | "requires": { 636 | "domelementtype": "1" 637 | } 638 | }, 639 | "domutils": { 640 | "version": "1.5.1", 641 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 642 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 643 | "dev": true, 644 | "requires": { 645 | "dom-serializer": "0", 646 | "domelementtype": "1" 647 | } 648 | }, 649 | "ecc-jsbn": { 650 | "version": "0.1.2", 651 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 652 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 653 | "dev": true, 654 | "requires": { 655 | "jsbn": "~0.1.0", 656 | "safer-buffer": "^2.1.0" 657 | } 658 | }, 659 | "entities": { 660 | "version": "1.0.0", 661 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", 662 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", 663 | "dev": true 664 | }, 665 | "error-ex": { 666 | "version": "1.3.2", 667 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 668 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 669 | "dev": true, 670 | "requires": { 671 | "is-arrayish": "^0.2.1" 672 | } 673 | }, 674 | "es6-promise": { 675 | "version": "4.2.8", 676 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 677 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 678 | "dev": true 679 | }, 680 | "es6-promisify": { 681 | "version": "5.0.0", 682 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 683 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 684 | "dev": true, 685 | "requires": { 686 | "es6-promise": "^4.0.3" 687 | } 688 | }, 689 | "escape-string-regexp": { 690 | "version": "1.0.5", 691 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 692 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 693 | "dev": true 694 | }, 695 | "esprima": { 696 | "version": "4.0.1", 697 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 698 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 699 | "dev": true 700 | }, 701 | "eventemitter2": { 702 | "version": "0.4.14", 703 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 704 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", 705 | "dev": true 706 | }, 707 | "exit": { 708 | "version": "0.1.2", 709 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 710 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 711 | "dev": true 712 | }, 713 | "expand-brackets": { 714 | "version": "2.1.4", 715 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 716 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 717 | "dev": true, 718 | "requires": { 719 | "debug": "^2.3.3", 720 | "define-property": "^0.2.5", 721 | "extend-shallow": "^2.0.1", 722 | "posix-character-classes": "^0.1.0", 723 | "regex-not": "^1.0.0", 724 | "snapdragon": "^0.8.1", 725 | "to-regex": "^3.0.1" 726 | }, 727 | "dependencies": { 728 | "debug": { 729 | "version": "2.6.9", 730 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 731 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 732 | "dev": true, 733 | "requires": { 734 | "ms": "2.0.0" 735 | } 736 | }, 737 | "define-property": { 738 | "version": "0.2.5", 739 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 740 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 741 | "dev": true, 742 | "requires": { 743 | "is-descriptor": "^0.1.0" 744 | } 745 | }, 746 | "extend-shallow": { 747 | "version": "2.0.1", 748 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 749 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 750 | "dev": true, 751 | "requires": { 752 | "is-extendable": "^0.1.0" 753 | } 754 | }, 755 | "ms": { 756 | "version": "2.0.0", 757 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 758 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 759 | "dev": true 760 | } 761 | } 762 | }, 763 | "expand-tilde": { 764 | "version": "2.0.2", 765 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", 766 | "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", 767 | "dev": true, 768 | "requires": { 769 | "homedir-polyfill": "^1.0.1" 770 | } 771 | }, 772 | "extend": { 773 | "version": "3.0.2", 774 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 775 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 776 | "dev": true 777 | }, 778 | "extend-shallow": { 779 | "version": "3.0.2", 780 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 781 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 782 | "dev": true, 783 | "requires": { 784 | "assign-symbols": "^1.0.0", 785 | "is-extendable": "^1.0.1" 786 | }, 787 | "dependencies": { 788 | "is-extendable": { 789 | "version": "1.0.1", 790 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 791 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 792 | "dev": true, 793 | "requires": { 794 | "is-plain-object": "^2.0.4" 795 | } 796 | } 797 | } 798 | }, 799 | "extglob": { 800 | "version": "2.0.4", 801 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 802 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 803 | "dev": true, 804 | "requires": { 805 | "array-unique": "^0.3.2", 806 | "define-property": "^1.0.0", 807 | "expand-brackets": "^2.1.4", 808 | "extend-shallow": "^2.0.1", 809 | "fragment-cache": "^0.2.1", 810 | "regex-not": "^1.0.0", 811 | "snapdragon": "^0.8.1", 812 | "to-regex": "^3.0.1" 813 | }, 814 | "dependencies": { 815 | "define-property": { 816 | "version": "1.0.0", 817 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 818 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 819 | "dev": true, 820 | "requires": { 821 | "is-descriptor": "^1.0.0" 822 | } 823 | }, 824 | "extend-shallow": { 825 | "version": "2.0.1", 826 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 827 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 828 | "dev": true, 829 | "requires": { 830 | "is-extendable": "^0.1.0" 831 | } 832 | }, 833 | "is-accessor-descriptor": { 834 | "version": "1.0.0", 835 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 836 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 837 | "dev": true, 838 | "requires": { 839 | "kind-of": "^6.0.0" 840 | } 841 | }, 842 | "is-data-descriptor": { 843 | "version": "1.0.0", 844 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 845 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 846 | "dev": true, 847 | "requires": { 848 | "kind-of": "^6.0.0" 849 | } 850 | }, 851 | "is-descriptor": { 852 | "version": "1.0.2", 853 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 854 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 855 | "dev": true, 856 | "requires": { 857 | "is-accessor-descriptor": "^1.0.0", 858 | "is-data-descriptor": "^1.0.0", 859 | "kind-of": "^6.0.2" 860 | } 861 | } 862 | } 863 | }, 864 | "extract-zip": { 865 | "version": "1.6.7", 866 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", 867 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", 868 | "dev": true, 869 | "requires": { 870 | "concat-stream": "1.6.2", 871 | "debug": "2.6.9", 872 | "mkdirp": "0.5.1", 873 | "yauzl": "2.4.1" 874 | }, 875 | "dependencies": { 876 | "debug": { 877 | "version": "2.6.9", 878 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 879 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 880 | "dev": true, 881 | "requires": { 882 | "ms": "2.0.0" 883 | } 884 | }, 885 | "ms": { 886 | "version": "2.0.0", 887 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 888 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 889 | "dev": true 890 | } 891 | } 892 | }, 893 | "extsprintf": { 894 | "version": "1.3.0", 895 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 896 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 897 | "dev": true 898 | }, 899 | "fast-deep-equal": { 900 | "version": "2.0.1", 901 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 902 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 903 | "dev": true 904 | }, 905 | "fast-json-stable-stringify": { 906 | "version": "2.0.0", 907 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 908 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 909 | "dev": true 910 | }, 911 | "fd-slicer": { 912 | "version": "1.0.1", 913 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 914 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 915 | "dev": true, 916 | "requires": { 917 | "pend": "~1.2.0" 918 | } 919 | }, 920 | "fill-range": { 921 | "version": "4.0.0", 922 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 923 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 924 | "dev": true, 925 | "requires": { 926 | "extend-shallow": "^2.0.1", 927 | "is-number": "^3.0.0", 928 | "repeat-string": "^1.6.1", 929 | "to-regex-range": "^2.1.0" 930 | }, 931 | "dependencies": { 932 | "extend-shallow": { 933 | "version": "2.0.1", 934 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 935 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 936 | "dev": true, 937 | "requires": { 938 | "is-extendable": "^0.1.0" 939 | } 940 | } 941 | } 942 | }, 943 | "find-up": { 944 | "version": "1.1.2", 945 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 946 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 947 | "dev": true, 948 | "requires": { 949 | "path-exists": "^2.0.0", 950 | "pinkie-promise": "^2.0.0" 951 | } 952 | }, 953 | "findup-sync": { 954 | "version": "0.3.0", 955 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", 956 | "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", 957 | "dev": true, 958 | "requires": { 959 | "glob": "~5.0.0" 960 | }, 961 | "dependencies": { 962 | "glob": { 963 | "version": "5.0.15", 964 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 965 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 966 | "dev": true, 967 | "requires": { 968 | "inflight": "^1.0.4", 969 | "inherits": "2", 970 | "minimatch": "2 || 3", 971 | "once": "^1.3.0", 972 | "path-is-absolute": "^1.0.0" 973 | } 974 | } 975 | } 976 | }, 977 | "fined": { 978 | "version": "1.2.0", 979 | "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", 980 | "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", 981 | "dev": true, 982 | "requires": { 983 | "expand-tilde": "^2.0.2", 984 | "is-plain-object": "^2.0.3", 985 | "object.defaults": "^1.1.0", 986 | "object.pick": "^1.2.0", 987 | "parse-filepath": "^1.0.1" 988 | } 989 | }, 990 | "flagged-respawn": { 991 | "version": "1.0.1", 992 | "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", 993 | "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", 994 | "dev": true 995 | }, 996 | "for-in": { 997 | "version": "1.0.2", 998 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 999 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 1000 | "dev": true 1001 | }, 1002 | "for-own": { 1003 | "version": "1.0.0", 1004 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", 1005 | "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", 1006 | "dev": true, 1007 | "requires": { 1008 | "for-in": "^1.0.1" 1009 | } 1010 | }, 1011 | "forever-agent": { 1012 | "version": "0.6.1", 1013 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1014 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 1015 | "dev": true 1016 | }, 1017 | "form-data": { 1018 | "version": "2.3.3", 1019 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 1020 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 1021 | "dev": true, 1022 | "requires": { 1023 | "asynckit": "^0.4.0", 1024 | "combined-stream": "^1.0.6", 1025 | "mime-types": "^2.1.12" 1026 | } 1027 | }, 1028 | "fragment-cache": { 1029 | "version": "0.2.1", 1030 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 1031 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 1032 | "dev": true, 1033 | "requires": { 1034 | "map-cache": "^0.2.2" 1035 | } 1036 | }, 1037 | "fs-extra": { 1038 | "version": "1.0.0", 1039 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", 1040 | "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", 1041 | "dev": true, 1042 | "requires": { 1043 | "graceful-fs": "^4.1.2", 1044 | "jsonfile": "^2.1.0", 1045 | "klaw": "^1.0.0" 1046 | }, 1047 | "dependencies": { 1048 | "graceful-fs": { 1049 | "version": "4.2.2", 1050 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", 1051 | "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", 1052 | "dev": true 1053 | } 1054 | } 1055 | }, 1056 | "fs.realpath": { 1057 | "version": "1.0.0", 1058 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1059 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1060 | "dev": true 1061 | }, 1062 | "get-stdin": { 1063 | "version": "4.0.1", 1064 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 1065 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 1066 | "dev": true 1067 | }, 1068 | "get-value": { 1069 | "version": "2.0.6", 1070 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 1071 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", 1072 | "dev": true 1073 | }, 1074 | "getobject": { 1075 | "version": "0.1.0", 1076 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", 1077 | "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", 1078 | "dev": true 1079 | }, 1080 | "getpass": { 1081 | "version": "0.1.7", 1082 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1083 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1084 | "dev": true, 1085 | "requires": { 1086 | "assert-plus": "^1.0.0" 1087 | } 1088 | }, 1089 | "glob": { 1090 | "version": "7.1.4", 1091 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 1092 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 1093 | "dev": true, 1094 | "requires": { 1095 | "fs.realpath": "^1.0.0", 1096 | "inflight": "^1.0.4", 1097 | "inherits": "2", 1098 | "minimatch": "^3.0.4", 1099 | "once": "^1.3.0", 1100 | "path-is-absolute": "^1.0.0" 1101 | }, 1102 | "dependencies": { 1103 | "minimatch": { 1104 | "version": "3.0.4", 1105 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1106 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1107 | "dev": true, 1108 | "requires": { 1109 | "brace-expansion": "^1.1.7" 1110 | } 1111 | } 1112 | } 1113 | }, 1114 | "global-modules": { 1115 | "version": "1.0.0", 1116 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", 1117 | "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", 1118 | "dev": true, 1119 | "requires": { 1120 | "global-prefix": "^1.0.1", 1121 | "is-windows": "^1.0.1", 1122 | "resolve-dir": "^1.0.0" 1123 | } 1124 | }, 1125 | "global-prefix": { 1126 | "version": "1.0.2", 1127 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", 1128 | "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", 1129 | "dev": true, 1130 | "requires": { 1131 | "expand-tilde": "^2.0.2", 1132 | "homedir-polyfill": "^1.0.1", 1133 | "ini": "^1.3.4", 1134 | "is-windows": "^1.0.1", 1135 | "which": "^1.2.14" 1136 | }, 1137 | "dependencies": { 1138 | "which": { 1139 | "version": "1.3.1", 1140 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1141 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1142 | "dev": true, 1143 | "requires": { 1144 | "isexe": "^2.0.0" 1145 | } 1146 | } 1147 | } 1148 | }, 1149 | "graceful-fs": { 1150 | "version": "4.2.2", 1151 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", 1152 | "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", 1153 | "dev": true 1154 | }, 1155 | "grunt": { 1156 | "version": "1.0.4", 1157 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", 1158 | "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", 1159 | "dev": true, 1160 | "requires": { 1161 | "coffeescript": "~1.10.0", 1162 | "dateformat": "~1.0.12", 1163 | "eventemitter2": "~0.4.13", 1164 | "exit": "~0.1.1", 1165 | "findup-sync": "~0.3.0", 1166 | "glob": "~7.0.0", 1167 | "grunt-cli": "~1.2.0", 1168 | "grunt-known-options": "~1.1.0", 1169 | "grunt-legacy-log": "~2.0.0", 1170 | "grunt-legacy-util": "~1.1.1", 1171 | "iconv-lite": "~0.4.13", 1172 | "js-yaml": "~3.13.0", 1173 | "minimatch": "~3.0.2", 1174 | "mkdirp": "~0.5.1", 1175 | "nopt": "~3.0.6", 1176 | "path-is-absolute": "~1.0.0", 1177 | "rimraf": "~2.6.2" 1178 | }, 1179 | "dependencies": { 1180 | "glob": { 1181 | "version": "7.0.6", 1182 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", 1183 | "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", 1184 | "dev": true, 1185 | "requires": { 1186 | "fs.realpath": "^1.0.0", 1187 | "inflight": "^1.0.4", 1188 | "inherits": "2", 1189 | "minimatch": "^3.0.2", 1190 | "once": "^1.3.0", 1191 | "path-is-absolute": "^1.0.0" 1192 | } 1193 | }, 1194 | "grunt-cli": { 1195 | "version": "1.2.0", 1196 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", 1197 | "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", 1198 | "dev": true, 1199 | "requires": { 1200 | "findup-sync": "~0.3.0", 1201 | "grunt-known-options": "~1.1.0", 1202 | "nopt": "~3.0.6", 1203 | "resolve": "~1.1.0" 1204 | } 1205 | }, 1206 | "resolve": { 1207 | "version": "1.1.7", 1208 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 1209 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 1210 | "dev": true 1211 | } 1212 | } 1213 | }, 1214 | "grunt-cli": { 1215 | "version": "1.3.2", 1216 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz", 1217 | "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==", 1218 | "dev": true, 1219 | "requires": { 1220 | "grunt-known-options": "~1.1.0", 1221 | "interpret": "~1.1.0", 1222 | "liftoff": "~2.5.0", 1223 | "nopt": "~4.0.1", 1224 | "v8flags": "~3.1.1" 1225 | }, 1226 | "dependencies": { 1227 | "nopt": { 1228 | "version": "4.0.1", 1229 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", 1230 | "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", 1231 | "dev": true, 1232 | "requires": { 1233 | "abbrev": "1", 1234 | "osenv": "^0.1.4" 1235 | } 1236 | } 1237 | } 1238 | }, 1239 | "grunt-contrib-jshint": { 1240 | "version": "2.1.0", 1241 | "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-2.1.0.tgz", 1242 | "integrity": "sha512-65S2/C/6RfjY/umTxfwXXn+wVvaYmykHkHSsW6Q6rhkbv3oudTEgqnFFZvWzWCoHUb+3GMZLbP3oSrNyvshmIQ==", 1243 | "dev": true, 1244 | "requires": { 1245 | "chalk": "^2.4.2", 1246 | "hooker": "^0.2.3", 1247 | "jshint": "~2.10.2" 1248 | } 1249 | }, 1250 | "grunt-contrib-qunit": { 1251 | "version": "3.1.0", 1252 | "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-3.1.0.tgz", 1253 | "integrity": "sha512-mdk8UltH6mxCD63E0hTXMAts42DOi4z4bBBrY7qnuHiShflMF7IueSMYe0zWaZ2dO8mgujh57Zfny2EbigJhRg==", 1254 | "dev": true, 1255 | "requires": { 1256 | "eventemitter2": "^5.0.1", 1257 | "p-each-series": "^1.0.0", 1258 | "puppeteer": "^1.11.0" 1259 | }, 1260 | "dependencies": { 1261 | "eventemitter2": { 1262 | "version": "5.0.1", 1263 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", 1264 | "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=", 1265 | "dev": true 1266 | } 1267 | } 1268 | }, 1269 | "grunt-known-options": { 1270 | "version": "1.1.1", 1271 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", 1272 | "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", 1273 | "dev": true 1274 | }, 1275 | "grunt-legacy-log": { 1276 | "version": "2.0.0", 1277 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", 1278 | "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", 1279 | "dev": true, 1280 | "requires": { 1281 | "colors": "~1.1.2", 1282 | "grunt-legacy-log-utils": "~2.0.0", 1283 | "hooker": "~0.2.3", 1284 | "lodash": "~4.17.5" 1285 | } 1286 | }, 1287 | "grunt-legacy-log-utils": { 1288 | "version": "2.0.1", 1289 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", 1290 | "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", 1291 | "dev": true, 1292 | "requires": { 1293 | "chalk": "~2.4.1", 1294 | "lodash": "~4.17.10" 1295 | } 1296 | }, 1297 | "grunt-legacy-util": { 1298 | "version": "1.1.1", 1299 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", 1300 | "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", 1301 | "dev": true, 1302 | "requires": { 1303 | "async": "~1.5.2", 1304 | "exit": "~0.1.1", 1305 | "getobject": "~0.1.0", 1306 | "hooker": "~0.2.3", 1307 | "lodash": "~4.17.10", 1308 | "underscore.string": "~3.3.4", 1309 | "which": "~1.3.0" 1310 | } 1311 | }, 1312 | "grunt-lib-phantomjs": { 1313 | "version": "1.1.0", 1314 | "resolved": "https://registry.npmjs.org/grunt-lib-phantomjs/-/grunt-lib-phantomjs-1.1.0.tgz", 1315 | "integrity": "sha1-np7c3Z/S3UDgwYHJQ3HVcqpe6tI=", 1316 | "dev": true, 1317 | "requires": { 1318 | "eventemitter2": "^0.4.9", 1319 | "phantomjs-prebuilt": "^2.1.3", 1320 | "rimraf": "^2.5.2", 1321 | "semver": "^5.1.0", 1322 | "temporary": "^0.0.8" 1323 | }, 1324 | "dependencies": { 1325 | "rimraf": { 1326 | "version": "2.7.1", 1327 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1328 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1329 | "dev": true, 1330 | "requires": { 1331 | "glob": "^7.1.3" 1332 | } 1333 | } 1334 | } 1335 | }, 1336 | "grunt-prettier": { 1337 | "version": "1.3.0", 1338 | "resolved": "https://registry.npmjs.org/grunt-prettier/-/grunt-prettier-1.3.0.tgz", 1339 | "integrity": "sha512-iLw60R5A7lyEE2Gw5sqlwYE9AQ+WrChpIFq6/K5qP9CHuN31Yh7EXquJnvUynTJAYl9H77E1Selq9LBSuNKqxQ==", 1340 | "dev": true, 1341 | "requires": { 1342 | "prettier": "^1.16.0", 1343 | "progress": "^2.0.0" 1344 | }, 1345 | "dependencies": { 1346 | "progress": { 1347 | "version": "2.0.3", 1348 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1349 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1350 | "dev": true 1351 | } 1352 | } 1353 | }, 1354 | "har-schema": { 1355 | "version": "2.0.0", 1356 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1357 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 1358 | "dev": true 1359 | }, 1360 | "har-validator": { 1361 | "version": "5.1.3", 1362 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 1363 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 1364 | "dev": true, 1365 | "requires": { 1366 | "ajv": "^6.5.5", 1367 | "har-schema": "^2.0.0" 1368 | } 1369 | }, 1370 | "has-flag": { 1371 | "version": "3.0.0", 1372 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1373 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1374 | "dev": true 1375 | }, 1376 | "has-value": { 1377 | "version": "1.0.0", 1378 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 1379 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1380 | "dev": true, 1381 | "requires": { 1382 | "get-value": "^2.0.6", 1383 | "has-values": "^1.0.0", 1384 | "isobject": "^3.0.0" 1385 | } 1386 | }, 1387 | "has-values": { 1388 | "version": "1.0.0", 1389 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 1390 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 1391 | "dev": true, 1392 | "requires": { 1393 | "is-number": "^3.0.0", 1394 | "kind-of": "^4.0.0" 1395 | }, 1396 | "dependencies": { 1397 | "kind-of": { 1398 | "version": "4.0.0", 1399 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1400 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1401 | "dev": true, 1402 | "requires": { 1403 | "is-buffer": "^1.1.5" 1404 | } 1405 | } 1406 | } 1407 | }, 1408 | "hasha": { 1409 | "version": "2.2.0", 1410 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", 1411 | "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", 1412 | "dev": true, 1413 | "requires": { 1414 | "is-stream": "^1.0.1", 1415 | "pinkie-promise": "^2.0.0" 1416 | } 1417 | }, 1418 | "homedir-polyfill": { 1419 | "version": "1.0.3", 1420 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", 1421 | "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", 1422 | "dev": true, 1423 | "requires": { 1424 | "parse-passwd": "^1.0.0" 1425 | } 1426 | }, 1427 | "hooker": { 1428 | "version": "0.2.3", 1429 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 1430 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", 1431 | "dev": true 1432 | }, 1433 | "hosted-git-info": { 1434 | "version": "2.8.5", 1435 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", 1436 | "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", 1437 | "dev": true 1438 | }, 1439 | "htmlparser2": { 1440 | "version": "3.8.3", 1441 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", 1442 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", 1443 | "dev": true, 1444 | "requires": { 1445 | "domelementtype": "1", 1446 | "domhandler": "2.3", 1447 | "domutils": "1.5", 1448 | "entities": "1.0", 1449 | "readable-stream": "1.1" 1450 | } 1451 | }, 1452 | "http-signature": { 1453 | "version": "1.2.0", 1454 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1455 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1456 | "dev": true, 1457 | "requires": { 1458 | "assert-plus": "^1.0.0", 1459 | "jsprim": "^1.2.2", 1460 | "sshpk": "^1.7.0" 1461 | } 1462 | }, 1463 | "https-proxy-agent": { 1464 | "version": "2.2.2", 1465 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", 1466 | "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", 1467 | "dev": true, 1468 | "requires": { 1469 | "agent-base": "^4.3.0", 1470 | "debug": "^3.1.0" 1471 | }, 1472 | "dependencies": { 1473 | "debug": { 1474 | "version": "3.2.6", 1475 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1476 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1477 | "dev": true, 1478 | "requires": { 1479 | "ms": "^2.1.1" 1480 | } 1481 | } 1482 | } 1483 | }, 1484 | "iconv-lite": { 1485 | "version": "0.4.24", 1486 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1487 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1488 | "dev": true, 1489 | "requires": { 1490 | "safer-buffer": ">= 2.1.2 < 3" 1491 | } 1492 | }, 1493 | "indent-string": { 1494 | "version": "2.1.0", 1495 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 1496 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 1497 | "dev": true, 1498 | "requires": { 1499 | "repeating": "^2.0.0" 1500 | } 1501 | }, 1502 | "inflight": { 1503 | "version": "1.0.6", 1504 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1505 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1506 | "dev": true, 1507 | "requires": { 1508 | "once": "^1.3.0", 1509 | "wrappy": "1" 1510 | } 1511 | }, 1512 | "inherits": { 1513 | "version": "2.0.4", 1514 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1515 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1516 | "dev": true 1517 | }, 1518 | "ini": { 1519 | "version": "1.3.5", 1520 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1521 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 1522 | "dev": true 1523 | }, 1524 | "interpret": { 1525 | "version": "1.1.0", 1526 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", 1527 | "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", 1528 | "dev": true 1529 | }, 1530 | "is-absolute": { 1531 | "version": "1.0.0", 1532 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 1533 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 1534 | "dev": true, 1535 | "requires": { 1536 | "is-relative": "^1.0.0", 1537 | "is-windows": "^1.0.1" 1538 | } 1539 | }, 1540 | "is-accessor-descriptor": { 1541 | "version": "0.1.6", 1542 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1543 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1544 | "dev": true, 1545 | "requires": { 1546 | "kind-of": "^3.0.2" 1547 | }, 1548 | "dependencies": { 1549 | "kind-of": { 1550 | "version": "3.2.2", 1551 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1552 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1553 | "dev": true, 1554 | "requires": { 1555 | "is-buffer": "^1.1.5" 1556 | } 1557 | } 1558 | } 1559 | }, 1560 | "is-arrayish": { 1561 | "version": "0.2.1", 1562 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1563 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1564 | "dev": true 1565 | }, 1566 | "is-buffer": { 1567 | "version": "1.1.6", 1568 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1569 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1570 | "dev": true 1571 | }, 1572 | "is-data-descriptor": { 1573 | "version": "0.1.4", 1574 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1575 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1576 | "dev": true, 1577 | "requires": { 1578 | "kind-of": "^3.0.2" 1579 | }, 1580 | "dependencies": { 1581 | "kind-of": { 1582 | "version": "3.2.2", 1583 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1584 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1585 | "dev": true, 1586 | "requires": { 1587 | "is-buffer": "^1.1.5" 1588 | } 1589 | } 1590 | } 1591 | }, 1592 | "is-descriptor": { 1593 | "version": "0.1.6", 1594 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1595 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1596 | "dev": true, 1597 | "requires": { 1598 | "is-accessor-descriptor": "^0.1.6", 1599 | "is-data-descriptor": "^0.1.4", 1600 | "kind-of": "^5.0.0" 1601 | }, 1602 | "dependencies": { 1603 | "kind-of": { 1604 | "version": "5.1.0", 1605 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1606 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", 1607 | "dev": true 1608 | } 1609 | } 1610 | }, 1611 | "is-extendable": { 1612 | "version": "0.1.1", 1613 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1614 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1615 | "dev": true 1616 | }, 1617 | "is-extglob": { 1618 | "version": "2.1.1", 1619 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1620 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1621 | "dev": true 1622 | }, 1623 | "is-finite": { 1624 | "version": "1.0.2", 1625 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1626 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1627 | "dev": true, 1628 | "requires": { 1629 | "number-is-nan": "^1.0.0" 1630 | } 1631 | }, 1632 | "is-glob": { 1633 | "version": "3.1.0", 1634 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1635 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1636 | "dev": true, 1637 | "requires": { 1638 | "is-extglob": "^2.1.0" 1639 | } 1640 | }, 1641 | "is-number": { 1642 | "version": "3.0.0", 1643 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1644 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1645 | "dev": true, 1646 | "requires": { 1647 | "kind-of": "^3.0.2" 1648 | }, 1649 | "dependencies": { 1650 | "kind-of": { 1651 | "version": "3.2.2", 1652 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1653 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1654 | "dev": true, 1655 | "requires": { 1656 | "is-buffer": "^1.1.5" 1657 | } 1658 | } 1659 | } 1660 | }, 1661 | "is-plain-object": { 1662 | "version": "2.0.4", 1663 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1664 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1665 | "dev": true, 1666 | "requires": { 1667 | "isobject": "^3.0.1" 1668 | } 1669 | }, 1670 | "is-relative": { 1671 | "version": "1.0.0", 1672 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 1673 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 1674 | "dev": true, 1675 | "requires": { 1676 | "is-unc-path": "^1.0.0" 1677 | } 1678 | }, 1679 | "is-stream": { 1680 | "version": "1.1.0", 1681 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1682 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1683 | "dev": true 1684 | }, 1685 | "is-typedarray": { 1686 | "version": "1.0.0", 1687 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1688 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1689 | "dev": true 1690 | }, 1691 | "is-unc-path": { 1692 | "version": "1.0.0", 1693 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 1694 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 1695 | "dev": true, 1696 | "requires": { 1697 | "unc-path-regex": "^0.1.2" 1698 | } 1699 | }, 1700 | "is-utf8": { 1701 | "version": "0.2.1", 1702 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1703 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 1704 | "dev": true 1705 | }, 1706 | "is-windows": { 1707 | "version": "1.0.2", 1708 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1709 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1710 | "dev": true 1711 | }, 1712 | "isarray": { 1713 | "version": "0.0.1", 1714 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1715 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 1716 | "dev": true 1717 | }, 1718 | "isexe": { 1719 | "version": "2.0.0", 1720 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1721 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1722 | "dev": true 1723 | }, 1724 | "isobject": { 1725 | "version": "3.0.1", 1726 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1727 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 1728 | "dev": true 1729 | }, 1730 | "isstream": { 1731 | "version": "0.1.2", 1732 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1733 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1734 | "dev": true 1735 | }, 1736 | "js-yaml": { 1737 | "version": "3.13.1", 1738 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1739 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1740 | "dev": true, 1741 | "requires": { 1742 | "argparse": "^1.0.7", 1743 | "esprima": "^4.0.0" 1744 | } 1745 | }, 1746 | "jsbn": { 1747 | "version": "0.1.1", 1748 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1749 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1750 | "dev": true 1751 | }, 1752 | "jshint": { 1753 | "version": "2.10.2", 1754 | "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz", 1755 | "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==", 1756 | "dev": true, 1757 | "requires": { 1758 | "cli": "~1.0.0", 1759 | "console-browserify": "1.1.x", 1760 | "exit": "0.1.x", 1761 | "htmlparser2": "3.8.x", 1762 | "lodash": "~4.17.11", 1763 | "minimatch": "~3.0.2", 1764 | "shelljs": "0.3.x", 1765 | "strip-json-comments": "1.0.x" 1766 | }, 1767 | "dependencies": { 1768 | "lodash": { 1769 | "version": "4.17.15", 1770 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1771 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1772 | "dev": true 1773 | }, 1774 | "minimatch": { 1775 | "version": "3.0.4", 1776 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1777 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1778 | "dev": true, 1779 | "requires": { 1780 | "brace-expansion": "^1.1.7" 1781 | } 1782 | } 1783 | } 1784 | }, 1785 | "json-schema": { 1786 | "version": "0.2.3", 1787 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1788 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1789 | "dev": true 1790 | }, 1791 | "json-schema-traverse": { 1792 | "version": "0.4.1", 1793 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1794 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1795 | "dev": true 1796 | }, 1797 | "json-stringify-safe": { 1798 | "version": "5.0.1", 1799 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1800 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1801 | "dev": true 1802 | }, 1803 | "jsonfile": { 1804 | "version": "2.4.0", 1805 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", 1806 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", 1807 | "dev": true, 1808 | "requires": { 1809 | "graceful-fs": "^4.1.6" 1810 | }, 1811 | "dependencies": { 1812 | "graceful-fs": { 1813 | "version": "4.2.2", 1814 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", 1815 | "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", 1816 | "dev": true, 1817 | "optional": true 1818 | } 1819 | } 1820 | }, 1821 | "jsprim": { 1822 | "version": "1.4.1", 1823 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1824 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1825 | "dev": true, 1826 | "requires": { 1827 | "assert-plus": "1.0.0", 1828 | "extsprintf": "1.3.0", 1829 | "json-schema": "0.2.3", 1830 | "verror": "1.10.0" 1831 | } 1832 | }, 1833 | "kew": { 1834 | "version": "0.7.0", 1835 | "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", 1836 | "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", 1837 | "dev": true 1838 | }, 1839 | "kind-of": { 1840 | "version": "6.0.2", 1841 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 1842 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", 1843 | "dev": true 1844 | }, 1845 | "klaw": { 1846 | "version": "1.3.1", 1847 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", 1848 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", 1849 | "dev": true, 1850 | "requires": { 1851 | "graceful-fs": "^4.1.9" 1852 | }, 1853 | "dependencies": { 1854 | "graceful-fs": { 1855 | "version": "4.2.2", 1856 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", 1857 | "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", 1858 | "dev": true, 1859 | "optional": true 1860 | } 1861 | } 1862 | }, 1863 | "liftoff": { 1864 | "version": "2.5.0", 1865 | "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", 1866 | "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", 1867 | "dev": true, 1868 | "requires": { 1869 | "extend": "^3.0.0", 1870 | "findup-sync": "^2.0.0", 1871 | "fined": "^1.0.1", 1872 | "flagged-respawn": "^1.0.0", 1873 | "is-plain-object": "^2.0.4", 1874 | "object.map": "^1.0.0", 1875 | "rechoir": "^0.6.2", 1876 | "resolve": "^1.1.7" 1877 | }, 1878 | "dependencies": { 1879 | "findup-sync": { 1880 | "version": "2.0.0", 1881 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", 1882 | "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", 1883 | "dev": true, 1884 | "requires": { 1885 | "detect-file": "^1.0.0", 1886 | "is-glob": "^3.1.0", 1887 | "micromatch": "^3.0.4", 1888 | "resolve-dir": "^1.0.1" 1889 | } 1890 | } 1891 | } 1892 | }, 1893 | "load-json-file": { 1894 | "version": "1.1.0", 1895 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 1896 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 1897 | "dev": true, 1898 | "requires": { 1899 | "graceful-fs": "^4.1.2", 1900 | "parse-json": "^2.2.0", 1901 | "pify": "^2.0.0", 1902 | "pinkie-promise": "^2.0.0", 1903 | "strip-bom": "^2.0.0" 1904 | } 1905 | }, 1906 | "lodash": { 1907 | "version": "4.17.15", 1908 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1909 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1910 | "dev": true 1911 | }, 1912 | "loud-rejection": { 1913 | "version": "1.6.0", 1914 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 1915 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 1916 | "dev": true, 1917 | "requires": { 1918 | "currently-unhandled": "^0.4.1", 1919 | "signal-exit": "^3.0.0" 1920 | } 1921 | }, 1922 | "make-iterator": { 1923 | "version": "1.0.1", 1924 | "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", 1925 | "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", 1926 | "dev": true, 1927 | "requires": { 1928 | "kind-of": "^6.0.2" 1929 | } 1930 | }, 1931 | "map-cache": { 1932 | "version": "0.2.2", 1933 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1934 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 1935 | "dev": true 1936 | }, 1937 | "map-obj": { 1938 | "version": "1.0.1", 1939 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 1940 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", 1941 | "dev": true 1942 | }, 1943 | "map-visit": { 1944 | "version": "1.0.0", 1945 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 1946 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 1947 | "dev": true, 1948 | "requires": { 1949 | "object-visit": "^1.0.0" 1950 | } 1951 | }, 1952 | "meow": { 1953 | "version": "3.7.0", 1954 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 1955 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 1956 | "dev": true, 1957 | "requires": { 1958 | "camelcase-keys": "^2.0.0", 1959 | "decamelize": "^1.1.2", 1960 | "loud-rejection": "^1.0.0", 1961 | "map-obj": "^1.0.1", 1962 | "minimist": "^1.1.3", 1963 | "normalize-package-data": "^2.3.4", 1964 | "object-assign": "^4.0.1", 1965 | "read-pkg-up": "^1.0.1", 1966 | "redent": "^1.0.0", 1967 | "trim-newlines": "^1.0.0" 1968 | }, 1969 | "dependencies": { 1970 | "minimist": { 1971 | "version": "1.2.0", 1972 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1973 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1974 | "dev": true 1975 | } 1976 | } 1977 | }, 1978 | "micromatch": { 1979 | "version": "3.1.10", 1980 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 1981 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 1982 | "dev": true, 1983 | "requires": { 1984 | "arr-diff": "^4.0.0", 1985 | "array-unique": "^0.3.2", 1986 | "braces": "^2.3.1", 1987 | "define-property": "^2.0.2", 1988 | "extend-shallow": "^3.0.2", 1989 | "extglob": "^2.0.4", 1990 | "fragment-cache": "^0.2.1", 1991 | "kind-of": "^6.0.2", 1992 | "nanomatch": "^1.2.9", 1993 | "object.pick": "^1.3.0", 1994 | "regex-not": "^1.0.0", 1995 | "snapdragon": "^0.8.1", 1996 | "to-regex": "^3.0.2" 1997 | } 1998 | }, 1999 | "mime-db": { 2000 | "version": "1.40.0", 2001 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 2002 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", 2003 | "dev": true 2004 | }, 2005 | "mime-types": { 2006 | "version": "2.1.24", 2007 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 2008 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 2009 | "dev": true, 2010 | "requires": { 2011 | "mime-db": "1.40.0" 2012 | } 2013 | }, 2014 | "minimatch": { 2015 | "version": "3.0.4", 2016 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2017 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2018 | "dev": true, 2019 | "requires": { 2020 | "brace-expansion": "^1.1.7" 2021 | } 2022 | }, 2023 | "minimist": { 2024 | "version": "0.0.8", 2025 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 2026 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 2027 | "dev": true 2028 | }, 2029 | "mixin-deep": { 2030 | "version": "1.3.2", 2031 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", 2032 | "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", 2033 | "dev": true, 2034 | "requires": { 2035 | "for-in": "^1.0.2", 2036 | "is-extendable": "^1.0.1" 2037 | }, 2038 | "dependencies": { 2039 | "is-extendable": { 2040 | "version": "1.0.1", 2041 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 2042 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 2043 | "dev": true, 2044 | "requires": { 2045 | "is-plain-object": "^2.0.4" 2046 | } 2047 | } 2048 | } 2049 | }, 2050 | "mkdirp": { 2051 | "version": "0.5.1", 2052 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2053 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 2054 | "dev": true, 2055 | "requires": { 2056 | "minimist": "0.0.8" 2057 | } 2058 | }, 2059 | "ms": { 2060 | "version": "2.1.2", 2061 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2062 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2063 | "dev": true 2064 | }, 2065 | "nanomatch": { 2066 | "version": "1.2.13", 2067 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 2068 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 2069 | "dev": true, 2070 | "requires": { 2071 | "arr-diff": "^4.0.0", 2072 | "array-unique": "^0.3.2", 2073 | "define-property": "^2.0.2", 2074 | "extend-shallow": "^3.0.2", 2075 | "fragment-cache": "^0.2.1", 2076 | "is-windows": "^1.0.2", 2077 | "kind-of": "^6.0.2", 2078 | "object.pick": "^1.3.0", 2079 | "regex-not": "^1.0.0", 2080 | "snapdragon": "^0.8.1", 2081 | "to-regex": "^3.0.1" 2082 | } 2083 | }, 2084 | "nopt": { 2085 | "version": "3.0.6", 2086 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 2087 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 2088 | "dev": true, 2089 | "requires": { 2090 | "abbrev": "1" 2091 | } 2092 | }, 2093 | "normalize-package-data": { 2094 | "version": "2.5.0", 2095 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 2096 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 2097 | "dev": true, 2098 | "requires": { 2099 | "hosted-git-info": "^2.1.4", 2100 | "resolve": "^1.10.0", 2101 | "semver": "2 || 3 || 4 || 5", 2102 | "validate-npm-package-license": "^3.0.1" 2103 | } 2104 | }, 2105 | "number-is-nan": { 2106 | "version": "1.0.1", 2107 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2108 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 2109 | "dev": true 2110 | }, 2111 | "oauth-sign": { 2112 | "version": "0.9.0", 2113 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 2114 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 2115 | "dev": true 2116 | }, 2117 | "object-assign": { 2118 | "version": "4.1.1", 2119 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2120 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2121 | "dev": true 2122 | }, 2123 | "object-copy": { 2124 | "version": "0.1.0", 2125 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 2126 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 2127 | "dev": true, 2128 | "requires": { 2129 | "copy-descriptor": "^0.1.0", 2130 | "define-property": "^0.2.5", 2131 | "kind-of": "^3.0.3" 2132 | }, 2133 | "dependencies": { 2134 | "define-property": { 2135 | "version": "0.2.5", 2136 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2137 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2138 | "dev": true, 2139 | "requires": { 2140 | "is-descriptor": "^0.1.0" 2141 | } 2142 | }, 2143 | "kind-of": { 2144 | "version": "3.2.2", 2145 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2146 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2147 | "dev": true, 2148 | "requires": { 2149 | "is-buffer": "^1.1.5" 2150 | } 2151 | } 2152 | } 2153 | }, 2154 | "object-visit": { 2155 | "version": "1.0.1", 2156 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 2157 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 2158 | "dev": true, 2159 | "requires": { 2160 | "isobject": "^3.0.0" 2161 | } 2162 | }, 2163 | "object.defaults": { 2164 | "version": "1.1.0", 2165 | "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", 2166 | "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", 2167 | "dev": true, 2168 | "requires": { 2169 | "array-each": "^1.0.1", 2170 | "array-slice": "^1.0.0", 2171 | "for-own": "^1.0.0", 2172 | "isobject": "^3.0.0" 2173 | } 2174 | }, 2175 | "object.map": { 2176 | "version": "1.0.1", 2177 | "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", 2178 | "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", 2179 | "dev": true, 2180 | "requires": { 2181 | "for-own": "^1.0.0", 2182 | "make-iterator": "^1.0.0" 2183 | } 2184 | }, 2185 | "object.pick": { 2186 | "version": "1.3.0", 2187 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 2188 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 2189 | "dev": true, 2190 | "requires": { 2191 | "isobject": "^3.0.1" 2192 | } 2193 | }, 2194 | "once": { 2195 | "version": "1.4.0", 2196 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2197 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2198 | "dev": true, 2199 | "requires": { 2200 | "wrappy": "1" 2201 | } 2202 | }, 2203 | "os-homedir": { 2204 | "version": "1.0.2", 2205 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 2206 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 2207 | "dev": true 2208 | }, 2209 | "os-tmpdir": { 2210 | "version": "1.0.2", 2211 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2212 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 2213 | "dev": true 2214 | }, 2215 | "osenv": { 2216 | "version": "0.1.5", 2217 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 2218 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 2219 | "dev": true, 2220 | "requires": { 2221 | "os-homedir": "^1.0.0", 2222 | "os-tmpdir": "^1.0.0" 2223 | } 2224 | }, 2225 | "p-each-series": { 2226 | "version": "1.0.0", 2227 | "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", 2228 | "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", 2229 | "dev": true, 2230 | "requires": { 2231 | "p-reduce": "^1.0.0" 2232 | } 2233 | }, 2234 | "p-reduce": { 2235 | "version": "1.0.0", 2236 | "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", 2237 | "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", 2238 | "dev": true 2239 | }, 2240 | "package": { 2241 | "version": "1.0.1", 2242 | "resolved": "https://registry.npmjs.org/package/-/package-1.0.1.tgz", 2243 | "integrity": "sha1-0lofmeJQbcsn1nBLg9yooxLk7cw=", 2244 | "dev": true 2245 | }, 2246 | "parse-filepath": { 2247 | "version": "1.0.2", 2248 | "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", 2249 | "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", 2250 | "dev": true, 2251 | "requires": { 2252 | "is-absolute": "^1.0.0", 2253 | "map-cache": "^0.2.0", 2254 | "path-root": "^0.1.1" 2255 | } 2256 | }, 2257 | "parse-json": { 2258 | "version": "2.2.0", 2259 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 2260 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 2261 | "dev": true, 2262 | "requires": { 2263 | "error-ex": "^1.2.0" 2264 | } 2265 | }, 2266 | "parse-passwd": { 2267 | "version": "1.0.0", 2268 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 2269 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 2270 | "dev": true 2271 | }, 2272 | "pascalcase": { 2273 | "version": "0.1.1", 2274 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 2275 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", 2276 | "dev": true 2277 | }, 2278 | "path-exists": { 2279 | "version": "2.1.0", 2280 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 2281 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 2282 | "dev": true, 2283 | "requires": { 2284 | "pinkie-promise": "^2.0.0" 2285 | } 2286 | }, 2287 | "path-is-absolute": { 2288 | "version": "1.0.1", 2289 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2290 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2291 | "dev": true 2292 | }, 2293 | "path-parse": { 2294 | "version": "1.0.6", 2295 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 2296 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 2297 | "dev": true 2298 | }, 2299 | "path-root": { 2300 | "version": "0.1.1", 2301 | "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", 2302 | "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", 2303 | "dev": true, 2304 | "requires": { 2305 | "path-root-regex": "^0.1.0" 2306 | } 2307 | }, 2308 | "path-root-regex": { 2309 | "version": "0.1.2", 2310 | "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", 2311 | "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", 2312 | "dev": true 2313 | }, 2314 | "path-type": { 2315 | "version": "1.1.0", 2316 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 2317 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 2318 | "dev": true, 2319 | "requires": { 2320 | "graceful-fs": "^4.1.2", 2321 | "pify": "^2.0.0", 2322 | "pinkie-promise": "^2.0.0" 2323 | } 2324 | }, 2325 | "pend": { 2326 | "version": "1.2.0", 2327 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 2328 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 2329 | "dev": true 2330 | }, 2331 | "performance-now": { 2332 | "version": "2.1.0", 2333 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2334 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 2335 | "dev": true 2336 | }, 2337 | "phantomjs-prebuilt": { 2338 | "version": "2.1.16", 2339 | "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", 2340 | "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", 2341 | "dev": true, 2342 | "requires": { 2343 | "es6-promise": "^4.0.3", 2344 | "extract-zip": "^1.6.5", 2345 | "fs-extra": "^1.0.0", 2346 | "hasha": "^2.2.0", 2347 | "kew": "^0.7.0", 2348 | "progress": "^1.1.8", 2349 | "request": "^2.81.0", 2350 | "request-progress": "^2.0.1", 2351 | "which": "^1.2.10" 2352 | }, 2353 | "dependencies": { 2354 | "which": { 2355 | "version": "1.3.1", 2356 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2357 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2358 | "dev": true, 2359 | "requires": { 2360 | "isexe": "^2.0.0" 2361 | } 2362 | } 2363 | } 2364 | }, 2365 | "pify": { 2366 | "version": "2.3.0", 2367 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2368 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 2369 | "dev": true 2370 | }, 2371 | "pinkie": { 2372 | "version": "2.0.4", 2373 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2374 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 2375 | "dev": true 2376 | }, 2377 | "pinkie-promise": { 2378 | "version": "2.0.1", 2379 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2380 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2381 | "dev": true, 2382 | "requires": { 2383 | "pinkie": "^2.0.0" 2384 | } 2385 | }, 2386 | "posix-character-classes": { 2387 | "version": "0.1.1", 2388 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 2389 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", 2390 | "dev": true 2391 | }, 2392 | "prettier": { 2393 | "version": "1.18.2", 2394 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", 2395 | "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", 2396 | "dev": true 2397 | }, 2398 | "process-nextick-args": { 2399 | "version": "2.0.1", 2400 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2401 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2402 | "dev": true 2403 | }, 2404 | "progress": { 2405 | "version": "1.1.8", 2406 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 2407 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 2408 | "dev": true 2409 | }, 2410 | "proxy-from-env": { 2411 | "version": "1.0.0", 2412 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", 2413 | "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", 2414 | "dev": true 2415 | }, 2416 | "psl": { 2417 | "version": "1.4.0", 2418 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", 2419 | "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", 2420 | "dev": true 2421 | }, 2422 | "punycode": { 2423 | "version": "2.1.1", 2424 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2425 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2426 | "dev": true 2427 | }, 2428 | "puppeteer": { 2429 | "version": "1.20.0", 2430 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", 2431 | "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", 2432 | "dev": true, 2433 | "requires": { 2434 | "debug": "^4.1.0", 2435 | "extract-zip": "^1.6.6", 2436 | "https-proxy-agent": "^2.2.1", 2437 | "mime": "^2.0.3", 2438 | "progress": "^2.0.1", 2439 | "proxy-from-env": "^1.0.0", 2440 | "rimraf": "^2.6.1", 2441 | "ws": "^6.1.0" 2442 | }, 2443 | "dependencies": { 2444 | "mime": { 2445 | "version": "2.4.4", 2446 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", 2447 | "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", 2448 | "dev": true 2449 | }, 2450 | "progress": { 2451 | "version": "2.0.3", 2452 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2453 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2454 | "dev": true 2455 | }, 2456 | "rimraf": { 2457 | "version": "2.7.1", 2458 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 2459 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 2460 | "dev": true, 2461 | "requires": { 2462 | "glob": "^7.1.3" 2463 | } 2464 | } 2465 | } 2466 | }, 2467 | "qunitjs": { 2468 | "version": "1.23.1", 2469 | "resolved": "https://registry.npmjs.org/qunitjs/-/qunitjs-1.23.1.tgz", 2470 | "integrity": "sha1-GXHPl6yb4Bpk0jFVCNLkjm/U5xk=", 2471 | "dev": true 2472 | }, 2473 | "read-pkg": { 2474 | "version": "1.1.0", 2475 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 2476 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 2477 | "dev": true, 2478 | "requires": { 2479 | "load-json-file": "^1.0.0", 2480 | "normalize-package-data": "^2.3.2", 2481 | "path-type": "^1.0.0" 2482 | } 2483 | }, 2484 | "read-pkg-up": { 2485 | "version": "1.0.1", 2486 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 2487 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 2488 | "dev": true, 2489 | "requires": { 2490 | "find-up": "^1.0.0", 2491 | "read-pkg": "^1.0.0" 2492 | } 2493 | }, 2494 | "readable-stream": { 2495 | "version": "1.1.14", 2496 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 2497 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 2498 | "dev": true, 2499 | "requires": { 2500 | "core-util-is": "~1.0.0", 2501 | "inherits": "~2.0.1", 2502 | "isarray": "0.0.1", 2503 | "string_decoder": "~0.10.x" 2504 | } 2505 | }, 2506 | "rechoir": { 2507 | "version": "0.6.2", 2508 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 2509 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 2510 | "dev": true, 2511 | "requires": { 2512 | "resolve": "^1.1.6" 2513 | } 2514 | }, 2515 | "redent": { 2516 | "version": "1.0.0", 2517 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 2518 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 2519 | "dev": true, 2520 | "requires": { 2521 | "indent-string": "^2.1.0", 2522 | "strip-indent": "^1.0.1" 2523 | } 2524 | }, 2525 | "regex-not": { 2526 | "version": "1.0.2", 2527 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 2528 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 2529 | "dev": true, 2530 | "requires": { 2531 | "extend-shallow": "^3.0.2", 2532 | "safe-regex": "^1.1.0" 2533 | } 2534 | }, 2535 | "repeat-element": { 2536 | "version": "1.1.3", 2537 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 2538 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", 2539 | "dev": true 2540 | }, 2541 | "repeat-string": { 2542 | "version": "1.6.1", 2543 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2544 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2545 | "dev": true 2546 | }, 2547 | "repeating": { 2548 | "version": "2.0.1", 2549 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 2550 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 2551 | "dev": true, 2552 | "requires": { 2553 | "is-finite": "^1.0.0" 2554 | } 2555 | }, 2556 | "request": { 2557 | "version": "2.88.0", 2558 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 2559 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 2560 | "dev": true, 2561 | "requires": { 2562 | "aws-sign2": "~0.7.0", 2563 | "aws4": "^1.8.0", 2564 | "caseless": "~0.12.0", 2565 | "combined-stream": "~1.0.6", 2566 | "extend": "~3.0.2", 2567 | "forever-agent": "~0.6.1", 2568 | "form-data": "~2.3.2", 2569 | "har-validator": "~5.1.0", 2570 | "http-signature": "~1.2.0", 2571 | "is-typedarray": "~1.0.0", 2572 | "isstream": "~0.1.2", 2573 | "json-stringify-safe": "~5.0.1", 2574 | "mime-types": "~2.1.19", 2575 | "oauth-sign": "~0.9.0", 2576 | "performance-now": "^2.1.0", 2577 | "qs": "~6.5.2", 2578 | "safe-buffer": "^5.1.2", 2579 | "tough-cookie": "~2.4.3", 2580 | "tunnel-agent": "^0.6.0", 2581 | "uuid": "^3.3.2" 2582 | }, 2583 | "dependencies": { 2584 | "qs": { 2585 | "version": "6.5.2", 2586 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2587 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 2588 | "dev": true 2589 | } 2590 | } 2591 | }, 2592 | "request-progress": { 2593 | "version": "2.0.1", 2594 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", 2595 | "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", 2596 | "dev": true, 2597 | "requires": { 2598 | "throttleit": "^1.0.0" 2599 | } 2600 | }, 2601 | "resolve": { 2602 | "version": "1.12.0", 2603 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 2604 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 2605 | "dev": true, 2606 | "requires": { 2607 | "path-parse": "^1.0.6" 2608 | } 2609 | }, 2610 | "resolve-dir": { 2611 | "version": "1.0.1", 2612 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", 2613 | "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", 2614 | "dev": true, 2615 | "requires": { 2616 | "expand-tilde": "^2.0.0", 2617 | "global-modules": "^1.0.0" 2618 | } 2619 | }, 2620 | "resolve-url": { 2621 | "version": "0.2.1", 2622 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2623 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", 2624 | "dev": true 2625 | }, 2626 | "ret": { 2627 | "version": "0.1.15", 2628 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 2629 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", 2630 | "dev": true 2631 | }, 2632 | "rimraf": { 2633 | "version": "2.6.3", 2634 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2635 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2636 | "dev": true, 2637 | "requires": { 2638 | "glob": "^7.1.3" 2639 | } 2640 | }, 2641 | "safe-buffer": { 2642 | "version": "5.1.2", 2643 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2644 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2645 | "dev": true 2646 | }, 2647 | "safe-regex": { 2648 | "version": "1.1.0", 2649 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 2650 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 2651 | "dev": true, 2652 | "requires": { 2653 | "ret": "~0.1.10" 2654 | } 2655 | }, 2656 | "safer-buffer": { 2657 | "version": "2.1.2", 2658 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2659 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2660 | "dev": true 2661 | }, 2662 | "semver": { 2663 | "version": "5.7.1", 2664 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2665 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2666 | "dev": true 2667 | }, 2668 | "set-value": { 2669 | "version": "2.0.1", 2670 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", 2671 | "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", 2672 | "dev": true, 2673 | "requires": { 2674 | "extend-shallow": "^2.0.1", 2675 | "is-extendable": "^0.1.1", 2676 | "is-plain-object": "^2.0.3", 2677 | "split-string": "^3.0.1" 2678 | }, 2679 | "dependencies": { 2680 | "extend-shallow": { 2681 | "version": "2.0.1", 2682 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2683 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2684 | "dev": true, 2685 | "requires": { 2686 | "is-extendable": "^0.1.0" 2687 | } 2688 | } 2689 | } 2690 | }, 2691 | "shelljs": { 2692 | "version": "0.3.0", 2693 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", 2694 | "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", 2695 | "dev": true 2696 | }, 2697 | "signal-exit": { 2698 | "version": "3.0.2", 2699 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2700 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 2701 | "dev": true 2702 | }, 2703 | "snapdragon": { 2704 | "version": "0.8.2", 2705 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 2706 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 2707 | "dev": true, 2708 | "requires": { 2709 | "base": "^0.11.1", 2710 | "debug": "^2.2.0", 2711 | "define-property": "^0.2.5", 2712 | "extend-shallow": "^2.0.1", 2713 | "map-cache": "^0.2.2", 2714 | "source-map": "^0.5.6", 2715 | "source-map-resolve": "^0.5.0", 2716 | "use": "^3.1.0" 2717 | }, 2718 | "dependencies": { 2719 | "debug": { 2720 | "version": "2.6.9", 2721 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2722 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2723 | "dev": true, 2724 | "requires": { 2725 | "ms": "2.0.0" 2726 | } 2727 | }, 2728 | "define-property": { 2729 | "version": "0.2.5", 2730 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2731 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2732 | "dev": true, 2733 | "requires": { 2734 | "is-descriptor": "^0.1.0" 2735 | } 2736 | }, 2737 | "extend-shallow": { 2738 | "version": "2.0.1", 2739 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2740 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2741 | "dev": true, 2742 | "requires": { 2743 | "is-extendable": "^0.1.0" 2744 | } 2745 | }, 2746 | "ms": { 2747 | "version": "2.0.0", 2748 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2749 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 2750 | "dev": true 2751 | } 2752 | } 2753 | }, 2754 | "snapdragon-node": { 2755 | "version": "2.1.1", 2756 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 2757 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 2758 | "dev": true, 2759 | "requires": { 2760 | "define-property": "^1.0.0", 2761 | "isobject": "^3.0.0", 2762 | "snapdragon-util": "^3.0.1" 2763 | }, 2764 | "dependencies": { 2765 | "define-property": { 2766 | "version": "1.0.0", 2767 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 2768 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 2769 | "dev": true, 2770 | "requires": { 2771 | "is-descriptor": "^1.0.0" 2772 | } 2773 | }, 2774 | "is-accessor-descriptor": { 2775 | "version": "1.0.0", 2776 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 2777 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 2778 | "dev": true, 2779 | "requires": { 2780 | "kind-of": "^6.0.0" 2781 | } 2782 | }, 2783 | "is-data-descriptor": { 2784 | "version": "1.0.0", 2785 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 2786 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 2787 | "dev": true, 2788 | "requires": { 2789 | "kind-of": "^6.0.0" 2790 | } 2791 | }, 2792 | "is-descriptor": { 2793 | "version": "1.0.2", 2794 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 2795 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 2796 | "dev": true, 2797 | "requires": { 2798 | "is-accessor-descriptor": "^1.0.0", 2799 | "is-data-descriptor": "^1.0.0", 2800 | "kind-of": "^6.0.2" 2801 | } 2802 | } 2803 | } 2804 | }, 2805 | "snapdragon-util": { 2806 | "version": "3.0.1", 2807 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 2808 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 2809 | "dev": true, 2810 | "requires": { 2811 | "kind-of": "^3.2.0" 2812 | }, 2813 | "dependencies": { 2814 | "kind-of": { 2815 | "version": "3.2.2", 2816 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2817 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2818 | "dev": true, 2819 | "requires": { 2820 | "is-buffer": "^1.1.5" 2821 | } 2822 | } 2823 | } 2824 | }, 2825 | "source-map": { 2826 | "version": "0.5.7", 2827 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2828 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2829 | "dev": true 2830 | }, 2831 | "source-map-resolve": { 2832 | "version": "0.5.2", 2833 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", 2834 | "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", 2835 | "dev": true, 2836 | "requires": { 2837 | "atob": "^2.1.1", 2838 | "decode-uri-component": "^0.2.0", 2839 | "resolve-url": "^0.2.1", 2840 | "source-map-url": "^0.4.0", 2841 | "urix": "^0.1.0" 2842 | } 2843 | }, 2844 | "source-map-url": { 2845 | "version": "0.4.0", 2846 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 2847 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", 2848 | "dev": true 2849 | }, 2850 | "spdx-correct": { 2851 | "version": "3.1.0", 2852 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 2853 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 2854 | "dev": true, 2855 | "requires": { 2856 | "spdx-expression-parse": "^3.0.0", 2857 | "spdx-license-ids": "^3.0.0" 2858 | } 2859 | }, 2860 | "spdx-exceptions": { 2861 | "version": "2.2.0", 2862 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 2863 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 2864 | "dev": true 2865 | }, 2866 | "spdx-expression-parse": { 2867 | "version": "3.0.0", 2868 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 2869 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 2870 | "dev": true, 2871 | "requires": { 2872 | "spdx-exceptions": "^2.1.0", 2873 | "spdx-license-ids": "^3.0.0" 2874 | } 2875 | }, 2876 | "spdx-license-ids": { 2877 | "version": "3.0.5", 2878 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 2879 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 2880 | "dev": true 2881 | }, 2882 | "split-string": { 2883 | "version": "3.1.0", 2884 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 2885 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 2886 | "dev": true, 2887 | "requires": { 2888 | "extend-shallow": "^3.0.0" 2889 | } 2890 | }, 2891 | "sprintf-js": { 2892 | "version": "1.1.2", 2893 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 2894 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", 2895 | "dev": true 2896 | }, 2897 | "sshpk": { 2898 | "version": "1.16.1", 2899 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 2900 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 2901 | "dev": true, 2902 | "requires": { 2903 | "asn1": "~0.2.3", 2904 | "assert-plus": "^1.0.0", 2905 | "bcrypt-pbkdf": "^1.0.0", 2906 | "dashdash": "^1.12.0", 2907 | "ecc-jsbn": "~0.1.1", 2908 | "getpass": "^0.1.1", 2909 | "jsbn": "~0.1.0", 2910 | "safer-buffer": "^2.0.2", 2911 | "tweetnacl": "~0.14.0" 2912 | } 2913 | }, 2914 | "static-extend": { 2915 | "version": "0.1.2", 2916 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 2917 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 2918 | "dev": true, 2919 | "requires": { 2920 | "define-property": "^0.2.5", 2921 | "object-copy": "^0.1.0" 2922 | }, 2923 | "dependencies": { 2924 | "define-property": { 2925 | "version": "0.2.5", 2926 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2927 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2928 | "dev": true, 2929 | "requires": { 2930 | "is-descriptor": "^0.1.0" 2931 | } 2932 | } 2933 | } 2934 | }, 2935 | "string_decoder": { 2936 | "version": "0.10.31", 2937 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2938 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 2939 | "dev": true 2940 | }, 2941 | "strip-bom": { 2942 | "version": "2.0.0", 2943 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 2944 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 2945 | "dev": true, 2946 | "requires": { 2947 | "is-utf8": "^0.2.0" 2948 | } 2949 | }, 2950 | "strip-indent": { 2951 | "version": "1.0.1", 2952 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 2953 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 2954 | "dev": true, 2955 | "requires": { 2956 | "get-stdin": "^4.0.1" 2957 | } 2958 | }, 2959 | "strip-json-comments": { 2960 | "version": "1.0.4", 2961 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", 2962 | "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", 2963 | "dev": true 2964 | }, 2965 | "supports-color": { 2966 | "version": "5.5.0", 2967 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2968 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2969 | "dev": true, 2970 | "requires": { 2971 | "has-flag": "^3.0.0" 2972 | } 2973 | }, 2974 | "temporary": { 2975 | "version": "0.0.8", 2976 | "resolved": "https://registry.npmjs.org/temporary/-/temporary-0.0.8.tgz", 2977 | "integrity": "sha1-oYqYHSi6jKNgJ/s8MFOMPst0CsA=", 2978 | "dev": true, 2979 | "requires": { 2980 | "package": ">= 1.0.0 < 1.2.0" 2981 | } 2982 | }, 2983 | "throttleit": { 2984 | "version": "1.0.0", 2985 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 2986 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 2987 | "dev": true 2988 | }, 2989 | "to-object-path": { 2990 | "version": "0.3.0", 2991 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 2992 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 2993 | "dev": true, 2994 | "requires": { 2995 | "kind-of": "^3.0.2" 2996 | }, 2997 | "dependencies": { 2998 | "kind-of": { 2999 | "version": "3.2.2", 3000 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3001 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3002 | "dev": true, 3003 | "requires": { 3004 | "is-buffer": "^1.1.5" 3005 | } 3006 | } 3007 | } 3008 | }, 3009 | "to-regex": { 3010 | "version": "3.0.2", 3011 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 3012 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 3013 | "dev": true, 3014 | "requires": { 3015 | "define-property": "^2.0.2", 3016 | "extend-shallow": "^3.0.2", 3017 | "regex-not": "^1.0.2", 3018 | "safe-regex": "^1.1.0" 3019 | } 3020 | }, 3021 | "to-regex-range": { 3022 | "version": "2.1.1", 3023 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 3024 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 3025 | "dev": true, 3026 | "requires": { 3027 | "is-number": "^3.0.0", 3028 | "repeat-string": "^1.6.1" 3029 | } 3030 | }, 3031 | "tough-cookie": { 3032 | "version": "2.4.3", 3033 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 3034 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 3035 | "dev": true, 3036 | "requires": { 3037 | "psl": "^1.1.24", 3038 | "punycode": "^1.4.1" 3039 | }, 3040 | "dependencies": { 3041 | "punycode": { 3042 | "version": "1.4.1", 3043 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 3044 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 3045 | "dev": true 3046 | } 3047 | } 3048 | }, 3049 | "trim-newlines": { 3050 | "version": "1.0.0", 3051 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 3052 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", 3053 | "dev": true 3054 | }, 3055 | "tunnel-agent": { 3056 | "version": "0.6.0", 3057 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3058 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3059 | "dev": true, 3060 | "requires": { 3061 | "safe-buffer": "^5.0.1" 3062 | } 3063 | }, 3064 | "tweetnacl": { 3065 | "version": "0.14.5", 3066 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3067 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 3068 | "dev": true 3069 | }, 3070 | "typedarray": { 3071 | "version": "0.0.6", 3072 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3073 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 3074 | "dev": true 3075 | }, 3076 | "unc-path-regex": { 3077 | "version": "0.1.2", 3078 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 3079 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", 3080 | "dev": true 3081 | }, 3082 | "underscore.string": { 3083 | "version": "3.3.5", 3084 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", 3085 | "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", 3086 | "dev": true, 3087 | "requires": { 3088 | "sprintf-js": "^1.0.3", 3089 | "util-deprecate": "^1.0.2" 3090 | } 3091 | }, 3092 | "union-value": { 3093 | "version": "1.0.1", 3094 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", 3095 | "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", 3096 | "dev": true, 3097 | "requires": { 3098 | "arr-union": "^3.1.0", 3099 | "get-value": "^2.0.6", 3100 | "is-extendable": "^0.1.1", 3101 | "set-value": "^2.0.1" 3102 | } 3103 | }, 3104 | "unset-value": { 3105 | "version": "1.0.0", 3106 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 3107 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 3108 | "dev": true, 3109 | "requires": { 3110 | "has-value": "^0.3.1", 3111 | "isobject": "^3.0.0" 3112 | }, 3113 | "dependencies": { 3114 | "has-value": { 3115 | "version": "0.3.1", 3116 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 3117 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 3118 | "dev": true, 3119 | "requires": { 3120 | "get-value": "^2.0.3", 3121 | "has-values": "^0.1.4", 3122 | "isobject": "^2.0.0" 3123 | }, 3124 | "dependencies": { 3125 | "isobject": { 3126 | "version": "2.1.0", 3127 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 3128 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 3129 | "dev": true, 3130 | "requires": { 3131 | "isarray": "1.0.0" 3132 | } 3133 | } 3134 | } 3135 | }, 3136 | "has-values": { 3137 | "version": "0.1.4", 3138 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 3139 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", 3140 | "dev": true 3141 | }, 3142 | "isarray": { 3143 | "version": "1.0.0", 3144 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3145 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 3146 | "dev": true 3147 | } 3148 | } 3149 | }, 3150 | "uri-js": { 3151 | "version": "4.2.2", 3152 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 3153 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 3154 | "dev": true, 3155 | "requires": { 3156 | "punycode": "^2.1.0" 3157 | } 3158 | }, 3159 | "urix": { 3160 | "version": "0.1.0", 3161 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 3162 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", 3163 | "dev": true 3164 | }, 3165 | "use": { 3166 | "version": "3.1.1", 3167 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 3168 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", 3169 | "dev": true 3170 | }, 3171 | "util-deprecate": { 3172 | "version": "1.0.2", 3173 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3174 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 3175 | "dev": true 3176 | }, 3177 | "uuid": { 3178 | "version": "3.3.3", 3179 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 3180 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", 3181 | "dev": true 3182 | }, 3183 | "v8flags": { 3184 | "version": "3.1.3", 3185 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", 3186 | "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", 3187 | "dev": true, 3188 | "requires": { 3189 | "homedir-polyfill": "^1.0.1" 3190 | } 3191 | }, 3192 | "validate-npm-package-license": { 3193 | "version": "3.0.4", 3194 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 3195 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 3196 | "dev": true, 3197 | "requires": { 3198 | "spdx-correct": "^3.0.0", 3199 | "spdx-expression-parse": "^3.0.0" 3200 | } 3201 | }, 3202 | "verror": { 3203 | "version": "1.10.0", 3204 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3205 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3206 | "dev": true, 3207 | "requires": { 3208 | "assert-plus": "^1.0.0", 3209 | "core-util-is": "1.0.2", 3210 | "extsprintf": "^1.2.0" 3211 | } 3212 | }, 3213 | "which": { 3214 | "version": "1.3.1", 3215 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 3216 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 3217 | "dev": true, 3218 | "requires": { 3219 | "isexe": "^2.0.0" 3220 | } 3221 | }, 3222 | "wrappy": { 3223 | "version": "1.0.2", 3224 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3225 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3226 | "dev": true 3227 | }, 3228 | "ws": { 3229 | "version": "6.2.1", 3230 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", 3231 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", 3232 | "dev": true, 3233 | "requires": { 3234 | "async-limiter": "~1.0.0" 3235 | } 3236 | }, 3237 | "yauzl": { 3238 | "version": "2.4.1", 3239 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 3240 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 3241 | "dev": true, 3242 | "requires": { 3243 | "fd-slicer": "~1.0.1" 3244 | } 3245 | } 3246 | } 3247 | } 3248 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "selector-set", 3 | "version": "1.1.5", 4 | "description": "An efficient data structure for matching and querying elements against a large set of CSS selectors.", 5 | "license": "MIT", 6 | "repository": { 7 | "type": "git", 8 | "url": "http://github.com/josh/selector-set.git" 9 | }, 10 | "main": "selector-set.js", 11 | "module": "selector-set.next.js", 12 | "jsnext:main": "selector-set.next.js", 13 | "types": "selector-set.d.ts", 14 | "devDependencies": { 15 | "benchmark": "^1.0.0", 16 | "d3": "^3.5.17", 17 | "grunt": "^1.0.4", 18 | "grunt-cli": "^1.3.2", 19 | "grunt-contrib-jshint": "^2.1.0", 20 | "grunt-contrib-qunit": "^3.1.0", 21 | "grunt-lib-phantomjs": "^1.1.0", 22 | "grunt-prettier": "^1.3.0", 23 | "qunitjs": "^1.23.1" 24 | }, 25 | "scripts": { 26 | "test": "grunt test" 27 | }, 28 | "files": [ 29 | "selector-set.d.ts", 30 | "selector-set.js.flow", 31 | "selector-set.js", 32 | "selector-set.next.d.ts", 33 | "selector-set.next.js.flow", 34 | "selector-set.next.js" 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /selector-set.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'selector-set' { 2 | interface ISelectorSetIndex { 3 | name: string; 4 | selector: (selector: string) => string | void; 5 | element: (el: Element) => Array | void; 6 | } 7 | 8 | class SelectorSet { 9 | size: number; 10 | 11 | matchesSelector: (el: Element, selector: string) => boolean; 12 | querySelectorAll: (selectors: string, context: Element) => Array; 13 | 14 | indexes: Array; 15 | 16 | add(selector: string, data: T): void; 17 | remove(selector: string, data?: T): void; 18 | 19 | matches(el: Element): Array<{ selector: string; data: T }>; 20 | queryAll( 21 | context: Element 22 | ): Array<{ selector: string; data: T; elements: Array }>; 23 | 24 | logDefaultIndexUsed: ({ 25 | selector, 26 | data 27 | }: { 28 | selector: string; 29 | data: T; 30 | }) => void; 31 | } 32 | 33 | export default SelectorSet; 34 | } 35 | -------------------------------------------------------------------------------- /selector-set.js: -------------------------------------------------------------------------------- 1 | (function(root, factory) { 2 | if (typeof define === 'function' && define.amd) { 3 | define([], factory); 4 | } else if (typeof exports === 'object') { 5 | module.exports = factory(); 6 | } else { 7 | root.SelectorSet = factory(); 8 | } 9 | })(this, function() { 10 | 'use strict'; 11 | 12 | // Public: Create a new SelectorSet. 13 | function SelectorSet() { 14 | // Construct new SelectorSet if called as a function. 15 | if (!(this instanceof SelectorSet)) { 16 | return new SelectorSet(); 17 | } 18 | 19 | // Public: Number of selectors added to the set 20 | this.size = 0; 21 | 22 | // Internal: Incrementing ID counter 23 | this.uid = 0; 24 | 25 | // Internal: Array of String selectors in the set 26 | this.selectors = []; 27 | 28 | // Internal: Map of selector ids to objects 29 | this.selectorObjects = {}; 30 | 31 | // Internal: All Object index String names mapping to Index objects. 32 | this.indexes = Object.create(this.indexes); 33 | 34 | // Internal: Used Object index String names mapping to Index objects. 35 | this.activeIndexes = []; 36 | } 37 | 38 | // Detect prefixed Element#matches function. 39 | var docElem = window.document.documentElement; 40 | var matches = 41 | docElem.matches || 42 | docElem.webkitMatchesSelector || 43 | docElem.mozMatchesSelector || 44 | docElem.oMatchesSelector || 45 | docElem.msMatchesSelector; 46 | 47 | // Public: Check if element matches selector. 48 | // 49 | // Maybe overridden with custom Element.matches function. 50 | // 51 | // el - An Element 52 | // selector - String CSS selector 53 | // 54 | // Returns true or false. 55 | SelectorSet.prototype.matchesSelector = function(el, selector) { 56 | return matches.call(el, selector); 57 | }; 58 | 59 | // Public: Find all elements in the context that match the selector. 60 | // 61 | // Maybe overridden with custom querySelectorAll function. 62 | // 63 | // selectors - String CSS selectors. 64 | // context - Element context 65 | // 66 | // Returns non-live list of Elements. 67 | SelectorSet.prototype.querySelectorAll = function(selectors, context) { 68 | return context.querySelectorAll(selectors); 69 | }; 70 | 71 | // Public: Array of indexes. 72 | // 73 | // name - Unique String name 74 | // selector - Function that takes a String selector and returns a String key 75 | // or undefined if it can't be used by the index. 76 | // element - Function that takes an Element and returns an Array of String 77 | // keys that point to indexed values. 78 | // 79 | SelectorSet.prototype.indexes = []; 80 | 81 | // Index by element id 82 | var idRe = /^#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g; 83 | SelectorSet.prototype.indexes.push({ 84 | name: 'ID', 85 | selector: function matchIdSelector(sel) { 86 | var m; 87 | if ((m = sel.match(idRe))) { 88 | return m[0].slice(1); 89 | } 90 | }, 91 | element: function getElementId(el) { 92 | if (el.id) { 93 | return [el.id]; 94 | } 95 | } 96 | }); 97 | 98 | // Index by all of its class names 99 | var classRe = /^\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g; 100 | SelectorSet.prototype.indexes.push({ 101 | name: 'CLASS', 102 | selector: function matchClassSelector(sel) { 103 | var m; 104 | if ((m = sel.match(classRe))) { 105 | return m[0].slice(1); 106 | } 107 | }, 108 | element: function getElementClassNames(el) { 109 | var className = el.className; 110 | if (className) { 111 | if (typeof className === 'string') { 112 | return className.split(/\s/); 113 | } else if (typeof className === 'object' && 'baseVal' in className) { 114 | // className is a SVGAnimatedString 115 | // global SVGAnimatedString is not an exposed global in Opera 12 116 | return className.baseVal.split(/\s/); 117 | } 118 | } 119 | } 120 | }); 121 | 122 | // Index by tag/node name: `DIV`, `FORM`, `A` 123 | var tagRe = /^((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g; 124 | SelectorSet.prototype.indexes.push({ 125 | name: 'TAG', 126 | selector: function matchTagSelector(sel) { 127 | var m; 128 | if ((m = sel.match(tagRe))) { 129 | return m[0].toUpperCase(); 130 | } 131 | }, 132 | element: function getElementTagName(el) { 133 | return [el.nodeName.toUpperCase()]; 134 | } 135 | }); 136 | 137 | // Default index just contains a single array of elements. 138 | SelectorSet.prototype.indexes['default'] = { 139 | name: 'UNIVERSAL', 140 | selector: function() { 141 | return true; 142 | }, 143 | element: function() { 144 | return [true]; 145 | } 146 | }; 147 | 148 | // Use ES Maps when supported 149 | var Map; 150 | if (typeof window.Map === 'function') { 151 | Map = window.Map; 152 | } else { 153 | Map = (function() { 154 | function Map() { 155 | this.map = {}; 156 | } 157 | Map.prototype.get = function(key) { 158 | return this.map[key + ' ']; 159 | }; 160 | Map.prototype.set = function(key, value) { 161 | this.map[key + ' '] = value; 162 | }; 163 | return Map; 164 | })(); 165 | } 166 | 167 | // Regexps adopted from Sizzle 168 | // https://github.com/jquery/sizzle/blob/1.7/sizzle.js 169 | // 170 | var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g; 171 | 172 | // Internal: Get indexes for selector. 173 | // 174 | // selector - String CSS selector 175 | // 176 | // Returns Array of {index, key}. 177 | function parseSelectorIndexes(allIndexes, selector) { 178 | allIndexes = allIndexes.slice(0).concat(allIndexes['default']); 179 | 180 | var allIndexesLen = allIndexes.length, 181 | i, 182 | j, 183 | m, 184 | dup, 185 | rest = selector, 186 | key, 187 | index, 188 | indexes = []; 189 | 190 | do { 191 | chunker.exec(''); 192 | if ((m = chunker.exec(rest))) { 193 | rest = m[3]; 194 | if (m[2] || !rest) { 195 | for (i = 0; i < allIndexesLen; i++) { 196 | index = allIndexes[i]; 197 | if ((key = index.selector(m[1]))) { 198 | j = indexes.length; 199 | dup = false; 200 | while (j--) { 201 | if (indexes[j].index === index && indexes[j].key === key) { 202 | dup = true; 203 | break; 204 | } 205 | } 206 | if (!dup) { 207 | indexes.push({ index: index, key: key }); 208 | } 209 | break; 210 | } 211 | } 212 | } 213 | } 214 | } while (m); 215 | 216 | return indexes; 217 | } 218 | 219 | // Internal: Find first item in Array that is a prototype of `proto`. 220 | // 221 | // ary - Array of objects 222 | // proto - Prototype of expected item in `ary` 223 | // 224 | // Returns object from `ary` if found. Otherwise returns undefined. 225 | function findByPrototype(ary, proto) { 226 | var i, len, item; 227 | for (i = 0, len = ary.length; i < len; i++) { 228 | item = ary[i]; 229 | if (proto.isPrototypeOf(item)) { 230 | return item; 231 | } 232 | } 233 | } 234 | 235 | // Public: Log when added selector falls under the default index. 236 | // 237 | // This API should not be considered stable. May change between 238 | // minor versions. 239 | // 240 | // obj - {selector, data} Object 241 | // 242 | // SelectorSet.prototype.logDefaultIndexUsed = function(obj) { 243 | // console.warn(obj.selector, "could not be indexed"); 244 | // }; 245 | // 246 | // Returns nothing. 247 | SelectorSet.prototype.logDefaultIndexUsed = function() {}; 248 | 249 | // Public: Add selector to set. 250 | // 251 | // selector - String CSS selector 252 | // data - Optional data Object (default: undefined) 253 | // 254 | // Returns nothing. 255 | SelectorSet.prototype.add = function(selector, data) { 256 | var obj, 257 | i, 258 | indexProto, 259 | key, 260 | index, 261 | objs, 262 | selectorIndexes, 263 | selectorIndex, 264 | indexes = this.activeIndexes, 265 | selectors = this.selectors, 266 | selectorObjects = this.selectorObjects; 267 | 268 | if (typeof selector !== 'string') { 269 | return; 270 | } 271 | 272 | obj = { 273 | id: this.uid++, 274 | selector: selector, 275 | data: data 276 | }; 277 | selectorObjects[obj.id] = obj; 278 | 279 | selectorIndexes = parseSelectorIndexes(this.indexes, selector); 280 | for (i = 0; i < selectorIndexes.length; i++) { 281 | selectorIndex = selectorIndexes[i]; 282 | key = selectorIndex.key; 283 | indexProto = selectorIndex.index; 284 | 285 | index = findByPrototype(indexes, indexProto); 286 | if (!index) { 287 | index = Object.create(indexProto); 288 | index.map = new Map(); 289 | indexes.push(index); 290 | } 291 | 292 | if (indexProto === this.indexes['default']) { 293 | this.logDefaultIndexUsed(obj); 294 | } 295 | objs = index.map.get(key); 296 | if (!objs) { 297 | objs = []; 298 | index.map.set(key, objs); 299 | } 300 | objs.push(obj); 301 | } 302 | 303 | this.size++; 304 | selectors.push(selector); 305 | }; 306 | 307 | // Public: Remove selector from set. 308 | // 309 | // selector - String CSS selector 310 | // data - Optional data Object (default: undefined) 311 | // 312 | // Returns nothing. 313 | SelectorSet.prototype.remove = function(selector, data) { 314 | if (typeof selector !== 'string') { 315 | return; 316 | } 317 | 318 | var selectorIndexes, 319 | selectorIndex, 320 | i, 321 | j, 322 | k, 323 | selIndex, 324 | objs, 325 | obj, 326 | indexes = this.activeIndexes, 327 | selectors = (this.selectors = []), 328 | selectorObjects = this.selectorObjects, 329 | removedIds = {}, 330 | removeAll = arguments.length === 1; 331 | 332 | selectorIndexes = parseSelectorIndexes(this.indexes, selector); 333 | for (i = 0; i < selectorIndexes.length; i++) { 334 | selectorIndex = selectorIndexes[i]; 335 | 336 | j = indexes.length; 337 | while (j--) { 338 | selIndex = indexes[j]; 339 | if (selectorIndex.index.isPrototypeOf(selIndex)) { 340 | objs = selIndex.map.get(selectorIndex.key); 341 | if (objs) { 342 | k = objs.length; 343 | while (k--) { 344 | obj = objs[k]; 345 | if ( 346 | obj.selector === selector && 347 | (removeAll || obj.data === data) 348 | ) { 349 | objs.splice(k, 1); 350 | removedIds[obj.id] = true; 351 | } 352 | } 353 | } 354 | break; 355 | } 356 | } 357 | } 358 | 359 | for (i in removedIds) { 360 | delete selectorObjects[i]; 361 | this.size--; 362 | } 363 | 364 | for (i in selectorObjects) { 365 | selectors.push(selectorObjects[i].selector); 366 | } 367 | }; 368 | 369 | // Sort by id property handler. 370 | // 371 | // a - Selector obj. 372 | // b - Selector obj. 373 | // 374 | // Returns Number. 375 | function sortById(a, b) { 376 | return a.id - b.id; 377 | } 378 | 379 | // Public: Find all matching decendants of the context element. 380 | // 381 | // context - An Element 382 | // 383 | // Returns Array of {selector, data, elements} matches. 384 | SelectorSet.prototype.queryAll = function(context) { 385 | if (!this.selectors.length) { 386 | return []; 387 | } 388 | 389 | var matches = {}, 390 | results = []; 391 | var els = this.querySelectorAll(this.selectors.join(', '), context); 392 | 393 | var i, j, len, len2, el, m, match, obj; 394 | for (i = 0, len = els.length; i < len; i++) { 395 | el = els[i]; 396 | m = this.matches(el); 397 | for (j = 0, len2 = m.length; j < len2; j++) { 398 | obj = m[j]; 399 | if (!matches[obj.id]) { 400 | match = { 401 | id: obj.id, 402 | selector: obj.selector, 403 | data: obj.data, 404 | elements: [] 405 | }; 406 | matches[obj.id] = match; 407 | results.push(match); 408 | } else { 409 | match = matches[obj.id]; 410 | } 411 | match.elements.push(el); 412 | } 413 | } 414 | 415 | return results.sort(sortById); 416 | }; 417 | 418 | // Public: Match element against all selectors in set. 419 | // 420 | // el - An Element 421 | // 422 | // Returns Array of {selector, data} matches. 423 | SelectorSet.prototype.matches = function(el) { 424 | if (!el) { 425 | return []; 426 | } 427 | 428 | var i, j, k, len, len2, len3, index, keys, objs, obj, id; 429 | var indexes = this.activeIndexes, 430 | matchedIds = {}, 431 | matches = []; 432 | 433 | for (i = 0, len = indexes.length; i < len; i++) { 434 | index = indexes[i]; 435 | keys = index.element(el); 436 | if (keys) { 437 | for (j = 0, len2 = keys.length; j < len2; j++) { 438 | if ((objs = index.map.get(keys[j]))) { 439 | for (k = 0, len3 = objs.length; k < len3; k++) { 440 | obj = objs[k]; 441 | id = obj.id; 442 | if (!matchedIds[id] && this.matchesSelector(el, obj.selector)) { 443 | matchedIds[id] = true; 444 | matches.push(obj); 445 | } 446 | } 447 | } 448 | } 449 | } 450 | } 451 | 452 | return matches.sort(sortById); 453 | }; 454 | 455 | // Public: Export SelectorSet 456 | return SelectorSet; 457 | }); 458 | -------------------------------------------------------------------------------- /selector-set.js.flow: -------------------------------------------------------------------------------- 1 | /* @flow strict */ 2 | 3 | declare class SelectorSet { 4 | static (): SelectorSet; 5 | constructor(): void; 6 | 7 | size: number; 8 | 9 | matchesSelector: (el: Element, selector: string) => boolean; 10 | querySelectorAll: (selectors: string, context: Element) => Array; 11 | 12 | indexes: Array<{ 13 | name: string, 14 | selector: (selector: string) => ?string, 15 | element: (el: Element) => ?Array 16 | }>; 17 | 18 | add(selector: string, data: T): void; 19 | remove(selector: string, data?: T): void; 20 | 21 | matches(el: Element): Array<{ selector: string, data: T }>; 22 | queryAll( 23 | context: Element 24 | ): Array<{ selector: string, data: T, elements: Array }>; 25 | 26 | logDefaultIndexUsed: ({ selector: string, data: T }) => void; 27 | } 28 | 29 | declare module.exports: typeof SelectorSet; 30 | -------------------------------------------------------------------------------- /selector-set.next.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'selector-set/selector-set.next' { 2 | interface ISelectorSetIndex { 3 | name: string; 4 | selector: (selector: string) => string | void; 5 | element: (el: Element) => Array | void; 6 | } 7 | 8 | class SelectorSet { 9 | size: number; 10 | 11 | matchesSelector: (el: Element, selector: string) => boolean; 12 | querySelectorAll: (selectors: string, context: Element) => Array; 13 | 14 | indexes: Array; 15 | 16 | add(selector: string, data: T): void; 17 | remove(selector: string, data?: T): void; 18 | 19 | matches(el: Element): Array<{ selector: string; data: T }>; 20 | queryAll( 21 | context: Element 22 | ): Array<{ selector: string; data: T; elements: Array }>; 23 | 24 | logDefaultIndexUsed: ({ 25 | selector, 26 | data 27 | }: { 28 | selector: string; 29 | data: T; 30 | }) => void; 31 | } 32 | 33 | export default SelectorSet; 34 | } 35 | -------------------------------------------------------------------------------- /selector-set.next.js: -------------------------------------------------------------------------------- 1 | // Public: Create a new SelectorSet. 2 | export default function SelectorSet() { 3 | // Construct new SelectorSet if called as a function. 4 | if (!(this instanceof SelectorSet)) { 5 | return new SelectorSet(); 6 | } 7 | 8 | // Public: Number of selectors added to the set 9 | this.size = 0; 10 | 11 | // Internal: Incrementing ID counter 12 | this.uid = 0; 13 | 14 | // Internal: Array of String selectors in the set 15 | this.selectors = []; 16 | 17 | // Internal: Map of selector ids to objects 18 | this.selectorObjects = {}; 19 | 20 | // Internal: All Object index String names mapping to Index objects. 21 | this.indexes = Object.create(this.indexes); 22 | 23 | // Internal: Used Object index String names mapping to Index objects. 24 | this.activeIndexes = []; 25 | } 26 | 27 | // Detect prefixed Element#matches function. 28 | var docElem = window.document.documentElement; 29 | var matches = 30 | docElem.matches || 31 | docElem.webkitMatchesSelector || 32 | docElem.mozMatchesSelector || 33 | docElem.oMatchesSelector || 34 | docElem.msMatchesSelector; 35 | 36 | // Public: Check if element matches selector. 37 | // 38 | // Maybe overridden with custom Element.matches function. 39 | // 40 | // el - An Element 41 | // selector - String CSS selector 42 | // 43 | // Returns true or false. 44 | SelectorSet.prototype.matchesSelector = function(el, selector) { 45 | return matches.call(el, selector); 46 | }; 47 | 48 | // Public: Find all elements in the context that match the selector. 49 | // 50 | // Maybe overridden with custom querySelectorAll function. 51 | // 52 | // selectors - String CSS selectors. 53 | // context - Element context 54 | // 55 | // Returns non-live list of Elements. 56 | SelectorSet.prototype.querySelectorAll = function(selectors, context) { 57 | return context.querySelectorAll(selectors); 58 | }; 59 | 60 | // Public: Array of indexes. 61 | // 62 | // name - Unique String name 63 | // selector - Function that takes a String selector and returns a String key 64 | // or undefined if it can't be used by the index. 65 | // element - Function that takes an Element and returns an Array of String 66 | // keys that point to indexed values. 67 | // 68 | SelectorSet.prototype.indexes = []; 69 | 70 | // Index by element id 71 | var idRe = /^#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g; 72 | SelectorSet.prototype.indexes.push({ 73 | name: 'ID', 74 | selector: function matchIdSelector(sel) { 75 | var m; 76 | if ((m = sel.match(idRe))) { 77 | return m[0].slice(1); 78 | } 79 | }, 80 | element: function getElementId(el) { 81 | if (el.id) { 82 | return [el.id]; 83 | } 84 | } 85 | }); 86 | 87 | // Index by all of its class names 88 | var classRe = /^\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g; 89 | SelectorSet.prototype.indexes.push({ 90 | name: 'CLASS', 91 | selector: function matchClassSelector(sel) { 92 | var m; 93 | if ((m = sel.match(classRe))) { 94 | return m[0].slice(1); 95 | } 96 | }, 97 | element: function getElementClassNames(el) { 98 | var className = el.className; 99 | if (className) { 100 | if (typeof className === 'string') { 101 | return className.split(/\s/); 102 | } else if (typeof className === 'object' && 'baseVal' in className) { 103 | // className is a SVGAnimatedString 104 | // global SVGAnimatedString is not an exposed global in Opera 12 105 | return className.baseVal.split(/\s/); 106 | } 107 | } 108 | } 109 | }); 110 | 111 | // Index by tag/node name: `DIV`, `FORM`, `A` 112 | var tagRe = /^((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g; 113 | SelectorSet.prototype.indexes.push({ 114 | name: 'TAG', 115 | selector: function matchTagSelector(sel) { 116 | var m; 117 | if ((m = sel.match(tagRe))) { 118 | return m[0].toUpperCase(); 119 | } 120 | }, 121 | element: function getElementTagName(el) { 122 | return [el.nodeName.toUpperCase()]; 123 | } 124 | }); 125 | 126 | // Default index just contains a single array of elements. 127 | SelectorSet.prototype.indexes['default'] = { 128 | name: 'UNIVERSAL', 129 | selector: function() { 130 | return true; 131 | }, 132 | element: function() { 133 | return [true]; 134 | } 135 | }; 136 | 137 | // Use ES Maps when supported 138 | var Map; 139 | if (typeof window.Map === 'function') { 140 | Map = window.Map; 141 | } else { 142 | Map = (function() { 143 | function Map() { 144 | this.map = {}; 145 | } 146 | Map.prototype.get = function(key) { 147 | return this.map[key + ' ']; 148 | }; 149 | Map.prototype.set = function(key, value) { 150 | this.map[key + ' '] = value; 151 | }; 152 | return Map; 153 | })(); 154 | } 155 | 156 | // Regexps adopted from Sizzle 157 | // https://github.com/jquery/sizzle/blob/1.7/sizzle.js 158 | // 159 | var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g; 160 | 161 | // Internal: Get indexes for selector. 162 | // 163 | // selector - String CSS selector 164 | // 165 | // Returns Array of {index, key}. 166 | function parseSelectorIndexes(allIndexes, selector) { 167 | allIndexes = allIndexes.slice(0).concat(allIndexes['default']); 168 | 169 | var allIndexesLen = allIndexes.length, 170 | i, 171 | j, 172 | m, 173 | dup, 174 | rest = selector, 175 | key, 176 | index, 177 | indexes = []; 178 | 179 | do { 180 | chunker.exec(''); 181 | if ((m = chunker.exec(rest))) { 182 | rest = m[3]; 183 | if (m[2] || !rest) { 184 | for (i = 0; i < allIndexesLen; i++) { 185 | index = allIndexes[i]; 186 | if ((key = index.selector(m[1]))) { 187 | j = indexes.length; 188 | dup = false; 189 | while (j--) { 190 | if (indexes[j].index === index && indexes[j].key === key) { 191 | dup = true; 192 | break; 193 | } 194 | } 195 | if (!dup) { 196 | indexes.push({ index: index, key: key }); 197 | } 198 | break; 199 | } 200 | } 201 | } 202 | } 203 | } while (m); 204 | 205 | return indexes; 206 | } 207 | 208 | // Internal: Find first item in Array that is a prototype of `proto`. 209 | // 210 | // ary - Array of objects 211 | // proto - Prototype of expected item in `ary` 212 | // 213 | // Returns object from `ary` if found. Otherwise returns undefined. 214 | function findByPrototype(ary, proto) { 215 | var i, len, item; 216 | for (i = 0, len = ary.length; i < len; i++) { 217 | item = ary[i]; 218 | if (proto.isPrototypeOf(item)) { 219 | return item; 220 | } 221 | } 222 | } 223 | 224 | // Public: Log when added selector falls under the default index. 225 | // 226 | // This API should not be considered stable. May change between 227 | // minor versions. 228 | // 229 | // obj - {selector, data} Object 230 | // 231 | // SelectorSet.prototype.logDefaultIndexUsed = function(obj) { 232 | // console.warn(obj.selector, "could not be indexed"); 233 | // }; 234 | // 235 | // Returns nothing. 236 | SelectorSet.prototype.logDefaultIndexUsed = function() {}; 237 | 238 | // Public: Add selector to set. 239 | // 240 | // selector - String CSS selector 241 | // data - Optional data Object (default: undefined) 242 | // 243 | // Returns nothing. 244 | SelectorSet.prototype.add = function(selector, data) { 245 | var obj, 246 | i, 247 | indexProto, 248 | key, 249 | index, 250 | objs, 251 | selectorIndexes, 252 | selectorIndex, 253 | indexes = this.activeIndexes, 254 | selectors = this.selectors, 255 | selectorObjects = this.selectorObjects; 256 | 257 | if (typeof selector !== 'string') { 258 | return; 259 | } 260 | 261 | obj = { 262 | id: this.uid++, 263 | selector: selector, 264 | data: data 265 | }; 266 | selectorObjects[obj.id] = obj; 267 | 268 | selectorIndexes = parseSelectorIndexes(this.indexes, selector); 269 | for (i = 0; i < selectorIndexes.length; i++) { 270 | selectorIndex = selectorIndexes[i]; 271 | key = selectorIndex.key; 272 | indexProto = selectorIndex.index; 273 | 274 | index = findByPrototype(indexes, indexProto); 275 | if (!index) { 276 | index = Object.create(indexProto); 277 | index.map = new Map(); 278 | indexes.push(index); 279 | } 280 | 281 | if (indexProto === this.indexes['default']) { 282 | this.logDefaultIndexUsed(obj); 283 | } 284 | objs = index.map.get(key); 285 | if (!objs) { 286 | objs = []; 287 | index.map.set(key, objs); 288 | } 289 | objs.push(obj); 290 | } 291 | 292 | this.size++; 293 | selectors.push(selector); 294 | }; 295 | 296 | // Public: Remove selector from set. 297 | // 298 | // selector - String CSS selector 299 | // data - Optional data Object (default: undefined) 300 | // 301 | // Returns nothing. 302 | SelectorSet.prototype.remove = function(selector, data) { 303 | if (typeof selector !== 'string') { 304 | return; 305 | } 306 | 307 | var selectorIndexes, 308 | selectorIndex, 309 | i, 310 | j, 311 | k, 312 | selIndex, 313 | objs, 314 | obj, 315 | indexes = this.activeIndexes, 316 | selectors = (this.selectors = []), 317 | selectorObjects = this.selectorObjects, 318 | removedIds = {}, 319 | removeAll = arguments.length === 1; 320 | 321 | selectorIndexes = parseSelectorIndexes(this.indexes, selector); 322 | for (i = 0; i < selectorIndexes.length; i++) { 323 | selectorIndex = selectorIndexes[i]; 324 | 325 | j = indexes.length; 326 | while (j--) { 327 | selIndex = indexes[j]; 328 | if (selectorIndex.index.isPrototypeOf(selIndex)) { 329 | objs = selIndex.map.get(selectorIndex.key); 330 | if (objs) { 331 | k = objs.length; 332 | while (k--) { 333 | obj = objs[k]; 334 | if (obj.selector === selector && (removeAll || obj.data === data)) { 335 | objs.splice(k, 1); 336 | removedIds[obj.id] = true; 337 | } 338 | } 339 | } 340 | break; 341 | } 342 | } 343 | } 344 | 345 | for (i in removedIds) { 346 | delete selectorObjects[i]; 347 | this.size--; 348 | } 349 | 350 | for (i in selectorObjects) { 351 | selectors.push(selectorObjects[i].selector); 352 | } 353 | }; 354 | 355 | // Sort by id property handler. 356 | // 357 | // a - Selector obj. 358 | // b - Selector obj. 359 | // 360 | // Returns Number. 361 | function sortById(a, b) { 362 | return a.id - b.id; 363 | } 364 | 365 | // Public: Find all matching decendants of the context element. 366 | // 367 | // context - An Element 368 | // 369 | // Returns Array of {selector, data, elements} matches. 370 | SelectorSet.prototype.queryAll = function(context) { 371 | if (!this.selectors.length) { 372 | return []; 373 | } 374 | 375 | var matches = {}, 376 | results = []; 377 | var els = this.querySelectorAll(this.selectors.join(', '), context); 378 | 379 | var i, j, len, len2, el, m, match, obj; 380 | for (i = 0, len = els.length; i < len; i++) { 381 | el = els[i]; 382 | m = this.matches(el); 383 | for (j = 0, len2 = m.length; j < len2; j++) { 384 | obj = m[j]; 385 | if (!matches[obj.id]) { 386 | match = { 387 | id: obj.id, 388 | selector: obj.selector, 389 | data: obj.data, 390 | elements: [] 391 | }; 392 | matches[obj.id] = match; 393 | results.push(match); 394 | } else { 395 | match = matches[obj.id]; 396 | } 397 | match.elements.push(el); 398 | } 399 | } 400 | 401 | return results.sort(sortById); 402 | }; 403 | 404 | // Public: Match element against all selectors in set. 405 | // 406 | // el - An Element 407 | // 408 | // Returns Array of {selector, data} matches. 409 | SelectorSet.prototype.matches = function(el) { 410 | if (!el) { 411 | return []; 412 | } 413 | 414 | var i, j, k, len, len2, len3, index, keys, objs, obj, id; 415 | var indexes = this.activeIndexes, 416 | matchedIds = {}, 417 | matches = []; 418 | 419 | for (i = 0, len = indexes.length; i < len; i++) { 420 | index = indexes[i]; 421 | keys = index.element(el); 422 | if (keys) { 423 | for (j = 0, len2 = keys.length; j < len2; j++) { 424 | if ((objs = index.map.get(keys[j]))) { 425 | for (k = 0, len3 = objs.length; k < len3; k++) { 426 | obj = objs[k]; 427 | id = obj.id; 428 | if (!matchedIds[id] && this.matchesSelector(el, obj.selector)) { 429 | matchedIds[id] = true; 430 | matches.push(obj); 431 | } 432 | } 433 | } 434 | } 435 | } 436 | } 437 | 438 | return matches.sort(sortById); 439 | }; 440 | -------------------------------------------------------------------------------- /selector-set.next.js.flow: -------------------------------------------------------------------------------- 1 | /* @flow strict */ 2 | 3 | declare class SelectorSet { 4 | static (): SelectorSet; 5 | constructor(): void; 6 | 7 | size: number; 8 | 9 | matchesSelector: (el: Element, selector: string) => boolean; 10 | querySelectorAll: (selectors: string, context: Element) => Array; 11 | 12 | indexes: Array<{ 13 | name: string, 14 | selector: (selector: string) => ?string, 15 | element: (el: Element) => ?Array 16 | }>; 17 | 18 | add(selector: string, data: T): void; 19 | remove(selector: string, data?: T): void; 20 | 21 | matches(el: Element): Array<{ selector: string, data: T }>; 22 | queryAll( 23 | context: Element 24 | ): Array<{ selector: string, data: T, elements: Array }>; 25 | 26 | logDefaultIndexUsed: ({ selector: string, data: T }) => void; 27 | } 28 | 29 | declare module.exports: typeof SelectorSet; 30 | -------------------------------------------------------------------------------- /test/exemplar-selector-set.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | function ExemplarSelectorSet() { 5 | this.selectors = []; 6 | this.uid = 0; 7 | } 8 | 9 | ExemplarSelectorSet.prototype = Object.create(SelectorSet.prototype, { 10 | constructor: { 11 | enumerable: false, 12 | value: ExemplarSelectorSet 13 | }, 14 | size: { 15 | get: function() { 16 | return this.selectors.length; 17 | } 18 | } 19 | }); 20 | 21 | ExemplarSelectorSet.prototype.add = function(selector, data) { 22 | if (typeof selector === 'string') { 23 | this.selectors.push({ 24 | id: this.uid++, 25 | selector: selector, 26 | data: data 27 | }); 28 | } 29 | }; 30 | 31 | ExemplarSelectorSet.prototype.remove = function(selector, data) { 32 | if (typeof selector === 'string') { 33 | var obj, 34 | selectors = [], 35 | i = this.selectors.length; 36 | while (i--) { 37 | obj = this.selectors[i]; 38 | if ( 39 | obj.selector !== selector || 40 | (arguments.length === 2 && obj.data !== data) 41 | ) { 42 | selectors.push(obj); 43 | } 44 | } 45 | this.selectors = selectors; 46 | } 47 | }; 48 | 49 | ExemplarSelectorSet.prototype.queryAll = function(context) { 50 | var i, 51 | obj, 52 | els, 53 | matches = []; 54 | for (i = 0; i < this.selectors.length; i++) { 55 | obj = this.selectors[i]; 56 | els = this.querySelectorAll(obj.selector, context); 57 | if (els.length) { 58 | matches.push({ 59 | id: obj.id, 60 | selector: obj.selector, 61 | data: obj.data, 62 | elements: Array.prototype.slice.call(els, 0) 63 | }); 64 | } 65 | } 66 | return matches; 67 | }; 68 | 69 | ExemplarSelectorSet.prototype.matches = function(el) { 70 | var i, 71 | obj, 72 | matches = []; 73 | for (i = 0; i < this.selectors.length; i++) { 74 | obj = this.selectors[i]; 75 | if (el && this.matchesSelector(el, obj.selector)) { 76 | matches.push({ 77 | id: obj.id, 78 | selector: obj.selector, 79 | data: obj.data 80 | }); 81 | } 82 | } 83 | return matches; 84 | }; 85 | 86 | window.ExemplarSelectorSet = ExemplarSelectorSet; 87 | })(); 88 | -------------------------------------------------------------------------------- /test/fuzz.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | var testCount = 100; 5 | 6 | function seededRandomFn(seed) { 7 | function random() { 8 | seed = (seed * 9301 + 49297) % 233280; 9 | return seed / 233280; 10 | } 11 | return random; 12 | } 13 | 14 | function retry(callback) { 15 | var n = 1000000; 16 | while (n--) { 17 | try { 18 | return callback(); 19 | } catch (err) { 20 | continue; 21 | } 22 | } 23 | } 24 | 25 | var alpha = {}; 26 | var c = 65535; 27 | while (--c) { 28 | var s = String.fromCharCode(c); 29 | // var m = s.match(/^[\w\u00c0-\uFFFF\-]$/); 30 | var m = s.match(/^[\wa-zA-Z0-9\-]$/); 31 | if (m) { 32 | alpha[s] = c; 33 | } 34 | } 35 | alpha = Object.keys(alpha); 36 | 37 | function randomChar(rand) { 38 | return alpha[Math.floor(rand() * 1e10) % alpha.length]; 39 | } 40 | 41 | function randomId(rand) { 42 | return randomChar(rand) + randomChar(rand) + randomChar(rand); 43 | } 44 | 45 | function randomElement(rand) { 46 | var el = retry(function() { 47 | return document.createElement(randomId(rand)); 48 | }); 49 | 50 | retry(function() { 51 | el.id = randomId(rand); 52 | }); 53 | 54 | retry(function() { 55 | el.className = [randomId(rand), randomId(rand), randomId(rand)].join(' '); 56 | }); 57 | 58 | retry(function() { 59 | el.setAttribute(randomId(rand), randomId(rand)); 60 | }); 61 | retry(function() { 62 | el.setAttribute( 63 | randomId(rand), 64 | [randomId(rand), randomId(rand)].join(' ') 65 | ); 66 | }); 67 | 68 | return el; 69 | } 70 | 71 | function randomTree(rand) { 72 | var child, parent, root; 73 | root = randomElement(rand); 74 | parent = root; 75 | 76 | var i = rand() * 100; 77 | while (--i > 0) { 78 | child = randomElement(rand); 79 | if (child) { 80 | parent.appendChild(child); 81 | } 82 | 83 | if (rand() > 0.75) { 84 | parent = child; 85 | } 86 | } 87 | return root; 88 | } 89 | 90 | function randomSelector(rand, el) { 91 | var sel; 92 | var len = el.attributes.length; 93 | 94 | if (len) { 95 | var i = Math.floor(rand() * 1000) % len; 96 | var attr = el.attributes[i]; 97 | 98 | if (rand() > 0.25 && attr.name === 'id') { 99 | sel = '#' + attr.value; 100 | } else if (rand() > 0.25 && attr.name === 'class') { 101 | sel = '.' + attr.value.split(' ')[0]; 102 | } else { 103 | sel = '[' + attr.name + '="' + attr.value + '"]'; 104 | } 105 | } else { 106 | sel = el.nodeName.toLowerCase(); 107 | } 108 | 109 | try { 110 | if (SelectorSet.prototype.matchesSelector(document.body, sel + ',*')) { 111 | return sel; 112 | } 113 | } catch (err) { 114 | return; 115 | } 116 | } 117 | 118 | function randomSelectorsForRoot(rand, el) { 119 | var sels = []; 120 | 121 | var i, 122 | els = el.getElementsByTagName('*'); 123 | for (i = 0; i < els.length; i++) { 124 | var sel = randomSelector(rand, els[i]); 125 | if (sel) { 126 | sels.push(sel); 127 | } 128 | } 129 | 130 | return sels; 131 | } 132 | 133 | if (!window.sessionStorage.seed) { 134 | window.sessionStorage.seed = Math.random(); 135 | } 136 | var suiteSeed = parseFloat(window.sessionStorage.seed); 137 | var suiteRand = seededRandomFn(suiteSeed); 138 | 139 | function test(testName, callback) { 140 | var i, seed; 141 | 142 | function testFn(seed) { 143 | return function() { 144 | callback.call(this, seededRandomFn(seed)); 145 | }; 146 | } 147 | 148 | for (i = 0; i < testCount; i++) { 149 | seed = suiteRand(); 150 | QUnit.test(testName + ' (' + seed + ')', testFn(seed)); 151 | } 152 | } 153 | 154 | function testEqual(actualObj, expectedObj) { 155 | function deepEqual(callback) { 156 | var actualValue, expectedValue, actualError, expectedError; 157 | 158 | try { 159 | actualValue = callback(actualObj); 160 | } catch (err) { 161 | actualError = err; 162 | } 163 | 164 | try { 165 | expectedValue = callback(expectedObj); 166 | } catch (err) { 167 | expectedError = err; 168 | } 169 | 170 | if (actualError || expectedError) { 171 | QUnit.ok(actualError); 172 | QUnit.ok(expectedError); 173 | } 174 | QUnit.deepEqual(actualValue, expectedValue); 175 | } 176 | return deepEqual; 177 | } 178 | 179 | test('match', function(rand) { 180 | var expectedSet = new ExemplarSelectorSet(); 181 | var actualSet = new SelectorSet(); 182 | var deepEqual = testEqual(actualSet, expectedSet); 183 | 184 | var root = randomTree(rand); 185 | var els = root.getElementsByTagName('*'); 186 | var sels = randomSelectorsForRoot(rand, root); 187 | 188 | deepEqual(function(set) { 189 | return set.size; 190 | }); 191 | 192 | var i; 193 | function setAdd(set) { 194 | return set.add(sels[i]); 195 | } 196 | for (i = 0; i < sels.length; i++) { 197 | deepEqual(setAdd); 198 | } 199 | 200 | deepEqual(function(set) { 201 | return set.size; 202 | }); 203 | 204 | function setMatch(set) { 205 | return set.matches(els[i]); 206 | } 207 | for (i = 0; i < els.length; i++) { 208 | deepEqual(setMatch); 209 | } 210 | }); 211 | 212 | test('queryAll', function(rand) { 213 | var expectedSet = new ExemplarSelectorSet(); 214 | var actualSet = new SelectorSet(); 215 | var deepEqual = testEqual(actualSet, expectedSet); 216 | 217 | var root = randomTree(rand); 218 | var sels = randomSelectorsForRoot(rand, root); 219 | 220 | deepEqual(function(set) { 221 | return set.size; 222 | }); 223 | 224 | var i; 225 | function setAdd(set) { 226 | return set.add(sels[i]); 227 | } 228 | for (i = 0; i < sels.length; i++) { 229 | deepEqual(setAdd); 230 | } 231 | 232 | deepEqual(function(set) { 233 | return set.size; 234 | }); 235 | 236 | deepEqual(function(set) { 237 | return set.queryAll(root); 238 | }); 239 | }); 240 | })(); 241 | -------------------------------------------------------------------------------- /test/perf.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Performance 6 | 7 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /test/perf.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | function each(obj, fn) { 5 | for (var key in obj) { 6 | fn(key, obj[key]); 7 | } 8 | } 9 | 10 | function defineCachedProperties(obj, props) { 11 | var properties = {}; 12 | each(props, function(name, fn) { 13 | var cache; 14 | properties[name] = { 15 | get: function() { 16 | if (!cache) { 17 | cache = fn.apply(this, arguments); 18 | } 19 | return cache; 20 | } 21 | }; 22 | }); 23 | Object.defineProperties(obj, properties); 24 | } 25 | 26 | function random() { 27 | return Math.floor(Math.random() * 1e10); 28 | } 29 | 30 | function initSet(Set, selectors) { 31 | var set = new Set(); 32 | for (var i = 0; i < selectors.length; i++) { 33 | set.add(selectors[i]); 34 | } 35 | return set; 36 | } 37 | 38 | function createElementMatchingSelector(selector) { 39 | if (!selector) { 40 | return; 41 | } 42 | 43 | var m, el; 44 | if ((m = selector.match(/^#(\w+)$/))) { 45 | el = document.createElement('div'); 46 | el.id = m[1]; 47 | } else if ((m = selector.match(/^\.(\w+)$/))) { 48 | el = document.createElement('div'); 49 | el.className = m[1]; 50 | } else if ((m = selector.match(/^(\w+)$/))) { 51 | el = document.createElement(m[1]); 52 | } 53 | 54 | if (!SelectorSet.prototype.matchesSelector(el, selector)) { 55 | throw 'couldn\'t make element matching "' + selector + '"'; 56 | } 57 | 58 | return el; 59 | } 60 | 61 | function Bench(props) { 62 | for (var propName in props) { 63 | this[propName] = props[propName]; 64 | } 65 | } 66 | 67 | Bench.prototype.implementations = [SelectorSet, ExemplarSelectorSet]; 68 | Bench.prototype.sizes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25]; 69 | 70 | defineCachedProperties(Bench.prototype, { 71 | selectors: function() { 72 | var selectors = []; 73 | var n = 100; 74 | while (n--) { 75 | selectors.push(this.randomSelector()); 76 | } 77 | return selectors; 78 | }, 79 | sets: function() { 80 | var i, 81 | j, 82 | sets = []; 83 | for (i = 0; i < this.sizes.length; i++) { 84 | var selectors = this.selectors.slice(0, this.sizes[i]); 85 | for (j = 0; j < this.implementations.length; j++) { 86 | sets.push(initSet(this.implementations[j], selectors)); 87 | } 88 | } 89 | return sets; 90 | }, 91 | element: function() { 92 | return createElementMatchingSelector(this.selectors[0]); 93 | }, 94 | tree: function() { 95 | var root = document.createElement('div'); 96 | root.innerHTML = 97 | '
'; 98 | root.querySelector('#parent').appendChild(this.element); 99 | return root; 100 | }, 101 | suite: function() { 102 | var i, 103 | suite = new Benchmark.Suite(); 104 | for (i = 0; i < this.sets.length; i++) { 105 | var set = this.sets[i]; 106 | var run = this.run(set); 107 | run.set = set; 108 | suite.add(run); 109 | } 110 | return suite; 111 | } 112 | }); 113 | 114 | Bench.prototype.runMatch = function(set) { 115 | var el = this.element; 116 | return function run() { 117 | set.matches(el); 118 | }; 119 | }; 120 | 121 | Bench.prototype.runQueryAll = function(set) { 122 | var root = this.tree; 123 | return function run() { 124 | set.queryAll(root); 125 | }; 126 | }; 127 | 128 | var benchmarks = [ 129 | new Bench({ 130 | name: 'match - id', 131 | randomSelector: function() { 132 | return '#rand' + random(); 133 | }, 134 | run: Bench.prototype.runMatch 135 | }), 136 | new Bench({ 137 | name: 'match - class', 138 | randomSelector: function() { 139 | return '.rand' + random(); 140 | }, 141 | run: Bench.prototype.runMatch 142 | }), 143 | new Bench({ 144 | name: 'match - tag', 145 | randomSelector: function() { 146 | return 'rand' + random(); 147 | }, 148 | run: Bench.prototype.runMatch 149 | }), 150 | new Bench({ 151 | name: 'match - id/class', 152 | randomSelector: function() { 153 | if (Math.random() < 0.5) { 154 | return '#rand' + random(); 155 | } else { 156 | return '.rand' + random(); 157 | } 158 | }, 159 | run: Bench.prototype.runMatch 160 | }), 161 | new Bench({ 162 | name: 'queryAll - id', 163 | randomSelector: function() { 164 | return '#rand' + random(); 165 | }, 166 | run: Bench.prototype.runQueryAll 167 | }) 168 | ]; 169 | 170 | function graph(root) { 171 | var margin = { top: 10, right: 10, bottom: 20, left: 30 }, 172 | width = root.width.baseVal.value - margin.left - margin.right, 173 | height = root.height.baseVal.value - margin.top - margin.bottom; 174 | 175 | var x = d3.scale.linear().range([0, width]); 176 | 177 | var y = d3.scale.linear().range([height, 0]); 178 | 179 | function domain(data, fn) { 180 | return [ 181 | d3.min(data, function(d) { 182 | return d3.min(d.values, fn); 183 | }), 184 | d3.max(data, function(d) { 185 | return d3.max(d.values, fn); 186 | }) 187 | ]; 188 | } 189 | 190 | var color = d3.scale.category10(); 191 | function stroke(d) { 192 | return color(d.key); 193 | } 194 | 195 | var xAxis = d3.svg 196 | .axis() 197 | .scale(x) 198 | .orient('bottom'); 199 | 200 | var yAxis = d3.svg 201 | .axis() 202 | .scale(y) 203 | .orient('left'); 204 | 205 | var nest = d3.nest().key(function(d) { 206 | return d.fn.set.constructor.name; 207 | }); 208 | 209 | function xValue(bench) { 210 | return bench.fn.set.selectors.length; 211 | } 212 | function yValue(bench) { 213 | return bench.stats.mean * 1000 * 1000; 214 | } 215 | 216 | var line = d3.svg 217 | .line() 218 | .interpolate('basis') 219 | .x(function(d) { 220 | return x(xValue(d)); 221 | }) 222 | .y(function(d) { 223 | return y(yValue(d)); 224 | }); 225 | 226 | var svg = d3 227 | .select(root) 228 | .append('g') 229 | .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); 230 | 231 | svg 232 | .append('g') 233 | .attr('class', 'x axis') 234 | .attr('transform', 'translate(0, ' + height + ')') 235 | .call(xAxis); 236 | 237 | svg 238 | .append('g') 239 | .attr('class', 'y axis') 240 | .call(yAxis) 241 | .append('text') 242 | .attr('transform', 'rotate(-90)') 243 | .attr('y', 6) 244 | .attr('dy', '.71em') 245 | .style('text-anchor', 'end') 246 | .text('μs'); 247 | 248 | function redraw(suite) { 249 | var data = nest.entries(suite); 250 | 251 | x.domain(domain(data, xValue)); 252 | svg 253 | .select('.x.axis') 254 | .transition() 255 | .call(xAxis); 256 | 257 | y.domain(domain(data, yValue)); 258 | svg 259 | .select('.y.axis') 260 | .transition() 261 | .call(yAxis); 262 | 263 | var l = svg.selectAll('.line').data(data); 264 | 265 | l.enter() 266 | .append('path') 267 | .attr('class', 'line') 268 | .style('stroke', stroke); 269 | 270 | l.exit().remove(); 271 | 272 | l.transition().attr('d', function(d) { 273 | return line(d.values); 274 | }); 275 | } 276 | 277 | return redraw; 278 | } 279 | 280 | window.perf = { 281 | benchmarks: benchmarks, 282 | graph: graph 283 | }; 284 | })(); 285 | -------------------------------------------------------------------------------- /test/test-exemplar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Test Suite 6 | 7 | 8 | 9 |
10 |
11 |
12 | 13 |
14 |
15 |
16 |
17 | 18 |
19 | 20 |
21 |
22 |
23 | 24 |
25 |
26 |
27 |
28 |
29 | 30 |
31 | 32 | 33 | 34 |
35 |
36 | 37 | 38 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /test/test-fuzz.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Test Suite 6 | 7 | 8 | 9 |
10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /test/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Test Suite 6 | 7 | 8 | 9 |
10 |
11 |
12 | 13 |
14 |
15 |
16 |
17 | 18 |
19 | 20 |
21 |
22 |
23 | 24 |
25 |
26 |
27 |
28 |
29 | 30 |
31 | 32 | 33 | 34 |
35 |
36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /test/unit/add.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | module('add'); 5 | 6 | test('ignores non string selector', function() { 7 | var set = new SelectorSet(); 8 | set.add(); 9 | set.remove(); 10 | set.add({}); 11 | set.remove({}); 12 | set.add(1); 13 | set.remove(1); 14 | ok(true); 15 | }); 16 | 17 | test('increments size', function() { 18 | var set = new SelectorSet(); 19 | equal(set.size, 0); 20 | 21 | set.add('#foo'); 22 | equal(set.size, 1); 23 | 24 | set.add('#foo'); 25 | equal(set.size, 2); 26 | 27 | set.add('#bar'); 28 | equal(set.size, 3); 29 | 30 | set.add('#bar', 123); 31 | equal(set.size, 4); 32 | 33 | set.add('#bar', 456); 34 | equal(set.size, 5); 35 | 36 | set.remove('#foo'); 37 | equal(set.size, 3); 38 | 39 | set.remove('#bar', undefined); 40 | equal(set.size, 2); 41 | 42 | set.remove('#bar', 456); 43 | equal(set.size, 1); 44 | 45 | set.remove('#bar'); 46 | equal(set.size, 0); 47 | }); 48 | })(); 49 | -------------------------------------------------------------------------------- /test/unit/matches.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | module('matches'); 5 | 6 | test('undefined', function() { 7 | var set = new SelectorSet(); 8 | var results = set.matches(null); 9 | equal(results.length, 0); 10 | }); 11 | 12 | test('no selectors', function() { 13 | var set = new SelectorSet(); 14 | var fixture1 = document.getElementById('fixture1'); 15 | ok(fixture1); 16 | 17 | var results = set.matches(fixture1); 18 | equal(results.length, 0); 19 | }); 20 | 21 | test('add/remove', function() { 22 | var set = new SelectorSet(); 23 | var fixture1 = document.getElementById('fixture1'); 24 | var el = fixture1.querySelector('#foo'); 25 | ok(el); 26 | 27 | set.add('#foo'); 28 | var results = set.matches(el); 29 | equal(results.length, 1); 30 | equal(results[0].selector, '#foo'); 31 | 32 | set.remove('#foo'); 33 | results = set.matches(el); 34 | equal(results.length, 0); 35 | }); 36 | 37 | test('add/remove multiple', function() { 38 | var set = new SelectorSet(); 39 | var fixture1 = document.getElementById('fixture1'); 40 | var el = fixture1.querySelector('#foo'); 41 | ok(el); 42 | 43 | set.add('#foo'); 44 | set.add('#foo'); 45 | var results = set.matches(el); 46 | equal(results.length, 2); 47 | equal(results[0].selector, '#foo'); 48 | equal(results[1].selector, '#foo'); 49 | 50 | set.remove('#foo'); 51 | results = set.matches(el); 52 | equal(results.length, 0); 53 | }); 54 | 55 | test('add/remove multiple indexed', function() { 56 | var set = new SelectorSet(); 57 | var fixture1 = document.getElementById('fixture1'); 58 | var el = fixture1.querySelector('#foo'); 59 | ok(el); 60 | 61 | set.add('#foo, #bar, .baz'); 62 | var results = set.matches(el); 63 | equal(results.length, 1); 64 | equal(results[0].selector, '#foo, #bar, .baz'); 65 | 66 | set.remove('#foo, #bar, .baz'); 67 | results = set.matches(el); 68 | equal(results.length, 0); 69 | }); 70 | 71 | test('add/remove data', function() { 72 | var set = new SelectorSet(); 73 | var fixture1 = document.getElementById('fixture1'); 74 | var el = fixture1.querySelector('#foo'); 75 | ok(el); 76 | 77 | set.add('#foo', 123); 78 | var results = set.matches(el); 79 | equal(results.length, 1); 80 | equal(results[0].selector, '#foo'); 81 | 82 | set.remove('#foo', 456); 83 | results = set.matches(el); 84 | equal(results.length, 1); 85 | equal(results[0].selector, '#foo'); 86 | 87 | set.remove('#foo', 123); 88 | results = set.matches(el); 89 | equal(results.length, 0); 90 | }); 91 | 92 | test('id', function() { 93 | var set = new SelectorSet(); 94 | set.add('#foo'); 95 | set.add('#bar'); 96 | set.add('#baz'); 97 | 98 | var fixture1 = document.getElementById('fixture1'); 99 | var el = fixture1.querySelector('#foo'); 100 | ok(el); 101 | var results = set.matches(el); 102 | equal(results.length, 1); 103 | equal(results[0].selector, '#foo'); 104 | 105 | el = fixture1.querySelector('.foo'); 106 | ok(el); 107 | results = set.matches(el); 108 | equal(results.length, 0); 109 | }); 110 | 111 | test('id as attribute', function() { 112 | var set = new SelectorSet(); 113 | set.add('[id=foo]'); 114 | set.add('#foo'); 115 | 116 | var fixture1 = document.getElementById('fixture1'); 117 | var el = fixture1.querySelector('[id=foo]'); 118 | ok(el); 119 | var results = set.matches(el); 120 | equal(results.length, 2); 121 | equal(results[0].selector, '[id=foo]'); 122 | equal(results[1].selector, '#foo'); 123 | }); 124 | 125 | test('id with tag', function() { 126 | var set = new SelectorSet(); 127 | set.add('div#foo'); 128 | set.add('span#foo'); 129 | set.add('div#bar'); 130 | 131 | var fixture1 = document.getElementById('fixture1'); 132 | var el = fixture1.querySelector('div#foo'); 133 | ok(el); 134 | var results = set.matches(el); 135 | equal(results.length, 1); 136 | equal(results[0].selector, 'div#foo'); 137 | 138 | el = fixture1.querySelector('div.foo'); 139 | ok(el); 140 | results = set.matches(el); 141 | equal(results.length, 0); 142 | }); 143 | 144 | test('class', function() { 145 | var set = new SelectorSet(); 146 | set.add('.foo'); 147 | set.add('.bar'); 148 | set.add('.baz'); 149 | 150 | var fixture1 = document.getElementById('fixture1'); 151 | var el = fixture1.querySelector('.foo'); 152 | ok(el); 153 | var results = set.matches(el); 154 | equal(results.length, 1); 155 | equal(results[0].selector, '.foo'); 156 | 157 | el = fixture1.querySelector('#foo'); 158 | ok(el); 159 | results = set.matches(el); 160 | equal(results.length, 0); 161 | }); 162 | 163 | test('class as attribute', function() { 164 | var set = new SelectorSet(); 165 | set.add('[class=foo]'); 166 | set.add('.foo'); 167 | 168 | var fixture1 = document.getElementById('fixture1'); 169 | var el = fixture1.querySelector('[class=foo]'); 170 | ok(el); 171 | var results = set.matches(el); 172 | equal(results.length, 2); 173 | equal(results[0].selector, '[class=foo]'); 174 | equal(results[1].selector, '.foo'); 175 | }); 176 | 177 | test('class with tag', function() { 178 | var set = new SelectorSet(); 179 | set.add('div.foo'); 180 | set.add('span.foo'); 181 | set.add('div.bar'); 182 | 183 | var fixture1 = document.getElementById('fixture1'); 184 | var el = fixture1.querySelector('div.foo'); 185 | ok(el); 186 | var results = set.matches(el); 187 | equal(results.length, 1); 188 | equal(results[0].selector, 'div.foo'); 189 | 190 | el = fixture1.querySelector('div#foo'); 191 | ok(el); 192 | results = set.matches(el); 193 | equal(results.length, 0); 194 | }); 195 | 196 | test('tag', function() { 197 | var set = new SelectorSet(); 198 | set.add('foo'); 199 | set.add('bar'); 200 | set.add('baz'); 201 | 202 | var fixture1 = document.getElementById('fixture1'); 203 | var el = fixture1.querySelector('foo'); 204 | ok(el); 205 | var results = set.matches(el); 206 | equal(results.length, 1); 207 | equal(results[0].selector, 'foo'); 208 | 209 | el = fixture1.querySelector('div'); 210 | ok(el); 211 | results = set.matches(el); 212 | equal(results.length, 0); 213 | }); 214 | 215 | test('attribute', function() { 216 | var set = new SelectorSet(); 217 | set.add('[foo=bar]'); 218 | set.add('[foo=baz]'); 219 | 220 | var fixture1 = document.getElementById('fixture1'); 221 | var el = fixture1.querySelector('[foo=bar]'); 222 | ok(el); 223 | var results = set.matches(el); 224 | equal(results.length, 1); 225 | equal(results[0].selector, '[foo=bar]'); 226 | }); 227 | 228 | test('attribute with "#bar" as value', function() { 229 | var set = new SelectorSet(); 230 | set.add('[foo="#bar"]'); 231 | 232 | var fixture2 = document.getElementById('fixture2'); 233 | var el = fixture2.querySelector('[foo="#bar"]'); 234 | ok(el); 235 | var results = set.matches(el); 236 | equal(results.length, 1); 237 | equal(results[0].selector, '[foo="#bar"]'); 238 | }); 239 | 240 | test('attribute with ".bar" as value', function() { 241 | var set = new SelectorSet(); 242 | set.add('[foo=".bar"]'); 243 | 244 | var fixture2 = document.getElementById('fixture2'); 245 | var el = fixture2.querySelector('[foo=".bar"]'); 246 | ok(el); 247 | var results = set.matches(el); 248 | equal(results.length, 1); 249 | equal(results[0].selector, '[foo=".bar"]'); 250 | }); 251 | 252 | test('universal', function() { 253 | var set = new SelectorSet(); 254 | set.add('*'); 255 | 256 | var fixture1 = document.getElementById('fixture1'); 257 | var el = fixture1.querySelector('*'); 258 | ok(el); 259 | var results = set.matches(el); 260 | equal(results.length, 1); 261 | equal(results[0].selector, '*'); 262 | }); 263 | 264 | test('id and class', function() { 265 | var set = new SelectorSet(); 266 | set.add('#foo'); 267 | set.add('#bar'); 268 | set.add('.foo'); 269 | set.add('.bar'); 270 | 271 | var fixture1 = document.getElementById('fixture1'); 272 | var el = fixture1.querySelector('#foo'); 273 | ok(el); 274 | var results = set.matches(el); 275 | equal(results.length, 1); 276 | equal(results[0].selector, '#foo'); 277 | 278 | el = fixture1.querySelector('.foo'); 279 | ok(el); 280 | results = set.matches(el); 281 | equal(results.length, 1); 282 | equal(results[0].selector, '.foo'); 283 | 284 | el = fixture1.querySelector('foo'); 285 | ok(el); 286 | results = set.matches(el); 287 | equal(results.length, 0); 288 | }); 289 | 290 | test('multiple id and class match', function() { 291 | var set = new SelectorSet(); 292 | set.add('#foo'); 293 | set.add('#bar'); 294 | set.add('.foo'); 295 | set.add('.bar'); 296 | 297 | var fixture2 = document.getElementById('fixture2'); 298 | var el = fixture2.querySelector('foo'); 299 | ok(el); 300 | var results = set.matches(el); 301 | equal(results.length, 2); 302 | equal(results[0].selector, '#foo'); 303 | equal(results[1].selector, '.foo'); 304 | }); 305 | 306 | test('multiple id and class match reverse', function() { 307 | var set = new SelectorSet(); 308 | set.add('.foo'); 309 | set.add('.bar'); 310 | set.add('#foo'); 311 | set.add('#bar'); 312 | 313 | var fixture2 = document.getElementById('fixture2'); 314 | var el = fixture2.querySelector('foo'); 315 | ok(el); 316 | var results = set.matches(el); 317 | equal(results.length, 2); 318 | equal(results[0].selector, '.foo'); 319 | equal(results[1].selector, '#foo'); 320 | }); 321 | 322 | test('compound id and class match', function() { 323 | var set = new SelectorSet(); 324 | set.add('.foo, .bar'); 325 | set.add('#foo, #bar'); 326 | set.add('#foo, .foo'); 327 | set.add('#bar, .bar'); 328 | 329 | var fixture2 = document.getElementById('fixture2'); 330 | var el = fixture2.querySelector('foo'); 331 | ok(el); 332 | var results = set.matches(el); 333 | equal(results.length, 3); 334 | equal(results[0].selector, '.foo, .bar'); 335 | equal(results[1].selector, '#foo, #bar'); 336 | equal(results[2].selector, '#foo, .foo'); 337 | }); 338 | 339 | test('compound universal matches', function() { 340 | var set = new SelectorSet(); 341 | set.add('.foo, .foo, .bar'); 342 | set.add('bar, [id=foo], [class=foo]'); 343 | set.add('[class=foo], .bar, [foo]'); 344 | set.add('[foo], [foo], [bar]'); 345 | 346 | var fixture2 = document.getElementById('fixture2'); 347 | var el = fixture2.querySelector('foo'); 348 | ok(el); 349 | var results = set.matches(el); 350 | equal(results.length, 4); 351 | equal(results[0].selector, '.foo, .foo, .bar'); 352 | equal(results[1].selector, 'bar, [id=foo], [class=foo]'); 353 | equal(results[2].selector, '[class=foo], .bar, [foo]'); 354 | equal(results[3].selector, '[foo], [foo], [bar]'); 355 | }); 356 | 357 | test('multiple id, class and tag match', function() { 358 | var set = new SelectorSet(); 359 | set.add('#foo'); 360 | set.add('#bar'); 361 | set.add('.foo'); 362 | set.add('.bar'); 363 | set.add('foo'); 364 | set.add('bar'); 365 | 366 | var fixture2 = document.getElementById('fixture2'); 367 | var el = fixture2.querySelector('foo'); 368 | ok(el); 369 | var results = set.matches(el); 370 | equal(results.length, 3); 371 | equal(results[0].selector, '#foo'); 372 | equal(results[1].selector, '.foo'); 373 | equal(results[2].selector, 'foo'); 374 | }); 375 | 376 | test('multiple id, class and tag match reverse', function() { 377 | var set = new SelectorSet(); 378 | set.add('foo'); 379 | set.add('bar'); 380 | set.add('.foo'); 381 | set.add('.bar'); 382 | set.add('#foo'); 383 | set.add('#bar'); 384 | 385 | var fixture2 = document.getElementById('fixture2'); 386 | var el = fixture2.querySelector('foo'); 387 | ok(el); 388 | var results = set.matches(el); 389 | equal(results.length, 3); 390 | equal(results[0].selector, 'foo'); 391 | equal(results[1].selector, '.foo'); 392 | equal(results[2].selector, '#foo'); 393 | }); 394 | 395 | test('tag with descendant class', function() { 396 | var set = new SelectorSet(); 397 | set.add('div .foo'); 398 | set.add('span .foo'); 399 | set.add('div .bar'); 400 | 401 | var fixture1 = document.getElementById('fixture1'); 402 | var el = fixture1.querySelector('div.foo'); 403 | ok(el); 404 | var results = set.matches(el); 405 | equal(results.length, 1); 406 | equal(results[0].selector, 'div .foo'); 407 | 408 | el = fixture1.querySelector('#foo'); 409 | ok(el); 410 | results = set.matches(el); 411 | equal(results.length, 0); 412 | }); 413 | 414 | test('tag with child class', function() { 415 | var set = new SelectorSet(); 416 | set.add('div > .foo'); 417 | set.add('span > .foo'); 418 | set.add('div > .bar'); 419 | 420 | var fixture1 = document.getElementById('fixture1'); 421 | var el = fixture1.querySelector('div.foo'); 422 | ok(el); 423 | var results = set.matches(el); 424 | equal(results.length, 1); 425 | equal(results[0].selector, 'div > .foo'); 426 | 427 | el = fixture1.querySelector('#foo'); 428 | ok(el); 429 | results = set.matches(el); 430 | equal(results.length, 0); 431 | }); 432 | 433 | test('svg', function() { 434 | var set = new SelectorSet(); 435 | set.add('svg'); 436 | set.add('.dot'); 437 | 438 | var fixture = document.getElementById('fixture-svg'); 439 | var svg = fixture.querySelector('svg'); 440 | var circle = fixture.querySelector('circle'); 441 | 442 | var results = set.matches(svg); 443 | equal(results.length, 1); 444 | equal(results[0].selector, 'svg'); 445 | 446 | results = set.matches(circle); 447 | equal(results.length, 1); 448 | equal(results[0].selector, '.dot'); 449 | }); 450 | 451 | test('large number of selectors', function() { 452 | var set = new SelectorSet(); 453 | 454 | set.add('#foo'); 455 | 456 | var n = 1000; 457 | while (n--) { 458 | set.add('#a' + Math.floor(Math.random() * 1000000000)); 459 | set.add('.b' + Math.floor(Math.random() * 1000000000)); 460 | } 461 | 462 | var fixture1 = document.getElementById('fixture1'); 463 | var el = fixture1.querySelector('#foo'); 464 | ok(el); 465 | var results = set.matches(el); 466 | equal(results.length, 1); 467 | equal(results[0].selector, '#foo'); 468 | }); 469 | 470 | test('object property names', function() { 471 | var set = new SelectorSet(); 472 | set.add('#prototype'); 473 | set.add('#constructor'); 474 | set.add('.hasOwnProperty'); 475 | set.add('.isPrototype'); 476 | set.add('.toString'); 477 | 478 | var fixture = document.getElementById('fixture-props'); 479 | var el = fixture.querySelector('#prototype'); 480 | ok(el); 481 | var results = set.matches(el); 482 | equal(results.length, 1); 483 | equal(results[0].selector, '#prototype'); 484 | 485 | el = fixture.querySelector('#constructor'); 486 | ok(el); 487 | results = set.matches(el); 488 | equal(results.length, 1); 489 | equal(results[0].selector, '#constructor'); 490 | 491 | el = fixture.querySelector('.hasOwnProperty'); 492 | ok(el); 493 | results = set.matches(el); 494 | equal(results.length, 1); 495 | equal(results[0].selector, '.hasOwnProperty'); 496 | }); 497 | })(); 498 | -------------------------------------------------------------------------------- /test/unit/queryall.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | module('queryAll'); 5 | 6 | test('undefined', function() { 7 | var set = new SelectorSet(); 8 | var results = set.queryAll(null); 9 | equal(results.length, 0); 10 | }); 11 | 12 | test('no selectors', function() { 13 | var set = new SelectorSet(); 14 | var fixture1 = document.getElementById('fixture1'); 15 | 16 | var results = set.queryAll(fixture1); 17 | ok(fixture1); 18 | equal(results.length, 0); 19 | }); 20 | 21 | test('id', function() { 22 | var set = new SelectorSet(); 23 | set.add('#foo'); 24 | 25 | var fixture1 = document.getElementById('fixture1'); 26 | var el = fixture1.querySelector('#foo'); 27 | var results = set.queryAll(fixture1); 28 | equal(results.length, 1); 29 | equal(results[0].selector, '#foo'); 30 | equal(results[0].elements[0], el); 31 | }); 32 | 33 | test('class', function() { 34 | var set = new SelectorSet(); 35 | set.add('.foo'); 36 | 37 | var fixture1 = document.getElementById('fixture1'); 38 | var el = fixture1.querySelector('.foo'); 39 | var results = set.queryAll(fixture1); 40 | equal(results.length, 1); 41 | equal(results[0].selector, '.foo'); 42 | equal(results[0].elements[0], el); 43 | }); 44 | 45 | test('tag', function() { 46 | var set = new SelectorSet(); 47 | set.add('foo'); 48 | 49 | var fixture1 = document.getElementById('fixture1'); 50 | var el = fixture1.querySelector('foo'); 51 | var results = set.queryAll(fixture1); 52 | equal(results.length, 1); 53 | equal(results[0].selector, 'foo'); 54 | equal(results[0].elements[0], el); 55 | }); 56 | 57 | test('id and class', function() { 58 | var set = new SelectorSet(); 59 | set.add('#foo'); 60 | set.add('.foo'); 61 | 62 | var fixture1 = document.getElementById('fixture1'); 63 | var el1 = fixture1.querySelector('#foo'); 64 | var el2 = fixture1.querySelector('.foo'); 65 | var results = set.queryAll(fixture1); 66 | equal(results.length, 2); 67 | equal(results[0].selector, '#foo'); 68 | equal(results[0].elements[0], el1); 69 | equal(results[1].selector, '.foo'); 70 | equal(results[1].elements[0], el2); 71 | }); 72 | 73 | test('compound id and class match', function() { 74 | var set = new SelectorSet(); 75 | set.add('.foo, .bar'); 76 | set.add('.foo, .foo'); 77 | set.add('#foo, #bar'); 78 | set.add('#foo, .foo'); 79 | set.add('#bar, .bar'); 80 | set.add('[class=foo], #foo'); 81 | set.add('.bar, [id=bar]'); 82 | 83 | var fixture1 = document.getElementById('fixture1'); 84 | var el1 = fixture1.querySelector('#foo'); 85 | var el2 = fixture1.querySelector('.foo'); 86 | var results = set.queryAll(fixture1); 87 | equal(results.length, 5); 88 | 89 | equal(results[0].selector, '.foo, .bar'); 90 | equal(results[0].elements.length, 1); 91 | equal(results[0].elements[0], el2); 92 | 93 | equal(results[1].selector, '.foo, .foo'); 94 | equal(results[1].elements.length, 1); 95 | equal(results[0].elements[0], el2); 96 | 97 | equal(results[2].selector, '#foo, #bar'); 98 | equal(results[2].elements.length, 1); 99 | equal(results[2].elements[0], el1); 100 | 101 | equal(results[3].selector, '#foo, .foo'); 102 | equal(results[3].elements.length, 2); 103 | equal(results[3].elements[0], el1); 104 | equal(results[3].elements[1], el2); 105 | 106 | equal(results[4].elements.length, 2); 107 | equal(results[4].elements[0], el1); 108 | equal(results[4].elements[1], el2); 109 | }); 110 | 111 | test('compound id and class match same element', function() { 112 | var set = new SelectorSet(); 113 | set.add('foo, #foo, .foo, [foo=bar]'); 114 | set.add('bar, #bar, .bar, [bar=foo]'); 115 | set.add('foo, div, #foo, [foo]'); 116 | 117 | var fixture2 = document.getElementById('fixture2'); 118 | var el1 = fixture2.querySelectorAll('[foo]')[0]; 119 | var el2 = fixture2.querySelectorAll('[foo]')[1]; 120 | var el3 = fixture2.querySelectorAll('[foo]')[2]; 121 | 122 | var results = set.queryAll(fixture2); 123 | equal(results.length, 2); 124 | 125 | equal(results[0].selector, 'foo, #foo, .foo, [foo=bar]'); 126 | equal(results[0].elements.length, 1); 127 | equal(results[0].elements[0], el1); 128 | 129 | equal(results[1].selector, 'foo, div, #foo, [foo]'); 130 | equal(results[1].elements.length, 3); 131 | equal(results[1].elements[0], el1); 132 | equal(results[1].elements[1], el2); 133 | equal(results[1].elements[2], el3); 134 | }); 135 | 136 | test('svg', function() { 137 | var set = new SelectorSet(); 138 | set.add('svg'); 139 | set.add('.dot'); 140 | 141 | var fixture = document.getElementById('fixture-svg'); 142 | var svg = fixture.querySelector('svg'); 143 | var circle = fixture.querySelector('circle'); 144 | 145 | var results = set.queryAll(fixture); 146 | equal(results.length, 2); 147 | equal(results[0].selector, 'svg'); 148 | equal(results[0].elements.length, 1); 149 | equal(results[0].elements[0], svg); 150 | equal(results[1].selector, '.dot'); 151 | equal(results[1].elements.length, 1); 152 | equal(results[1].elements[0], circle); 153 | }); 154 | 155 | test('add/remove data', function() { 156 | var set = new SelectorSet(); 157 | var fixture1 = document.getElementById('fixture1'); 158 | 159 | set.add('#foo', 123); 160 | var results = set.queryAll(fixture1); 161 | equal(results.length, 1); 162 | equal(results[0].selector, '#foo'); 163 | equal(results[0].data, 123); 164 | 165 | set.add('#bar', 123); 166 | results = set.queryAll(fixture1); 167 | equal(results.length, 1); 168 | equal(results[0].selector, '#foo'); 169 | equal(results[0].data, 123); 170 | 171 | set.add('#foo', 456); 172 | results = set.queryAll(fixture1); 173 | equal(results.length, 2); 174 | equal(results[0].selector, '#foo'); 175 | equal(results[1].selector, '#foo'); 176 | 177 | set.remove('#bar', 456); 178 | results = set.queryAll(fixture1); 179 | equal(results.length, 2); 180 | equal(results[0].selector, '#foo'); 181 | equal(results[1].selector, '#foo'); 182 | 183 | set.remove('#foo', 456); 184 | results = set.queryAll(fixture1); 185 | equal(results.length, 1); 186 | equal(results[0].selector, '#foo'); 187 | equal(results[0].data, 123); 188 | 189 | set.remove('#foo', 123); 190 | results = set.queryAll(fixture1); 191 | equal(results.length, 0); 192 | }); 193 | })(); 194 | --------------------------------------------------------------------------------