├── .eslintrc ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── d3-hsluv.sublime-project ├── index.js ├── package-lock.json ├── package.json ├── src ├── color.js ├── constant.js ├── helpers.js ├── hsluv.js ├── interpolateHsluv.js └── space.js └── test ├── hsluv-test.js ├── hsluvEqual.js ├── interpolate-test.js ├── interpolateLong-test.js └── rgbEqual.js /.eslintrc: -------------------------------------------------------------------------------- 1 | parserOptions: 2 | sourceType: "module" 3 | 4 | env: 5 | es6: true 6 | browser: true 7 | node: true 8 | 9 | extends: 10 | "eslint:recommended" 11 | 12 | rules: 13 | no-cond-assign: 0 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.sublime-workspace 2 | .DS_Store 3 | build/ 4 | node_modules 5 | npm-debug.log 6 | .npm 7 | .eslintcache 8 | test.js 9 | 10 | changes.txt 11 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.sublime-* 2 | build/*.zip 3 | test/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2010-2016 Sam Petulla 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * Neither the name of the author nor the names of contributors may be used to 15 | endorse or promote products derived from this software without specific prior 16 | written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 19 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 22 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 25 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # d3-hsluv 2 | 3 | This module implements the [HSLuv](http://www.hsluv.org/) (Hue, Saturation, Lightness) color space. 4 | 5 | 6 | ## Installing 7 | 8 | If you use NPM, `npm install d3-hsluv`. AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: 9 | 10 | ```html 11 | 12 | 17 | ``` 18 | 19 | [Try d3-hsluv in your browser.](https://tonicdev.com/npm/d3-hsluv) 20 | 21 | ## API Reference 22 | 23 | # d3.hsluv(l, u, v[, opacity])
24 | # d3.hsluv(specifier)
25 | # d3.hsluv(color)
26 | 27 | Constructs a new [hsluv](http://www.hsluv.org/) color. The channel values are exposed as `l`, `u` and `v` properties on the returned instance. 28 | 29 | If *l*, *u* and *v* are specified, these represent the channel values of the returned color; an *opacity* may also be specified. If a CSS Color Module Level 3 *specifier* string is specified, it is parsed and then converted to the hsluv color space. See [d3.color](https://github.com/d3/d3-color#color) for examples. If a [*color*](https://github.com/d3/d3-color#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](https://github.com/d3/d3-color#color_rgb) and then converted to hsluv. 30 | 31 | # d3.interpolateHsluv(a, b) [<>](https://github.com/d3/d3-hsluv/blob/master/src/interpolateHsluv.js "Source")
32 | 33 | Returns an HSLuv color space interpolator between the two colors a and b. The colors a and b need not be in HSLuv; they will be converted to HSLuv using d3.hsluv. If either color’s hue or chroma is NaN, the opposing color’s channel value is used. The shortest path between hues is used. The return value of the interpolator is an RGB string. 34 | 35 | # d3.interpolateHsluvLong(a, b) [<>](https://github.com/d3/d3-hsluv/blob/master/src/interpolateHsluv.js "Source")
36 | 37 | Like interpolateHsluv, but does not use the shortest path between hues. 38 | -------------------------------------------------------------------------------- /d3-hsluv.sublime-project: -------------------------------------------------------------------------------- 1 | { 2 | "folders": 3 | [ 4 | { 5 | "file_exclude_patterns": 6 | [ 7 | "*.sublime-workspace" 8 | ], 9 | "folder_exclude_patterns": 10 | [ 11 | "build" 12 | ], 13 | "path": "." 14 | }, 15 | { 16 | "path": "build" 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | export {default as hsluv} from "./src/hsluv"; 2 | export {default as interpolateHsluv, hsluvLong as interpolateHsluvLong} from "./src/interpolateHsluv"; 3 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "d3-hsluv", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.7.1", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", 10 | "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", 11 | "dev": true 12 | }, 13 | "acorn-jsx": { 14 | "version": "4.1.1", 15 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", 16 | "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "^5.0.3" 20 | } 21 | }, 22 | "ajv": { 23 | "version": "6.5.2", 24 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", 25 | "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", 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.1" 32 | } 33 | }, 34 | "ajv-keywords": { 35 | "version": "3.2.0", 36 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", 37 | "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", 38 | "dev": true 39 | }, 40 | "align-text": { 41 | "version": "0.1.4", 42 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 43 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 44 | "dev": true, 45 | "requires": { 46 | "kind-of": "^3.0.2", 47 | "longest": "^1.0.1", 48 | "repeat-string": "^1.5.2" 49 | } 50 | }, 51 | "ansi-escapes": { 52 | "version": "3.1.0", 53 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 54 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", 55 | "dev": true 56 | }, 57 | "ansi-regex": { 58 | "version": "2.1.1", 59 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 60 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 61 | "dev": true 62 | }, 63 | "ansi-styles": { 64 | "version": "2.2.1", 65 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 66 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 67 | "dev": true 68 | }, 69 | "argparse": { 70 | "version": "1.0.10", 71 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 72 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 73 | "dev": true, 74 | "requires": { 75 | "sprintf-js": "~1.0.2" 76 | } 77 | }, 78 | "array-union": { 79 | "version": "1.0.2", 80 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 81 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 82 | "dev": true, 83 | "requires": { 84 | "array-uniq": "^1.0.1" 85 | } 86 | }, 87 | "array-uniq": { 88 | "version": "1.0.3", 89 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 90 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 91 | "dev": true 92 | }, 93 | "arrify": { 94 | "version": "1.0.1", 95 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 96 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 97 | "dev": true 98 | }, 99 | "async": { 100 | "version": "0.2.10", 101 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 102 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 103 | "dev": true 104 | }, 105 | "babel-code-frame": { 106 | "version": "6.26.0", 107 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 108 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 109 | "dev": true, 110 | "requires": { 111 | "chalk": "^1.1.3", 112 | "esutils": "^2.0.2", 113 | "js-tokens": "^3.0.2" 114 | }, 115 | "dependencies": { 116 | "chalk": { 117 | "version": "1.1.3", 118 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 119 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 120 | "dev": true, 121 | "requires": { 122 | "ansi-styles": "^2.2.1", 123 | "escape-string-regexp": "^1.0.2", 124 | "has-ansi": "^2.0.0", 125 | "strip-ansi": "^3.0.0", 126 | "supports-color": "^2.0.0" 127 | } 128 | }, 129 | "strip-ansi": { 130 | "version": "3.0.1", 131 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 132 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 133 | "dev": true, 134 | "requires": { 135 | "ansi-regex": "^2.0.0" 136 | } 137 | } 138 | } 139 | }, 140 | "balanced-match": { 141 | "version": "1.0.0", 142 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 143 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 144 | "dev": true 145 | }, 146 | "brace-expansion": { 147 | "version": "1.1.8", 148 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 149 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 150 | "dev": true, 151 | "requires": { 152 | "balanced-match": "^1.0.0", 153 | "concat-map": "0.0.1" 154 | } 155 | }, 156 | "caller-path": { 157 | "version": "0.1.0", 158 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 159 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 160 | "dev": true, 161 | "requires": { 162 | "callsites": "^0.2.0" 163 | } 164 | }, 165 | "callsites": { 166 | "version": "0.2.0", 167 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 168 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 169 | "dev": true 170 | }, 171 | "camelcase": { 172 | "version": "1.2.1", 173 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 174 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 175 | "dev": true 176 | }, 177 | "center-align": { 178 | "version": "0.1.3", 179 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 180 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 181 | "dev": true, 182 | "requires": { 183 | "align-text": "^0.1.3", 184 | "lazy-cache": "^1.0.3" 185 | } 186 | }, 187 | "chalk": { 188 | "version": "2.4.1", 189 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 190 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 191 | "dev": true, 192 | "requires": { 193 | "ansi-styles": "^3.2.1", 194 | "escape-string-regexp": "^1.0.5", 195 | "supports-color": "^5.3.0" 196 | }, 197 | "dependencies": { 198 | "ansi-styles": { 199 | "version": "3.2.1", 200 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 201 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 202 | "dev": true, 203 | "requires": { 204 | "color-convert": "^1.9.0" 205 | } 206 | }, 207 | "supports-color": { 208 | "version": "5.4.0", 209 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 210 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 211 | "dev": true, 212 | "requires": { 213 | "has-flag": "^3.0.0" 214 | } 215 | } 216 | } 217 | }, 218 | "chardet": { 219 | "version": "0.4.2", 220 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 221 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 222 | "dev": true 223 | }, 224 | "circular-json": { 225 | "version": "0.3.3", 226 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 227 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 228 | "dev": true 229 | }, 230 | "cli-cursor": { 231 | "version": "2.1.0", 232 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 233 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 234 | "dev": true, 235 | "requires": { 236 | "restore-cursor": "^2.0.0" 237 | } 238 | }, 239 | "cli-width": { 240 | "version": "2.2.0", 241 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 242 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 243 | "dev": true 244 | }, 245 | "cliui": { 246 | "version": "2.1.0", 247 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 248 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 249 | "dev": true, 250 | "requires": { 251 | "center-align": "^0.1.1", 252 | "right-align": "^0.1.1", 253 | "wordwrap": "0.0.2" 254 | }, 255 | "dependencies": { 256 | "wordwrap": { 257 | "version": "0.0.2", 258 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 259 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 260 | "dev": true 261 | } 262 | } 263 | }, 264 | "color-convert": { 265 | "version": "1.9.2", 266 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", 267 | "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", 268 | "dev": true, 269 | "requires": { 270 | "color-name": "1.1.1" 271 | } 272 | }, 273 | "color-name": { 274 | "version": "1.1.1", 275 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", 276 | "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", 277 | "dev": true 278 | }, 279 | "commander": { 280 | "version": "2.17.0", 281 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.0.tgz", 282 | "integrity": "sha512-477o1hdVORiFlZxw8wgsXYCef3lh0zl/OV0FTftqiDxJSWw6dPQ2ipS4k20J2qBcsmsmLKSyr2iFrf9e3JGi4w==" 283 | }, 284 | "concat-map": { 285 | "version": "0.0.1", 286 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 287 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 288 | "dev": true 289 | }, 290 | "cross-spawn": { 291 | "version": "6.0.5", 292 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 293 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 294 | "dev": true, 295 | "requires": { 296 | "nice-try": "^1.0.4", 297 | "path-key": "^2.0.1", 298 | "semver": "^5.5.0", 299 | "shebang-command": "^1.2.0", 300 | "which": "^1.2.9" 301 | } 302 | }, 303 | "d3": { 304 | "version": "5.5.0", 305 | "resolved": "https://registry.npmjs.org/d3/-/d3-5.5.0.tgz", 306 | "integrity": "sha512-HRDSYvT3n7kMvJH7Avp7iR0Xsz97bkCFka9aOg04EdyXyiAP8yQzUpLH3712y9R7ffVo1g94t1OYFHBB0yI9vQ==", 307 | "requires": { 308 | "d3-array": "1", 309 | "d3-axis": "1", 310 | "d3-brush": "1", 311 | "d3-chord": "1", 312 | "d3-collection": "1", 313 | "d3-color": "1", 314 | "d3-contour": "1", 315 | "d3-dispatch": "1", 316 | "d3-drag": "1", 317 | "d3-dsv": "1", 318 | "d3-ease": "1", 319 | "d3-fetch": "1", 320 | "d3-force": "1", 321 | "d3-format": "1", 322 | "d3-geo": "1", 323 | "d3-hierarchy": "1", 324 | "d3-interpolate": "1", 325 | "d3-path": "1", 326 | "d3-polygon": "1", 327 | "d3-quadtree": "1", 328 | "d3-random": "1", 329 | "d3-scale": "2", 330 | "d3-scale-chromatic": "1", 331 | "d3-selection": "1", 332 | "d3-shape": "1", 333 | "d3-time": "1", 334 | "d3-time-format": "2", 335 | "d3-timer": "1", 336 | "d3-transition": "1", 337 | "d3-voronoi": "1", 338 | "d3-zoom": "1" 339 | } 340 | }, 341 | "d3-array": { 342 | "version": "1.2.1", 343 | "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", 344 | "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" 345 | }, 346 | "d3-axis": { 347 | "version": "1.0.8", 348 | "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", 349 | "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=" 350 | }, 351 | "d3-brush": { 352 | "version": "1.0.4", 353 | "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz", 354 | "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=", 355 | "requires": { 356 | "d3-dispatch": "1", 357 | "d3-drag": "1", 358 | "d3-interpolate": "1", 359 | "d3-selection": "1", 360 | "d3-transition": "1" 361 | } 362 | }, 363 | "d3-chord": { 364 | "version": "1.0.4", 365 | "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz", 366 | "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=", 367 | "requires": { 368 | "d3-array": "1", 369 | "d3-path": "1" 370 | } 371 | }, 372 | "d3-collection": { 373 | "version": "1.0.4", 374 | "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", 375 | "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" 376 | }, 377 | "d3-color": { 378 | "version": "1.0.3", 379 | "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", 380 | "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=" 381 | }, 382 | "d3-contour": { 383 | "version": "1.3.0", 384 | "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.0.tgz", 385 | "integrity": "sha512-6zccxidQRtcydx0lWqHawdW1UcBzKZTxv0cW90Dlx98pY/L7GjQJmftH1tWopYFDaLCoXU0ECg9x/z2EuFT8tg==", 386 | "requires": { 387 | "d3-array": "^1.1.1" 388 | } 389 | }, 390 | "d3-dispatch": { 391 | "version": "1.0.3", 392 | "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz", 393 | "integrity": "sha1-RuFJHqqbWMNY/OW+TovtYm54cfg=" 394 | }, 395 | "d3-drag": { 396 | "version": "1.2.1", 397 | "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", 398 | "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", 399 | "requires": { 400 | "d3-dispatch": "1", 401 | "d3-selection": "1" 402 | } 403 | }, 404 | "d3-dsv": { 405 | "version": "1.0.8", 406 | "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz", 407 | "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==", 408 | "requires": { 409 | "commander": "2", 410 | "iconv-lite": "0.4", 411 | "rw": "1" 412 | } 413 | }, 414 | "d3-ease": { 415 | "version": "1.0.3", 416 | "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", 417 | "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=" 418 | }, 419 | "d3-fetch": { 420 | "version": "1.1.0", 421 | "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.0.tgz", 422 | "integrity": "sha512-j+V4vtT6dceQbcKYLtpTueB8Zvc+wb9I93WaFtEQIYNADXl0c1ZJMN3qQo0CssiTsAqK8pePwc7f4qiW+b0WOg==", 423 | "requires": { 424 | "d3-dsv": "1" 425 | } 426 | }, 427 | "d3-force": { 428 | "version": "1.1.0", 429 | "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", 430 | "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", 431 | "requires": { 432 | "d3-collection": "1", 433 | "d3-dispatch": "1", 434 | "d3-quadtree": "1", 435 | "d3-timer": "1" 436 | } 437 | }, 438 | "d3-format": { 439 | "version": "1.3.0", 440 | "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.0.tgz", 441 | "integrity": "sha512-ycfLEIzHVZC3rOvuBOKVyQXSiUyCDjeAPIj9n/wugrr+s5AcTQC2Bz6aKkubG7rQaQF0SGW/OV4UEJB9nfioFg==" 442 | }, 443 | "d3-geo": { 444 | "version": "1.10.0", 445 | "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.10.0.tgz", 446 | "integrity": "sha512-VK/buVGgexthTTqGRNXQ/LSo3EbOFu4p2Pjud5drSIaEnOaF2moc8A3P7WEljEO1JEBEwbpAJjFWMuJiUtoBcw==", 447 | "requires": { 448 | "d3-array": "1" 449 | } 450 | }, 451 | "d3-hierarchy": { 452 | "version": "1.1.6", 453 | "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz", 454 | "integrity": "sha512-nn4bhBnwWnMSoZgkBXD7vRyZ0xVUsNMQRKytWYHhP1I4qHw+qzApCTgSQTZqMdf4XXZbTMqA59hFusga+THA/g==" 455 | }, 456 | "d3-interpolate": { 457 | "version": "1.2.0", 458 | "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.2.0.tgz", 459 | "integrity": "sha512-zLvTk8CREPFfc/2XglPQriAsXkzoRDAyBzndtKJWrZmHw7kmOWHNS11e40kPTd/oGk8P5mFJW5uBbcFQ+ybxyA==", 460 | "requires": { 461 | "d3-color": "1" 462 | } 463 | }, 464 | "d3-path": { 465 | "version": "1.0.5", 466 | "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", 467 | "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=" 468 | }, 469 | "d3-polygon": { 470 | "version": "1.0.3", 471 | "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz", 472 | "integrity": "sha1-FoiOkCZGCTPysXllKtN4Ik04LGI=" 473 | }, 474 | "d3-quadtree": { 475 | "version": "1.0.3", 476 | "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz", 477 | "integrity": "sha1-rHmH4+I/6AWpkPKOG1DTj8uCJDg=" 478 | }, 479 | "d3-random": { 480 | "version": "1.1.0", 481 | "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz", 482 | "integrity": "sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM=" 483 | }, 484 | "d3-scale": { 485 | "version": "2.1.0", 486 | "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.1.0.tgz", 487 | "integrity": "sha512-Bb2N3ZgzPdKVEoWGkt8lPV6R7YdpSBWI70Xf26NQHOVjs77a6gLUmBOOPt9d9nB8JiQhwXY1RHCa+eSyWCJZIQ==", 488 | "requires": { 489 | "d3-array": "^1.2.0", 490 | "d3-collection": "1", 491 | "d3-format": "1", 492 | "d3-interpolate": "1", 493 | "d3-time": "1", 494 | "d3-time-format": "2" 495 | } 496 | }, 497 | "d3-scale-chromatic": { 498 | "version": "1.3.0", 499 | "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.0.tgz", 500 | "integrity": "sha512-YwMbiaW2bStWvQFByK8hA6hk7ToWflspIo2TRukCqERd8isiafEMBXmwfh8c7/0Z94mVvIzIveRLVC6RAjhgeA==", 501 | "requires": { 502 | "d3-color": "1", 503 | "d3-interpolate": "1" 504 | } 505 | }, 506 | "d3-selection": { 507 | "version": "1.3.0", 508 | "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz", 509 | "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" 510 | }, 511 | "d3-shape": { 512 | "version": "1.2.0", 513 | "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", 514 | "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", 515 | "requires": { 516 | "d3-path": "1" 517 | } 518 | }, 519 | "d3-time": { 520 | "version": "1.0.8", 521 | "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", 522 | "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" 523 | }, 524 | "d3-time-format": { 525 | "version": "2.1.1", 526 | "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", 527 | "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", 528 | "requires": { 529 | "d3-time": "1" 530 | } 531 | }, 532 | "d3-timer": { 533 | "version": "1.0.7", 534 | "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", 535 | "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" 536 | }, 537 | "d3-transition": { 538 | "version": "1.1.1", 539 | "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", 540 | "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", 541 | "requires": { 542 | "d3-color": "1", 543 | "d3-dispatch": "1", 544 | "d3-ease": "1", 545 | "d3-interpolate": "1", 546 | "d3-selection": "^1.1.0", 547 | "d3-timer": "1" 548 | } 549 | }, 550 | "d3-voronoi": { 551 | "version": "1.1.2", 552 | "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", 553 | "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=" 554 | }, 555 | "d3-zoom": { 556 | "version": "1.7.1", 557 | "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", 558 | "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", 559 | "requires": { 560 | "d3-dispatch": "1", 561 | "d3-drag": "1", 562 | "d3-interpolate": "1", 563 | "d3-selection": "1", 564 | "d3-transition": "1" 565 | } 566 | }, 567 | "debug": { 568 | "version": "3.1.0", 569 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 570 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 571 | "dev": true, 572 | "requires": { 573 | "ms": "2.0.0" 574 | } 575 | }, 576 | "decamelize": { 577 | "version": "1.2.0", 578 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 579 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 580 | "dev": true 581 | }, 582 | "deep-equal": { 583 | "version": "1.0.1", 584 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 585 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 586 | "dev": true 587 | }, 588 | "deep-is": { 589 | "version": "0.1.3", 590 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 591 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 592 | "dev": true 593 | }, 594 | "define-properties": { 595 | "version": "1.1.2", 596 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", 597 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", 598 | "dev": true, 599 | "requires": { 600 | "foreach": "^2.0.5", 601 | "object-keys": "^1.0.8" 602 | } 603 | }, 604 | "defined": { 605 | "version": "1.0.0", 606 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 607 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 608 | "dev": true 609 | }, 610 | "del": { 611 | "version": "2.2.2", 612 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 613 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 614 | "dev": true, 615 | "requires": { 616 | "globby": "^5.0.0", 617 | "is-path-cwd": "^1.0.0", 618 | "is-path-in-cwd": "^1.0.0", 619 | "object-assign": "^4.0.1", 620 | "pify": "^2.0.0", 621 | "pinkie-promise": "^2.0.0", 622 | "rimraf": "^2.2.8" 623 | } 624 | }, 625 | "doctrine": { 626 | "version": "2.1.0", 627 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 628 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 629 | "dev": true, 630 | "requires": { 631 | "esutils": "^2.0.2" 632 | } 633 | }, 634 | "es-abstract": { 635 | "version": "1.10.0", 636 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", 637 | "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", 638 | "dev": true, 639 | "requires": { 640 | "es-to-primitive": "^1.1.1", 641 | "function-bind": "^1.1.1", 642 | "has": "^1.0.1", 643 | "is-callable": "^1.1.3", 644 | "is-regex": "^1.0.4" 645 | } 646 | }, 647 | "es-to-primitive": { 648 | "version": "1.1.1", 649 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", 650 | "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", 651 | "dev": true, 652 | "requires": { 653 | "is-callable": "^1.1.1", 654 | "is-date-object": "^1.0.1", 655 | "is-symbol": "^1.0.1" 656 | } 657 | }, 658 | "escape-string-regexp": { 659 | "version": "1.0.5", 660 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 661 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 662 | "dev": true 663 | }, 664 | "eslint": { 665 | "version": "5.3.0", 666 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.3.0.tgz", 667 | "integrity": "sha512-N/tCqlMKkyNvAvLu+zI9AqDasnSLt00K+Hu8kdsERliC9jYEc8ck12XtjvOXrBKu8fK6RrBcN9bat6Xk++9jAg==", 668 | "dev": true, 669 | "requires": { 670 | "ajv": "^6.5.0", 671 | "babel-code-frame": "^6.26.0", 672 | "chalk": "^2.1.0", 673 | "cross-spawn": "^6.0.5", 674 | "debug": "^3.1.0", 675 | "doctrine": "^2.1.0", 676 | "eslint-scope": "^4.0.0", 677 | "eslint-utils": "^1.3.1", 678 | "eslint-visitor-keys": "^1.0.0", 679 | "espree": "^4.0.0", 680 | "esquery": "^1.0.1", 681 | "esutils": "^2.0.2", 682 | "file-entry-cache": "^2.0.0", 683 | "functional-red-black-tree": "^1.0.1", 684 | "glob": "^7.1.2", 685 | "globals": "^11.7.0", 686 | "ignore": "^4.0.2", 687 | "imurmurhash": "^0.1.4", 688 | "inquirer": "^5.2.0", 689 | "is-resolvable": "^1.1.0", 690 | "js-yaml": "^3.11.0", 691 | "json-stable-stringify-without-jsonify": "^1.0.1", 692 | "levn": "^0.3.0", 693 | "lodash": "^4.17.5", 694 | "minimatch": "^3.0.4", 695 | "mkdirp": "^0.5.1", 696 | "natural-compare": "^1.4.0", 697 | "optionator": "^0.8.2", 698 | "path-is-inside": "^1.0.2", 699 | "pluralize": "^7.0.0", 700 | "progress": "^2.0.0", 701 | "regexpp": "^2.0.0", 702 | "require-uncached": "^1.0.3", 703 | "semver": "^5.5.0", 704 | "string.prototype.matchall": "^2.0.0", 705 | "strip-ansi": "^4.0.0", 706 | "strip-json-comments": "^2.0.1", 707 | "table": "^4.0.3", 708 | "text-table": "^0.2.0" 709 | } 710 | }, 711 | "eslint-scope": { 712 | "version": "4.0.0", 713 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", 714 | "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", 715 | "dev": true, 716 | "requires": { 717 | "esrecurse": "^4.1.0", 718 | "estraverse": "^4.1.1" 719 | } 720 | }, 721 | "eslint-utils": { 722 | "version": "1.3.1", 723 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", 724 | "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", 725 | "dev": true 726 | }, 727 | "eslint-visitor-keys": { 728 | "version": "1.0.0", 729 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 730 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 731 | "dev": true 732 | }, 733 | "espree": { 734 | "version": "4.0.0", 735 | "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", 736 | "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", 737 | "dev": true, 738 | "requires": { 739 | "acorn": "^5.6.0", 740 | "acorn-jsx": "^4.1.1" 741 | } 742 | }, 743 | "esprima": { 744 | "version": "4.0.1", 745 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 746 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 747 | "dev": true 748 | }, 749 | "esquery": { 750 | "version": "1.0.1", 751 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 752 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 753 | "dev": true, 754 | "requires": { 755 | "estraverse": "^4.0.0" 756 | } 757 | }, 758 | "esrecurse": { 759 | "version": "4.2.1", 760 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 761 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 762 | "dev": true, 763 | "requires": { 764 | "estraverse": "^4.1.0" 765 | } 766 | }, 767 | "estraverse": { 768 | "version": "4.2.0", 769 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 770 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 771 | "dev": true 772 | }, 773 | "esutils": { 774 | "version": "2.0.2", 775 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 776 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 777 | "dev": true 778 | }, 779 | "external-editor": { 780 | "version": "2.2.0", 781 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 782 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 783 | "dev": true, 784 | "requires": { 785 | "chardet": "^0.4.0", 786 | "iconv-lite": "^0.4.17", 787 | "tmp": "^0.0.33" 788 | } 789 | }, 790 | "fast-deep-equal": { 791 | "version": "2.0.1", 792 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 793 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 794 | "dev": true 795 | }, 796 | "fast-json-stable-stringify": { 797 | "version": "2.0.0", 798 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 799 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 800 | "dev": true 801 | }, 802 | "fast-levenshtein": { 803 | "version": "2.0.6", 804 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 805 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 806 | "dev": true 807 | }, 808 | "figures": { 809 | "version": "2.0.0", 810 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 811 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 812 | "dev": true, 813 | "requires": { 814 | "escape-string-regexp": "^1.0.5" 815 | } 816 | }, 817 | "file-entry-cache": { 818 | "version": "2.0.0", 819 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 820 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 821 | "dev": true, 822 | "requires": { 823 | "flat-cache": "^1.2.1", 824 | "object-assign": "^4.0.1" 825 | } 826 | }, 827 | "flat-cache": { 828 | "version": "1.3.0", 829 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 830 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 831 | "dev": true, 832 | "requires": { 833 | "circular-json": "^0.3.1", 834 | "del": "^2.0.2", 835 | "graceful-fs": "^4.1.2", 836 | "write": "^0.2.1" 837 | } 838 | }, 839 | "for-each": { 840 | "version": "0.3.2", 841 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", 842 | "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", 843 | "dev": true, 844 | "requires": { 845 | "is-function": "~1.0.0" 846 | } 847 | }, 848 | "foreach": { 849 | "version": "2.0.5", 850 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 851 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", 852 | "dev": true 853 | }, 854 | "fs.realpath": { 855 | "version": "1.0.0", 856 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 857 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 858 | "dev": true 859 | }, 860 | "function-bind": { 861 | "version": "1.1.1", 862 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 863 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 864 | "dev": true 865 | }, 866 | "functional-red-black-tree": { 867 | "version": "1.0.1", 868 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 869 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 870 | "dev": true 871 | }, 872 | "glob": { 873 | "version": "7.1.2", 874 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 875 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 876 | "dev": true, 877 | "requires": { 878 | "fs.realpath": "^1.0.0", 879 | "inflight": "^1.0.4", 880 | "inherits": "2", 881 | "minimatch": "^3.0.4", 882 | "once": "^1.3.0", 883 | "path-is-absolute": "^1.0.0" 884 | } 885 | }, 886 | "globals": { 887 | "version": "11.7.0", 888 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", 889 | "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", 890 | "dev": true 891 | }, 892 | "globby": { 893 | "version": "5.0.0", 894 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 895 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 896 | "dev": true, 897 | "requires": { 898 | "array-union": "^1.0.1", 899 | "arrify": "^1.0.0", 900 | "glob": "^7.0.3", 901 | "object-assign": "^4.0.1", 902 | "pify": "^2.0.0", 903 | "pinkie-promise": "^2.0.0" 904 | } 905 | }, 906 | "graceful-fs": { 907 | "version": "4.1.11", 908 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 909 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 910 | "dev": true 911 | }, 912 | "has": { 913 | "version": "1.0.1", 914 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 915 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 916 | "dev": true, 917 | "requires": { 918 | "function-bind": "^1.0.2" 919 | } 920 | }, 921 | "has-ansi": { 922 | "version": "2.0.0", 923 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 924 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 925 | "dev": true, 926 | "requires": { 927 | "ansi-regex": "^2.0.0" 928 | } 929 | }, 930 | "has-flag": { 931 | "version": "3.0.0", 932 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 933 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 934 | "dev": true 935 | }, 936 | "has-symbols": { 937 | "version": "1.0.0", 938 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 939 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 940 | "dev": true 941 | }, 942 | "iconv-lite": { 943 | "version": "0.4.23", 944 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 945 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 946 | "requires": { 947 | "safer-buffer": ">= 2.1.2 < 3" 948 | } 949 | }, 950 | "ignore": { 951 | "version": "4.0.3", 952 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.3.tgz", 953 | "integrity": "sha512-Z/vAH2GGIEATQnBVXMclE2IGV6i0GyVngKThcGZ5kHgHMxLo9Ow2+XHRq1aEKEej5vOF1TPJNbvX6J/anT0M7A==", 954 | "dev": true 955 | }, 956 | "imurmurhash": { 957 | "version": "0.1.4", 958 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 959 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 960 | "dev": true 961 | }, 962 | "inflight": { 963 | "version": "1.0.6", 964 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 965 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 966 | "dev": true, 967 | "requires": { 968 | "once": "^1.3.0", 969 | "wrappy": "1" 970 | } 971 | }, 972 | "inherits": { 973 | "version": "2.0.3", 974 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 975 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 976 | "dev": true 977 | }, 978 | "inquirer": { 979 | "version": "5.2.0", 980 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", 981 | "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", 982 | "dev": true, 983 | "requires": { 984 | "ansi-escapes": "^3.0.0", 985 | "chalk": "^2.0.0", 986 | "cli-cursor": "^2.1.0", 987 | "cli-width": "^2.0.0", 988 | "external-editor": "^2.1.0", 989 | "figures": "^2.0.0", 990 | "lodash": "^4.3.0", 991 | "mute-stream": "0.0.7", 992 | "run-async": "^2.2.0", 993 | "rxjs": "^5.5.2", 994 | "string-width": "^2.1.0", 995 | "strip-ansi": "^4.0.0", 996 | "through": "^2.3.6" 997 | } 998 | }, 999 | "is-buffer": { 1000 | "version": "1.1.6", 1001 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1002 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1003 | "dev": true 1004 | }, 1005 | "is-callable": { 1006 | "version": "1.1.3", 1007 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", 1008 | "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", 1009 | "dev": true 1010 | }, 1011 | "is-date-object": { 1012 | "version": "1.0.1", 1013 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 1014 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 1015 | "dev": true 1016 | }, 1017 | "is-fullwidth-code-point": { 1018 | "version": "2.0.0", 1019 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1020 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1021 | "dev": true 1022 | }, 1023 | "is-function": { 1024 | "version": "1.0.1", 1025 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", 1026 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", 1027 | "dev": true 1028 | }, 1029 | "is-path-cwd": { 1030 | "version": "1.0.0", 1031 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1032 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1033 | "dev": true 1034 | }, 1035 | "is-path-in-cwd": { 1036 | "version": "1.0.1", 1037 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 1038 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 1039 | "dev": true, 1040 | "requires": { 1041 | "is-path-inside": "^1.0.0" 1042 | } 1043 | }, 1044 | "is-path-inside": { 1045 | "version": "1.0.1", 1046 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1047 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1048 | "dev": true, 1049 | "requires": { 1050 | "path-is-inside": "^1.0.1" 1051 | } 1052 | }, 1053 | "is-promise": { 1054 | "version": "2.1.0", 1055 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1056 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1057 | "dev": true 1058 | }, 1059 | "is-regex": { 1060 | "version": "1.0.4", 1061 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 1062 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 1063 | "dev": true, 1064 | "requires": { 1065 | "has": "^1.0.1" 1066 | } 1067 | }, 1068 | "is-resolvable": { 1069 | "version": "1.1.0", 1070 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 1071 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 1072 | "dev": true 1073 | }, 1074 | "is-symbol": { 1075 | "version": "1.0.1", 1076 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", 1077 | "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", 1078 | "dev": true 1079 | }, 1080 | "isexe": { 1081 | "version": "2.0.0", 1082 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1083 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1084 | "dev": true 1085 | }, 1086 | "js-tokens": { 1087 | "version": "3.0.2", 1088 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1089 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1090 | "dev": true 1091 | }, 1092 | "js-yaml": { 1093 | "version": "3.12.0", 1094 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", 1095 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", 1096 | "dev": true, 1097 | "requires": { 1098 | "argparse": "^1.0.7", 1099 | "esprima": "^4.0.0" 1100 | } 1101 | }, 1102 | "json-schema-traverse": { 1103 | "version": "0.4.1", 1104 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1105 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1106 | "dev": true 1107 | }, 1108 | "json-stable-stringify-without-jsonify": { 1109 | "version": "1.0.1", 1110 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1111 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1112 | "dev": true 1113 | }, 1114 | "kind-of": { 1115 | "version": "3.2.2", 1116 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1117 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1118 | "dev": true, 1119 | "requires": { 1120 | "is-buffer": "^1.1.5" 1121 | } 1122 | }, 1123 | "lazy-cache": { 1124 | "version": "1.0.4", 1125 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1126 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1127 | "dev": true 1128 | }, 1129 | "levn": { 1130 | "version": "0.3.0", 1131 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1132 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1133 | "dev": true, 1134 | "requires": { 1135 | "prelude-ls": "~1.1.2", 1136 | "type-check": "~0.3.2" 1137 | } 1138 | }, 1139 | "lodash": { 1140 | "version": "4.17.10", 1141 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", 1142 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", 1143 | "dev": true 1144 | }, 1145 | "longest": { 1146 | "version": "1.0.1", 1147 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1148 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 1149 | "dev": true 1150 | }, 1151 | "mimic-fn": { 1152 | "version": "1.2.0", 1153 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1154 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1155 | "dev": true 1156 | }, 1157 | "minimatch": { 1158 | "version": "3.0.4", 1159 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1160 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1161 | "dev": true, 1162 | "requires": { 1163 | "brace-expansion": "^1.1.7" 1164 | } 1165 | }, 1166 | "minimist": { 1167 | "version": "0.0.8", 1168 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1169 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1170 | "dev": true 1171 | }, 1172 | "mkdirp": { 1173 | "version": "0.5.1", 1174 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1175 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1176 | "dev": true, 1177 | "requires": { 1178 | "minimist": "0.0.8" 1179 | } 1180 | }, 1181 | "ms": { 1182 | "version": "2.0.0", 1183 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1184 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1185 | "dev": true 1186 | }, 1187 | "mute-stream": { 1188 | "version": "0.0.7", 1189 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1190 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1191 | "dev": true 1192 | }, 1193 | "natural-compare": { 1194 | "version": "1.4.0", 1195 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1196 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1197 | "dev": true 1198 | }, 1199 | "nice-try": { 1200 | "version": "1.0.4", 1201 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", 1202 | "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", 1203 | "dev": true 1204 | }, 1205 | "object-assign": { 1206 | "version": "4.1.1", 1207 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1208 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1209 | "dev": true 1210 | }, 1211 | "object-inspect": { 1212 | "version": "1.3.0", 1213 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.3.0.tgz", 1214 | "integrity": "sha512-OHHnLgLNXpM++GnJRyyhbr2bwl3pPVm4YvaraHrRvDt/N3r+s/gDVHciA7EJBTkijKXj61ssgSAikq1fb0IBRg==", 1215 | "dev": true 1216 | }, 1217 | "object-keys": { 1218 | "version": "1.0.11", 1219 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", 1220 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", 1221 | "dev": true 1222 | }, 1223 | "once": { 1224 | "version": "1.4.0", 1225 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1226 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1227 | "dev": true, 1228 | "requires": { 1229 | "wrappy": "1" 1230 | } 1231 | }, 1232 | "onetime": { 1233 | "version": "2.0.1", 1234 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1235 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1236 | "dev": true, 1237 | "requires": { 1238 | "mimic-fn": "^1.0.0" 1239 | } 1240 | }, 1241 | "optionator": { 1242 | "version": "0.8.2", 1243 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1244 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1245 | "dev": true, 1246 | "requires": { 1247 | "deep-is": "~0.1.3", 1248 | "fast-levenshtein": "~2.0.4", 1249 | "levn": "~0.3.0", 1250 | "prelude-ls": "~1.1.2", 1251 | "type-check": "~0.3.2", 1252 | "wordwrap": "~1.0.0" 1253 | } 1254 | }, 1255 | "os-tmpdir": { 1256 | "version": "1.0.2", 1257 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1258 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1259 | "dev": true 1260 | }, 1261 | "package-preamble": { 1262 | "version": "0.0.2", 1263 | "resolved": "https://registry.npmjs.org/package-preamble/-/package-preamble-0.0.2.tgz", 1264 | "integrity": "sha1-ecd4G1TlR51BBAI4ufmPjhknGc8=", 1265 | "dev": true 1266 | }, 1267 | "path-is-absolute": { 1268 | "version": "1.0.1", 1269 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1270 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1271 | "dev": true 1272 | }, 1273 | "path-is-inside": { 1274 | "version": "1.0.2", 1275 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1276 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1277 | "dev": true 1278 | }, 1279 | "path-key": { 1280 | "version": "2.0.1", 1281 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1282 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1283 | "dev": true 1284 | }, 1285 | "path-parse": { 1286 | "version": "1.0.5", 1287 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1288 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1289 | "dev": true 1290 | }, 1291 | "pify": { 1292 | "version": "2.3.0", 1293 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1294 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1295 | "dev": true 1296 | }, 1297 | "pinkie": { 1298 | "version": "2.0.4", 1299 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1300 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1301 | "dev": true 1302 | }, 1303 | "pinkie-promise": { 1304 | "version": "2.0.1", 1305 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1306 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1307 | "dev": true, 1308 | "requires": { 1309 | "pinkie": "^2.0.0" 1310 | } 1311 | }, 1312 | "pluralize": { 1313 | "version": "7.0.0", 1314 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1315 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1316 | "dev": true 1317 | }, 1318 | "prelude-ls": { 1319 | "version": "1.1.2", 1320 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1321 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1322 | "dev": true 1323 | }, 1324 | "progress": { 1325 | "version": "2.0.0", 1326 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 1327 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 1328 | "dev": true 1329 | }, 1330 | "punycode": { 1331 | "version": "2.1.1", 1332 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1333 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1334 | "dev": true 1335 | }, 1336 | "regexp.prototype.flags": { 1337 | "version": "1.2.0", 1338 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", 1339 | "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", 1340 | "dev": true, 1341 | "requires": { 1342 | "define-properties": "^1.1.2" 1343 | } 1344 | }, 1345 | "regexpp": { 1346 | "version": "2.0.0", 1347 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz", 1348 | "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==", 1349 | "dev": true 1350 | }, 1351 | "repeat-string": { 1352 | "version": "1.6.1", 1353 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1354 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1355 | "dev": true 1356 | }, 1357 | "require-uncached": { 1358 | "version": "1.0.3", 1359 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1360 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1361 | "dev": true, 1362 | "requires": { 1363 | "caller-path": "^0.1.0", 1364 | "resolve-from": "^1.0.0" 1365 | } 1366 | }, 1367 | "resolve-from": { 1368 | "version": "1.0.1", 1369 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1370 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1371 | "dev": true 1372 | }, 1373 | "restore-cursor": { 1374 | "version": "2.0.0", 1375 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1376 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1377 | "dev": true, 1378 | "requires": { 1379 | "onetime": "^2.0.0", 1380 | "signal-exit": "^3.0.2" 1381 | } 1382 | }, 1383 | "resumer": { 1384 | "version": "0.0.0", 1385 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 1386 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 1387 | "dev": true, 1388 | "requires": { 1389 | "through": "~2.3.4" 1390 | } 1391 | }, 1392 | "right-align": { 1393 | "version": "0.1.3", 1394 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 1395 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 1396 | "dev": true, 1397 | "requires": { 1398 | "align-text": "^0.1.1" 1399 | } 1400 | }, 1401 | "rimraf": { 1402 | "version": "2.6.2", 1403 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1404 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1405 | "dev": true, 1406 | "requires": { 1407 | "glob": "^7.0.5" 1408 | } 1409 | }, 1410 | "rollup": { 1411 | "version": "0.41.6", 1412 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.41.6.tgz", 1413 | "integrity": "sha1-4NBUl4d6OYwQTYFtJzOnGKepTio=", 1414 | "dev": true, 1415 | "requires": { 1416 | "source-map-support": "^0.4.0" 1417 | } 1418 | }, 1419 | "run-async": { 1420 | "version": "2.3.0", 1421 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1422 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1423 | "dev": true, 1424 | "requires": { 1425 | "is-promise": "^2.1.0" 1426 | } 1427 | }, 1428 | "rw": { 1429 | "version": "1.3.3", 1430 | "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", 1431 | "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" 1432 | }, 1433 | "rxjs": { 1434 | "version": "5.5.11", 1435 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", 1436 | "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", 1437 | "dev": true, 1438 | "requires": { 1439 | "symbol-observable": "1.0.1" 1440 | } 1441 | }, 1442 | "safer-buffer": { 1443 | "version": "2.1.2", 1444 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1445 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1446 | }, 1447 | "semver": { 1448 | "version": "5.5.0", 1449 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 1450 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 1451 | "dev": true 1452 | }, 1453 | "shebang-command": { 1454 | "version": "1.2.0", 1455 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1456 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1457 | "dev": true, 1458 | "requires": { 1459 | "shebang-regex": "^1.0.0" 1460 | } 1461 | }, 1462 | "shebang-regex": { 1463 | "version": "1.0.0", 1464 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1465 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1466 | "dev": true 1467 | }, 1468 | "signal-exit": { 1469 | "version": "3.0.2", 1470 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1471 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1472 | "dev": true 1473 | }, 1474 | "slice-ansi": { 1475 | "version": "1.0.0", 1476 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 1477 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 1478 | "dev": true, 1479 | "requires": { 1480 | "is-fullwidth-code-point": "^2.0.0" 1481 | } 1482 | }, 1483 | "source-map": { 1484 | "version": "0.5.7", 1485 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1486 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1487 | "dev": true 1488 | }, 1489 | "source-map-support": { 1490 | "version": "0.4.18", 1491 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 1492 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 1493 | "dev": true, 1494 | "requires": { 1495 | "source-map": "^0.5.6" 1496 | } 1497 | }, 1498 | "sprintf-js": { 1499 | "version": "1.0.3", 1500 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1501 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1502 | "dev": true 1503 | }, 1504 | "string-width": { 1505 | "version": "2.1.1", 1506 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1507 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1508 | "dev": true, 1509 | "requires": { 1510 | "is-fullwidth-code-point": "^2.0.0", 1511 | "strip-ansi": "^4.0.0" 1512 | } 1513 | }, 1514 | "string.prototype.matchall": { 1515 | "version": "2.0.0", 1516 | "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", 1517 | "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", 1518 | "dev": true, 1519 | "requires": { 1520 | "define-properties": "^1.1.2", 1521 | "es-abstract": "^1.10.0", 1522 | "function-bind": "^1.1.1", 1523 | "has-symbols": "^1.0.0", 1524 | "regexp.prototype.flags": "^1.2.0" 1525 | } 1526 | }, 1527 | "string.prototype.trim": { 1528 | "version": "1.1.2", 1529 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 1530 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 1531 | "dev": true, 1532 | "requires": { 1533 | "define-properties": "^1.1.2", 1534 | "es-abstract": "^1.5.0", 1535 | "function-bind": "^1.0.2" 1536 | } 1537 | }, 1538 | "strip-ansi": { 1539 | "version": "4.0.0", 1540 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1541 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1542 | "dev": true, 1543 | "requires": { 1544 | "ansi-regex": "^3.0.0" 1545 | }, 1546 | "dependencies": { 1547 | "ansi-regex": { 1548 | "version": "3.0.0", 1549 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1550 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1551 | "dev": true 1552 | } 1553 | } 1554 | }, 1555 | "strip-json-comments": { 1556 | "version": "2.0.1", 1557 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1558 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1559 | "dev": true 1560 | }, 1561 | "supports-color": { 1562 | "version": "2.0.0", 1563 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1564 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1565 | "dev": true 1566 | }, 1567 | "symbol-observable": { 1568 | "version": "1.0.1", 1569 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 1570 | "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", 1571 | "dev": true 1572 | }, 1573 | "table": { 1574 | "version": "4.0.3", 1575 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", 1576 | "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", 1577 | "dev": true, 1578 | "requires": { 1579 | "ajv": "^6.0.1", 1580 | "ajv-keywords": "^3.0.0", 1581 | "chalk": "^2.1.0", 1582 | "lodash": "^4.17.4", 1583 | "slice-ansi": "1.0.0", 1584 | "string-width": "^2.1.1" 1585 | } 1586 | }, 1587 | "tape": { 1588 | "version": "4.8.0", 1589 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.8.0.tgz", 1590 | "integrity": "sha512-TWILfEnvO7I8mFe35d98F6T5fbLaEtbFTG/lxWvid8qDfFTxt19EBijWmB4j3+Hoh5TfHE2faWs73ua+EphuBA==", 1591 | "dev": true, 1592 | "requires": { 1593 | "deep-equal": "~1.0.1", 1594 | "defined": "~1.0.0", 1595 | "for-each": "~0.3.2", 1596 | "function-bind": "~1.1.0", 1597 | "glob": "~7.1.2", 1598 | "has": "~1.0.1", 1599 | "inherits": "~2.0.3", 1600 | "minimist": "~1.2.0", 1601 | "object-inspect": "~1.3.0", 1602 | "resolve": "~1.4.0", 1603 | "resumer": "~0.0.0", 1604 | "string.prototype.trim": "~1.1.2", 1605 | "through": "~2.3.8" 1606 | }, 1607 | "dependencies": { 1608 | "minimist": { 1609 | "version": "1.2.0", 1610 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1611 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1612 | "dev": true 1613 | }, 1614 | "resolve": { 1615 | "version": "1.4.0", 1616 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", 1617 | "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", 1618 | "dev": true, 1619 | "requires": { 1620 | "path-parse": "^1.0.5" 1621 | } 1622 | } 1623 | } 1624 | }, 1625 | "text-table": { 1626 | "version": "0.2.0", 1627 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1628 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1629 | "dev": true 1630 | }, 1631 | "through": { 1632 | "version": "2.3.8", 1633 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1634 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1635 | "dev": true 1636 | }, 1637 | "tmp": { 1638 | "version": "0.0.33", 1639 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1640 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1641 | "dev": true, 1642 | "requires": { 1643 | "os-tmpdir": "~1.0.2" 1644 | } 1645 | }, 1646 | "type-check": { 1647 | "version": "0.3.2", 1648 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1649 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1650 | "dev": true, 1651 | "requires": { 1652 | "prelude-ls": "~1.1.2" 1653 | } 1654 | }, 1655 | "uglify-js": { 1656 | "version": "2.6.0", 1657 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.0.tgz", 1658 | "integrity": "sha1-JeqhzDVQ45QQzu+v0c+7a20V8AE=", 1659 | "dev": true, 1660 | "requires": { 1661 | "async": "~0.2.6", 1662 | "source-map": "~0.5.1", 1663 | "uglify-to-browserify": "~1.0.0", 1664 | "yargs": "~3.10.0" 1665 | } 1666 | }, 1667 | "uglify-to-browserify": { 1668 | "version": "1.0.2", 1669 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 1670 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 1671 | "dev": true 1672 | }, 1673 | "uri-js": { 1674 | "version": "4.2.2", 1675 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1676 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1677 | "dev": true, 1678 | "requires": { 1679 | "punycode": "^2.1.0" 1680 | } 1681 | }, 1682 | "which": { 1683 | "version": "1.3.1", 1684 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1685 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1686 | "dev": true, 1687 | "requires": { 1688 | "isexe": "^2.0.0" 1689 | } 1690 | }, 1691 | "window-size": { 1692 | "version": "0.1.0", 1693 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 1694 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 1695 | "dev": true 1696 | }, 1697 | "wordwrap": { 1698 | "version": "1.0.0", 1699 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1700 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1701 | "dev": true 1702 | }, 1703 | "wrappy": { 1704 | "version": "1.0.2", 1705 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1706 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1707 | "dev": true 1708 | }, 1709 | "write": { 1710 | "version": "0.2.1", 1711 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1712 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1713 | "dev": true, 1714 | "requires": { 1715 | "mkdirp": "^0.5.1" 1716 | } 1717 | }, 1718 | "yargs": { 1719 | "version": "3.10.0", 1720 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 1721 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 1722 | "dev": true, 1723 | "requires": { 1724 | "camelcase": "^1.0.2", 1725 | "cliui": "^2.1.0", 1726 | "decamelize": "^1.0.0", 1727 | "window-size": "0.1.0" 1728 | } 1729 | } 1730 | } 1731 | } 1732 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "d3-hsluv", 3 | "version": "0.1.2", 4 | "description": "HSLuv, the human-friendly HSl (Hue, Saturation, Lightness) color space.", 5 | "keywords": [ 6 | "d3", 7 | "d3-module", 8 | "color", 9 | "hsluv" 10 | ], 11 | "homepage": "https://d3js.org/d3-hsluv/", 12 | "license": "BSD-3-Clause", 13 | "author": { 14 | "name": "Sam Petulla", 15 | "url": "http://www.sampetulla.com" 16 | }, 17 | "main": "build/d3-hsluv.js", 18 | "jsnext:main": "index", 19 | "module": "index", 20 | "repository": { 21 | "type": "git", 22 | "url": "https://github.com/d3/d3-hsluv.git" 23 | }, 24 | "dependencies": { 25 | "d3-color": "^1.0.3" 26 | }, 27 | "scripts": { 28 | "pretest": "rm -rf build && mkdir build && rollup --banner \"$(preamble)\" -f umd -g d3-color:d3 -n d3 -o build/d3-hsluv.js -- index.js", 29 | "test": "tape 'test/**/*-test.js' && eslint index.js src test", 30 | "prepublish": "npm run test && uglifyjs --preamble \"$(preamble)\" build/d3-hsluv.js -c -m -o build/d3-hsluv.min.js" 31 | }, 32 | "devDependencies": { 33 | "eslint": "5", 34 | "package-preamble": "0.0", 35 | "rollup": "0.41", 36 | "tape": "4", 37 | "uglify-js": "2.6.0" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/color.js: -------------------------------------------------------------------------------- 1 | import constant from "./constant"; 2 | 3 | function linear(a, d) { 4 | return function(t) { 5 | return a + t * d; 6 | }; 7 | } 8 | 9 | export function hue(a, b) { 10 | var d = b - a; 11 | return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); 12 | } 13 | 14 | export default function nogamma(a, b) { 15 | var d = b - a; 16 | return d ? linear(a, d) : constant(isNaN(a) ? b : a); 17 | } 18 | -------------------------------------------------------------------------------- /src/constant.js: -------------------------------------------------------------------------------- 1 | export var m = [[3.240969941904521,-1.537383177570093,-0.498610760293],[-0.96924363628087,1.87596750150772,0.041555057407175],[0.055630079696993,-0.20397695888897,1.056971514242878]]; 2 | export var minv = [[0.41239079926595,0.35758433938387,0.18048078840183],[0.21263900587151,0.71516867876775,0.072192315360733],[0.019330818715591,0.11919477979462,0.95053215224966]]; 3 | export var refY = 1.0; 4 | export var refU = 0.19783000664283; 5 | export var refV = 0.46831999493879; 6 | export var kappa = 903.2962962; 7 | export var epsilon = 0.0088564516; 8 | export var darker = 0.7; 9 | export var brighter = 1 / darker; 10 | 11 | export default function(x) { 12 | return function() { 13 | return x; 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /src/helpers.js: -------------------------------------------------------------------------------- 1 | import {m, refY, kappa, epsilon} from './constant'; 2 | 3 | export function lengthOfRayUntilIntersect(theta,line) { 4 | return line.intercept / (Math.sin(theta) - line.slope * Math.cos(theta)); 5 | } 6 | 7 | export function yToL(Y) { 8 | if(Y <= epsilon) return Y / refY * kappa; else return 116 * Math.pow(Y / refY,0.333333333333333315) - 16; 9 | } 10 | 11 | export function lToY(L) { 12 | if(L <= 8) return refY * L / kappa; else return refY * Math.pow((L + 16) / 116,3); 13 | } 14 | 15 | export function getBounds(L) { 16 | var result = []; 17 | var sub1 = Math.pow(L + 16,3) / 1560896; 18 | var sub2; 19 | if(sub1 > epsilon) sub2 = sub1; else sub2 = L / kappa; 20 | var _g = 0; 21 | while(_g < 3) { 22 | var c = _g++; 23 | var m1 = m[c][0]; 24 | var m2 = m[c][1]; 25 | var m3 = m[c][2]; 26 | var _g1 = 0; 27 | while(_g1 < 2) { 28 | var t = _g1++; 29 | var top1 = (284517 * m1 - 94839 * m3) * sub2; 30 | var top2 = (838422 * m3 + 769860 * m2 + 731718 * m1) * L * sub2 - 769860 * t * L; 31 | var bottom = (632260 * m3 - 126452 * m2) * sub2 + 126452 * t; 32 | result.push({ slope : top1 / bottom, intercept : top2 / bottom}); 33 | } 34 | } 35 | return result; 36 | } 37 | 38 | export function maxChromaForLH(L,H) { 39 | var hrad = H / 360 * Math.PI * 2; 40 | var bounds = getBounds(L); 41 | var min = 1.7976931348623157e+308; 42 | var _g = 0; 43 | while(_g < bounds.length) { 44 | var bound = bounds[_g]; 45 | ++_g; 46 | var length = lengthOfRayUntilIntersect(hrad,bound); 47 | if(length >= 0) min = Math.min(min,length); 48 | } 49 | return min; 50 | } 51 | 52 | export function dotProduct(a,b) { 53 | var sum = 0; 54 | var _g1 = 0; 55 | var _g = a.length; 56 | while(_g1 < _g) { 57 | var i = _g1++; 58 | sum += a[i] * b[i]; 59 | } 60 | return sum; 61 | } 62 | 63 | export function toLinear(c) { 64 | if(c > 0.04045) return Math.pow((c + 0.055) / 1.055,2.4); else return c / 12.92; 65 | } 66 | 67 | export function fromLinear(c) { 68 | if(c <= 0.0031308) return 12.92 * c; else return 1.055 * Math.pow(c,0.416666666666666685) - 0.055; 69 | } -------------------------------------------------------------------------------- /src/hsluv.js: -------------------------------------------------------------------------------- 1 | import {color, rgb} from "d3-color"; 2 | import {xyzToLuv, rgbToXyz, lchToHsluv, luvToLch, xyzToRgb, luvToXyz, lchToLuv, hsluvToLch} from "./space"; 3 | import {brighter, darker} from './constant'; 4 | 5 | function HsluvConvert(o) { 6 | if (o instanceof Hsluv) return new Hsluv(o.l, o.u, o.v, o.opacity); 7 | if (!(o instanceof rgb)) o = rgb(o); 8 | 9 | var oRGB = lchToHsluv(luvToLch(xyzToLuv(rgbToXyz([o.r/255,o.g/255,o.b/255])))); 10 | 11 | var l = oRGB.l.toPrecision(7), 12 | u = oRGB.u.toPrecision(7), 13 | v = oRGB.v.toPrecision(7); 14 | 15 | return new Hsluv(l,u,v, o.opacity); 16 | } 17 | 18 | export default function hsluv(l, u, v, opacity) { 19 | return arguments.length === 1 ? HsluvConvert(l) : new Hsluv(l, u, v, opacity == null ? 1 : opacity); 20 | } 21 | 22 | export function Hsluv(l, u, v, opacity) { 23 | this.l = +l; 24 | this.u = +u; 25 | this.v = +v; 26 | this.opacity = +opacity; 27 | } 28 | 29 | var hsluvPrototype = Hsluv.prototype = hsluv.prototype = Object.create(color.prototype); 30 | 31 | hsluvPrototype.constructor = Hsluv; 32 | 33 | hsluvPrototype.brighter = function(k) { 34 | k = k == null ? brighter : Math.pow(brighter, k); 35 | return new Hsluv(this.l, this.u, this.v * k, this.opacity); 36 | }; 37 | 38 | hsluvPrototype.darker = function(k) { 39 | k = k == null ? darker : Math.pow(darker, k); 40 | return new Hsluv(this.l, this.u, this.v * k, this.opacity); 41 | }; 42 | 43 | hsluvPrototype.rgb = function() { 44 | var L = isNaN(this.l) ? 0 : this.l, 45 | U = isNaN(this.u) ? 0 : this.u, 46 | V = isNaN(this.v) ? 0 : this.v, 47 | a = this.opacity, 48 | o = xyzToRgb(luvToXyz(lchToLuv((hsluvToLch([L,U,V]))))), 49 | r = o.r, 50 | g = o.g, 51 | b = o.b; 52 | 53 | return hsluv2rgb(r,g,b,a); 54 | }; 55 | 56 | hsluvPrototype.displayable = function() { 57 | return (0 <= this.l && this.l <= 360 || isNaN(this.l)) 58 | && (0 <= this.u && this.u <= 100) 59 | && (0 <= this.v && this.v <= 100) 60 | && (0 <= this.opacity && this.opacity <= 1); 61 | }; 62 | 63 | function hsluv2rgb(r, g, b, a) { 64 | return rgb(r * 255, g * 255, b * 255, a || 1); 65 | } 66 | -------------------------------------------------------------------------------- /src/interpolateHsluv.js: -------------------------------------------------------------------------------- 1 | import {hsluv as colorHsluv} from "./../index"; 2 | import color, {hue} from "./color"; 3 | 4 | function hsluv(hue) { 5 | return function(start, end) { 6 | var l = hue((start = colorHsluv(start)).l, (end = colorHsluv(end)).l), 7 | u = color(start.u, end.u), 8 | v = color(start.v, end.v), 9 | opacity = color(start.opacity, end.opacity); 10 | return function(t) { 11 | start.l = l(t); 12 | start.u = u(t); 13 | start.v = v(t); 14 | start.opacity = opacity(t); 15 | return start + ""; 16 | }; 17 | } 18 | } 19 | 20 | export default hsluv(hue); 21 | export var hsluvLong = hsluv(color); 22 | -------------------------------------------------------------------------------- /src/space.js: -------------------------------------------------------------------------------- 1 | import {m, minv, refU, refV} from './constant'; 2 | import {fromLinear, toLinear, dotProduct, lToY, yToL, maxChromaForLH} from './helpers'; 3 | 4 | export function luvToXyz(tuple) { 5 | var L = tuple[0]; 6 | var U = tuple[1]; 7 | var V = tuple[2]; 8 | if(L == 0) return [0,0,0]; 9 | var varU = U / (13 * L) + refU; 10 | var varV = V / (13 * L) + refV; 11 | var Y = lToY(L); 12 | var X = 0 - 9 * Y * varU / ((varU - 4) * varV - varU * varV); 13 | var Z = (9 * Y - 15 * varV * Y - varV * X) / (3 * varV); 14 | return [X,Y,Z]; 15 | } 16 | 17 | export function lchToLuv (tuple) { 18 | var L = tuple[0]; 19 | var C = tuple[1]; 20 | var H = tuple[2]; 21 | var Hrad = H / 360 * 2 * Math.PI; 22 | var U = Math.cos(Hrad) * C; 23 | var V = Math.sin(Hrad) * C; 24 | return [L,U,V]; 25 | } 26 | 27 | export function hsluvToLch (tuple) { 28 | var H = tuple[0]; 29 | var S = tuple[1]; 30 | var L = tuple[2]; 31 | if(L > 99.9999999) return [100,0,H]; 32 | if(L < 0.00000001) return [0,0,H]; 33 | var max = maxChromaForLH(L,H); 34 | var C = max / 100 * S; 35 | return [L,C,H]; 36 | } 37 | 38 | export function lchToHsluv(tuple) { 39 | var L = tuple[0]; 40 | var C = tuple[1]; 41 | var H = tuple[2]; 42 | if(L > 99.9999999) return {l:H,u:0,v:100}; 43 | if(L < 0.00000001) return {l:H,u:0,v:0}; 44 | var max = maxChromaForLH(L,H); 45 | var S = C / max * 100; 46 | return {l:H,u:S,v:L}; 47 | } 48 | 49 | export function luvToLch(tuple) { 50 | var L = tuple[0]; 51 | var U = tuple[1]; 52 | var V = tuple[2]; 53 | var C = Math.sqrt(U * U + V * V); 54 | var H; 55 | if(C < 0.00000001) H = 0; else { 56 | var Hrad = Math.atan2(V,U); 57 | H = Hrad * 180 / Math.PI; 58 | if(H < 0) H = 360 + H; 59 | } 60 | return [L,C,H]; 61 | } 62 | 63 | export function xyzToLuv(tuple) { 64 | var X = tuple[0]; 65 | var Y = tuple[1]; 66 | var Z = tuple[2]; 67 | var divider = X + 15 * Y + 3 * Z; 68 | var varU = 4 * X; 69 | var varV = 9 * Y; 70 | if(divider != 0) { 71 | varU /= divider; 72 | varV /= divider; 73 | } else { 74 | varU = NaN; 75 | varV = NaN; 76 | } 77 | var L = yToL(Y); 78 | if(L == 0) return [0,0,0]; 79 | var U = 13 * L * (varU - refU); 80 | var V = 13 * L * (varV - refV); 81 | return [L,U,V]; 82 | } 83 | 84 | export function xyzToRgb(tuple) { 85 | var RGB = [fromLinear(dotProduct(m[0],tuple)),fromLinear(dotProduct(m[1],tuple)),fromLinear(dotProduct(m[2],tuple))]; 86 | return {r: RGB[0], g: RGB[1], b: RGB[2]}; 87 | } 88 | 89 | export function rgbToXyz(tuple) { 90 | var rgbl = [toLinear(tuple[0]),toLinear(tuple[1]),toLinear(tuple[2])]; 91 | return [dotProduct(minv[0],rgbl), dotProduct(minv[1],rgbl),dotProduct(minv[2],rgbl)]; 92 | } 93 | -------------------------------------------------------------------------------- /test/hsluv-test.js: -------------------------------------------------------------------------------- 1 | var tape = require("tape"), 2 | d3_color = require("d3-color"), 3 | d3_hsluv = require("../"); 4 | 5 | require("./hsluvEqual"); 6 | require("./rgbEqual"); 7 | 8 | tape("hsluv(…) returns an instance of hsluv and color", function(test) { 9 | var c = d3_hsluv.hsluv(120, 0.4, 0.5); 10 | test.ok(c instanceof d3_hsluv.hsluv); 11 | test.ok(c instanceof d3_color.color); 12 | test.equal(c.constructor.name, "Hsluv"); 13 | test.end(); 14 | }); 15 | 16 | tape("hsluv(…) exposes h, s, and l channel values and opacity", function(test) { 17 | test.hsluvEqual(d3_hsluv.hsluv("#abc"), 237.8523, 25.80045, 75.10529, 1); 18 | test.end(); 19 | }); 20 | 21 | tape("hsluv.toString() converts to RGB and formats as rgb(…) or rgba(…)", function(test) { 22 | test.equal(d3_hsluv.hsluv("#abcdef") + "", "rgb(171, 205, 239)"); 23 | test.equal(d3_hsluv.hsluv("moccasin") + "", "rgb(255, 228, 181)"); 24 | test.equal(d3_hsluv.hsluv("rgb(12, 34, 56)") + "", "rgb(12, 34, 56)"); 25 | test.equal(d3_hsluv.hsluv(d3_color.rgb("rgb(12, 34, 56)")) + "", "rgb(12, 34, 56)"); 26 | test.equal(d3_hsluv.hsluv(d3_hsluv.hsluv("rgba(102, 102, 0, 0.4)")) + "", "rgba(102, 102, 0, 0.4)"); 27 | test.end(); 28 | }); 29 | 30 | tape("hsluv.toString() reflects l, u and v channel values and opacity", function(test) { 31 | var c = d3_hsluv.hsluv("#abc"); 32 | c.l += 100, c.u += 10, c.v -= 10, c.opacity = 0.4; 33 | test.equal(c + "", "rgba(198, 142, 169, 0.4)"); 34 | test.end(); 35 | }); 36 | 37 | tape("hsluv.toString() treats undefined channel values as 0", function(test) { 38 | test.equal(d3_hsluv.hsluv("invalid") + "", "rgb(0, 0, 0)"); 39 | test.equal(d3_hsluv.hsluv("#000") + "", "rgb(0, 0, 0)"); 40 | test.equal(d3_hsluv.hsluv("#ccc") + "", "rgb(204, 204, 204)"); 41 | test.equal(d3_hsluv.hsluv("#fff") + "", "rgb(255, 255, 255)"); 42 | test.equal(d3_hsluv.hsluv(NaN, 0.0, 0.4) + "", "rgb(1, 1, 1)"); // equivalent to hsluv(0, 0, 0.4) 43 | test.equal(d3_hsluv.hsluv(120, NaN, 0.4) + "", "rgb(1, 1, 1)"); 44 | test.equal(d3_hsluv.hsluv(NaN, NaN, 0.4) + "", "rgb(1, 1, 1)"); 45 | test.equal(d3_hsluv.hsluv(120, 0.5, NaN) + "", "rgb(0, 0, 0)"); // equivalent to hsluv(120, 0.5, 0) 46 | test.end(); 47 | }); 48 | 49 | tape("hsluv.toString() treats undefined opacity as 1", function(test) { 50 | var c = d3_hsluv.hsluv("#abc"); 51 | c.opacity = NaN; 52 | test.equal(c + "", "rgb(170, 187, 204)"); 53 | test.end(); 54 | }); 55 | 56 | tape("hsluv(h, c, g) does not wrap hue to [0,360)", function(test) { 57 | test.hsluvEqual(d3_hsluv.hsluv(-10, 0.4, 0.5), -10, 0.4, 0.5, 1); 58 | test.hsluvEqual(d3_hsluv.hsluv(0, 0.4, 0.5), 0, 0.4, 0.5, 1); 59 | test.hsluvEqual(d3_hsluv.hsluv(360, 0.4, 0.5), 360, 0.4, 0.5, 1); 60 | test.hsluvEqual(d3_hsluv.hsluv(370, 0.4, 0.5), 370, 0.4, 0.5, 1); 61 | test.end(); 62 | }); 63 | 64 | tape("hsluv(l, u, v) does not clamp u and v channel values to [0,1]", function(test) { 65 | test.hsluvEqual(d3_hsluv.hsluv(120, -0.1, 0.5), 120, -0.1, 0.5, 1); 66 | test.hsluvEqual(d3_hsluv.hsluv(120, 1.1, 0.5), 120, 1.1, 0.5, 1); 67 | test.hsluvEqual(d3_hsluv.hsluv(120, 0.2, -0.1), 120, 0.2, -0.1, 1); 68 | test.hsluvEqual(d3_hsluv.hsluv(120, 0.2, 1.1), 120, 0.2, 1.1, 1); 69 | test.end(); 70 | }); 71 | 72 | tape("hsluv(l, u, v, opacity) does not clamp opacity to [0,1]", function(test) { 73 | test.hsluvEqual(d3_hsluv.hsluv(120, 0.1, 0.5, -0.2), 120, 0.1, 0.5, -0.2); 74 | test.hsluvEqual(d3_hsluv.hsluv(120, 0.9, 0.5, 1.2), 120, 0.9, 0.5, 1.2); 75 | test.end(); 76 | }); 77 | 78 | tape("hsluv(l, u, v) coerces channel values to numbers", function(test) { 79 | test.hsluvEqual(d3_hsluv.hsluv("120", ".4", ".5"), 120, 0.4, 0.5, 1); 80 | test.end(); 81 | }); 82 | 83 | tape("hsluv(l, u, v, opacity) coerces opacity to number", function(test) { 84 | test.hsluvEqual(d3_hsluv.hsluv(120, 0.1, 0.5, "0.2"), 120, 0.1, 0.5, 0.2); 85 | test.hsluvEqual(d3_hsluv.hsluv(120, 0.9, 0.5, "0.9"), 120, 0.9, 0.5, 0.9); 86 | test.end(); 87 | }); 88 | 89 | tape("hsluv(l, u, v) allows undefined channel values", function(test) { 90 | test.hsluvEqual(d3_hsluv.hsluv(undefined, NaN, "foo"), NaN, NaN, NaN, 1); 91 | test.hsluvEqual(d3_hsluv.hsluv(undefined, 0.4, 0.5), NaN, 0.4, 0.5, 1); 92 | test.hsluvEqual(d3_hsluv.hsluv(42, undefined, 0.5), 42, NaN, 0.5, 1); 93 | test.hsluvEqual(d3_hsluv.hsluv(42, 0.4, undefined), 42, 0.4, NaN, 1); 94 | test.end(); 95 | }); 96 | 97 | tape("hsluv(l, u, v, opacity) converts undefined opacity to 1", function(test) { 98 | test.hsluvEqual(d3_hsluv.hsluv(10, 0.2, 0.3, null), 10, 0.2, 0.3, 1); 99 | test.hsluvEqual(d3_hsluv.hsluv(10, 0.2, 0.3, undefined), 10, 0.2, 0.3, 1); 100 | test.end(); 101 | }); 102 | 103 | tape("hsluv(l, u, v) preserves explicit hue, even for grays", function(test) { 104 | test.hsluvEqual(d3_hsluv.hsluv(0, 0, 0), 0, 0, 0, 1); 105 | test.hsluvEqual(d3_hsluv.hsluv(42, 0, 0.5), 42, 0, 0.5, 1); 106 | test.hsluvEqual(d3_hsluv.hsluv(118, 0, 1), 118, 0, 1, 1); 107 | test.end(); 108 | }); 109 | 110 | tape("hsluv(l, u, v) preserves explicit saturation, even for white or black", function(test) { 111 | test.hsluvEqual(d3_hsluv.hsluv(0, 0, 0), 0, 0, 0, 1); 112 | test.hsluvEqual(d3_hsluv.hsluv(0, 0.18, 0), 0, 0.18, 0, 1); 113 | test.hsluvEqual(d3_hsluv.hsluv(0, 0.42, 1), 0, 0.42, 1, 1); 114 | test.hsluvEqual(d3_hsluv.hsluv(0, 1, 1), 0, 1, 1, 1); 115 | test.end(); 116 | }); 117 | 118 | tape("hsluv(format) parses the specified format and converts to hsluv", function(test) { 119 | test.hsluvEqual(d3_hsluv.hsluv("#abcdef"), 239.8087, 69.11436, 81.04448, 1); 120 | test.hsluvEqual(d3_hsluv.hsluv("#abc"), 237.8523, 25.80045, 75.10529, 1); 121 | test.hsluvEqual(d3_hsluv.hsluv("rgb(12, 34, 56)"), 247.3614, 80.33178, 12.65677, 1); 122 | test.hsluvEqual(d3_hsluv.hsluv("rgb(12%, 34%, 56%)"), 249.4946, 88.58912, 36.04142, 1); 123 | test.hsluvEqual(d3_hsluv.hsluv("aliceblue"), 233.4799, 100, 97.17878, 1); 124 | test.hsluvEqual(d3_hsluv.hsluv("transparent"), NaN, NaN, NaN, 0); 125 | test.end(); 126 | }); 127 | 128 | tape("hsluv(format) returns undefined channel values for unknown formats", function(test) { 129 | test.hsluvEqual(d3_hsluv.hsluv("invalid"), NaN, NaN, NaN, NaN); 130 | test.end(); 131 | }); 132 | 133 | tape("hsluv(hsluv) copies an hsluv color", function(test) { 134 | var c1 = d3_hsluv.hsluv("hsla(120, 30%, 50%, 0.4)"), 135 | c2 = d3_hsluv.hsluv(c1); 136 | test.hsluvEqual(c1, 127.715, 62.35914, 61.69085, 0.4); 137 | c1.l = c1.u = c1.v = c1.opacity = 0; 138 | test.hsluvEqual(c1, 0, 0, 0, 0); 139 | test.hsluvEqual(c2, 127.715, 62.35914, 61.69085, 0.4); 140 | test.end(); 141 | }); 142 | 143 | tape("hsluv(rgb) converts from RGB", function(test) { 144 | test.hsluvEqual(d3_hsluv.hsluv(d3_color.rgb(255, 0, 0, 0.4)), 12.17705, 100, 53.23712, 0.4); 145 | test.end(); 146 | }); 147 | 148 | tape("hsluv(color) returns zero hue and zero saturation for grays", function(test) { 149 | test.hsluvEqual(d3_hsluv.hsluv("gray"), 0, 1.903044e-12, 53.58501, 1); 150 | test.hsluvEqual(d3_hsluv.hsluv("#ccc"), 0, 1.016426e-11, 82.04578, 1); 151 | test.hsluvEqual(d3_hsluv.hsluv(d3_color.rgb("gray")), 0, 1.903044e-12, 53.58501, 1); 152 | test.end(); 153 | }); 154 | 155 | tape("hsluv(color) returns 0 hue and saturation for black and white", function(test) { 156 | test.hsluvEqual(d3_hsluv.hsluv("black"), 0, 0, 0, 1); 157 | test.hsluvEqual(d3_hsluv.hsluv("#000"), 0, 0, 0, 1); 158 | test.hsluvEqual(d3_hsluv.hsluv("white"), 0, 0, 100, 1); 159 | test.hsluvEqual(d3_hsluv.hsluv("#fff"), 0, 0, 100, 1); 160 | test.hsluvEqual(d3_hsluv.hsluv(d3_color.rgb("#fff")), 0, 0, 100, 1); 161 | test.end(); 162 | }); 163 | 164 | tape("hsluv(color) converts from another colorspace via d3_color.rgb()", function(test) { 165 | function TestColor() {} 166 | TestColor.prototype = Object.create(d3_color.color.prototype); 167 | TestColor.prototype.rgb = function() { return d3_color.rgb(12, 34, 56, 0.4); }; 168 | TestColor.prototype.toString = function() { throw new Error("should use rgb, not toString"); }; 169 | test.hsluvEqual(d3_hsluv.hsluv(new TestColor), 247.3614, 80.33178, 12.65677, 0.4); 170 | test.end(); 171 | }); 172 | 173 | tape("hsluv.displayable() returns true if the color is within the RGB gamut and the opacity is in [0,1]", function(test) { 174 | test.equal(d3_hsluv.hsluv("white").displayable(), true); 175 | test.equal(d3_hsluv.hsluv("red").displayable(), true); 176 | test.equal(d3_hsluv.hsluv("black").displayable(), true); 177 | test.equal(d3_hsluv.hsluv("invalid").displayable(), false); 178 | test.equal(d3_hsluv.hsluv(NaN, NaN, 1).displayable(), false); 179 | test.equal(d3_hsluv.hsluv(120, -0.5, 0).displayable(), false); 180 | test.equal(d3_hsluv.hsluv(370, 1.5, 0).displayable(), false); 181 | test.equal(d3_hsluv.hsluv(0, 1, 1, 0).displayable(), true); 182 | test.equal(d3_hsluv.hsluv(0, 1, 1, 1).displayable(), true); 183 | test.equal(d3_hsluv.hsluv(0, 1, 1, -0.2).displayable(), false); 184 | test.equal(d3_hsluv.hsluv(0, 1, 1, 1.2).displayable(), false); 185 | test.end(); 186 | }); 187 | 188 | tape("hsluv.rgb() converts to RGB", function(test) { 189 | var c = d3_hsluv.hsluv(85.87432, 100, 97.13855, 0.4); 190 | test.rgbEqual(c.rgb(), 255, 255, 0, 0.4); 191 | test.end(); 192 | }); 193 | -------------------------------------------------------------------------------- /test/hsluvEqual.js: -------------------------------------------------------------------------------- 1 | var tape = require("tape"), 2 | color = require("../"); 3 | 4 | tape.Test.prototype.hsluvEqual = function(actual, l, u, v, opacity) { 5 | this._assert(actual instanceof color.hsluv 6 | && (isNaN(l) ? isNaN(actual.l) && actual.l !== actual.l : l - 1e-6 <= actual.l && actual.l <= l + 1e-6) 7 | && (isNaN(u) ? isNaN(actual.u) && actual.u !== actual.u : u - 1e-6 <= actual.u && actual.u <= u + 1e-6) 8 | && (isNaN(v) ? isNaN(actual.v) && actual.v !== actual.v : v - 1e-6 <= actual.v && actual.v <= v + 1e-6) 9 | && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity), { 10 | message: "should be equal", 11 | operator: "hsluvEqual", 12 | actual: [actual.l, actual.u, actual.v, actual.opacity], 13 | expected: [l, u, v, opacity] 14 | }); 15 | }; -------------------------------------------------------------------------------- /test/interpolate-test.js: -------------------------------------------------------------------------------- 1 | var tape = require("tape"), 2 | color = require("d3-color"), 3 | interpolate = require("../"), 4 | hsluv = interpolate.hsluv; 5 | 6 | tape("interpolateHsluv(a, b) converts a and b to HSLuv colors", function(test) { 7 | test.equal(interpolate.interpolateHsluv("steelblue", "brown")(0), color.rgb("steelblue") + ""); 8 | test.equal(interpolate.interpolateHsluv("steelblue", hsluv("brown"))(1), color.rgb("brown") + ""); 9 | test.equal(interpolate.interpolateHsluv("steelblue", color.rgb("brown"))(1), color.rgb("brown") + ""); 10 | test.end(); 11 | }); 12 | 13 | tape("interpolateHsluv(a, b) interpolates in HSLuv and returns an RGB string", function(test) { 14 | test.equal(interpolate.interpolateHsluv("steelblue", "#f00")(0.2), "rgb(122, 109, 228)"); 15 | test.equal(interpolate.interpolateHsluv("rgba(70, 130, 180, 1)", "rgba(255, 0, 0, 0.2)")(0.2), "rgba(122, 109, 228, 0.84)"); 16 | test.end(); 17 | }); 18 | 19 | tape("interpolateHsluv(a, b) uses the shortest path when interpolating hue", function(test) { 20 | var i = interpolate.interpolateHsluv(hsluv(10,50,50), hsluv(350,50,50)); 21 | test.equal(i(0.0), "rgb(193, 84, 89)"); 22 | test.equal(i(0.2), "rgb(191, 85, 99)"); 23 | test.equal(i(0.4), "rgb(189, 85, 107)"); 24 | test.equal(i(0.6), "rgb(187, 86, 113)"); 25 | test.equal(i(0.8), "rgb(185, 86, 119)"); 26 | test.equal(i(1.0), "rgb(184, 87, 124)"); 27 | test.end(); 28 | }); 29 | 30 | tape("interpolateHsluv(a, b) uses a’s hue when b’s hue is undefined", function(test) { 31 | test.equal(interpolate.interpolateHsluv("#f60", "#000")(0.5), "rgb(123, 50, 51)"); 32 | test.end(); 33 | }); 34 | 35 | tape("interpolateHsluv(a, b) uses b’s hue when a’s hue is undefined", function(test) { 36 | test.equal(interpolate.interpolateHsluv("#000", "#f60")(0.5), "rgb(123, 50, 51)"); 37 | test.end(); 38 | }); 39 | 40 | 41 | tape("interpolateHsluv(a, b) uses a’s saturation when b’s saturation is undefined", function(test) { 42 | test.equal(interpolate.interpolateHsluv("#ccc", "#000")(0.5), "rgb(97, 97, 97)"); 43 | test.equal(interpolate.interpolateHsluv("#f00", "#000")(0.5), "rgb(105, 43, 51)"); 44 | test.end(); 45 | }); 46 | 47 | tape("interpolateHsluv(a, b) uses b’s saturation when a’s saturation is undefined", function(test) { 48 | test.equal(interpolate.interpolateHsluv("#000", "#ccc")(0.5), "rgb(97, 97, 97)"); 49 | test.equal(interpolate.interpolateHsluv("#000", "#f00")(0.5), "rgb(105, 43, 51)"); 50 | test.end(); 51 | }); 52 | 53 | tape("interpolateHsluv(a, b) uses b’s lightness when a’s lightness is undefined", function(test) { 54 | test.equal(interpolate.interpolateHsluv(null, hsluv(16, 100, 57))(0.5), "rgb(255, 64, 4)"); 55 | test.end(); 56 | }); 57 | 58 | tape("interpolateHsluv(a, b) uses a’s lightness when b’s lightness is undefined", function(test) { 59 | test.equal(interpolate.interpolateHsluv(hsluv(16, 100, 57), null)(0.5), "rgb(255, 64, 4)"); 60 | test.end(); 61 | }); 62 | -------------------------------------------------------------------------------- /test/interpolateLong-test.js: -------------------------------------------------------------------------------- 1 | var tape = require("tape"), 2 | color = require("d3-color"), 3 | interpolate = require("../"), 4 | hsluv = interpolate.hsluv; 5 | 6 | tape("interpolateHsluvLong(a, b) converts a and b to HSLuv colors", function(test) { 7 | test.equal(interpolate.interpolateHsluvLong("steelblue", "brown")(0), color.rgb("steelblue") + ""); 8 | test.equal(interpolate.interpolateHsluvLong("steelblue", hsluv("brown"))(1), color.rgb("brown") + ""); 9 | test.equal(interpolate.interpolateHsluvLong("steelblue", color.rgb("brown"))(1), color.rgb("brown") + ""); 10 | test.end(); 11 | }); 12 | 13 | tape("interpolateHsluvLong(a, b) interpolates in HSLuv and returns an RGB string", function(test) { 14 | test.equal(interpolate.interpolateHsluvLong("steelblue", "#f00")(0.2), "rgb(59, 137, 140)"); 15 | test.equal(interpolate.interpolateHsluvLong("rgba(70, 130, 180, 1)", "rgba(255, 0, 0, 0.2)")(0.2), "rgba(59, 137, 140, 0.84)"); 16 | test.end(); 17 | }); 18 | 19 | tape("interpolateHsluvLong(a, b) uses the shortest path when interpolating hue", function(test) { 20 | var i = interpolate.interpolateHsluvLong(hsluv(10,50,50), hsluv(350,50,50)); 21 | test.equal(i(0.0), "rgb(193, 84, 89)"); 22 | test.equal(i(0.2), "rgb(126, 120, 82)"); 23 | test.equal(i(0.4), "rgb(84, 128, 104)"); 24 | test.equal(i(0.6), "rgb(87, 125, 135)"); 25 | test.equal(i(0.8), "rgb(140, 101, 185)"); 26 | test.equal(i(1.0), "rgb(184, 87, 124)"); 27 | test.end(); 28 | }); 29 | 30 | tape("interpolateHsluvLong(a, b) uses a’s hue when b’s hue is undefined", function(test) { 31 | test.equal(interpolate.interpolateHsluvLong("#f60", "#000")(0.5), "rgb(123, 50, 51)"); 32 | test.end(); 33 | }); 34 | 35 | tape("interpolateHsluvLong(a, b) uses b’s hue when a’s hue is undefined", function(test) { 36 | test.equal(interpolate.interpolateHsluvLong("#000", "#f60")(0.5), "rgb(123, 50, 51)"); 37 | test.end(); 38 | }); 39 | 40 | 41 | tape("interpolateHsluvLong(a, b) uses a’s saturation when b’s saturation is undefined", function(test) { 42 | test.equal(interpolate.interpolateHsluvLong("#ccc", "#000")(0.5), "rgb(97, 97, 97)"); 43 | test.equal(interpolate.interpolateHsluvLong("#f00", "#000")(0.5), "rgb(105, 43, 51)"); 44 | test.end(); 45 | }); 46 | 47 | tape("interpolateHsluvLong(a, b) uses b’s saturation when a’s saturation is undefined", function(test) { 48 | test.equal(interpolate.interpolateHsluvLong("#000", "#ccc")(0.5), "rgb(97, 97, 97)"); 49 | test.equal(interpolate.interpolateHsluvLong("#000", "#f00")(0.5), "rgb(105, 43, 51)"); 50 | test.end(); 51 | }); 52 | 53 | tape("interpolateHsluvLong(a, b) uses b’s lightness when a’s lightness is undefined", function(test) { 54 | test.equal(interpolate.interpolateHsluvLong(null, hsluv(16, 100, 57))(0.5), "rgb(255, 64, 4)"); 55 | test.end(); 56 | }); 57 | 58 | tape("interpolateHsluvLong(a, b) uses a’s lightness when b’s lightness is undefined", function(test) { 59 | test.equal(interpolate.interpolateHsluvLong(hsluv(16, 100, 57), null)(0.5), "rgb(255, 64, 4)"); 60 | test.end(); 61 | }); 62 | -------------------------------------------------------------------------------- /test/rgbEqual.js: -------------------------------------------------------------------------------- 1 | var tape = require("tape"), 2 | d3_color = require("d3-color"); 3 | 4 | tape.Test.prototype.rgbStrictEqual = function(actual, r, g, b, opacity) { 5 | this._assert(actual instanceof d3_color.rgb 6 | && (isNaN(r) ? isNaN(actual.r) && actual.r !== actual.r : actual.r === r) 7 | && (isNaN(g) ? isNaN(actual.g) && actual.g !== actual.g : actual.g === g) 8 | && (isNaN(b) ? isNaN(actual.b) && actual.b !== actual.b : actual.b === b) 9 | && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity), { 10 | message: "should be equal", 11 | operator: "rgbStrictEqual", 12 | actual: [actual.r, actual.g, actual.b, actual.opacity], 13 | expected: [r, g, b, opacity] 14 | }); 15 | }; 16 | 17 | tape.Test.prototype.rgbEqual = function(actual, r, g, b, opacity) { 18 | this._assert(actual instanceof d3_color.rgb 19 | && (isNaN(r) ? isNaN(actual.r) && actual.r !== actual.r : Math.round(actual.r) === Math.round(r)) 20 | && (isNaN(g) ? isNaN(actual.g) && actual.g !== actual.g : Math.round(actual.g) === Math.round(g)) 21 | && (isNaN(b) ? isNaN(actual.b) && actual.b !== actual.b : Math.round(actual.b) === Math.round(b)) 22 | && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity), { 23 | message: "should be equal", 24 | operator: "rgbEqual", 25 | actual: [Math.round(actual.r), Math.round(actual.g), Math.round(actual.b), actual.opacity], 26 | expected: [Math.round(r), Math.round(g), Math.round(b), opacity] 27 | }); 28 | }; --------------------------------------------------------------------------------