├── .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 | };
--------------------------------------------------------------------------------