From 237b75551b94cdc9d8c8121d980fccdf047e3e7b Mon Sep 17 00:00:00 2001 From: Curran Kelleher Date: Wed, 7 Aug 2019 16:55:35 +0530 Subject: [PATCH 01/34] Fix #62 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 10fb420..02860b3 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,6 @@ Equivalent to [d3.hcl](#hcl), but with reversed argument order. # d3.cubehelix(specifier)
# d3.cubehelix(color)
-Constructs a new [Cubehelix](https://www.mrao.cam.ac.uk/~dag/CUBEHELIX/) color. The channel values are exposed as `h`, `s` and `l` properties on the returned instance. Use the [Cubehelix color picker](http://bl.ocks.org/mbostock/ba8d75e45794c27168b5) to explore this color space. +Constructs a new [Cubehelix](http://www.mrao.cam.ac.uk/~dag/CUBEHELIX/) color. The channel values are exposed as `h`, `s` and `l` properties on the returned instance. Use the [Cubehelix color picker](http://bl.ocks.org/mbostock/ba8d75e45794c27168b5) to explore this color space. If *h*, *s* and *l* 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 Cubehelix color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to Cubehelix. (Colors already in the Cubehelix color space skip the conversion to RGB.) From 48bccfb0851b693f3f1e4806b5cc817f43552745 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Fri, 9 Aug 2019 15:14:47 -0700 Subject: [PATCH 02/34] Use exact paths in imports. d3/d3#3265 --- src/color.js | 2 +- src/cubehelix.js | 6 +++--- src/index.js | 6 +++--- src/lab.js | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/color.js b/src/color.js index af5c1c5..6f133b1 100644 --- a/src/color.js +++ b/src/color.js @@ -1,4 +1,4 @@ -import define, {extend} from "./define"; +import define, {extend} from "./define.js"; export function Color() {} diff --git a/src/cubehelix.js b/src/cubehelix.js index f77b00f..bc31659 100644 --- a/src/cubehelix.js +++ b/src/cubehelix.js @@ -1,6 +1,6 @@ -import define, {extend} from "./define"; -import {Color, rgbConvert, Rgb, darker, brighter} from "./color"; -import {deg2rad, rad2deg} from "./math"; +import define, {extend} from "./define.js"; +import {Color, rgbConvert, Rgb, darker, brighter} from "./color.js"; +import {deg2rad, rad2deg} from "./math.js"; var A = -0.14861, B = +1.78277, diff --git a/src/index.js b/src/index.js index 1993890..831cf52 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,3 @@ -export {default as color, rgb, hsl} from "./color"; -export {default as lab, hcl, lch, gray} from "./lab"; -export {default as cubehelix} from "./cubehelix"; +export {default as color, rgb, hsl} from "./color.js"; +export {default as lab, hcl, lch, gray} from "./lab.js"; +export {default as cubehelix} from "./cubehelix.js"; diff --git a/src/lab.js b/src/lab.js index 1d023f2..b27196e 100644 --- a/src/lab.js +++ b/src/lab.js @@ -1,6 +1,6 @@ -import define, {extend} from "./define"; -import {Color, rgbConvert, Rgb} from "./color"; -import {deg2rad, rad2deg} from "./math"; +import define, {extend} from "./define.js"; +import {Color, rgbConvert, Rgb} from "./color.js"; +import {deg2rad, rad2deg} from "./math.js"; // https://observablehq.com/@mbostock/lab-and-rgb var K = 18, From 81c3a5507a00bd8afae942333a75e3cee9634bf9 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 22 Aug 2019 10:05:05 -0700 Subject: [PATCH 03/34] Update README. Fix #66. --- README.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 02860b3..7ba58ee 100644 --- a/README.md +++ b/README.md @@ -29,12 +29,13 @@ c.opacity = 0.8; c + ""; // rgba(198, 45, 205, 0.8) ``` -In addition to the ubiquitous and machine-friendly [RGB](#rgb) and [HSL](#hsl) color space, d3-color supports two color spaces that are designed for humans: +In addition to the ubiquitous and machine-friendly [RGB](#rgb) and [HSL](#hsl) color space, d3-color supports color spaces that are designed for humans: +* [CIELAB](#lab) +* [CIELChab](#lch) * Dave Green’s [Cubehelix](#cubehelix) -* [Lab (CIELAB)](#lab) and [HCL (CIELCH)](#hcl) -Cubehelix features monotonic lightness, while Lab and HCL are perceptually uniform. Note that HCL is the cylindrical form of Lab, similar to how HSL is the cylindrical form of RGB. +Cubehelix features monotonic lightness, while CIELAB and its polar form CIELChab are perceptually uniform. For additional color spaces, see: @@ -45,7 +46,7 @@ For additional color spaces, see: ## Installing -If you use NPM, `npm install d3-color`. Otherwise, download the [latest release](https://github.com/d3/d3-color/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-color.v1.min.js) or as part of [D3 4.0](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: +If you use NPM, `npm install d3-color`. Otherwise, download the [latest release](https://github.com/d3/d3-color/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-color.v1.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: ```html @@ -56,7 +57,7 @@ var steelblue = d3.rgb("steelblue"); ``` -[Try d3-color in your browser.](https://tonicdev.com/npm/d3-color) +[Try d3-color in your browser.](https://observablehq.com/collection/@d3/d3-color) ## API Reference @@ -142,27 +143,27 @@ If *h*, *s* and *l* are specified, these represent the channel values of the ret # d3.lab(specifier)
# d3.lab(color)
-Constructs a new [Lab](https://en.wikipedia.org/wiki/Lab_color_space#CIELAB) color. The channel values are exposed as `l`, `a` and `b` properties on the returned instance. Use the [Lab color picker](http://bl.ocks.org/mbostock/9f37cc207c0cb166921b) to explore this color space. The value of *l* is typically in the range [0, 100], while *a* and *b* are typically in [-160, +160]. +Constructs a new [CIELAB](https://en.wikipedia.org/wiki/Lab_color_space#CIELAB) color. The channel values are exposed as `l`, `a` and `b` properties on the returned instance. Use the [CIELAB color picker](http://bl.ocks.org/mbostock/9f37cc207c0cb166921b) to explore this color space. The value of *l* is typically in the range [0, 100], while *a* and *b* are typically in [-160, +160]. -If *l*, *a* and *b* 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 Lab color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to Lab. (Colors already in the Lab color space skip the conversion to RGB, and colors in the HCL color space are converted directly to Lab.) +If *l*, *a* and *b* 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 CIELAB color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to CIELAB. (Colors already in the CIELAB color space skip the conversion to RGB, and colors in the HCL color space are converted directly to CIELAB.) # d3.gray(l[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/lab.js "Source")
-Constructs a new [Lab](#lab) color with the specified *l* value and *a* = *b* = 0. +Constructs a new [CIELAB](#lab) color with the specified *l* value and *a* = *b* = 0. # d3.hcl(h, c, l[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/lab.js "Source")
# d3.hcl(specifier)
# d3.hcl(color)
-Constructs a new [HCL](https://en.wikipedia.org/wiki/HCL_color_space) color. The channel values are exposed as `h`, `c` and `l` properties on the returned instance. Use the [HCL color picker](http://bl.ocks.org/mbostock/3e115519a1b495e0bd95) to explore this color space. The value of *l* is typically in the range [0, 100], *c* is typically in [0, 230], and *h* is typically in [0, 360). - -If *h*, *c* and *l* 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 HCL color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to HCL. (Colors already in the HCL color space skip the conversion to RGB, and colors in the Lab color space are converted directly to HCL.) +Equivalent to [d3.lch](#lch), but with reversed argument order. # d3.lch(l, c, h[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/lab.js "Source")
# d3.lch(specifier)
# d3.lch(color)
-Equivalent to [d3.hcl](#hcl), but with reversed argument order. +Constructs a new [CIELChab](https://en.wikipedia.org/wiki/CIELAB_color_space#Cylindrical_representation:_CIELCh_or_CIEHLC) color. The channel values are exposed as `l`, `c` and `h` properties on the returned instance. Use the [CIELChab](http://bl.ocks.org/mbostock/3e115519a1b495e0bd95) to explore this color space. The value of *l* is typically in the range [0, 100], *c* is typically in [0, 230], and *h* is typically in [0, 360). + +If *l*, *c*, and *h* 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 CIELChab color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to CIELChab. (Colors already in CIELChab color space skip the conversion to RGB, and colors in CIELAB color space are converted directly to CIELChab.) # d3.cubehelix(h, s, l[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/cubehelix.js "Source")
# d3.cubehelix(specifier)
From 1a9e6120ebd28272a55e57aad5b5d8482475cd80 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 22 Aug 2019 10:06:34 -0700 Subject: [PATCH 04/34] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ba58ee..878a8ad 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ Equivalent to [d3.lch](#lch), but with reversed argument order. # d3.lch(specifier)
# d3.lch(color)
-Constructs a new [CIELChab](https://en.wikipedia.org/wiki/CIELAB_color_space#Cylindrical_representation:_CIELCh_or_CIEHLC) color. The channel values are exposed as `l`, `c` and `h` properties on the returned instance. Use the [CIELChab](http://bl.ocks.org/mbostock/3e115519a1b495e0bd95) to explore this color space. The value of *l* is typically in the range [0, 100], *c* is typically in [0, 230], and *h* is typically in [0, 360). +Constructs a new [CIELChab](https://en.wikipedia.org/wiki/CIELAB_color_space#Cylindrical_representation:_CIELCh_or_CIEHLC) color. The channel values are exposed as `l`, `c` and `h` properties on the returned instance. Use the [CIELChab color picker](http://bl.ocks.org/mbostock/3e115519a1b495e0bd95) to explore this color space. The value of *l* is typically in the range [0, 100], *c* is typically in [0, 230], and *h* is typically in [0, 360). If *l*, *c*, and *h* 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 CIELChab color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to CIELChab. (Colors already in CIELChab color space skip the conversion to RGB, and colors in CIELAB color space are converted directly to CIELChab.) From bff4aa3c982ff819d0eddfcee37641edebf015a8 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 22 Aug 2019 10:13:59 -0700 Subject: [PATCH 05/34] Update README. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 878a8ad..4f761f0 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ c + ""; // rgba(198, 45, 205, 0.8) In addition to the ubiquitous and machine-friendly [RGB](#rgb) and [HSL](#hsl) color space, d3-color supports color spaces that are designed for humans: -* [CIELAB](#lab) -* [CIELChab](#lch) +* [CIELAB](#lab) (*a.k.a.* “Lab”) +* [CIELChab](#lch) (*a.k.a.* “LCh” or “HCL”) * Dave Green’s [Cubehelix](#cubehelix) Cubehelix features monotonic lightness, while CIELAB and its polar form CIELChab are perceptually uniform. From 7a4982b3d16cf48bdeab2b0c0c5208220d85693b Mon Sep 17 00:00:00 2001 From: Tim Slatcher <933064+zerovox@users.noreply.github.com> Date: Thu, 19 Sep 2019 08:23:20 -0700 Subject: [PATCH 06/34] Add support for 4 and 8 digit hex codes --- src/color.js | 11 ++++++++++- test/color-test.js | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/color.js b/src/color.js index 6f133b1..356f831 100644 --- a/src/color.js +++ b/src/color.js @@ -9,7 +9,9 @@ var reI = "\\s*([+-]?\\d+)\\s*", reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", reHex3 = /^#([0-9a-f]{3})$/, + reHex4 = /^#([0-9a-f]{4})$/, reHex6 = /^#([0-9a-f]{6})$/, + reHex8 = /^#([0-9a-f]{8})$/, reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), @@ -197,8 +199,10 @@ function color_formatRgb() { export default function color(format) { var m; format = (format + "").trim().toLowerCase(); - return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00 + return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00 + : (m = reHex4.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff)) // #f000 : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000 + : (m = reHex8.exec(format)) ? rgbn8(parseInt(m[1], 16)) // #ff000000 : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) @@ -214,6 +218,11 @@ function rgbn(n) { return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); } +function rgbn8(n) { + console.log(n); + return new Rgb(n >> 24 & 0xff, n >> 16 & 0xff, n >> 8 & 0xff, (n & 0xff) / 0xff); +} + function rgba(r, g, b, a) { if (a <= 0) r = g = b = NaN; return new Rgb(r, g, b, a); diff --git a/test/color-test.js b/test/color-test.js index a8e9825..c2251c4 100644 --- a/test/color-test.js +++ b/test/color-test.js @@ -26,6 +26,16 @@ tape("color(format) parses 3-digit hexadecimal (e.g., \"#abc\")", function(test) test.end(); }); +tape("color(format) parses 8-digit hexadecimal (e.g., \"#abcdef\")", function(test) { + test.rgbEqual(color.color("#abcdef33"), 171, 205, 239, 0.2); + test.end(); +}); + +tape("color(format) parses 4-digit hexadecimal (e.g., \"#abc\")", function(test) { + test.rgbEqual(color.color("#abc3"), 170, 187, 204, 0.2); + test.end(); +}); + tape("color(format) parses RGB integer format (e.g., \"rgb(12,34,56)\")", function(test) { test.rgbEqual(color.color("rgb(12,34,56)"), 12, 34, 56, 1); test.end(); @@ -157,7 +167,6 @@ tape("color(format) returns undefined RGB channel values for unknown formats", f test.equal(color.color("hasOwnProperty"), null); test.equal(color.color("__proto__"), null); test.equal(color.color("#ab"), null); - test.equal(color.color("#abcd"), null); test.end(); }); From 69f83822e1ff70e2b273dfb2f28df6bef7fa91b3 Mon Sep 17 00:00:00 2001 From: Tim Slatcher <933064+zerovox@users.noreply.github.com> Date: Thu, 19 Sep 2019 08:33:04 -0700 Subject: [PATCH 07/34] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f761f0..890e491 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ var steelblue = d3.rgb("steelblue"); # d3.color(specifier) [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") -Parses the specified [CSS Color Module Level 3](http://www.w3.org/TR/css3-color/#colorunits) *specifier* string, returning an [RGB](#rgb) or [HSL](#hsl) color. If the specifier was not valid, null is returned. Some examples: +Parses the specified [CSS Color Module Level 3](http://www.w3.org/TR/css3-color/#colorunits) *specifier* string, returning an [RGB](#rgb) or [HSL](#hsl) color, along with [CSS Color Module Level 4 hex](https://www.w3.org/TR/css-color-4/#hex-notation) *specifier* strings. If the specifier was not valid, null is returned. Some examples: * `rgb(255, 255, 255)` * `rgb(10%, 20%, 30%)` @@ -73,6 +73,8 @@ Parses the specified [CSS Color Module Level 3](http://www.w3.org/TR/css3-color/ * `hsla(120, 50%, 20%, 0.4)` * `#ffeeaa` * `#fea` +* `#ffeeaa22` +* `#fea2` * `steelblue` The list of supported [named colors](http://www.w3.org/TR/SVG/types.html#ColorKeywords) is specified by CSS. From 39f06c9c5b567251dfbb9235825a2cbbe2cfb095 Mon Sep 17 00:00:00 2001 From: Tim Slatcher <933064+zerovox@users.noreply.github.com> Date: Thu, 19 Sep 2019 08:37:35 -0700 Subject: [PATCH 08/34] clean up --- src/color.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/color.js b/src/color.js index 356f831..7638c32 100644 --- a/src/color.js +++ b/src/color.js @@ -219,7 +219,6 @@ function rgbn(n) { } function rgbn8(n) { - console.log(n); return new Rgb(n >> 24 & 0xff, n >> 16 & 0xff, n >> 8 & 0xff, (n & 0xff) / 0xff); } From 6d5e89c352c107c693adbdb889e1e3683926790c Mon Sep 17 00:00:00 2001 From: Tim Slatcher <933064+zerovox@users.noreply.github.com> Date: Thu, 19 Sep 2019 08:38:18 -0700 Subject: [PATCH 09/34] fix test name --- test/color-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/color-test.js b/test/color-test.js index c2251c4..99ed663 100644 --- a/test/color-test.js +++ b/test/color-test.js @@ -26,12 +26,12 @@ tape("color(format) parses 3-digit hexadecimal (e.g., \"#abc\")", function(test) test.end(); }); -tape("color(format) parses 8-digit hexadecimal (e.g., \"#abcdef\")", function(test) { +tape("color(format) parses 8-digit hexadecimal (e.g., \"#abcdef33\")", function(test) { test.rgbEqual(color.color("#abcdef33"), 171, 205, 239, 0.2); test.end(); }); -tape("color(format) parses 4-digit hexadecimal (e.g., \"#abc\")", function(test) { +tape("color(format) parses 4-digit hexadecimal (e.g., \"#abc3\")", function(test) { test.rgbEqual(color.color("#abc3"), 170, 187, 204, 0.2); test.end(); }); From fd380cdac37a29c928b11cf3d8483c7674e4b6a6 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 25 Sep 2019 13:25:22 -0700 Subject: [PATCH 10/34] Consolidate code. --- src/color.js | 20 +++++++------------- test/color-test.js | 5 +++++ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/color.js b/src/color.js index 7638c32..64fb70d 100644 --- a/src/color.js +++ b/src/color.js @@ -8,10 +8,7 @@ export var brighter = 1 / darker; var reI = "\\s*([+-]?\\d+)\\s*", reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", - reHex3 = /^#([0-9a-f]{3})$/, - reHex4 = /^#([0-9a-f]{4})$/, - reHex6 = /^#([0-9a-f]{6})$/, - reHex8 = /^#([0-9a-f]{8})$/, + reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), @@ -197,12 +194,13 @@ function color_formatRgb() { } export default function color(format) { - var m; + var m, l; format = (format + "").trim().toLowerCase(); - return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00 - : (m = reHex4.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff)) // #f000 - : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000 - : (m = reHex8.exec(format)) ? rgbn8(parseInt(m[1], 16)) // #ff000000 + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) @@ -218,10 +216,6 @@ function rgbn(n) { return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); } -function rgbn8(n) { - return new Rgb(n >> 24 & 0xff, n >> 16 & 0xff, n >> 8 & 0xff, (n & 0xff) / 0xff); -} - function rgba(r, g, b, a) { if (a <= 0) r = g = b = NaN; return new Rgb(r, g, b, a); diff --git a/test/color-test.js b/test/color-test.js index 99ed663..35580d1 100644 --- a/test/color-test.js +++ b/test/color-test.js @@ -26,6 +26,11 @@ tape("color(format) parses 3-digit hexadecimal (e.g., \"#abc\")", function(test) test.end(); }); +tape("color(format) does not parse 7-digit hexadecimal (e.g., \"#abcdef3\")", function(test) { + test.strictEqual(color.color("#abcdef3"), null); + test.end(); +}); + tape("color(format) parses 8-digit hexadecimal (e.g., \"#abcdef33\")", function(test) { test.rgbEqual(color.color("#abcdef33"), 171, 205, 239, 0.2); test.end(); From d0a60ee60f824d6d29ea8be0dfb1fc85e812a184 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 25 Sep 2019 13:27:10 -0700 Subject: [PATCH 11/34] Add sideEffects: false. Related d3/d3#3131. --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 53e8cd8..c8bedc1 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "prepublishOnly": "rm -rf dist && yarn test", "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js" }, + "sideEffects": false, "devDependencies": { "eslint": "6", "rollup": "1", From 0b12fa0d5906dddf34acfbdd2158b1d43953f285 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 25 Sep 2019 13:27:25 -0700 Subject: [PATCH 12/34] 1.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c8bedc1..9281ac0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "d3-color", - "version": "1.3.0", + "version": "1.4.0", "description": "Color spaces! RGB, HSL, Cubehelix, Lab and HCL (Lch).", "keywords": [ "d3", From acf4da14272ecc5049010dd5645ddd0dfc198734 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Nov 2019 08:23:37 +0000 Subject: [PATCH 13/34] Bump eslint-utils from 1.4.0 to 1.4.3 Bumps [eslint-utils](https://github.com/mysticatea/eslint-utils) from 1.4.0 to 1.4.3. - [Release notes](https://github.com/mysticatea/eslint-utils/releases) - [Commits](https://github.com/mysticatea/eslint-utils/compare/v1.4.0...v1.4.3) Signed-off-by: dependabot[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9990f59..79cda26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -245,16 +245,16 @@ eslint-scope@^5.0.0: estraverse "^4.1.1" eslint-utils@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.0.tgz#e2c3c8dba768425f897cf0f9e51fe2e241485d4c" - integrity sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ== + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: - eslint-visitor-keys "^1.0.0" + eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== eslint@6: version "6.1.0" From df603789b0907a4bf9041cdf19acb45eb70efa58 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 9 Mar 2020 17:54:46 -0700 Subject: [PATCH 14/34] Add link to d3-hsluv. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 890e491..f6d79b2 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ For additional color spaces, see: * [d3-cam02](https://github.com/connorgr/d3-cam02) * [d3-hsv](https://github.com/d3/d3-hsv) * [d3-hcg](https://github.com/d3/d3-hcg) +* [d3-hsluv](https://github.com/petulla/d3-hsluv) ## Installing From f176ff11d69195a06dc478bd80c33d26411bf3c7 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 20 Apr 2020 10:36:25 -0700 Subject: [PATCH 15/34] Fix hexadecimal transparent colors. --- src/color.js | 4 ++-- test/color-test.js | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/color.js b/src/color.js index 64fb70d..036d9f4 100644 --- a/src/color.js +++ b/src/color.js @@ -198,8 +198,8 @@ export default function color(format) { format = (format + "").trim().toLowerCase(); return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 - : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 - : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 : null) // invalid hex : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) diff --git a/test/color-test.js b/test/color-test.js index 35580d1..2c44313 100644 --- a/test/color-test.js +++ b/test/color-test.js @@ -146,6 +146,13 @@ tape("color(format) does not allow made-up names", function(test) { test.end(); }); +tape("color(format) allows achromatic colors", function(test) { + test.rgbEqual(color.color("rgba(0,0,0,0)"), NaN, NaN, NaN, 0); + test.rgbEqual(color.color("#0000"), NaN, NaN, NaN, 0); + test.rgbEqual(color.color("#00000000"), NaN, NaN, NaN, 0); + test.end(); +}); + tape("color(format) does not allow whitespace before open paren or percent sign", function(test) { test.equal(color.color("rgb (120,30,50)"), null); test.equal(color.color("rgb (12%,30%,50%)"), null); From e87dc62c4bd4641534e81d8b0a42e472ab88156d Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 20 Apr 2020 10:39:53 -0700 Subject: [PATCH 16/34] 1.4.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9281ac0..3889496 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "d3-color", - "version": "1.4.0", + "version": "1.4.1", "description": "Color spaces! RGB, HSL, Cubehelix, Lab and HCL (Lch).", "keywords": [ "d3", From 693572be4c654b9e38eeb94ab6cbdb65a609e3cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Tue, 2 Jun 2020 16:17:14 +0200 Subject: [PATCH 17/34] deliberate ES6 syntax (rationale: don't let people install @2 in a build system that will not alert them that we have moved to ES6, only to cause trouble with a later release.) --- src/lab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lab.js b/src/lab.js index b27196e..02545c4 100644 --- a/src/lab.js +++ b/src/lab.js @@ -3,7 +3,7 @@ import {Color, rgbConvert, Rgb} from "./color.js"; import {deg2rad, rad2deg} from "./math.js"; // https://observablehq.com/@mbostock/lab-and-rgb -var K = 18, +const K = 18, Xn = 0.96422, Yn = 1, Zn = 0.82521, From c1b93f1bcb27945403aceac36bc64648d8a2b8a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Tue, 2 Jun 2020 16:21:34 +0200 Subject: [PATCH 18/34] normalize "degrees" and "radians" for deg2rad conversions --- src/cubehelix.js | 6 +++--- src/lab.js | 6 +++--- src/math.js | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cubehelix.js b/src/cubehelix.js index bc31659..83536dd 100644 --- a/src/cubehelix.js +++ b/src/cubehelix.js @@ -1,6 +1,6 @@ import define, {extend} from "./define.js"; import {Color, rgbConvert, Rgb, darker, brighter} from "./color.js"; -import {deg2rad, rad2deg} from "./math.js"; +import {degrees, radians} from "./math.js"; var A = -0.14861, B = +1.78277, @@ -21,7 +21,7 @@ function cubehelixConvert(o) { bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 - h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + h = s ? Math.atan2(k, bl) * degrees - 120 : NaN; return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); } @@ -46,7 +46,7 @@ define(Cubehelix, cubehelix, extend(Color, { return new Cubehelix(this.h, this.s, this.l * k, this.opacity); }, rgb: function() { - var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh = Math.cos(h), diff --git a/src/lab.js b/src/lab.js index 02545c4..645e1a5 100644 --- a/src/lab.js +++ b/src/lab.js @@ -1,6 +1,6 @@ import define, {extend} from "./define.js"; import {Color, rgbConvert, Rgb} from "./color.js"; -import {deg2rad, rad2deg} from "./math.js"; +import {degrees, radians} from "./math.js"; // https://observablehq.com/@mbostock/lab-and-rgb const K = 18, @@ -85,7 +85,7 @@ function hclConvert(o) { if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); if (!(o instanceof Lab)) o = labConvert(o); if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); - var h = Math.atan2(o.b, o.a) * rad2deg; + var h = Math.atan2(o.b, o.a) * degrees; return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); } @@ -106,7 +106,7 @@ export function Hcl(h, c, l, opacity) { function hcl2lab(o) { if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); - var h = o.h * deg2rad; + var h = o.h * radians; return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); } diff --git a/src/math.js b/src/math.js index e94b840..66b172e 100644 --- a/src/math.js +++ b/src/math.js @@ -1,2 +1,2 @@ -export var deg2rad = Math.PI / 180; -export var rad2deg = 180 / Math.PI; +export const radians = Math.PI / 180; +export const degrees = 180 / Math.PI; From d86e36ba1631b78c5bea2bb091d8fd3db8418b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Tue, 2 Jun 2020 16:45:29 +0200 Subject: [PATCH 19/34] link to https://d3js.org/d3-color.v2.min.js --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f6d79b2..386d4dc 100644 --- a/README.md +++ b/README.md @@ -47,10 +47,10 @@ For additional color spaces, see: ## Installing -If you use NPM, `npm install d3-color`. Otherwise, download the [latest release](https://github.com/d3/d3-color/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-color.v1.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: +If you use NPM, `npm install d3-color`. Otherwise, download the [latest release](https://github.com/d3/d3-color/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-color.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: ```html - + + +``` + +For legacy environments, you can load d3-color’s UMD bundle from an npm-based CDN such as jsDelivr; a `d3` global is exported: + +```html + ``` diff --git a/d3-color.sublime-project b/d3-color.sublime-project deleted file mode 100644 index 772dfa5..0000000 --- a/d3-color.sublime-project +++ /dev/null @@ -1,17 +0,0 @@ -{ - "folders": [ - { - "path": ".", - "file_exclude_patterns": ["*.sublime-workspace"], - "folder_exclude_patterns": ["dist"] - } - ], - "build_systems": [ - { - "name": "yarn test", - "cmd": ["yarn", "test"], - "file_regex": "\\((...*?):([0-9]*):([0-9]*)\\)", - "working_dir": "$project_path" - } - ] -} diff --git a/package.json b/package.json index dbfb8bd..c9ff4ea 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,11 @@ "name": "d3-color", "version": "2.0.0", "description": "Color spaces! RGB, HSL, Cubehelix, Lab and HCL (Lch).", + "homepage": "https://d3js.org/d3-color/", + "repository": { + "type": "git", + "url": "https://github.com/d3/d3-color.git" + }, "keywords": [ "d3", "d3-module", @@ -13,35 +18,37 @@ "lch", "cubehelix" ], - "homepage": "https://d3js.org/d3-color/", - "license": "BSD-3-Clause", + "license": "ISC", "author": { "name": "Mike Bostock", "url": "http://bost.ocks.org/mike" }, - "main": "dist/d3-color.js", - "unpkg": "dist/d3-color.min.js", - "jsdelivr": "dist/d3-color.min.js", - "module": "src/index.js", - "repository": { - "type": "git", - "url": "https://github.com/d3/d3-color.git" - }, + "type": "module", "files": [ "dist/**/*.js", "src/**/*.js" ], - "scripts": { - "pretest": "rollup -c", - "test": "tape 'test/**/*-test.js' && eslint src test", - "prepublishOnly": "rm -rf dist && yarn test", - "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js" + "module": "src/index.js", + "main": "src/index.js", + "jsdelivr": "dist/d3-color.min.js", + "unpkg": "dist/d3-color.min.js", + "exports": { + "umd": "./dist/d3-color.min.js", + "default": "./src/index.js" }, "sideEffects": false, "devDependencies": { - "eslint": "6", - "rollup": "1", - "rollup-plugin-terser": "5", - "tape": "4" + "eslint": "7", + "mocha": "8", + "rollup": "2", + "rollup-plugin-terser": "7" + }, + "scripts": { + "test": "mocha 'test/**/*-test.js' && eslint src test", + "prepublishOnly": "rm -rf dist && yarn test && rollup -c", + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd -" + }, + "engines": { + "node": ">=12" } } diff --git a/test/.eslintrc.json b/test/.eslintrc.json new file mode 100644 index 0000000..d5fdab6 --- /dev/null +++ b/test/.eslintrc.json @@ -0,0 +1,13 @@ +{ + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 8 + }, + "rules": { + "no-cond-assign": 0 + }, + "env": { + "mocha": true + } +} diff --git a/test/asserts.js b/test/asserts.js new file mode 100644 index 0000000..e769b59 --- /dev/null +++ b/test/asserts.js @@ -0,0 +1,46 @@ +import assert from "assert"; +import {hcl, hsl, lab, rgb} from "../src/index.js"; + +export function assertRgbEqual(actual, r, g, b, opacity) { + assert(actual instanceof rgb + && (isNaN(r) ? isNaN(actual.r) && actual.r !== actual.r : actual.r === r) + && (isNaN(g) ? isNaN(actual.g) && actual.g !== actual.g : actual.g === g) + && (isNaN(b) ? isNaN(actual.b) && actual.b !== actual.b : actual.b === b) + && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity) + ); +} + +export function assertRgbApproxEqual(actual, r, g, b, opacity) { + assert(actual instanceof rgb + && (isNaN(r) ? isNaN(actual.r) && actual.r !== actual.r : Math.round(actual.r) === Math.round(r)) + && (isNaN(g) ? isNaN(actual.g) && actual.g !== actual.g : Math.round(actual.g) === Math.round(g)) + && (isNaN(b) ? isNaN(actual.b) && actual.b !== actual.b : Math.round(actual.b) === Math.round(b)) + && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity) + ); +} +export function assertHclEqual(actual, h, c, l, opacity) { + assert(actual instanceof hcl + && (isNaN(h) ? isNaN(actual.h) && actual.h !== actual.h : h - 1e-6 <= actual.h && actual.h <= h + 1e-6) + && (isNaN(c) ? isNaN(actual.c) && actual.c !== actual.c : c - 1e-6 <= actual.c && actual.c <= c + 1e-6) + && (isNaN(l) ? isNaN(actual.l) && actual.l !== actual.l : l - 1e-6 <= actual.l && actual.l <= l + 1e-6) + && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity) + ); +} + +export function assertHslEqual(actual, h, s, l, opacity) { + assert(actual instanceof hsl + && (isNaN(h) ? isNaN(actual.h) && actual.h !== actual.h : h - 1e-6 <= actual.h && actual.h <= h + 1e-6) + && (isNaN(s) ? isNaN(actual.s) && actual.s !== actual.s : s - 1e-6 <= actual.s && actual.s <= s + 1e-6) + && (isNaN(l) ? isNaN(actual.l) && actual.l !== actual.l : l - 1e-6 <= actual.l && actual.l <= l + 1e-6) + && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity) + ); +} + +export function assertLabEqual(actual, l, a, b, opacity) { + assert(actual instanceof lab + && (isNaN(l) ? isNaN(actual.l) && actual.l !== actual.l : l - 1e-6 <= actual.l && actual.l <= l + 1e-6) + && (isNaN(a) ? isNaN(actual.a) && actual.a !== actual.a : a - 1e-6 <= actual.a && actual.a <= a + 1e-6) + && (isNaN(b) ? isNaN(actual.b) && actual.b !== actual.b : b - 1e-6 <= actual.b && actual.b <= b + 1e-6) + && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity) + ); +} diff --git a/test/color-test.js b/test/color-test.js index 2c44313..3282877 100644 --- a/test/color-test.js +++ b/test/color-test.js @@ -1,188 +1,160 @@ -var tape = require("tape"), - color = require("../"); +import assert from "assert"; +import {color} from "../src/index.js"; +import {assertHslEqual, assertRgbApproxEqual, assertRgbEqual} from "./asserts.js"; -require("./rgbEqual"); -require("./hslEqual"); +it("color(format) parses CSS color names (e.g., \"rebeccapurple\")", () => { + assertRgbApproxEqual(color("moccasin"), 255, 228, 181, 1); + assertRgbApproxEqual(color("aliceblue"), 240, 248, 255, 1); + assertRgbApproxEqual(color("yellow"), 255, 255, 0, 1); + assertRgbApproxEqual(color("moccasin"), 255, 228, 181, 1); + assertRgbApproxEqual(color("aliceblue"), 240, 248, 255, 1); + assertRgbApproxEqual(color("yellow"), 255, 255, 0, 1); + assertRgbApproxEqual(color("rebeccapurple"), 102, 51, 153, 1); + assertRgbApproxEqual(color("transparent"), NaN, NaN, NaN, 0); +}); -tape("color(format) parses CSS color names (e.g., \"rebeccapurple\")", function(test) { - test.rgbEqual(color.color("moccasin"), 255, 228, 181, 1); - test.rgbEqual(color.color("aliceblue"), 240, 248, 255, 1); - test.rgbEqual(color.color("yellow"), 255, 255, 0, 1); - test.rgbEqual(color.color("moccasin"), 255, 228, 181, 1); - test.rgbEqual(color.color("aliceblue"), 240, 248, 255, 1); - test.rgbEqual(color.color("yellow"), 255, 255, 0, 1); - test.rgbEqual(color.color("rebeccapurple"), 102, 51, 153, 1); - test.rgbEqual(color.color("transparent"), NaN, NaN, NaN, 0); - test.end(); +it("color(format) parses 6-digit hexadecimal (e.g., \"#abcdef\")", () => { + assertRgbApproxEqual(color("#abcdef"), 171, 205, 239, 1); }); -tape("color(format) parses 6-digit hexadecimal (e.g., \"#abcdef\")", function(test) { - test.rgbEqual(color.color("#abcdef"), 171, 205, 239, 1); - test.end(); +it("color(format) parses 3-digit hexadecimal (e.g., \"#abc\")", () => { + assertRgbApproxEqual(color("#abc"), 170, 187, 204, 1); }); -tape("color(format) parses 3-digit hexadecimal (e.g., \"#abc\")", function(test) { - test.rgbEqual(color.color("#abc"), 170, 187, 204, 1); - test.end(); +it("color(format) does not parse 7-digit hexadecimal (e.g., \"#abcdef3\")", () => { + assert.strictEqual(color("#abcdef3"), null); }); -tape("color(format) does not parse 7-digit hexadecimal (e.g., \"#abcdef3\")", function(test) { - test.strictEqual(color.color("#abcdef3"), null); - test.end(); +it("color(format) parses 8-digit hexadecimal (e.g., \"#abcdef33\")", () => { + assertRgbApproxEqual(color("#abcdef33"), 171, 205, 239, 0.2); }); -tape("color(format) parses 8-digit hexadecimal (e.g., \"#abcdef33\")", function(test) { - test.rgbEqual(color.color("#abcdef33"), 171, 205, 239, 0.2); - test.end(); +it("color(format) parses 4-digit hexadecimal (e.g., \"#abc3\")", () => { + assertRgbApproxEqual(color("#abc3"), 170, 187, 204, 0.2); }); -tape("color(format) parses 4-digit hexadecimal (e.g., \"#abc3\")", function(test) { - test.rgbEqual(color.color("#abc3"), 170, 187, 204, 0.2); - test.end(); +it("color(format) parses RGB integer format (e.g., \"rgb(12,34,56)\")", () => { + assertRgbApproxEqual(color("rgb(12,34,56)"), 12, 34, 56, 1); }); -tape("color(format) parses RGB integer format (e.g., \"rgb(12,34,56)\")", function(test) { - test.rgbEqual(color.color("rgb(12,34,56)"), 12, 34, 56, 1); - test.end(); +it("color(format) parses RGBA integer format (e.g., \"rgba(12,34,56,0.4)\")", () => { + assertRgbApproxEqual(color("rgba(12,34,56,0.4)"), 12, 34, 56, 0.4); }); -tape("color(format) parses RGBA integer format (e.g., \"rgba(12,34,56,0.4)\")", function(test) { - test.rgbEqual(color.color("rgba(12,34,56,0.4)"), 12, 34, 56, 0.4); - test.end(); +it("color(format) parses RGB percentage format (e.g., \"rgb(12%,34%,56%)\")", () => { + assertRgbApproxEqual(color("rgb(12%,34%,56%)"), 31, 87, 143, 1); + assertRgbEqual(color("rgb(100%,100%,100%)"), 255, 255, 255, 1); }); -tape("color(format) parses RGB percentage format (e.g., \"rgb(12%,34%,56%)\")", function(test) { - test.rgbEqual(color.color("rgb(12%,34%,56%)"), 31, 87, 143, 1); - test.rgbStrictEqual(color.color("rgb(100%,100%,100%)"), 255, 255, 255, 1); - test.end(); +it("color(format) parses RGBA percentage format (e.g., \"rgba(12%,34%,56%,0.4)\")", () => { + assertRgbApproxEqual(color("rgba(12%,34%,56%,0.4)"), 31, 87, 143, 0.4); + assertRgbEqual(color("rgba(100%,100%,100%,0.4)"), 255, 255, 255, 0.4); }); -tape("color(format) parses RGBA percentage format (e.g., \"rgba(12%,34%,56%,0.4)\")", function(test) { - test.rgbEqual(color.color("rgba(12%,34%,56%,0.4)"), 31, 87, 143, 0.4); - test.rgbStrictEqual(color.color("rgba(100%,100%,100%,0.4)"), 255, 255, 255, 0.4); - test.end(); +it("color(format) parses HSL format (e.g., \"hsl(60,100%,20%)\")", () => { + assertHslEqual(color("hsl(60,100%,20%)"), 60, 1, 0.2, 1); }); -tape("color(format) parses HSL format (e.g., \"hsl(60,100%,20%)\")", function(test) { - test.hslEqual(color.color("hsl(60,100%,20%)"), 60, 1, 0.2, 1); - test.end(); +it("color(format) parses HSLA format (e.g., \"hsla(60,100%,20%,0.4)\")", () => { + assertHslEqual(color("hsla(60,100%,20%,0.4)"), 60, 1, 0.2, 0.4); }); -tape("color(format) parses HSLA format (e.g., \"hsla(60,100%,20%,0.4)\")", function(test) { - test.hslEqual(color.color("hsla(60,100%,20%,0.4)"), 60, 1, 0.2, 0.4); - test.end(); +it("color(format) ignores leading and trailing whitespace", () => { + assertRgbApproxEqual(color(" aliceblue\t\n"), 240, 248, 255, 1); + assertRgbApproxEqual(color(" #abc\t\n"), 170, 187, 204, 1); + assertRgbApproxEqual(color(" #aabbcc\t\n"), 170, 187, 204, 1); + assertRgbApproxEqual(color(" rgb(120,30,50)\t\n"), 120, 30, 50, 1); + assertHslEqual(color(" hsl(120,30%,50%)\t\n"), 120, 0.3, 0.5, 1); }); -tape("color(format) ignores leading and trailing whitespace", function(test) { - test.rgbEqual(color.color(" aliceblue\t\n"), 240, 248, 255, 1); - test.rgbEqual(color.color(" #abc\t\n"), 170, 187, 204, 1); - test.rgbEqual(color.color(" #aabbcc\t\n"), 170, 187, 204, 1); - test.rgbEqual(color.color(" rgb(120,30,50)\t\n"), 120, 30, 50, 1); - test.hslEqual(color.color(" hsl(120,30%,50%)\t\n"), 120, 0.3, 0.5, 1); - test.end(); +it("color(format) ignores whitespace between numbers", () => { + assertRgbApproxEqual(color(" rgb( 120 , 30 , 50 ) "), 120, 30, 50, 1); + assertHslEqual(color(" hsl( 120 , 30% , 50% ) "), 120, 0.3, 0.5, 1); + assertRgbApproxEqual(color(" rgba( 12 , 34 , 56 , 0.4 ) "), 12, 34, 56, 0.4); + assertRgbApproxEqual(color(" rgba( 12% , 34% , 56% , 0.4 ) "), 31, 87, 143, 0.4); + assertHslEqual(color(" hsla( 60 , 100% , 20% , 0.4 ) "), 60, 1, 0.2, 0.4); }); -tape("color(format) ignores whitespace between numbers", function(test) { - test.rgbEqual(color.color(" rgb( 120 , 30 , 50 ) "), 120, 30, 50, 1); - test.hslEqual(color.color(" hsl( 120 , 30% , 50% ) "), 120, 0.3, 0.5, 1); - test.rgbEqual(color.color(" rgba( 12 , 34 , 56 , 0.4 ) "), 12, 34, 56, 0.4); - test.rgbEqual(color.color(" rgba( 12% , 34% , 56% , 0.4 ) "), 31, 87, 143, 0.4); - test.hslEqual(color.color(" hsla( 60 , 100% , 20% , 0.4 ) "), 60, 1, 0.2, 0.4); - test.end(); +it("color(format) allows number signs", () => { + assertRgbApproxEqual(color("rgb(+120,+30,+50)"), 120, 30, 50, 1); + assertHslEqual(color("hsl(+120,+30%,+50%)"), 120, 0.3, 0.5, 1); + assertRgbApproxEqual(color("rgb(-120,-30,-50)"), -120, -30, -50, 1); + assertHslEqual(color("hsl(-120,-30%,-50%)"), NaN, NaN, -0.5, 1); + assertRgbApproxEqual(color("rgba(12,34,56,+0.4)"), 12, 34, 56, 0.4); + assertRgbApproxEqual(color("rgba(12,34,56,-0.4)"), NaN, NaN, NaN, -0.4); + assertRgbApproxEqual(color("rgba(12%,34%,56%,+0.4)"), 31, 87, 143, 0.4); + assertRgbApproxEqual(color("rgba(12%,34%,56%,-0.4)"), NaN, NaN, NaN, -0.4); + assertHslEqual(color("hsla(60,100%,20%,+0.4)"), 60, 1, 0.2, 0.4); + assertHslEqual(color("hsla(60,100%,20%,-0.4)"), NaN, NaN, NaN, -0.4); }); -tape("color(format) allows number signs", function(test) { - test.rgbEqual(color.color("rgb(+120,+30,+50)"), 120, 30, 50, 1); - test.hslEqual(color.color("hsl(+120,+30%,+50%)"), 120, 0.3, 0.5, 1); - test.rgbEqual(color.color("rgb(-120,-30,-50)"), -120, -30, -50, 1); - test.hslEqual(color.color("hsl(-120,-30%,-50%)"), NaN, NaN, -0.5, 1); - test.rgbEqual(color.color("rgba(12,34,56,+0.4)"), 12, 34, 56, 0.4); - test.rgbEqual(color.color("rgba(12,34,56,-0.4)"), NaN, NaN, NaN, -0.4); - test.rgbEqual(color.color("rgba(12%,34%,56%,+0.4)"), 31, 87, 143, 0.4); - test.rgbEqual(color.color("rgba(12%,34%,56%,-0.4)"), NaN, NaN, NaN, -0.4); - test.hslEqual(color.color("hsla(60,100%,20%,+0.4)"), 60, 1, 0.2, 0.4); - test.hslEqual(color.color("hsla(60,100%,20%,-0.4)"), NaN, NaN, NaN, -0.4); - test.end(); +it("color(format) allows decimals for non-integer values", () => { + assertRgbApproxEqual(color("rgb(20.0%,30.4%,51.2%)"), 51, 78, 131, 1); + assertHslEqual(color("hsl(20.0,30.4%,51.2%)"), 20, 0.304, 0.512, 1); }); -tape("color(format) allows decimals for non-integer values", function(test) { - test.rgbEqual(color.color("rgb(20.0%,30.4%,51.2%)"), 51, 78, 131, 1); - test.hslEqual(color.color("hsl(20.0,30.4%,51.2%)"), 20, 0.304, 0.512, 1); - test.end(); +it("color(format) allows leading decimal for hue, opacity and percentages", () => { + assertHslEqual(color("hsl(.9,.3%,.5%)"), 0.9, 0.003, 0.005, 1); + assertHslEqual(color("hsla(.9,.3%,.5%,.5)"), 0.9, 0.003, 0.005, 0.5); + assertRgbApproxEqual(color("rgb(.1%,.2%,.3%)"), 0, 1, 1, 1); + assertRgbApproxEqual(color("rgba(120,30,50,.5)"), 120, 30, 50, 0.5); }); -tape("color(format) allows leading decimal for hue, opacity and percentages", function(test) { - test.hslEqual(color.color("hsl(.9,.3%,.5%)"), 0.9, 0.003, 0.005, 1); - test.hslEqual(color.color("hsla(.9,.3%,.5%,.5)"), 0.9, 0.003, 0.005, 0.5); - test.rgbEqual(color.color("rgb(.1%,.2%,.3%)"), 0, 1, 1, 1); - test.rgbEqual(color.color("rgba(120,30,50,.5)"), 120, 30, 50, 0.5); - test.end(); +it("color(format) allows exponential format for hue, opacity and percentages", () => { + assertHslEqual(color("hsl(1e1,2e1%,3e1%)"), 10, 0.2, 0.3, 1); + assertHslEqual(color("hsla(9e-1,3e-1%,5e-1%,5e-1)"), 0.9, 0.003, 0.005, 0.5); + assertRgbApproxEqual(color("rgb(1e-1%,2e-1%,3e-1%)"), 0, 1, 1, 1); + assertRgbApproxEqual(color("rgba(120,30,50,1e-1)"), 120, 30, 50, 0.1); }); -tape("color(format) allows exponential format for hue, opacity and percentages", function(test) { - test.hslEqual(color.color("hsl(1e1,2e1%,3e1%)"), 10, 0.2, 0.3, 1); - test.hslEqual(color.color("hsla(9e-1,3e-1%,5e-1%,5e-1)"), 0.9, 0.003, 0.005, 0.5); - test.rgbEqual(color.color("rgb(1e-1%,2e-1%,3e-1%)"), 0, 1, 1, 1); - test.rgbEqual(color.color("rgba(120,30,50,1e-1)"), 120, 30, 50, 0.1); - test.end(); +it("color(format) does not allow decimals for integer values", () => { + assert.strictEqual(color("rgb(120.5,30,50)"), null); }); -tape("color(format) does not allow decimals for integer values", function(test) { - test.equal(color.color("rgb(120.5,30,50)"), null); - test.end(); +it("color(format) does not allow empty decimals", () => { + assert.strictEqual(color("rgb(120.,30,50)"), null); + assert.strictEqual(color("rgb(120.%,30%,50%)"), null); + assert.strictEqual(color("rgba(120,30,50,1.)"), null); + assert.strictEqual(color("rgba(12%,30%,50%,1.)"), null); + assert.strictEqual(color("hsla(60,100%,20%,1.)"), null); }); -tape("color(format) does not allow empty decimals", function(test) { - test.equal(color.color("rgb(120.,30,50)"), null); - test.equal(color.color("rgb(120.%,30%,50%)"), null); - test.equal(color.color("rgba(120,30,50,1.)"), null); - test.equal(color.color("rgba(12%,30%,50%,1.)"), null); - test.equal(color.color("hsla(60,100%,20%,1.)"), null); - test.end(); +it("color(format) does not allow made-up names", () => { + assert.strictEqual(color("bostock"), null); }); -tape("color(format) does not allow made-up names", function(test) { - test.equal(color.color("bostock"), null); - test.end(); +it("color(format) allows achromatic colors", () => { + assertRgbApproxEqual(color("rgba(0,0,0,0)"), NaN, NaN, NaN, 0); + assertRgbApproxEqual(color("#0000"), NaN, NaN, NaN, 0); + assertRgbApproxEqual(color("#00000000"), NaN, NaN, NaN, 0); }); -tape("color(format) allows achromatic colors", function(test) { - test.rgbEqual(color.color("rgba(0,0,0,0)"), NaN, NaN, NaN, 0); - test.rgbEqual(color.color("#0000"), NaN, NaN, NaN, 0); - test.rgbEqual(color.color("#00000000"), NaN, NaN, NaN, 0); - test.end(); +it("color(format) does not allow whitespace before open paren or percent sign", () => { + assert.strictEqual(color("rgb (120,30,50)"), null); + assert.strictEqual(color("rgb (12%,30%,50%)"), null); + assert.strictEqual(color("hsl (120,30%,50%)"), null); + assert.strictEqual(color("hsl(120,30 %,50%)"), null); + assert.strictEqual(color("rgba (120,30,50,1)"), null); + assert.strictEqual(color("rgba (12%,30%,50%,1)"), null); + assert.strictEqual(color("hsla (120,30%,50%,1)"), null); }); -tape("color(format) does not allow whitespace before open paren or percent sign", function(test) { - test.equal(color.color("rgb (120,30,50)"), null); - test.equal(color.color("rgb (12%,30%,50%)"), null); - test.equal(color.color("hsl (120,30%,50%)"), null); - test.equal(color.color("hsl(120,30 %,50%)"), null); - test.equal(color.color("rgba (120,30,50,1)"), null); - test.equal(color.color("rgba (12%,30%,50%,1)"), null); - test.equal(color.color("hsla (120,30%,50%,1)"), null); - test.end(); +it("color(format) is case-insensitive", () => { + assertRgbApproxEqual(color("aLiCeBlUE"), 240, 248, 255, 1); + assertRgbApproxEqual(color("transPARENT"), NaN, NaN, NaN, 0); + assertRgbApproxEqual(color(" #aBc\t\n"), 170, 187, 204, 1); + assertRgbApproxEqual(color(" #aaBBCC\t\n"), 170, 187, 204, 1); + assertRgbApproxEqual(color(" rGB(120,30,50)\t\n"), 120, 30, 50, 1); + assertHslEqual(color(" HSl(120,30%,50%)\t\n"), 120, 0.3, 0.5, 1); }); -tape("color(format) is case-insensitive", function(test) { - test.rgbEqual(color.color("aLiCeBlUE"), 240, 248, 255, 1); - test.rgbEqual(color.color("transPARENT"), NaN, NaN, NaN, 0); - test.rgbEqual(color.color(" #aBc\t\n"), 170, 187, 204, 1); - test.rgbEqual(color.color(" #aaBBCC\t\n"), 170, 187, 204, 1); - test.rgbEqual(color.color(" rGB(120,30,50)\t\n"), 120, 30, 50, 1); - test.hslEqual(color.color(" HSl(120,30%,50%)\t\n"), 120, 0.3, 0.5, 1); - test.end(); -}); - -tape("color(format) returns undefined RGB channel values for unknown formats", function(test) { - test.equal(color.color("invalid"), null); - test.equal(color.color("hasOwnProperty"), null); - test.equal(color.color("__proto__"), null); - test.equal(color.color("#ab"), null); - test.end(); +it("color(format) returns undefined RGB channel values for unknown formats", () => { + assert.strictEqual(color("invalid"), null); + assert.strictEqual(color("hasOwnProperty"), null); + assert.strictEqual(color("__proto__"), null); + assert.strictEqual(color("#ab"), null); }); - -tape("color(format).hex() returns a hexadecimal string", function(test) { - test.equal(color.color("rgba(12%,34%,56%,0.4)").hex(), "#1f578f"); - test.end(); + +it("color(format).hex() returns a hexadecimal string", () => { + assert.strictEqual(color("rgba(12%,34%,56%,0.4)").hex(), "#1f578f"); }); diff --git a/test/cubehelix-test.js b/test/cubehelix-test.js index 849b2be..adb3991 100644 --- a/test/cubehelix-test.js +++ b/test/cubehelix-test.js @@ -1,9 +1,8 @@ -var tape = require("tape"), - color = require("../"); +import assert from "assert"; +import {color, cubehelix} from "../src/index.js"; -tape("cubehelix(…) returns an instance of cubehelix and color", function(test) { - var c = color.cubehelix("steelblue"); - test.ok(c instanceof color.cubehelix); - test.ok(c instanceof color.color); - test.end(); +it("cubehelix(…) returns an instance of cubehelix and color", () => { + const c = cubehelix("steelblue"); + assert(c instanceof cubehelix); + assert(c instanceof color); }); diff --git a/test/gray-test.js b/test/gray-test.js index e5fee13..983c9db 100644 --- a/test/gray-test.js +++ b/test/gray-test.js @@ -1,12 +1,9 @@ -var tape = require("tape"), - color = require("../"); +import {assertLabEqual} from "./asserts.js"; +import {gray} from "../src/index.js"; -require("./labEqual"); - -tape("gray(l[, opacity]) is an alias for lab(l, 0, 0[, opacity])", function(test) { - test.labEqual(color.gray(120), 120, 0, 0, 1); - test.labEqual(color.gray(120, 0.5), 120, 0, 0, 0.5); - test.labEqual(color.gray(120, null), 120, 0, 0, 1); - test.labEqual(color.gray(120, undefined), 120, 0, 0, 1); - test.end(); +it("gray(l[, opacity]) is an alias for lab(l, 0, 0[, opacity])", () => { + assertLabEqual(gray(120), 120, 0, 0, 1); + assertLabEqual(gray(120, 0.5), 120, 0, 0, 0.5); + assertLabEqual(gray(120, null), 120, 0, 0, 1); + assertLabEqual(gray(120, undefined), 120, 0, 0, 1); }); diff --git a/test/hcl-test.js b/test/hcl-test.js index dfb464c..2c75025 100644 --- a/test/hcl-test.js +++ b/test/hcl-test.js @@ -1,247 +1,214 @@ -var tape = require("tape"), - color = require("../"); +import assert from "assert"; +import {assertHclEqual, assertRgbApproxEqual} from "./asserts.js"; +import {color, hcl, hsl, lab, rgb} from "../src/index.js"; -require("./hclEqual"); -require("./rgbEqual"); - -tape("hcl(…) returns an instance of hcl and color", function(test) { - var c = color.hcl(120, 40, 50); - test.ok(c instanceof color.hcl); - test.ok(c instanceof color.color); - test.end(); +it("hcl(…) returns an instance of hcl and color", () => { + const c = hcl(120, 40, 50); + assert(c instanceof hcl); + assert(c instanceof color); }); -tape("hcl(…) exposes h, c, and l channel values", function(test) { - test.hclEqual(color.hcl("#abc"), 252.37145234745182, 11.223567114593477, 74.96879980931759, 1); - test.end(); +it("hcl(…) exposes h, c, and l channel values", () => { + assertHclEqual(hcl("#abc"), 252.37145234745182, 11.223567114593477, 74.96879980931759, 1); }); -tape("hcl(…) returns defined hue and undefined chroma for black and white", function(test) { - test.hclEqual(color.hcl("black"), NaN, NaN, 0, 1); - test.hclEqual(color.hcl("#000"), NaN, NaN, 0, 1); - test.hclEqual(color.hcl(color.lab("#000")), NaN, NaN, 0, 1); - test.hclEqual(color.hcl("white"), NaN, NaN, 100, 1); - test.hclEqual(color.hcl("#fff"), NaN, NaN, 100, 1); - test.hclEqual(color.hcl(color.lab("#fff")), NaN, NaN, 100, 1); - test.end(); +it("hcl(…) returns defined hue and undefined chroma for black and white", () => { + assertHclEqual(hcl("black"), NaN, NaN, 0, 1); + assertHclEqual(hcl("#000"), NaN, NaN, 0, 1); + assertHclEqual(hcl(lab("#000")), NaN, NaN, 0, 1); + assertHclEqual(hcl("white"), NaN, NaN, 100, 1); + assertHclEqual(hcl("#fff"), NaN, NaN, 100, 1); + assertHclEqual(hcl(lab("#fff")), NaN, NaN, 100, 1); }); -tape("hcl(…) returns undefined hue and zero chroma for gray", function(test) { - test.hclEqual(color.hcl("gray"), NaN, 0, 53.585013, 1); - test.hclEqual(color.hcl(color.lab("gray")), NaN, 0, 53.585013, 1); - test.end(); +it("hcl(…) returns undefined hue and zero chroma for gray", () => { + assertHclEqual(hcl("gray"), NaN, 0, 53.585013, 1); + assertHclEqual(hcl(lab("gray")), NaN, 0, 53.585013, 1); }); -tape("hcl.toString() converts to RGB and formats as hexadecimal", function(test) { - test.equal(color.hcl("#abcdef") + "", "rgb(171, 205, 239)"); - test.equal(color.hcl("moccasin") + "", "rgb(255, 228, 181)"); - test.equal(color.hcl("hsl(60, 100%, 20%)") + "", "rgb(102, 102, 0)"); - test.equal(color.hcl("rgb(12, 34, 56)") + "", "rgb(12, 34, 56)"); - test.equal(color.hcl(color.rgb(12, 34, 56)) + "", "rgb(12, 34, 56)"); - test.equal(color.hcl(color.hsl(60, 1, 0.2)) + "", "rgb(102, 102, 0)"); - test.end(); +it("hcl.toString() converts to RGB and formats as hexadecimal", () => { + assert.strictEqual(hcl("#abcdef") + "", "rgb(171, 205, 239)"); + assert.strictEqual(hcl("moccasin") + "", "rgb(255, 228, 181)"); + assert.strictEqual(hcl("hsl(60, 100%, 20%)") + "", "rgb(102, 102, 0)"); + assert.strictEqual(hcl("rgb(12, 34, 56)") + "", "rgb(12, 34, 56)"); + assert.strictEqual(hcl(rgb(12, 34, 56)) + "", "rgb(12, 34, 56)"); + assert.strictEqual(hcl(hsl(60, 1, 0.2)) + "", "rgb(102, 102, 0)"); }); -tape("hcl.toString() reflects h, c and l channel values", function(test) { - var c = color.hcl("#abc"); +it("hcl.toString() reflects h, c and l channel values", () => { + const c = hcl("#abc"); c.h += 10, c.c += 1, c.l -= 1; - test.equal(c + "", "rgb(170, 183, 204)"); - test.end(); + assert.strictEqual(c + "", "rgb(170, 183, 204)"); }); -tape("hcl.toString() treats undefined opacity as 1", function(test) { - var c = color.hcl("#abc"); +it("hcl.toString() treats undefined opacity as 1", () => { + const c = hcl("#abc"); c.opacity = NaN; - test.equal(c + "", "rgb(170, 187, 204)"); - test.end(); + assert.strictEqual(c + "", "rgb(170, 187, 204)"); }); -tape("hcl.toString() treats undefined channel values as 0", function(test) { - test.equal(color.hcl("invalid") + "", "rgb(0, 0, 0)"); - test.equal(color.hcl("#000") + "", "rgb(0, 0, 0)"); - test.equal(color.hcl("#ccc") + "", "rgb(204, 204, 204)"); - test.equal(color.hcl("#fff") + "", "rgb(255, 255, 255)"); - test.equal(color.hcl(NaN, 20, 40) + "", "rgb(94, 94, 94)"); // equivalent to hcl(*, *, 40) - test.equal(color.hcl(120, NaN, 40) + "", "rgb(94, 94, 94)"); - test.equal(color.hcl(0, NaN, 40) + "", "rgb(94, 94, 94)"); - test.equal(color.hcl(120, 50, NaN) + "", "rgb(0, 0, 0)"); // equivalent to hcl(*, *, 0) - test.equal(color.hcl(0, 50, NaN) + "", "rgb(0, 0, 0)"); - test.equal(color.hcl(120, 0, NaN) + "", "rgb(0, 0, 0)"); - test.end(); +it("hcl.toString() treats undefined channel values as 0", () => { + assert.strictEqual(hcl("invalid") + "", "rgb(0, 0, 0)"); + assert.strictEqual(hcl("#000") + "", "rgb(0, 0, 0)"); + assert.strictEqual(hcl("#ccc") + "", "rgb(204, 204, 204)"); + assert.strictEqual(hcl("#fff") + "", "rgb(255, 255, 255)"); + assert.strictEqual(hcl(NaN, 20, 40) + "", "rgb(94, 94, 94)"); // equivalent to hcl(*, *, 40) + assert.strictEqual(hcl(120, NaN, 40) + "", "rgb(94, 94, 94)"); + assert.strictEqual(hcl(0, NaN, 40) + "", "rgb(94, 94, 94)"); + assert.strictEqual(hcl(120, 50, NaN) + "", "rgb(0, 0, 0)"); // equivalent to hcl(*, *, 0) + assert.strictEqual(hcl(0, 50, NaN) + "", "rgb(0, 0, 0)"); + assert.strictEqual(hcl(120, 0, NaN) + "", "rgb(0, 0, 0)"); }); -tape("hcl(yellow) is displayable", function(test) { - test.equal(color.hcl("yellow").displayable(), true); - test.equal(color.hcl("yellow") + "", "rgb(255, 255, 0)"); - test.end(); +it("hcl(yellow) is displayable", () => { + assert.strictEqual(hcl("yellow").displayable(), true); + assert.strictEqual(hcl("yellow") + "", "rgb(255, 255, 0)"); }); -tape("hcl(h, c, l) does not wrap hue to [0,360)", function(test) { - test.hclEqual(color.hcl(-10, 40, 50), -10, 40, 50, 1); - test.hclEqual(color.hcl(0, 40, 50), 0, 40, 50, 1); - test.hclEqual(color.hcl(360, 40, 50), 360, 40, 50, 1); - test.hclEqual(color.hcl(370, 40, 50), 370, 40, 50, 1); - test.end(); +it("hcl(h, c, l) does not wrap hue to [0,360)", () => { + assertHclEqual(hcl(-10, 40, 50), -10, 40, 50, 1); + assertHclEqual(hcl(0, 40, 50), 0, 40, 50, 1); + assertHclEqual(hcl(360, 40, 50), 360, 40, 50, 1); + assertHclEqual(hcl(370, 40, 50), 370, 40, 50, 1); }); -tape("hcl(h, c, l) does not clamp l channel value", function(test) { - test.hclEqual(color.hcl(120, 20, -10), 120, 20, -10, 1); - test.hclEqual(color.hcl(120, 20, 0), 120, 20, 0, 1); - test.hclEqual(color.hcl(120, 20, 100), 120, 20, 100, 1); - test.hclEqual(color.hcl(120, 20, 110), 120, 20, 110, 1); - test.end(); +it("hcl(h, c, l) does not clamp l channel value", () => { + assertHclEqual(hcl(120, 20, -10), 120, 20, -10, 1); + assertHclEqual(hcl(120, 20, 0), 120, 20, 0, 1); + assertHclEqual(hcl(120, 20, 100), 120, 20, 100, 1); + assertHclEqual(hcl(120, 20, 110), 120, 20, 110, 1); }); -tape("hcl(h, c, l, opacity) does not clamp opacity to [0,1]", function(test) { - test.hclEqual(color.hcl(120, 20, 100, -0.2), 120, 20, 100, -0.2); - test.hclEqual(color.hcl(120, 20, 110, 1.2), 120, 20, 110, 1.2); - test.end(); +it("hcl(h, c, l, opacity) does not clamp opacity to [0,1]", () => { + assertHclEqual(hcl(120, 20, 100, -0.2), 120, 20, 100, -0.2); + assertHclEqual(hcl(120, 20, 110, 1.2), 120, 20, 110, 1.2); }); -tape("hcl(h, c, l) coerces channel values to numbers", function(test) { - test.hclEqual(color.hcl("120", "40", "50"), 120, 40, 50, 1); - test.end(); +it("hcl(h, c, l) coerces channel values to numbers", () => { + assertHclEqual(hcl("120", "40", "50"), 120, 40, 50, 1); }); -tape("hcl(h, c, l, opacity) coerces opacity to number", function(test) { - test.hclEqual(color.hcl(120, 40, 50, "0.2"), 120, 40, 50, 0.2); - test.end(); +it("hcl(h, c, l, opacity) coerces opacity to number", () => { + assertHclEqual(hcl(120, 40, 50, "0.2"), 120, 40, 50, 0.2); }); -tape("hcl(h, c, l) allows undefined channel values", function(test) { - test.hclEqual(color.hcl(undefined, NaN, "foo"), NaN, NaN, NaN, 1); - test.hclEqual(color.hcl(undefined, 40, 50), NaN, 40, 50, 1); - test.hclEqual(color.hcl(42, undefined, 50), 42, NaN, 50, 1); - test.hclEqual(color.hcl(42, 40, undefined), 42, 40, NaN, 1); - test.end(); +it("hcl(h, c, l) allows undefined channel values", () => { + assertHclEqual(hcl(undefined, NaN, "foo"), NaN, NaN, NaN, 1); + assertHclEqual(hcl(undefined, 40, 50), NaN, 40, 50, 1); + assertHclEqual(hcl(42, undefined, 50), 42, NaN, 50, 1); + assertHclEqual(hcl(42, 40, undefined), 42, 40, NaN, 1); }); -tape("hcl(h, c, l, opacity) converts undefined opacity to 1", function(test) { - test.hclEqual(color.hcl(10, 20, 30, null), 10, 20, 30, 1); - test.hclEqual(color.hcl(10, 20, 30, undefined), 10, 20, 30, 1); - test.end(); +it("hcl(h, c, l, opacity) converts undefined opacity to 1", () => { + assertHclEqual(hcl(10, 20, 30, null), 10, 20, 30, 1); + assertHclEqual(hcl(10, 20, 30, undefined), 10, 20, 30, 1); }); -tape("hcl(format) parses the specified format and converts to HCL", function(test) { - test.hclEqual(color.hcl("#abcdef"), 254.0079700170605, 21.62257586147983, 80.77135418262527, 1); - test.hclEqual(color.hcl("#abc"), 252.37145234745182, 11.223567114593477, 74.96879980931759, 1); - test.hclEqual(color.hcl("rgb(12, 34, 56)"), 262.8292023352897, 17.30347233219686, 12.404844123471648, 1); - test.hclEqual(color.hcl("rgb(12%, 34%, 56%)"), 266.117653326772, 37.03612078188506, 35.48300043476593, 1); - test.hclEqual(color.hcl("rgba(12%, 34%, 56%, 0.4)"), 266.117653326772, 37.03612078188506, 35.48300043476593, 0.4); - test.hclEqual(color.hcl("hsl(60,100%,20%)"), 99.57458688693686, 48.327323183108916, 41.97125732118659, 1); - test.hclEqual(color.hcl("hsla(60,100%,20%,0.4)"), 99.57458688693686, 48.327323183108916, 41.97125732118659, 0.4); - test.hclEqual(color.hcl("aliceblue"), 247.7353849904697, 4.681732046417135, 97.12294991108756, 1); - test.end(); +it("hcl(format) parses the specified format and converts to HCL", () => { + assertHclEqual(hcl("#abcdef"), 254.0079700170605, 21.62257586147983, 80.77135418262527, 1); + assertHclEqual(hcl("#abc"), 252.37145234745182, 11.223567114593477, 74.96879980931759, 1); + assertHclEqual(hcl("rgb(12, 34, 56)"), 262.8292023352897, 17.30347233219686, 12.404844123471648, 1); + assertHclEqual(hcl("rgb(12%, 34%, 56%)"), 266.117653326772, 37.03612078188506, 35.48300043476593, 1); + assertHclEqual(hcl("rgba(12%, 34%, 56%, 0.4)"), 266.117653326772, 37.03612078188506, 35.48300043476593, 0.4); + assertHclEqual(hcl("hsl(60,100%,20%)"), 99.57458688693686, 48.327323183108916, 41.97125732118659, 1); + assertHclEqual(hcl("hsla(60,100%,20%,0.4)"), 99.57458688693686, 48.327323183108916, 41.97125732118659, 0.4); + assertHclEqual(hcl("aliceblue"), 247.7353849904697, 4.681732046417135, 97.12294991108756, 1); }); -tape("hcl(format) returns undefined channel values for unknown formats", function(test) { - test.hclEqual(color.hcl("invalid"), NaN, NaN, NaN, NaN); - test.end(); +it("hcl(format) returns undefined channel values for unknown formats", () => { + assertHclEqual(hcl("invalid"), NaN, NaN, NaN, NaN); }); -tape("hcl(hcl) copies an HCL color", function(test) { - var c1 = color.hcl(120, 30, 50, 0.4), - c2 = color.hcl(c1); - test.hclEqual(c1, 120, 30, 50, 0.4); +it("hcl(hcl) copies an HCL color", () => { + const c1 = hcl(120, 30, 50, 0.4); + const c2 = hcl(c1); + assertHclEqual(c1, 120, 30, 50, 0.4); c1.h = c1.c = c1.l = c1.opacity = 0; - test.hclEqual(c1, 0, 0, 0, 0); - test.hclEqual(c2, 120, 30, 50, 0.4); - test.end(); + assertHclEqual(c1, 0, 0, 0, 0); + assertHclEqual(c2, 120, 30, 50, 0.4); }); -tape("hcl(lab) returns h = NaN if a and b are zero", function(test) { - test.hclEqual(color.hcl(color.lab(0, 0, 0)), NaN, NaN, 0, 1); - test.hclEqual(color.hcl(color.lab(50, 0, 0)), NaN, 0, 50, 1); - test.hclEqual(color.hcl(color.lab(100, 0, 0)), NaN, NaN, 100, 1); - test.hclEqual(color.hcl(color.lab(0, 10, 0)), 0, 10, 0, 1); - test.hclEqual(color.hcl(color.lab(50, 10, 0)), 0, 10, 50, 1); - test.hclEqual(color.hcl(color.lab(100, 10, 0)), 0, 10, 100, 1); - test.hclEqual(color.hcl(color.lab(0, 0, 10)), 90, 10, 0, 1); - test.hclEqual(color.hcl(color.lab(50, 0, 10)), 90, 10, 50, 1); - test.hclEqual(color.hcl(color.lab(100, 0, 10)), 90, 10, 100, 1); - test.end(); +it("hcl(lab) returns h = NaN if a and b are zero", () => { + assertHclEqual(hcl(lab(0, 0, 0)), NaN, NaN, 0, 1); + assertHclEqual(hcl(lab(50, 0, 0)), NaN, 0, 50, 1); + assertHclEqual(hcl(lab(100, 0, 0)), NaN, NaN, 100, 1); + assertHclEqual(hcl(lab(0, 10, 0)), 0, 10, 0, 1); + assertHclEqual(hcl(lab(50, 10, 0)), 0, 10, 50, 1); + assertHclEqual(hcl(lab(100, 10, 0)), 0, 10, 100, 1); + assertHclEqual(hcl(lab(0, 0, 10)), 90, 10, 0, 1); + assertHclEqual(hcl(lab(50, 0, 10)), 90, 10, 50, 1); + assertHclEqual(hcl(lab(100, 0, 10)), 90, 10, 100, 1); }); -tape("hcl(rgb) converts from RGB", function(test) { - test.hclEqual(color.hcl(color.rgb(255, 0, 0, 0.4)), 40.85261277607024, 106.83899941284552, 54.29173376861782, 0.4); - test.end(); +it("hcl(rgb) converts from RGB", () => { + assertHclEqual(hcl(rgb(255, 0, 0, 0.4)), 40.85261277607024, 106.83899941284552, 54.29173376861782, 0.4); }); -tape("hcl(color) converts from another colorspace via color.rgb()", function(test) { +it("hcl(color) converts from another colorspace via rgb()", () => { function TestColor() {} - TestColor.prototype = Object.create(color.color.prototype); - TestColor.prototype.rgb = function() { return color.rgb(12, 34, 56, 0.4); }; + TestColor.prototype = Object.create(color.prototype); + TestColor.prototype.rgb = function() { return rgb(12, 34, 56, 0.4); }; TestColor.prototype.toString = function() { throw new Error("should use rgb, not toString"); }; - test.hclEqual(color.hcl(new TestColor), 262.8292023352897, 17.30347233219686, 12.404844123471648, 0.4); - test.end(); + assertHclEqual(hcl(new TestColor), 262.8292023352897, 17.30347233219686, 12.404844123471648, 0.4); }); -tape("hcl.brighter(k) returns a brighter color if k > 0", function(test) { - var c = color.hcl("rgba(165, 42, 42, 0.4)"); - test.hclEqual(c.brighter(0.5), 32.28342524928155, 59.60231039142763, 47.149667346714935, 0.4); - test.hclEqual(c.brighter(1), 32.28342524928155, 59.60231039142763, 56.149667346714935, 0.4); - test.hclEqual(c.brighter(2), 32.28342524928155, 59.60231039142763, 74.14966734671493, 0.4); - test.end(); +it("hcl.brighter(k) returns a brighter color if k > 0", () => { + const c = hcl("rgba(165, 42, 42, 0.4)"); + assertHclEqual(c.brighter(0.5), 32.28342524928155, 59.60231039142763, 47.149667346714935, 0.4); + assertHclEqual(c.brighter(1), 32.28342524928155, 59.60231039142763, 56.149667346714935, 0.4); + assertHclEqual(c.brighter(2), 32.28342524928155, 59.60231039142763, 74.14966734671493, 0.4); }); -tape("hcl.brighter(k) returns a copy", function(test) { - var c1 = color.hcl("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(1); - test.hclEqual(c1, 255.71009124439382, 33.88100417355615, 51.98624890550498, 0.4); - test.hclEqual(c2, 255.71009124439382, 33.88100417355615, 69.98624890550498, 0.4); - test.end(); +it("hcl.brighter(k) returns a copy", () => { + const c1 = hcl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(1); + assertHclEqual(c1, 255.71009124439382, 33.88100417355615, 51.98624890550498, 0.4); + assertHclEqual(c2, 255.71009124439382, 33.88100417355615, 69.98624890550498, 0.4); }); -tape("hcl.brighter() is equivalent to hcl.brighter(1)", function(test) { - var c1 = color.hcl("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(), - c3 = c1.brighter(1); - test.hclEqual(c2, c3.h, c3.c, c3.l, 0.4); - test.end(); +it("hcl.brighter() is equivalent to hcl.brighter(1)", () => { + const c1 = hcl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(); + const c3 = c1.brighter(1); + assertHclEqual(c2, c3.h, c3.c, c3.l, 0.4); }); -tape("hcl.brighter(k) is equivalent to hcl.darker(-k)", function(test) { - var c1 = color.hcl("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(1.5), - c3 = c1.darker(-1.5); - test.hclEqual(c2, c3.h, c3.c, c3.l, 0.4); - test.end(); +it("hcl.brighter(k) is equivalent to hcl.darker(-k)", () => { + const c1 = hcl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(1.5); + const c3 = c1.darker(-1.5); + assertHclEqual(c2, c3.h, c3.c, c3.l, 0.4); }); -tape("hcl.darker(k) returns a darker color if k > 0", function(test) { - var c = color.hcl("rgba(165, 42, 42, 0.4)"); - test.hclEqual(c.darker(0.5), 32.28342524928155, 59.60231039142763, 29.149667346714935, 0.4); - test.hclEqual(c.darker(1), 32.28342524928155, 59.60231039142763, 20.149667346714935, 0.4); - test.hclEqual(c.darker(2), 32.28342524928155, 59.60231039142763, 2.149667346714935, 0.4); - test.end(); +it("hcl.darker(k) returns a darker color if k > 0", () => { + const c = hcl("rgba(165, 42, 42, 0.4)"); + assertHclEqual(c.darker(0.5), 32.28342524928155, 59.60231039142763, 29.149667346714935, 0.4); + assertHclEqual(c.darker(1), 32.28342524928155, 59.60231039142763, 20.149667346714935, 0.4); + assertHclEqual(c.darker(2), 32.28342524928155, 59.60231039142763, 2.149667346714935, 0.4); }); -tape("hcl.darker(k) returns a copy", function(test) { - var c1 = color.hcl("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(1); - test.hclEqual(c1, 255.71009124439382, 33.88100417355615, 51.98624890550498, 0.4); - test.hclEqual(c2, 255.71009124439382, 33.88100417355615, 33.98624890550498, 0.4); - test.end(); +it("hcl.darker(k) returns a copy", () => { + const c1 = hcl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(1); + assertHclEqual(c1, 255.71009124439382, 33.88100417355615, 51.98624890550498, 0.4); + assertHclEqual(c2, 255.71009124439382, 33.88100417355615, 33.98624890550498, 0.4); }); -tape("hcl.darker() is equivalent to hcl.darker(1)", function(test) { - var c1 = color.hcl("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(), - c3 = c1.darker(1); - test.hclEqual(c2, c3.h, c3.c, c3.l, 0.4); - test.end(); +it("hcl.darker() is equivalent to hcl.darker(1)", () => { + const c1 = hcl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(); + const c3 = c1.darker(1); + assertHclEqual(c2, c3.h, c3.c, c3.l, 0.4); }); -tape("hcl.darker(k) is equivalent to hcl.brighter(-k)", function(test) { - var c1 = color.hcl("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(1.5), - c3 = c1.brighter(-1.5); - test.hclEqual(c2, c3.h, c3.c, c3.l, 0.4); - test.end(); +it("hcl.darker(k) is equivalent to hcl.brighter(-k)", () => { + const c1 = hcl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(1.5); + const c3 = c1.brighter(-1.5); + assertHclEqual(c2, c3.h, c3.c, c3.l, 0.4); }); -tape("hcl.rgb() converts to RGB", function(test) { - var c = color.hcl(120, 30, 50, 0.4); - test.rgbEqual(c.rgb(), 105, 126, 73, 0.4); - test.end(); +it("hcl.rgb() converts to RGB", () => { + const c = hcl(120, 30, 50, 0.4); + assertRgbApproxEqual(c.rgb(), 105, 126, 73, 0.4); }); diff --git a/test/hclEqual.js b/test/hclEqual.js deleted file mode 100644 index f56bb2a..0000000 --- a/test/hclEqual.js +++ /dev/null @@ -1,15 +0,0 @@ -var tape = require("tape"), - color = require("../"); - -tape.Test.prototype.hclEqual = function(actual, h, c, l, opacity) { - this._assert(actual instanceof color.hcl - && (isNaN(h) ? isNaN(actual.h) && actual.h !== actual.h : h - 1e-6 <= actual.h && actual.h <= h + 1e-6) - && (isNaN(c) ? isNaN(actual.c) && actual.c !== actual.c : c - 1e-6 <= actual.c && actual.c <= c + 1e-6) - && (isNaN(l) ? isNaN(actual.l) && actual.l !== actual.l : l - 1e-6 <= actual.l && actual.l <= l + 1e-6) - && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity), { - message: "should be equal", - operator: "hclEqual", - actual: [actual.h, actual.c, actual.l, actual.opacity], - expected: [h, c, l, opacity] - }); -}; diff --git a/test/hsl-test.js b/test/hsl-test.js index 4ac92b5..5f5b9c7 100644 --- a/test/hsl-test.js +++ b/test/hsl-test.js @@ -1,328 +1,285 @@ -var tape = require("tape"), - color = require("../"); +import assert from "assert"; +import {color, hsl, rgb} from "../src/index.js"; +import {assertHslEqual, assertRgbApproxEqual} from "./asserts.js"; -require("./hslEqual"); -require("./rgbEqual"); - -tape("hsl(…) returns an instance of hsl and color", function(test) { - var c = color.hsl(120, 0.4, 0.5); - test.ok(c instanceof color.hsl); - test.ok(c instanceof color.color); - test.end(); +it("hsl(…) returns an instance of hsl and color", () => { + const c = hsl(120, 0.4, 0.5); + assert(c instanceof hsl); + assert(c instanceof color); }); -tape("hsl(…) exposes h, s, and l channel values and opacity", function(test) { - test.hslEqual(color.hsl("#abc"), 210, 0.25, 0.7333333, 1); - test.hslEqual(color.hsl("hsla(60, 100%, 20%, 0.4)"), 60, 1, 0.2, 0.4); - test.end(); +it("hsl(…) exposes h, s, and l channel values and opacity", () => { + assertHslEqual(hsl("#abc"), 210, 0.25, 0.7333333, 1); + assertHslEqual(hsl("hsla(60, 100%, 20%, 0.4)"), 60, 1, 0.2, 0.4); }); -tape("hsl.toString() converts to RGB and formats as rgb(…) or rgba(…)", function(test) { - test.equal(color.hsl("#abcdef") + "", "rgb(171, 205, 239)"); - test.equal(color.hsl("moccasin") + "", "rgb(255, 228, 181)"); - test.equal(color.hsl("hsl(60, 100%, 20%)") + "", "rgb(102, 102, 0)"); - test.equal(color.hsl("hsla(60, 100%, 20%, 0.4)") + "", "rgba(102, 102, 0, 0.4)"); - test.equal(color.hsl("rgb(12, 34, 56)") + "", "rgb(12, 34, 56)"); - test.equal(color.hsl(color.rgb(12, 34, 56)) + "", "rgb(12, 34, 56)"); - test.equal(color.hsl(color.hsl(60, 1, 0.2)) + "", "rgb(102, 102, 0)"); - test.equal(color.hsl(color.hsl(60, 1, 0.2, 0.4)) + "", "rgba(102, 102, 0, 0.4)"); - test.end(); +it("hsl.toString() converts to RGB and formats as rgb(…) or rgba(…)", () => { + assert.strictEqual(hsl("#abcdef") + "", "rgb(171, 205, 239)"); + assert.strictEqual(hsl("moccasin") + "", "rgb(255, 228, 181)"); + assert.strictEqual(hsl("hsl(60, 100%, 20%)") + "", "rgb(102, 102, 0)"); + assert.strictEqual(hsl("hsla(60, 100%, 20%, 0.4)") + "", "rgba(102, 102, 0, 0.4)"); + assert.strictEqual(hsl("rgb(12, 34, 56)") + "", "rgb(12, 34, 56)"); + assert.strictEqual(hsl(rgb(12, 34, 56)) + "", "rgb(12, 34, 56)"); + assert.strictEqual(hsl(hsl(60, 1, 0.2)) + "", "rgb(102, 102, 0)"); + assert.strictEqual(hsl(hsl(60, 1, 0.2, 0.4)) + "", "rgba(102, 102, 0, 0.4)"); }); -tape("hsl.formatRgb() formats as rgb(…) or rgba(…)", function(test) { - test.equal(color.hsl("#abcdef").formatRgb(), "rgb(171, 205, 239)"); - test.equal(color.hsl("hsl(60, 100%, 20%)").formatRgb(), "rgb(102, 102, 0)"); - test.equal(color.hsl("rgba(12%, 34%, 56%, 0.4)").formatRgb(), "rgba(31, 87, 143, 0.4)"); - test.equal(color.hsl("hsla(60, 100%, 20%, 0.4)").formatRgb(), "rgba(102, 102, 0, 0.4)"); - test.end(); +it("hsl.formatRgb() formats as rgb(…) or rgba(…)", () => { + assert.strictEqual(hsl("#abcdef").formatRgb(), "rgb(171, 205, 239)"); + assert.strictEqual(hsl("hsl(60, 100%, 20%)").formatRgb(), "rgb(102, 102, 0)"); + assert.strictEqual(hsl("rgba(12%, 34%, 56%, 0.4)").formatRgb(), "rgba(31, 87, 143, 0.4)"); + assert.strictEqual(hsl("hsla(60, 100%, 20%, 0.4)").formatRgb(), "rgba(102, 102, 0, 0.4)"); }); -tape("hsl.formatHsl() formats as hsl(…) or hsla(…)", function(test) { - test.equal(color.hsl("#abcdef").formatHsl(), "hsl(210, 68%, 80.3921568627451%)"); - test.equal(color.hsl("hsl(60, 100%, 20%)").formatHsl(), "hsl(60, 100%, 20%)"); - test.equal(color.hsl("rgba(12%, 34%, 56%, 0.4)").formatHsl(), "hsla(210, 64.70588235294117%, 34%, 0.4)"); - test.equal(color.hsl("hsla(60, 100%, 20%, 0.4)").formatHsl(), "hsla(60, 100%, 20%, 0.4)"); - test.end(); +it("hsl.formatHsl() formats as hsl(…) or hsla(…)", () => { + assert.strictEqual(hsl("#abcdef").formatHsl(), "hsl(210, 68%, 80.3921568627451%)"); + assert.strictEqual(hsl("hsl(60, 100%, 20%)").formatHsl(), "hsl(60, 100%, 20%)"); + assert.strictEqual(hsl("rgba(12%, 34%, 56%, 0.4)").formatHsl(), "hsla(210, 64.70588235294117%, 34%, 0.4)"); + assert.strictEqual(hsl("hsla(60, 100%, 20%, 0.4)").formatHsl(), "hsla(60, 100%, 20%, 0.4)"); }); -tape("hsl.formatHex() formats as #rrggbb", function(test) { - test.equal(color.hsl("#abcdef").formatHex(), "#abcdef"); - test.equal(color.hsl("hsl(60, 100%, 20%)").formatHex(), "#666600"); - test.equal(color.hsl("rgba(12%, 34%, 56%, 0.4)").formatHex(), "#1f578f"); - test.equal(color.hsl("hsla(60, 100%, 20%, 0.4)").formatHex(), "#666600"); - test.end(); +it("hsl.formatHex() formats as #rrggbb", () => { + assert.strictEqual(hsl("#abcdef").formatHex(), "#abcdef"); + assert.strictEqual(hsl("hsl(60, 100%, 20%)").formatHex(), "#666600"); + assert.strictEqual(hsl("rgba(12%, 34%, 56%, 0.4)").formatHex(), "#1f578f"); + assert.strictEqual(hsl("hsla(60, 100%, 20%, 0.4)").formatHex(), "#666600"); }); -tape("hsl.toString() reflects h, s and l channel values and opacity", function(test) { - var c = color.hsl("#abc"); +it("hsl.toString() reflects h, s and l channel values and opacity", () => { + const c = hsl("#abc"); c.h += 10, c.s += 0.01, c.l -= 0.01, c.opacity = 0.4; - test.equal(c + "", "rgba(166, 178, 203, 0.4)"); - test.end(); + assert.strictEqual(c + "", "rgba(166, 178, 203, 0.4)"); }); -tape("hsl.toString() treats undefined channel values as 0", function(test) { - test.equal(color.hsl("invalid") + "", "rgb(0, 0, 0)"); - test.equal(color.hsl("#000") + "", "rgb(0, 0, 0)"); - test.equal(color.hsl("#ccc") + "", "rgb(204, 204, 204)"); - test.equal(color.hsl("#fff") + "", "rgb(255, 255, 255)"); - test.equal(color.hsl(NaN, 0.5, 0.4) + "", "rgb(102, 102, 102)"); // equivalent to hsl(*, 0, 0.4) - test.equal(color.hsl(120, NaN, 0.4) + "", "rgb(102, 102, 102)"); - test.equal(color.hsl(NaN, NaN, 0.4) + "", "rgb(102, 102, 102)"); - test.equal(color.hsl(120, 0.5, NaN) + "", "rgb(0, 0, 0)"); // equivalent to hsl(120, 0.5, 0) - test.end(); +it("hsl.toString() treats undefined channel values as 0", () => { + assert.strictEqual(hsl("invalid") + "", "rgb(0, 0, 0)"); + assert.strictEqual(hsl("#000") + "", "rgb(0, 0, 0)"); + assert.strictEqual(hsl("#ccc") + "", "rgb(204, 204, 204)"); + assert.strictEqual(hsl("#fff") + "", "rgb(255, 255, 255)"); + assert.strictEqual(hsl(NaN, 0.5, 0.4) + "", "rgb(102, 102, 102)"); // equivalent to hsl(*, 0, 0.4) + assert.strictEqual(hsl(120, NaN, 0.4) + "", "rgb(102, 102, 102)"); + assert.strictEqual(hsl(NaN, NaN, 0.4) + "", "rgb(102, 102, 102)"); + assert.strictEqual(hsl(120, 0.5, NaN) + "", "rgb(0, 0, 0)"); // equivalent to hsl(120, 0.5, 0) }); -tape("hsl.toString() treats undefined opacity as 1", function(test) { - var c = color.hsl("#abc"); +it("hsl.toString() treats undefined opacity as 1", () => { + const c = hsl("#abc"); c.opacity = NaN; - test.equal(c + "", "rgb(170, 187, 204)"); - test.end(); + assert.strictEqual(c + "", "rgb(170, 187, 204)"); }); -tape("hsl(h, s, l) does not wrap hue to [0,360)", function(test) { - test.hslEqual(color.hsl(-10, 0.4, 0.5), -10, 0.4, 0.5, 1); - test.hslEqual(color.hsl(0, 0.4, 0.5), 0, 0.4, 0.5, 1); - test.hslEqual(color.hsl(360, 0.4, 0.5), 360, 0.4, 0.5, 1); - test.hslEqual(color.hsl(370, 0.4, 0.5), 370, 0.4, 0.5, 1); - test.end(); +it("hsl(h, s, l) does not wrap hue to [0,360)", () => { + assertHslEqual(hsl(-10, 0.4, 0.5), -10, 0.4, 0.5, 1); + assertHslEqual(hsl(0, 0.4, 0.5), 0, 0.4, 0.5, 1); + assertHslEqual(hsl(360, 0.4, 0.5), 360, 0.4, 0.5, 1); + assertHslEqual(hsl(370, 0.4, 0.5), 370, 0.4, 0.5, 1); }); -tape("hsl(h, s, l) does not clamp s and l channel values to [0,1]", function(test) { - test.hslEqual(color.hsl(120, -0.1, 0.5), 120, -0.1, 0.5, 1); - test.hslEqual(color.hsl(120, 1.1, 0.5), 120, 1.1, 0.5, 1); - test.hslEqual(color.hsl(120, 0.2, -0.1), 120, 0.2, -0.1, 1); - test.hslEqual(color.hsl(120, 0.2, 1.1), 120, 0.2, 1.1, 1); - test.end(); +it("hsl(h, s, l) does not clamp s and l channel values to [0,1]", () => { + assertHslEqual(hsl(120, -0.1, 0.5), 120, -0.1, 0.5, 1); + assertHslEqual(hsl(120, 1.1, 0.5), 120, 1.1, 0.5, 1); + assertHslEqual(hsl(120, 0.2, -0.1), 120, 0.2, -0.1, 1); + assertHslEqual(hsl(120, 0.2, 1.1), 120, 0.2, 1.1, 1); }); -tape("hsl(h, s, l, opacity) does not clamp opacity to [0,1]", function(test) { - test.hslEqual(color.hsl(120, 0.1, 0.5, -0.2), 120, 0.1, 0.5, -0.2); - test.hslEqual(color.hsl(120, 0.9, 0.5, 1.2), 120, 0.9, 0.5, 1.2); - test.end(); +it("hsl(h, s, l, opacity) does not clamp opacity to [0,1]", () => { + assertHslEqual(hsl(120, 0.1, 0.5, -0.2), 120, 0.1, 0.5, -0.2); + assertHslEqual(hsl(120, 0.9, 0.5, 1.2), 120, 0.9, 0.5, 1.2); }); -tape("hsl(h, s, l) coerces channel values to numbers", function(test) { - test.hslEqual(color.hsl("120", ".4", ".5"), 120, 0.4, 0.5, 1); - test.end(); +it("hsl(h, s, l) coerces channel values to numbers", () => { + assertHslEqual(hsl("120", ".4", ".5"), 120, 0.4, 0.5, 1); }); -tape("hsl(h, s, l, opacity) coerces opacity to number", function(test) { - test.hslEqual(color.hsl(120, 0.1, 0.5, "0.2"), 120, 0.1, 0.5, 0.2); - test.hslEqual(color.hsl(120, 0.9, 0.5, "0.9"), 120, 0.9, 0.5, 0.9); - test.end(); +it("hsl(h, s, l, opacity) coerces opacity to number", () => { + assertHslEqual(hsl(120, 0.1, 0.5, "0.2"), 120, 0.1, 0.5, 0.2); + assertHslEqual(hsl(120, 0.9, 0.5, "0.9"), 120, 0.9, 0.5, 0.9); }); -tape("hsl(h, s, l) allows undefined channel values", function(test) { - test.hslEqual(color.hsl(undefined, NaN, "foo"), NaN, NaN, NaN, 1); - test.hslEqual(color.hsl(undefined, 0.4, 0.5), NaN, 0.4, 0.5, 1); - test.hslEqual(color.hsl(42, undefined, 0.5), 42, NaN, 0.5, 1); - test.hslEqual(color.hsl(42, 0.4, undefined), 42, 0.4, NaN, 1); - test.end(); +it("hsl(h, s, l) allows undefined channel values", () => { + assertHslEqual(hsl(undefined, NaN, "foo"), NaN, NaN, NaN, 1); + assertHslEqual(hsl(undefined, 0.4, 0.5), NaN, 0.4, 0.5, 1); + assertHslEqual(hsl(42, undefined, 0.5), 42, NaN, 0.5, 1); + assertHslEqual(hsl(42, 0.4, undefined), 42, 0.4, NaN, 1); }); -tape("hsl(h, s, l, opacity) converts undefined opacity to 1", function(test) { - test.hslEqual(color.hsl(10, 0.2, 0.3, null), 10, 0.2, 0.3, 1); - test.hslEqual(color.hsl(10, 0.2, 0.3, undefined), 10, 0.2, 0.3, 1); - test.end(); +it("hsl(h, s, l, opacity) converts undefined opacity to 1", () => { + assertHslEqual(hsl(10, 0.2, 0.3, null), 10, 0.2, 0.3, 1); + assertHslEqual(hsl(10, 0.2, 0.3, undefined), 10, 0.2, 0.3, 1); }); -tape("hsl(h, s, l) preserves explicit hue, even for grays", function(test) { - test.hslEqual(color.hsl(0, 0, 0), 0, 0, 0, 1); - test.hslEqual(color.hsl(42, 0, 0.5), 42, 0, 0.5, 1); - test.hslEqual(color.hsl(118, 0, 1), 118, 0, 1, 1); - test.end(); +it("hsl(h, s, l) preserves explicit hue, even for grays", () => { + assertHslEqual(hsl(0, 0, 0), 0, 0, 0, 1); + assertHslEqual(hsl(42, 0, 0.5), 42, 0, 0.5, 1); + assertHslEqual(hsl(118, 0, 1), 118, 0, 1, 1); }); -tape("hsl(h, s, l) preserves explicit saturation, even for white or black", function(test) { - test.hslEqual(color.hsl(0, 0, 0), 0, 0, 0, 1); - test.hslEqual(color.hsl(0, 0.18, 0), 0, 0.18, 0, 1); - test.hslEqual(color.hsl(0, 0.42, 1), 0, 0.42, 1, 1); - test.hslEqual(color.hsl(0, 1, 1), 0, 1, 1, 1); - test.end(); +it("hsl(h, s, l) preserves explicit saturation, even for white or black", () => { + assertHslEqual(hsl(0, 0, 0), 0, 0, 0, 1); + assertHslEqual(hsl(0, 0.18, 0), 0, 0.18, 0, 1); + assertHslEqual(hsl(0, 0.42, 1), 0, 0.42, 1, 1); + assertHslEqual(hsl(0, 1, 1), 0, 1, 1, 1); }); -tape("hsl(format) parses the specified format and converts to HSL", function(test) { - test.hslEqual(color.hsl("#abcdef"), 210, 0.68, 0.8039215, 1); - test.hslEqual(color.hsl("#abc"), 210, 0.25, 0.733333333, 1); - test.hslEqual(color.hsl("rgb(12, 34, 56)"), 210, 0.647058, 0.1333333, 1); - test.hslEqual(color.hsl("rgb(12%, 34%, 56%)"), 210, 0.647058, 0.34, 1); - test.hslEqual(color.hsl("hsl(60,100%,20%)"), 60, 1, 0.2, 1); - test.hslEqual(color.hsl("hsla(60,100%,20%,0.4)"), 60, 1, 0.2, 0.4); - test.hslEqual(color.hsl("aliceblue"), 208, 1, 0.9705882, 1); - test.hslEqual(color.hsl("transparent"), NaN, NaN, NaN, 0); - test.end(); +it("hsl(format) parses the specified format and converts to HSL", () => { + assertHslEqual(hsl("#abcdef"), 210, 0.68, 0.8039215, 1); + assertHslEqual(hsl("#abc"), 210, 0.25, 0.733333333, 1); + assertHslEqual(hsl("rgb(12, 34, 56)"), 210, 0.647058, 0.1333333, 1); + assertHslEqual(hsl("rgb(12%, 34%, 56%)"), 210, 0.647058, 0.34, 1); + assertHslEqual(hsl("hsl(60,100%,20%)"), 60, 1, 0.2, 1); + assertHslEqual(hsl("hsla(60,100%,20%,0.4)"), 60, 1, 0.2, 0.4); + assertHslEqual(hsl("aliceblue"), 208, 1, 0.9705882, 1); + assertHslEqual(hsl("transparent"), NaN, NaN, NaN, 0); }); -tape("hsl(format) ignores the hue if the saturation is <= 0", function(test) { - test.hslEqual(color.hsl("hsl(120,0%,20%)"), NaN, 0, 0.2, 1); - test.hslEqual(color.hsl("hsl(120,-10%,20%)"), NaN, -0.1, 0.2, 1); - test.end(); +it("hsl(format) ignores the hue if the saturation is <= 0", () => { + assertHslEqual(hsl("hsl(120,0%,20%)"), NaN, 0, 0.2, 1); + assertHslEqual(hsl("hsl(120,-10%,20%)"), NaN, -0.1, 0.2, 1); }); -tape("hsl(format) ignores the hue and saturation if the lightness is <= 0 or >= 1", function(test) { - test.hslEqual(color.hsl("hsl(120,20%,-10%)"), NaN, NaN, -0.1, 1); - test.hslEqual(color.hsl("hsl(120,20%,0%)"), NaN, NaN, 0.0, 1); - test.hslEqual(color.hsl("hsl(120,20%,100%)"), NaN, NaN, 1.0, 1); - test.hslEqual(color.hsl("hsl(120,20%,120%)"), NaN, NaN, 1.2, 1); - test.end(); +it("hsl(format) ignores the hue and saturation if the lightness is <= 0 or >= 1", () => { + assertHslEqual(hsl("hsl(120,20%,-10%)"), NaN, NaN, -0.1, 1); + assertHslEqual(hsl("hsl(120,20%,0%)"), NaN, NaN, 0.0, 1); + assertHslEqual(hsl("hsl(120,20%,100%)"), NaN, NaN, 1.0, 1); + assertHslEqual(hsl("hsl(120,20%,120%)"), NaN, NaN, 1.2, 1); }); -tape("hsl(format) ignores all channels if the alpha is <= 0", function(test) { - test.hslEqual(color.hsl("hsla(120,20%,10%,0)"), NaN, NaN, NaN, 0); - test.hslEqual(color.hsl("hsla(120,20%,10%,-0.1)"), NaN, NaN, NaN, -0.1); - test.end(); +it("hsl(format) ignores all channels if the alpha is <= 0", () => { + assertHslEqual(hsl("hsla(120,20%,10%,0)"), NaN, NaN, NaN, 0); + assertHslEqual(hsl("hsla(120,20%,10%,-0.1)"), NaN, NaN, NaN, -0.1); }); -tape("hsl(format) does not lose precision when parsing HSL formats", function(test) { - test.hslEqual(color.hsl("hsl(325,50%,40%)"), 325, 0.5, 0.4, 1); - test.end(); +it("hsl(format) does not lose precision when parsing HSL formats", () => { + assertHslEqual(hsl("hsl(325,50%,40%)"), 325, 0.5, 0.4, 1); }); -tape("hsl(format) returns undefined channel values for unknown formats", function(test) { - test.hslEqual(color.hsl("invalid"), NaN, NaN, NaN, NaN); - test.end(); +it("hsl(format) returns undefined channel values for unknown formats", () => { + assertHslEqual(hsl("invalid"), NaN, NaN, NaN, NaN); }); -tape("hsl(hsl) copies an HSL color", function(test) { - var c1 = color.hsl("hsla(120,30%,50%,0.4)"), - c2 = color.hsl(c1); - test.hslEqual(c1, 120, 0.3, 0.5, 0.4); +it("hsl(hsl) copies an HSL color", () => { + const c1 = hsl("hsla(120,30%,50%,0.4)"); + const c2 = hsl(c1); + assertHslEqual(c1, 120, 0.3, 0.5, 0.4); c1.h = c1.s = c1.l = c1.opacity = 0; - test.hslEqual(c1, 0, 0, 0, 0); - test.hslEqual(c2, 120, 0.3, 0.5, 0.4); - test.end(); + assertHslEqual(c1, 0, 0, 0, 0); + assertHslEqual(c2, 120, 0.3, 0.5, 0.4); }); -tape("hsl(rgb) converts from RGB", function(test) { - test.hslEqual(color.hsl(color.rgb(255, 0, 0, 0.4)), 0, 1, 0.5, 0.4); - test.end(); +it("hsl(rgb) converts from RGB", () => { + assertHslEqual(hsl(rgb(255, 0, 0, 0.4)), 0, 1, 0.5, 0.4); }); -tape("hsl(color) returns undefined hue and zero saturation for grays (but not white and black)", function(test) { - test.hslEqual(color.hsl("gray"), NaN, 0, 0.5019608, 1); - test.hslEqual(color.hsl("#ccc"), NaN, 0, 0.8, 1); - test.hslEqual(color.hsl(color.rgb("gray")), NaN, 0, 0.5019608, 1); - test.end(); +it("hsl(color) returns undefined hue and zero saturation for grays (but not white and black)", () => { + assertHslEqual(hsl("gray"), NaN, 0, 0.5019608, 1); + assertHslEqual(hsl("#ccc"), NaN, 0, 0.8, 1); + assertHslEqual(hsl(rgb("gray")), NaN, 0, 0.5019608, 1); }); -tape("hsl(color) returns undefined hue and saturation for black and white", function(test) { - test.hslEqual(color.hsl("black"), NaN, NaN, 0, 1); - test.hslEqual(color.hsl("#000"), NaN, NaN, 0, 1); - test.hslEqual(color.hsl("white"), NaN, NaN, 1, 1); - test.hslEqual(color.hsl("#fff"), NaN, NaN, 1, 1); - test.hslEqual(color.hsl(color.rgb("#fff")), NaN, NaN, 1, 1); - test.end(); +it("hsl(color) returns undefined hue and saturation for black and white", () => { + assertHslEqual(hsl("black"), NaN, NaN, 0, 1); + assertHslEqual(hsl("#000"), NaN, NaN, 0, 1); + assertHslEqual(hsl("white"), NaN, NaN, 1, 1); + assertHslEqual(hsl("#fff"), NaN, NaN, 1, 1); + assertHslEqual(hsl(rgb("#fff")), NaN, NaN, 1, 1); }); -tape("hsl(color) converts from another colorspace via color.rgb()", function(test) { +it("hsl(color) converts from another colorspace via rgb()", () => { function TestColor() {} - TestColor.prototype = Object.create(color.color.prototype); - TestColor.prototype.rgb = function() { return color.rgb(12, 34, 56, 0.4); }; + TestColor.prototype = Object.create(color.prototype); + TestColor.prototype.rgb = function() { return rgb(12, 34, 56, 0.4); }; TestColor.prototype.toString = function() { throw new Error("should use rgb, not toString"); }; - test.hslEqual(color.hsl(new TestColor), 210, 0.6470588, 0.1333334, 0.4); - test.end(); -}); - -tape("hsl.displayable() returns true if the color is within the RGB gamut and the opacity is in [0,1]", function(test) { - test.equal(color.hsl("white").displayable(), true); - test.equal(color.hsl("red").displayable(), true); - test.equal(color.hsl("black").displayable(), true); - test.equal(color.hsl("invalid").displayable(), false); - test.equal(color.hsl(NaN, NaN, 1).displayable(), true); - test.equal(color.hsl(NaN, NaN, 1.5).displayable(), false); - test.equal(color.hsl(120, -0.5, 0).displayable(), false); - test.equal(color.hsl(120, 1.5, 0).displayable(), false); - test.equal(color.hsl(0, 1, 1, 0).displayable(), true); - test.equal(color.hsl(0, 1, 1, 1).displayable(), true); - test.equal(color.hsl(0, 1, 1, -0.2).displayable(), false); - test.equal(color.hsl(0, 1, 1, 1.2).displayable(), false); - test.end(); -}); - -tape("hsl.brighter(k) returns a brighter color if k > 0", function(test) { - var c = color.hsl("rgba(165, 42, 42, 0.4)"); - test.hslEqual(c.brighter(0.5), 0, 0.5942028, 0.4851222, 0.4); - test.hslEqual(c.brighter(1), 0, 0.5942028, 0.5798319, 0.4); - test.hslEqual(c.brighter(2), 0, 0.5942028, 0.8283313, 0.4); - test.end(); -}); - -tape("hsl.brighter(k) returns a copy", function(test) { - var c1 = color.hsl("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(1); - test.hslEqual(c1, 207.272727, 0.44, 0.4901961, 0.4); - test.hslEqual(c2, 207.272727, 0.44, 0.7002801, 0.4); - test.end(); -}); - -tape("hsl.brighter() is equivalent to hsl.brighter(1)", function(test) { - var c1 = color.hsl("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(), - c3 = c1.brighter(1); - test.hslEqual(c2, c3.h, c3.s, c3.l, 0.4); - test.end(); -}); - -tape("hsl.brighter(k) is equivalent to hsl.darker(-k)", function(test) { - var c1 = color.hsl("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(1.5), - c3 = c1.darker(-1.5); - test.hslEqual(c2, c3.h, c3.s, c3.l, 0.4); - test.end(); -}); - -tape("hsl(\"black\").brighter() still returns black", function(test) { - var c1 = color.hsl("black"), - c2 = c1.brighter(1); - test.hslEqual(c1, NaN, NaN, 0, 1); - test.hslEqual(c2, NaN, NaN, 0, 1); - test.end(); -}); - -tape("hsl.darker(k) returns a darker color if k > 0", function(test) { - var c = color.hsl("rgba(165, 42, 42, 0.4)"); - test.hslEqual(c.darker(0.5), 0, 0.5942029, 0.3395855, 0.4); - test.hslEqual(c.darker(1), 0, 0.5942029, 0.2841176, 0.4); - test.hslEqual(c.darker(2), 0, 0.5942029, 0.1988823, 0.4); - test.end(); -}); - -tape("hsl.darker(k) returns a copy", function(test) { - var c1 = color.hsl("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(1); - test.hslEqual(c1, 207.272727, 0.44, 0.4901961, 0.4); - test.hslEqual(c2, 207.272727, 0.44, 0.3431373, 0.4); - test.end(); -}); - -tape("hsl.darker() is equivalent to hsl.darker(1)", function(test) { - var c1 = color.hsl("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(), - c3 = c1.darker(1); - test.hslEqual(c2, c3.h, c3.s, c3.l, 0.4); - test.end(); -}); - -tape("hsl.darker(k) is equivalent to hsl.brighter(-k)", function(test) { - var c1 = color.hsl("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(1.5), - c3 = c1.brighter(-1.5); - test.hslEqual(c2, c3.h, c3.s, c3.l, 0.4); - test.end(); -}); - -tape("hsl.rgb() converts to RGB", function(test) { - var c = color.hsl(120, 0.3, 0.5, 0.4); - test.rgbEqual(c.rgb(), 89, 166, 89, 0.4); - test.end(); -}); - -tape("hsl.copy(…) returns a new hsl with the specified channel values", function(test) { - var c = color.hsl(120, 0.3, 0.5, 0.4); - test.equal(c.copy() instanceof color.hsl, true); - test.equal(c.copy().formatHsl(), "hsla(120, 30%, 50%, 0.4)"); - test.equal(c.copy({opacity: 1}).formatHsl(), "hsl(120, 30%, 50%)"); - test.equal(c.copy({h: 20}).formatHsl(), "hsla(20, 30%, 50%, 0.4)"); - test.equal(c.copy({h: 20, s: 0.4}).formatHsl(), "hsla(20, 40%, 50%, 0.4)"); - test.end(); + assertHslEqual(hsl(new TestColor), 210, 0.6470588, 0.1333334, 0.4); +}); + +it("hsl.displayable() returns true if the color is within the RGB gamut and the opacity is in [0,1]", () => { + assert.strictEqual(hsl("white").displayable(), true); + assert.strictEqual(hsl("red").displayable(), true); + assert.strictEqual(hsl("black").displayable(), true); + assert.strictEqual(hsl("invalid").displayable(), false); + assert.strictEqual(hsl(NaN, NaN, 1).displayable(), true); + assert.strictEqual(hsl(NaN, NaN, 1.5).displayable(), false); + assert.strictEqual(hsl(120, -0.5, 0).displayable(), false); + assert.strictEqual(hsl(120, 1.5, 0).displayable(), false); + assert.strictEqual(hsl(0, 1, 1, 0).displayable(), true); + assert.strictEqual(hsl(0, 1, 1, 1).displayable(), true); + assert.strictEqual(hsl(0, 1, 1, -0.2).displayable(), false); + assert.strictEqual(hsl(0, 1, 1, 1.2).displayable(), false); +}); + +it("hsl.brighter(k) returns a brighter color if k > 0", () => { + const c = hsl("rgba(165, 42, 42, 0.4)"); + assertHslEqual(c.brighter(0.5), 0, 0.5942028, 0.4851222, 0.4); + assertHslEqual(c.brighter(1), 0, 0.5942028, 0.5798319, 0.4); + assertHslEqual(c.brighter(2), 0, 0.5942028, 0.8283313, 0.4); +}); + +it("hsl.brighter(k) returns a copy", () => { + const c1 = hsl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(1); + assertHslEqual(c1, 207.272727, 0.44, 0.4901961, 0.4); + assertHslEqual(c2, 207.272727, 0.44, 0.7002801, 0.4); +}); + +it("hsl.brighter() is equivalent to hsl.brighter(1)", () => { + const c1 = hsl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(); + const c3 = c1.brighter(1); + assertHslEqual(c2, c3.h, c3.s, c3.l, 0.4); +}); + +it("hsl.brighter(k) is equivalent to hsl.darker(-k)", () => { + const c1 = hsl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(1.5); + const c3 = c1.darker(-1.5); + assertHslEqual(c2, c3.h, c3.s, c3.l, 0.4); +}); + +it("hsl(\"black\").brighter() still returns black", () => { + const c1 = hsl("black"); + const c2 = c1.brighter(1); + assertHslEqual(c1, NaN, NaN, 0, 1); + assertHslEqual(c2, NaN, NaN, 0, 1); +}); + +it("hsl.darker(k) returns a darker color if k > 0", () => { + const c = hsl("rgba(165, 42, 42, 0.4)"); + assertHslEqual(c.darker(0.5), 0, 0.5942029, 0.3395855, 0.4); + assertHslEqual(c.darker(1), 0, 0.5942029, 0.2841176, 0.4); + assertHslEqual(c.darker(2), 0, 0.5942029, 0.1988823, 0.4); +}); + +it("hsl.darker(k) returns a copy", () => { + const c1 = hsl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(1); + assertHslEqual(c1, 207.272727, 0.44, 0.4901961, 0.4); + assertHslEqual(c2, 207.272727, 0.44, 0.3431373, 0.4); +}); + +it("hsl.darker() is equivalent to hsl.darker(1)", () => { + const c1 = hsl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(); + const c3 = c1.darker(1); + assertHslEqual(c2, c3.h, c3.s, c3.l, 0.4); +}); + +it("hsl.darker(k) is equivalent to hsl.brighter(-k)", () => { + const c1 = hsl("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(1.5); + const c3 = c1.brighter(-1.5); + assertHslEqual(c2, c3.h, c3.s, c3.l, 0.4); +}); + +it("hsl.rgb() converts to RGB", () => { + const c = hsl(120, 0.3, 0.5, 0.4); + assertRgbApproxEqual(c.rgb(), 89, 166, 89, 0.4); +}); + +it("hsl.copy(…) returns a new hsl with the specified channel values", () => { + const c = hsl(120, 0.3, 0.5, 0.4); + assert.strictEqual(c.copy() instanceof hsl, true); + assert.strictEqual(c.copy().formatHsl(), "hsla(120, 30%, 50%, 0.4)"); + assert.strictEqual(c.copy({opacity: 1}).formatHsl(), "hsl(120, 30%, 50%)"); + assert.strictEqual(c.copy({h: 20}).formatHsl(), "hsla(20, 30%, 50%, 0.4)"); + assert.strictEqual(c.copy({h: 20, s: 0.4}).formatHsl(), "hsla(20, 40%, 50%, 0.4)"); }); diff --git a/test/hslEqual.js b/test/hslEqual.js deleted file mode 100644 index e4f6b16..0000000 --- a/test/hslEqual.js +++ /dev/null @@ -1,15 +0,0 @@ -var tape = require("tape"), - color = require("../"); - -tape.Test.prototype.hslEqual = function(actual, h, s, l, opacity) { - this._assert(actual instanceof color.hsl - && (isNaN(h) ? isNaN(actual.h) && actual.h !== actual.h : h - 1e-6 <= actual.h && actual.h <= h + 1e-6) - && (isNaN(s) ? isNaN(actual.s) && actual.s !== actual.s : s - 1e-6 <= actual.s && actual.s <= s + 1e-6) - && (isNaN(l) ? isNaN(actual.l) && actual.l !== actual.l : l - 1e-6 <= actual.l && actual.l <= l + 1e-6) - && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity), { - message: "should be equal", - operator: "hslEqual", - actual: [actual.h, actual.s, actual.l, actual.opacity], - expected: [h, s, l, opacity] - }); -}; diff --git a/test/lab-test.js b/test/lab-test.js index 0464644..cb01f45 100644 --- a/test/lab-test.js +++ b/test/lab-test.js @@ -1,206 +1,177 @@ -var tape = require("tape"), - color = require("../"); +import assert from "assert"; +import {color, hcl, hsl, lab, rgb} from "../src/index.js"; +import {assertLabEqual, assertRgbApproxEqual} from "./asserts.js"; -require("./labEqual"); -require("./rgbEqual"); - -tape("lab(…) returns an instance of lab and color", function(test) { - var c = color.lab(120, 40, 50); - test.ok(c instanceof color.lab); - test.ok(c instanceof color.color); - test.end(); +it("lab(…) returns an instance of lab and color", () => { + const c = lab(120, 40, 50); + assert(c instanceof lab); + assert(c instanceof color); }); -tape("lab(…) exposes l, a and b channel values and opacity", function(test) { - test.labEqual(color.lab("rgba(170, 187, 204, 0.4)"), 74.96879980931759, -3.398998724348956, -10.696507207853333, 0.4); - test.end(); +it("lab(…) exposes l, a and b channel values and opacity", () => { + assertLabEqual(lab("rgba(170, 187, 204, 0.4)"), 74.96879980931759, -3.398998724348956, -10.696507207853333, 0.4); }); -tape("lab.toString() converts to RGB and formats as rgb(…) or rgba(…)", function(test) { - test.equal(color.lab("#abcdef") + "", "rgb(171, 205, 239)"); - test.equal(color.lab("moccasin") + "", "rgb(255, 228, 181)"); - test.equal(color.lab("hsl(60, 100%, 20%)") + "", "rgb(102, 102, 0)"); - test.equal(color.lab("hsla(60, 100%, 20%, 0.4)") + "", "rgba(102, 102, 0, 0.4)"); - test.equal(color.lab("rgb(12, 34, 56)") + "", "rgb(12, 34, 56)"); - test.equal(color.lab(color.rgb(12, 34, 56)) + "", "rgb(12, 34, 56)"); - test.equal(color.lab(color.hsl(60, 1, 0.2)) + "", "rgb(102, 102, 0)"); - test.equal(color.lab(color.hsl(60, 1, 0.2, 0.4)) + "", "rgba(102, 102, 0, 0.4)"); - test.end(); +it("lab.toString() converts to RGB and formats as rgb(…) or rgba(…)", () => { + assert.strictEqual(lab("#abcdef") + "", "rgb(171, 205, 239)"); + assert.strictEqual(lab("moccasin") + "", "rgb(255, 228, 181)"); + assert.strictEqual(lab("hsl(60, 100%, 20%)") + "", "rgb(102, 102, 0)"); + assert.strictEqual(lab("hsla(60, 100%, 20%, 0.4)") + "", "rgba(102, 102, 0, 0.4)"); + assert.strictEqual(lab("rgb(12, 34, 56)") + "", "rgb(12, 34, 56)"); + assert.strictEqual(lab(rgb(12, 34, 56)) + "", "rgb(12, 34, 56)"); + assert.strictEqual(lab(hsl(60, 1, 0.2)) + "", "rgb(102, 102, 0)"); + assert.strictEqual(lab(hsl(60, 1, 0.2, 0.4)) + "", "rgba(102, 102, 0, 0.4)"); }); -tape("lab.toString() reflects l, a and b channel values and opacity", function(test) { - var c = color.lab("#abc"); +it("lab.toString() reflects l, a and b channel values and opacity", () => { + const c = lab("#abc"); c.l += 10, c.a -= 10, c.b += 10, c.opacity = 0.4; - test.equal(c + "", "rgba(184, 220, 213, 0.4)"); - test.end(); + assert.strictEqual(c + "", "rgba(184, 220, 213, 0.4)"); }); -tape("lab.toString() treats undefined channel values as 0", function(test) { - test.equal(color.lab("invalid") + "", "rgb(0, 0, 0)"); - test.equal(color.lab(NaN, 0, 0) + "", "rgb(0, 0, 0)"); - test.equal(color.lab(50, NaN, 0) + "", "rgb(119, 119, 119)"); - test.equal(color.lab(50, 0, NaN) + "", "rgb(119, 119, 119)"); - test.equal(color.lab(50, NaN, NaN) + "", "rgb(119, 119, 119)"); - test.end(); +it("lab.toString() treats undefined channel values as 0", () => { + assert.strictEqual(lab("invalid") + "", "rgb(0, 0, 0)"); + assert.strictEqual(lab(NaN, 0, 0) + "", "rgb(0, 0, 0)"); + assert.strictEqual(lab(50, NaN, 0) + "", "rgb(119, 119, 119)"); + assert.strictEqual(lab(50, 0, NaN) + "", "rgb(119, 119, 119)"); + assert.strictEqual(lab(50, NaN, NaN) + "", "rgb(119, 119, 119)"); }); -tape("lab.toString() treats undefined opacity as 1", function(test) { - var c = color.lab("#abc"); +it("lab.toString() treats undefined opacity as 1", () => { + const c = lab("#abc"); c.opacity = NaN; - test.equal(c + "", "rgb(170, 187, 204)"); - test.end(); + assert.strictEqual(c + "", "rgb(170, 187, 204)"); }); -tape("lab(l, a, b) does not clamp l channel value", function(test) { - test.labEqual(color.lab(-10, 1, 2), -10, 1, 2, 1); - test.labEqual(color.lab(0, 1, 2), 0, 1, 2, 1); - test.labEqual(color.lab(100, 1, 2), 100, 1, 2, 1); - test.labEqual(color.lab(110, 1, 2), 110, 1, 2, 1); - test.end(); +it("lab(l, a, b) does not clamp l channel value", () => { + assertLabEqual(lab(-10, 1, 2), -10, 1, 2, 1); + assertLabEqual(lab(0, 1, 2), 0, 1, 2, 1); + assertLabEqual(lab(100, 1, 2), 100, 1, 2, 1); + assertLabEqual(lab(110, 1, 2), 110, 1, 2, 1); }); -tape("lab(l, a, b, opacity) does not clamp opacity to [0,1]", function(test) { - test.labEqual(color.lab(50, 10, 20, -0.2), 50, 10, 20, -0.2); - test.labEqual(color.lab(50, 10, 20, 1.2), 50, 10, 20, 1.2); - test.end(); +it("lab(l, a, b, opacity) does not clamp opacity to [0,1]", () => { + assertLabEqual(lab(50, 10, 20, -0.2), 50, 10, 20, -0.2); + assertLabEqual(lab(50, 10, 20, 1.2), 50, 10, 20, 1.2); }); -tape("lab(l, a, b) coerces channel values to numbers", function(test) { - test.labEqual(color.lab("50", "4", "-5"), 50, 4, -5, 1); - test.end(); +it("lab(l, a, b) coerces channel values to numbers", () => { + assertLabEqual(lab("50", "4", "-5"), 50, 4, -5, 1); }); -tape("lab(l, a, b, opacity) coerces opacity to number", function(test) { - test.labEqual(color.lab(50, 4, -5, "0.2"), 50, 4, -5, 0.2); - test.end(); +it("lab(l, a, b, opacity) coerces opacity to number", () => { + assertLabEqual(lab(50, 4, -5, "0.2"), 50, 4, -5, 0.2); }); -tape("lab(l, a, b) allows undefined channel values", function(test) { - test.labEqual(color.lab(undefined, NaN, "foo"), NaN, NaN, NaN, 1); - test.labEqual(color.lab(undefined, 4, -5), NaN, 4, -5, 1); - test.labEqual(color.lab(42, undefined, -5), 42, NaN, -5, 1); - test.labEqual(color.lab(42, 4, undefined), 42, 4, NaN, 1); - test.end(); +it("lab(l, a, b) allows undefined channel values", () => { + assertLabEqual(lab(undefined, NaN, "foo"), NaN, NaN, NaN, 1); + assertLabEqual(lab(undefined, 4, -5), NaN, 4, -5, 1); + assertLabEqual(lab(42, undefined, -5), 42, NaN, -5, 1); + assertLabEqual(lab(42, 4, undefined), 42, 4, NaN, 1); }); -tape("lab(l, a, b, opacity) converts undefined opacity to 1", function(test) { - test.labEqual(color.lab(10, 20, 30, null), 10, 20, 30, 1); - test.labEqual(color.lab(10, 20, 30, undefined), 10, 20, 30, 1); - test.end(); +it("lab(l, a, b, opacity) converts undefined opacity to 1", () => { + assertLabEqual(lab(10, 20, 30, null), 10, 20, 30, 1); + assertLabEqual(lab(10, 20, 30, undefined), 10, 20, 30, 1); }); -tape("lab(format) parses the specified format and converts to Lab", function(test) { - test.labEqual(color.lab("#abcdef"), 80.77135418262527, -5.957098328496224, -20.785782794739237, 1); - test.labEqual(color.lab("#abc"), 74.96879980931759, -3.398998724348956, -10.696507207853333, 1); - test.labEqual(color.lab("rgb(12, 34, 56)"), 12.404844123471648, -2.159950219712034, -17.168132391132946, 1); - test.labEqual(color.lab("rgb(12%, 34%, 56%)"), 35.48300043476593, -2.507637675606522, -36.95112983195855, 1); - test.labEqual(color.lab("rgba(12%, 34%, 56%, 0.4)"), 35.48300043476593, -2.507637675606522, -36.95112983195855, 0.4); - test.labEqual(color.lab("hsl(60,100%,20%)"), 41.97125732118659, -8.03835128380484, 47.65411917854332, 1); - test.labEqual(color.lab("hsla(60,100%,20%,0.4)"), 41.97125732118659, -8.03835128380484, 47.65411917854332, 0.4); - test.labEqual(color.lab("aliceblue"), 97.12294991108756, -1.773836604137824, -4.332680308569969, 1); - test.end(); +it("lab(format) parses the specified format and converts to Lab", () => { + assertLabEqual(lab("#abcdef"), 80.77135418262527, -5.957098328496224, -20.785782794739237, 1); + assertLabEqual(lab("#abc"), 74.96879980931759, -3.398998724348956, -10.696507207853333, 1); + assertLabEqual(lab("rgb(12, 34, 56)"), 12.404844123471648, -2.159950219712034, -17.168132391132946, 1); + assertLabEqual(lab("rgb(12%, 34%, 56%)"), 35.48300043476593, -2.507637675606522, -36.95112983195855, 1); + assertLabEqual(lab("rgba(12%, 34%, 56%, 0.4)"), 35.48300043476593, -2.507637675606522, -36.95112983195855, 0.4); + assertLabEqual(lab("hsl(60,100%,20%)"), 41.97125732118659, -8.03835128380484, 47.65411917854332, 1); + assertLabEqual(lab("hsla(60,100%,20%,0.4)"), 41.97125732118659, -8.03835128380484, 47.65411917854332, 0.4); + assertLabEqual(lab("aliceblue"), 97.12294991108756, -1.773836604137824, -4.332680308569969, 1); }); -tape("lab(format) returns undefined channel values for unknown formats", function(test) { - test.labEqual(color.lab("invalid"), NaN, NaN, NaN, NaN); - test.end(); +it("lab(format) returns undefined channel values for unknown formats", () => { + assertLabEqual(lab("invalid"), NaN, NaN, NaN, NaN); }); -tape("lab(lab) copies a Lab color", function(test) { - var c1 = color.lab(50, 4, -5, 0.4), - c2 = color.lab(c1); - test.labEqual(c1, 50, 4, -5, 0.4); +it("lab(lab) copies a Lab color", () => { + const c1 = lab(50, 4, -5, 0.4); + const c2 = lab(c1); + assertLabEqual(c1, 50, 4, -5, 0.4); c1.l = c1.a = c1.b = c1.opacity = 0; - test.labEqual(c1, 0, 0, 0, 0); - test.labEqual(c2, 50, 4, -5, 0.4); - test.end(); + assertLabEqual(c1, 0, 0, 0, 0); + assertLabEqual(c2, 50, 4, -5, 0.4); }); -tape("lab(hcl(lab)) doesn’t lose a and b channels if luminance is zero", function(test) { - test.labEqual(color.lab(color.hcl(color.lab(0, 10, 0))), 0, 10, 0, 1); - test.end(); +it("lab(hcl(lab)) doesn’t lose a and b channels if luminance is zero", () => { + assertLabEqual(lab(hcl(lab(0, 10, 0))), 0, 10, 0, 1); }); -tape("lab(rgb) converts from RGB", function(test) { - test.labEqual(color.lab(color.rgb(255, 0, 0, 0.4)), 54.29173376861782, 80.8124553179771, 69.88504032350531, 0.4); - test.end(); +it("lab(rgb) converts from RGB", () => { + assertLabEqual(lab(rgb(255, 0, 0, 0.4)), 54.29173376861782, 80.8124553179771, 69.88504032350531, 0.4); }); -tape("lab(color) converts from another colorspace via color.rgb()", function(test) { +it("lab(color) converts from another colorspace via rgb()", () => { function TestColor() {} - TestColor.prototype = Object.create(color.color.prototype); - TestColor.prototype.rgb = function() { return color.rgb(12, 34, 56, 0.4); }; + TestColor.prototype = Object.create(color.prototype); + TestColor.prototype.rgb = function() { return rgb(12, 34, 56, 0.4); }; TestColor.prototype.toString = function() { throw new Error("should use rgb, not toString"); }; - test.labEqual(color.lab(new TestColor), 12.404844123471648, -2.159950219712034, -17.168132391132946, 0.4); - test.end(); + assertLabEqual(lab(new TestColor), 12.404844123471648, -2.159950219712034, -17.168132391132946, 0.4); }); -tape("lab.brighter(k) returns a brighter color if k > 0", function(test) { - var c = color.lab("rgba(165, 42, 42, 0.4)"); - test.labEqual(c.brighter(0.5), 47.149667346714935, 50.388769337115, 31.834059255569358, 0.4); - test.labEqual(c.brighter(1), 56.149667346714935, 50.388769337115, 31.834059255569358, 0.4); - test.labEqual(c.brighter(2), 74.14966734671493, 50.388769337115, 31.834059255569358, 0.4); - test.end(); +it("lab.brighter(k) returns a brighter color if k > 0", () => { + const c = lab("rgba(165, 42, 42, 0.4)"); + assertLabEqual(c.brighter(0.5), 47.149667346714935, 50.388769337115, 31.834059255569358, 0.4); + assertLabEqual(c.brighter(1), 56.149667346714935, 50.388769337115, 31.834059255569358, 0.4); + assertLabEqual(c.brighter(2), 74.14966734671493, 50.388769337115, 31.834059255569358, 0.4); }); -tape("lab.brighter(k) returns a copy", function(test) { - var c1 = color.lab("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(1); - test.labEqual(c1, 51.98624890550498, -8.362792037014344, -32.832699449697685, 0.4); - test.labEqual(c2, 69.98624890550498, -8.362792037014344, -32.832699449697685, 0.4); - test.end(); +it("lab.brighter(k) returns a copy", () => { + const c1 = lab("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(1); + assertLabEqual(c1, 51.98624890550498, -8.362792037014344, -32.832699449697685, 0.4); + assertLabEqual(c2, 69.98624890550498, -8.362792037014344, -32.832699449697685, 0.4); }); -tape("lab.brighter() is equivalent to lab.brighter(1)", function(test) { - var c1 = color.lab("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(), - c3 = c1.brighter(1); - test.labEqual(c2, c3.l, c3.a, c3.b, 0.4); - test.end(); +it("lab.brighter() is equivalent to lab.brighter(1)", () => { + const c1 = lab("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(); + const c3 = c1.brighter(1); + assertLabEqual(c2, c3.l, c3.a, c3.b, 0.4); }); -tape("lab.brighter(k) is equivalent to lab.darker(-k)", function(test) { - var c1 = color.lab("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(1.5), - c3 = c1.darker(-1.5); - test.labEqual(c2, c3.l, c3.a, c3.b, 0.4); - test.end(); +it("lab.brighter(k) is equivalent to lab.darker(-k)", () => { + const c1 = lab("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(1.5); + const c3 = c1.darker(-1.5); + assertLabEqual(c2, c3.l, c3.a, c3.b, 0.4); }); -tape("lab.darker(k) returns a darker color if k > 0", function(test) { - var c = color.lab("rgba(165, 42, 42, 0.4)"); - test.labEqual(c.darker(0.5), 29.149667346714935, 50.388769337115, 31.834059255569358, 0.4); - test.labEqual(c.darker(1), 20.149667346714935, 50.388769337115, 31.834059255569358, 0.4); - test.labEqual(c.darker(2), 2.149667346714935, 50.388769337115, 31.834059255569358, 0.4); - test.end(); +it("lab.darker(k) returns a darker color if k > 0", () => { + const c = lab("rgba(165, 42, 42, 0.4)"); + assertLabEqual(c.darker(0.5), 29.149667346714935, 50.388769337115, 31.834059255569358, 0.4); + assertLabEqual(c.darker(1), 20.149667346714935, 50.388769337115, 31.834059255569358, 0.4); + assertLabEqual(c.darker(2), 2.149667346714935, 50.388769337115, 31.834059255569358, 0.4); }); -tape("lab.darker(k) returns a copy", function(test) { - var c1 = color.lab("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(1); - test.labEqual(c1, 51.98624890550498, -8.362792037014344, -32.832699449697685, 0.4); - test.labEqual(c2, 33.98624890550498, -8.362792037014344, -32.832699449697685, 0.4); - test.end(); +it("lab.darker(k) returns a copy", () => { + const c1 = lab("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(1); + assertLabEqual(c1, 51.98624890550498, -8.362792037014344, -32.832699449697685, 0.4); + assertLabEqual(c2, 33.98624890550498, -8.362792037014344, -32.832699449697685, 0.4); }); -tape("lab.darker() is equivalent to lab.darker(1)", function(test) { - var c1 = color.lab("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(), - c3 = c1.darker(1); - test.labEqual(c2, c3.l, c3.a, c3.b, 0.4); - test.end(); +it("lab.darker() is equivalent to lab.darker(1)", () => { + const c1 = lab("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(); + const c3 = c1.darker(1); + assertLabEqual(c2, c3.l, c3.a, c3.b, 0.4); }); -tape("lab.darker(k) is equivalent to lab.brighter(-k)", function(test) { - var c1 = color.lab("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(1.5), - c3 = c1.brighter(-1.5); - test.labEqual(c2, c3.l, c3.a, c3.b, 0.4); - test.end(); +it("lab.darker(k) is equivalent to lab.brighter(-k)", () => { + const c1 = lab("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(1.5); + const c3 = c1.brighter(-1.5); + assertLabEqual(c2, c3.l, c3.a, c3.b, 0.4); }); -tape("lab.rgb() converts to RGB", function(test) { - var c = color.lab(50, 4, -5, 0.4); - test.rgbEqual(c.rgb(), 123, 117, 128, 0.4); - test.end(); +it("lab.rgb() converts to RGB", () => { + const c = lab(50, 4, -5, 0.4); + assertRgbApproxEqual(c.rgb(), 123, 117, 128, 0.4); }); diff --git a/test/labEqual.js b/test/labEqual.js deleted file mode 100644 index efd00d7..0000000 --- a/test/labEqual.js +++ /dev/null @@ -1,15 +0,0 @@ -var tape = require("tape"), - color = require("../"); - -tape.Test.prototype.labEqual = function(actual, l, a, b, opacity) { - this._assert(actual instanceof color.lab - && (isNaN(l) ? isNaN(actual.l) && actual.l !== actual.l : l - 1e-6 <= actual.l && actual.l <= l + 1e-6) - && (isNaN(a) ? isNaN(actual.a) && actual.a !== actual.a : a - 1e-6 <= actual.a && actual.a <= a + 1e-6) - && (isNaN(b) ? isNaN(actual.b) && actual.b !== actual.b : b - 1e-6 <= actual.b && actual.b <= b + 1e-6) - && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity), { - message: "should be equal", - operator: "labEqual", - actual: [actual.l, actual.a, actual.b, actual.opacity], - expected: [l, a, b, opacity] - }); -}; diff --git a/test/lch-test.js b/test/lch-test.js index 3f401f0..8093998 100644 --- a/test/lch-test.js +++ b/test/lch-test.js @@ -1,19 +1,15 @@ -var tape = require("tape"), - color = require("../"); +import {lch, rgb} from "../src/index.js"; +import {assertHclEqual} from "./asserts.js"; -require("./hclEqual"); - -tape("lch(color) is equivalent to hcl(color)", function(test) { - test.hclEqual(color.lch("#abc"), 252.37145234745182, 11.223567114593477, 74.96879980931759, 1); - test.hclEqual(color.lch(color.rgb("#abc")), 252.37145234745182, 11.223567114593477, 74.96879980931759, 1); - test.end(); +it("lch(color) is equivalent to hcl(color)", () => { + assertHclEqual(lch("#abc"), 252.37145234745182, 11.223567114593477, 74.96879980931759, 1); + assertHclEqual(lch(rgb("#abc")), 252.37145234745182, 11.223567114593477, 74.96879980931759, 1); }); -tape("lch(l, c, h[, opacity]) is equivalent to hcl(h, c, l[, opacity])", function(test) { - test.hclEqual(color.lch(74, 11, 252), 252, 11, 74, 1); - test.hclEqual(color.lch(74, 11, 252), 252, 11, 74, 1); - test.hclEqual(color.lch(74, 11, 252, null), 252, 11, 74, 1); - test.hclEqual(color.lch(74, 11, 252, undefined), 252, 11, 74, 1); - test.hclEqual(color.lch(74, 11, 252, 0.5), 252, 11, 74, 0.5); - test.end(); +it("lch(l, c, h[, opacity]) is equivalent to hcl(h, c, l[, opacity])", () => { + assertHclEqual(lch(74, 11, 252), 252, 11, 74, 1); + assertHclEqual(lch(74, 11, 252), 252, 11, 74, 1); + assertHclEqual(lch(74, 11, 252, null), 252, 11, 74, 1); + assertHclEqual(lch(74, 11, 252, undefined), 252, 11, 74, 1); + assertHclEqual(lch(74, 11, 252, 0.5), 252, 11, 74, 0.5); }); diff --git a/test/rgb-test.js b/test/rgb-test.js index a62709f..32ebdf2 100644 --- a/test/rgb-test.js +++ b/test/rgb-test.js @@ -1,291 +1,253 @@ -var tape = require("tape"), - color = require("../"); +import assert from "assert"; +import {color, hsl, rgb} from "../src/index.js"; +import {assertRgbApproxEqual, assertRgbEqual} from "./asserts.js"; -require("./rgbEqual"); - -tape("rgb(…) returns an instance of rgb and color", function(test) { - var c = color.rgb(70, 130, 180); - test.ok(c instanceof color.rgb); - test.ok(c instanceof color.color); - test.end(); +it("rgb(…) returns an instance of rgb and color", () => { + const c = rgb(70, 130, 180); + assert(c instanceof rgb); + assert(c instanceof color); }); -tape("rgb(…) exposes r, g and b channel values and opacity", function(test) { - test.rgbEqual(color.rgb("#abc"), 170, 187, 204, 1); - test.rgbEqual(color.rgb("rgba(170, 187, 204, 0.4)"), 170, 187, 204, 0.4); - test.end(); +it("rgb(…) exposes r, g and b channel values and opacity", () => { + assertRgbApproxEqual(rgb("#abc"), 170, 187, 204, 1); + assertRgbApproxEqual(rgb("rgba(170, 187, 204, 0.4)"), 170, 187, 204, 0.4); }); -tape("rgb.toString() formats as rgb(…) or rgba(…)", function(test) { - test.equal(color.rgb("#abcdef") + "", "rgb(171, 205, 239)"); - test.equal(color.rgb("moccasin") + "", "rgb(255, 228, 181)"); - test.equal(color.rgb("hsl(60, 100%, 20%)") + "", "rgb(102, 102, 0)"); - test.equal(color.rgb("rgb(12, 34, 56)") + "", "rgb(12, 34, 56)"); - test.equal(color.rgb(color.rgb(12, 34, 56)) + "", "rgb(12, 34, 56)"); - test.equal(color.rgb(color.hsl(60, 1, 0.2)) + "", "rgb(102, 102, 0)"); - test.equal(color.rgb("rgba(12, 34, 56, 0.4)") + "", "rgba(12, 34, 56, 0.4)"); - test.equal(color.rgb("rgba(12%, 34%, 56%, 0.4)") + "", "rgba(31, 87, 143, 0.4)"); - test.equal(color.rgb("hsla(60, 100%, 20%, 0.4)") + "", "rgba(102, 102, 0, 0.4)"); - test.end(); +it("rgb.toString() formats as rgb(…) or rgba(…)", () => { + assert.strictEqual(rgb("#abcdef") + "", "rgb(171, 205, 239)"); + assert.strictEqual(rgb("moccasin") + "", "rgb(255, 228, 181)"); + assert.strictEqual(rgb("hsl(60, 100%, 20%)") + "", "rgb(102, 102, 0)"); + assert.strictEqual(rgb("rgb(12, 34, 56)") + "", "rgb(12, 34, 56)"); + assert.strictEqual(rgb(rgb(12, 34, 56)) + "", "rgb(12, 34, 56)"); + assert.strictEqual(rgb(hsl(60, 1, 0.2)) + "", "rgb(102, 102, 0)"); + assert.strictEqual(rgb("rgba(12, 34, 56, 0.4)") + "", "rgba(12, 34, 56, 0.4)"); + assert.strictEqual(rgb("rgba(12%, 34%, 56%, 0.4)") + "", "rgba(31, 87, 143, 0.4)"); + assert.strictEqual(rgb("hsla(60, 100%, 20%, 0.4)") + "", "rgba(102, 102, 0, 0.4)"); }); -tape("rgb.formatRgb() formats as rgb(…) or rgba(…)", function(test) { - test.equal(color.rgb("#abcdef").formatRgb(), "rgb(171, 205, 239)"); - test.equal(color.rgb("hsl(60, 100%, 20%)").formatRgb(), "rgb(102, 102, 0)"); - test.equal(color.rgb("rgba(12%, 34%, 56%, 0.4)").formatRgb(), "rgba(31, 87, 143, 0.4)"); - test.equal(color.rgb("hsla(60, 100%, 20%, 0.4)").formatRgb(), "rgba(102, 102, 0, 0.4)"); - test.end(); +it("rgb.formatRgb() formats as rgb(…) or rgba(…)", () => { + assert.strictEqual(rgb("#abcdef").formatRgb(), "rgb(171, 205, 239)"); + assert.strictEqual(rgb("hsl(60, 100%, 20%)").formatRgb(), "rgb(102, 102, 0)"); + assert.strictEqual(rgb("rgba(12%, 34%, 56%, 0.4)").formatRgb(), "rgba(31, 87, 143, 0.4)"); + assert.strictEqual(rgb("hsla(60, 100%, 20%, 0.4)").formatRgb(), "rgba(102, 102, 0, 0.4)"); }); -tape("rgb.formatHsl() formats as hsl(…) or hsla(…)", function(test) { - test.equal(color.rgb("#abcdef").formatHsl(), "hsl(210, 68%, 80.3921568627451%)"); - test.equal(color.rgb("hsl(60, 100%, 20%)").formatHsl(), "hsl(60, 100%, 20%)"); - test.equal(color.rgb("rgba(12%, 34%, 56%, 0.4)").formatHsl(), "hsla(210, 64.70588235294117%, 34%, 0.4)"); - test.equal(color.rgb("hsla(60, 100%, 20%, 0.4)").formatHsl(), "hsla(60, 100%, 20%, 0.4)"); - test.end(); +it("rgb.formatHsl() formats as hsl(…) or hsla(…)", () => { + assert.strictEqual(rgb("#abcdef").formatHsl(), "hsl(210, 68%, 80.3921568627451%)"); + assert.strictEqual(rgb("hsl(60, 100%, 20%)").formatHsl(), "hsl(60, 100%, 20%)"); + assert.strictEqual(rgb("rgba(12%, 34%, 56%, 0.4)").formatHsl(), "hsla(210, 64.70588235294117%, 34%, 0.4)"); + assert.strictEqual(rgb("hsla(60, 100%, 20%, 0.4)").formatHsl(), "hsla(60, 100%, 20%, 0.4)"); }); -tape("rgb.formatHex() formats as #rrggbb", function(test) { - test.equal(color.rgb("#abcdef").formatHex(), "#abcdef"); - test.equal(color.rgb("hsl(60, 100%, 20%)").formatHex(), "#666600"); - test.equal(color.rgb("rgba(12%, 34%, 56%, 0.4)").formatHex(), "#1f578f"); - test.equal(color.rgb("hsla(60, 100%, 20%, 0.4)").formatHex(), "#666600"); - test.end(); +it("rgb.formatHex() formats as #rrggbb", () => { + assert.strictEqual(rgb("#abcdef").formatHex(), "#abcdef"); + assert.strictEqual(rgb("hsl(60, 100%, 20%)").formatHex(), "#666600"); + assert.strictEqual(rgb("rgba(12%, 34%, 56%, 0.4)").formatHex(), "#1f578f"); + assert.strictEqual(rgb("hsla(60, 100%, 20%, 0.4)").formatHex(), "#666600"); }); -tape("rgb.hex() is an alias for rgb.formatHex()", function(test) { - test.equal(color.color.prototype.hex, color.color.prototype.formatHex); - test.equal(color.rgb.prototype.hex, color.rgb.prototype.formatHex); - test.end(); +it("rgb.hex() is an alias for rgb.formatHex()", () => { + assert.strictEqual(color.prototype.hex, color.prototype.formatHex); + assert.strictEqual(rgb.prototype.hex, rgb.prototype.formatHex); }); -tape("rgb.toString() reflects r, g and b channel values and opacity", function(test) { - var c = color.rgb("#abc"); +it("rgb.toString() reflects r, g and b channel values and opacity", () => { + const c = rgb("#abc"); ++c.r, ++c.g, ++c.b, c.opacity = 0.5; - test.equal(c + "", "rgba(171, 188, 205, 0.5)"); - test.end(); + assert.strictEqual(c + "", "rgba(171, 188, 205, 0.5)"); }); -tape("rgb.toString() treats undefined channel values as 0", function(test) { - test.equal(color.rgb("invalid") + "", "rgb(0, 0, 0)"); - test.equal(color.rgb(NaN, 12, 34) + "", "rgb(0, 12, 34)"); - test.end(); +it("rgb.toString() treats undefined channel values as 0", () => { + assert.strictEqual(rgb("invalid") + "", "rgb(0, 0, 0)"); + assert.strictEqual(rgb(NaN, 12, 34) + "", "rgb(0, 12, 34)"); }); -tape("rgb.toString() treats undefined opacity as 1", function(test) { - var c = color.rgb("#abc"); +it("rgb.toString() treats undefined opacity as 1", () => { + const c = rgb("#abc"); ++c.r, ++c.g, ++c.b, c.opacity = NaN; - test.equal(c + "", "rgb(171, 188, 205)"); - test.end(); + assert.strictEqual(c + "", "rgb(171, 188, 205)"); }); -tape("rgb.toString() clamps r, g, b and opacity channel values", function(test) { - test.equal(color.rgb(-1, 2, 3) + "", "rgb(0, 2, 3)"); - test.equal(color.rgb( 2, -1, 3) + "", "rgb(2, 0, 3)"); - test.equal(color.rgb( 2, 3, -1) + "", "rgb(2, 3, 0)"); - test.equal(color.rgb( 2, 3, -1, -0.2) + "", "rgba(2, 3, 0, 0)"); - test.equal(color.rgb( 2, 3, -1, 1.2) + "", "rgb(2, 3, 0)"); - test.end(); +it("rgb.toString() clamps r, g, b and opacity channel values", () => { + assert.strictEqual(rgb(-1, 2, 3) + "", "rgb(0, 2, 3)"); + assert.strictEqual(rgb( 2, -1, 3) + "", "rgb(2, 0, 3)"); + assert.strictEqual(rgb( 2, 3, -1) + "", "rgb(2, 3, 0)"); + assert.strictEqual(rgb( 2, 3, -1, -0.2) + "", "rgba(2, 3, 0, 0)"); + assert.strictEqual(rgb( 2, 3, -1, 1.2) + "", "rgb(2, 3, 0)"); }); -tape("rgb.toString() rounds r, g and b channel values", function(test) { - test.equal(color.rgb(0.5, 2.0, 3.0) + "", "rgb(1, 2, 3)"); - test.equal(color.rgb(2.0, 0.5, 3.0) + "", "rgb(2, 1, 3)"); - test.equal(color.rgb(2.0, 3.0, 0.5) + "", "rgb(2, 3, 1)"); - test.end(); +it("rgb.toString() rounds r, g and b channel values", () => { + assert.strictEqual(rgb(0.5, 2.0, 3.0) + "", "rgb(1, 2, 3)"); + assert.strictEqual(rgb(2.0, 0.5, 3.0) + "", "rgb(2, 1, 3)"); + assert.strictEqual(rgb(2.0, 3.0, 0.5) + "", "rgb(2, 3, 1)"); }); -tape("rgb(r, g, b) does not round channel values", function(test) { - test.rgbStrictEqual(color.rgb(1.2, 2.6, 42.9), 1.2, 2.6, 42.9, 1); - test.end(); +it("rgb(r, g, b) does not round channel values", () => { + assertRgbEqual(rgb(1.2, 2.6, 42.9), 1.2, 2.6, 42.9, 1); }); -tape("rgb(r, g, b) does not clamp channel values", function(test) { - test.rgbEqual(color.rgb(-10, -20, -30), -10, -20, -30, 1); - test.rgbEqual(color.rgb(300, 400, 500), 300, 400, 500, 1); - test.end(); +it("rgb(r, g, b) does not clamp channel values", () => { + assertRgbApproxEqual(rgb(-10, -20, -30), -10, -20, -30, 1); + assertRgbApproxEqual(rgb(300, 400, 500), 300, 400, 500, 1); }); -tape("rgb(r, g, b, opacity) does not clamp opacity", function(test) { - test.rgbEqual(color.rgb(-10, -20, -30, -0.2), -10, -20, -30, -0.2); - test.rgbEqual(color.rgb(300, 400, 500, 1.2), 300, 400, 500, 1.2); - test.end(); +it("rgb(r, g, b, opacity) does not clamp opacity", () => { + assertRgbApproxEqual(rgb(-10, -20, -30, -0.2), -10, -20, -30, -0.2); + assertRgbApproxEqual(rgb(300, 400, 500, 1.2), 300, 400, 500, 1.2); }); -tape("rgb(r, g, b) coerces channel values to numbers", function(test) { - test.rgbEqual(color.rgb("12", "34", "56"), 12, 34, 56, 1); - test.rgbEqual(color.rgb(null, null, null), 0, 0, 0, 1); - test.end(); +it("rgb(r, g, b) coerces channel values to numbers", () => { + assertRgbApproxEqual(rgb("12", "34", "56"), 12, 34, 56, 1); + assertRgbApproxEqual(rgb(null, null, null), 0, 0, 0, 1); }); -tape("rgb(r, g, b, opacity) coerces opacity to number", function(test) { - test.rgbStrictEqual(color.rgb(-10, -20, -30, "-0.2"), -10, -20, -30, -0.2); - test.rgbStrictEqual(color.rgb(300, 400, 500, "1.2"), 300, 400, 500, 1.2); - test.end(); +it("rgb(r, g, b, opacity) coerces opacity to number", () => { + assertRgbEqual(rgb(-10, -20, -30, "-0.2"), -10, -20, -30, -0.2); + assertRgbEqual(rgb(300, 400, 500, "1.2"), 300, 400, 500, 1.2); }); -tape("rgb(r, g, b) allows undefined channel values", function(test) { - test.rgbEqual(color.rgb(undefined, NaN, "foo"), NaN, NaN, NaN, 1); - test.rgbEqual(color.rgb(undefined, 42, 56), NaN, 42, 56, 1); - test.rgbEqual(color.rgb(42, undefined, 56), 42, NaN, 56, 1); - test.rgbEqual(color.rgb(42, 56, undefined), 42, 56, NaN, 1); - test.end(); +it("rgb(r, g, b) allows undefined channel values", () => { + assertRgbApproxEqual(rgb(undefined, NaN, "foo"), NaN, NaN, NaN, 1); + assertRgbApproxEqual(rgb(undefined, 42, 56), NaN, 42, 56, 1); + assertRgbApproxEqual(rgb(42, undefined, 56), 42, NaN, 56, 1); + assertRgbApproxEqual(rgb(42, 56, undefined), 42, 56, NaN, 1); }); -tape("rgb(r, g, b, opacity) converts undefined opacity to 1", function(test) { - test.rgbEqual(color.rgb(10, 20, 30, null), 10, 20, 30, 1); - test.rgbEqual(color.rgb(10, 20, 30, undefined), 10, 20, 30, 1); - test.end(); +it("rgb(r, g, b, opacity) converts undefined opacity to 1", () => { + assertRgbApproxEqual(rgb(10, 20, 30, null), 10, 20, 30, 1); + assertRgbApproxEqual(rgb(10, 20, 30, undefined), 10, 20, 30, 1); }); -tape("rgb(format) parses the specified format and converts to RGB", function(test) { - test.rgbEqual(color.rgb("#abcdef"), 171, 205, 239, 1); - test.rgbEqual(color.rgb("#abc"), 170, 187, 204, 1); - test.rgbEqual(color.rgb("rgb(12, 34, 56)"), 12, 34, 56, 1); - test.rgbEqual(color.rgb("rgb(12%, 34%, 56%)"), 31, 87, 143, 1); - test.rgbEqual(color.rgb("hsl(60,100%,20%)"), 102, 102, 0, 1); - test.rgbEqual(color.rgb("aliceblue"), 240, 248, 255, 1); - test.rgbEqual(color.rgb("hsla(60,100%,20%,0.4)"), 102, 102, 0, 0.4); - test.end(); +it("rgb(format) parses the specified format and converts to RGB", () => { + assertRgbApproxEqual(rgb("#abcdef"), 171, 205, 239, 1); + assertRgbApproxEqual(rgb("#abc"), 170, 187, 204, 1); + assertRgbApproxEqual(rgb("rgb(12, 34, 56)"), 12, 34, 56, 1); + assertRgbApproxEqual(rgb("rgb(12%, 34%, 56%)"), 31, 87, 143, 1); + assertRgbApproxEqual(rgb("hsl(60,100%,20%)"), 102, 102, 0, 1); + assertRgbApproxEqual(rgb("aliceblue"), 240, 248, 255, 1); + assertRgbApproxEqual(rgb("hsla(60,100%,20%,0.4)"), 102, 102, 0, 0.4); }); -tape("rgb(format) ignores all channels if the alpha is <= 0", function(test) { - test.rgbEqual(color.rgb("rgba(12,34,45,0)"), NaN, NaN, NaN, 0); - test.rgbEqual(color.rgb("rgba(12,34,45,-0.1)"), NaN, NaN, NaN, -0.1); - test.end(); +it("rgb(format) ignores all channels if the alpha is <= 0", () => { + assertRgbApproxEqual(rgb("rgba(12,34,45,0)"), NaN, NaN, NaN, 0); + assertRgbApproxEqual(rgb("rgba(12,34,45,-0.1)"), NaN, NaN, NaN, -0.1); }); -tape("rgb(format) returns undefined channel values for unknown formats", function(test) { - test.rgbEqual(color.rgb("invalid"), NaN, NaN, NaN, NaN); - test.end(); +it("rgb(format) returns undefined channel values for unknown formats", () => { + assertRgbApproxEqual(rgb("invalid"), NaN, NaN, NaN, NaN); }); -tape("rgb(rgb) copies an RGB color", function(test) { - var c1 = color.rgb("rgba(70, 130, 180, 0.4)"), - c2 = color.rgb(c1); - test.rgbEqual(c1, 70, 130, 180, 0.4); +it("rgb(rgb) copies an RGB color", () => { + const c1 = rgb("rgba(70, 130, 180, 0.4)"); + const c2 = rgb(c1); + assertRgbApproxEqual(c1, 70, 130, 180, 0.4); c1.r = c1.g = c1.b = c1.opacity = 0; - test.rgbEqual(c1, 0, 0, 0, 0); - test.rgbEqual(c2, 70, 130, 180, 0.4); - test.end(); + assertRgbApproxEqual(c1, 0, 0, 0, 0); + assertRgbApproxEqual(c2, 70, 130, 180, 0.4); }); -tape("rgb(hsl) converts from HSL", function(test) { - test.rgbEqual(color.rgb(color.hsl(0, 1, 0.5)), 255, 0, 0, 1); - test.rgbEqual(color.rgb(color.hsl(0, 1, 0.5, 0.4)), 255, 0, 0, 0.4); - test.end(); +it("rgb(hsl) converts from HSL", () => { + assertRgbApproxEqual(rgb(hsl(0, 1, 0.5)), 255, 0, 0, 1); + assertRgbApproxEqual(rgb(hsl(0, 1, 0.5, 0.4)), 255, 0, 0, 0.4); }); -tape("rgb(color) converts from another colorspace via color.rgb()", function(test) { +it("rgb(color) converts from another colorspace via rgb()", () => { function TestColor() {} - TestColor.prototype = Object.create(color.color.prototype); - TestColor.prototype.rgb = function() { return color.rgb(12, 34, 56, 0.4); }; + TestColor.prototype = Object.create(color.prototype); + TestColor.prototype.rgb = function() { return rgb(12, 34, 56, 0.4); }; TestColor.prototype.toString = function() { throw new Error("should use rgb, not toString"); }; - test.rgbEqual(color.rgb(new TestColor), 12, 34, 56, 0.4); - test.end(); -}); - -tape("rgb.displayable() returns true if the color is within the RGB gamut and opacity is in [0,1]", function(test) { - test.equal(color.rgb("white").displayable(), true); - test.equal(color.rgb("red").displayable(), true); - test.equal(color.rgb("black").displayable(), true); - test.equal(color.rgb("invalid").displayable(), false); - test.equal(color.rgb(-1, 0, 0).displayable(), false); - test.equal(color.rgb(0, -1, 0).displayable(), false); - test.equal(color.rgb(0, 0, -1).displayable(), false); - test.equal(color.rgb(256, 0, 0).displayable(), false); - test.equal(color.rgb(0, 256, 0).displayable(), false); - test.equal(color.rgb(0, 0, 256).displayable(), false); - test.equal(color.rgb(0, 0, 255, 0).displayable(), true); - test.equal(color.rgb(0, 0, 255, 1.2).displayable(), false); - test.equal(color.rgb(0, 0, 255, -0.2).displayable(), false); - test.end(); -}); - -tape("rgb.brighter(k) returns a brighter color if k > 0", function(test) { - var c = color.rgb("rgba(165, 42, 42, 0.4)"); - test.rgbEqual(c.brighter(0.5), 197, 50, 50, 0.4); - test.rgbEqual(c.brighter(1), 236, 60, 60, 0.4); - test.rgbEqual(c.brighter(2), 337, 86, 86, 0.4); - test.end(); -}); - -tape("rgb.brighter(k) returns a copy", function(test) { - var c1 = color.rgb("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(1); - test.rgbEqual(c1, 70, 130, 180, 0.4); - test.rgbEqual(c2, 100, 186, 257, 0.4); - test.end(); -}); - -tape("rgb.brighter() is equivalent to rgb.brighter(1)", function(test) { - var c1 = color.rgb("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(), - c3 = c1.brighter(1); - test.rgbEqual(c2, c3.r, c3.g, c3.b, 0.4); - test.end(); -}); - -tape("rgb.brighter(k) is equivalent to rgb.darker(-k)", function(test) { - var c1 = color.rgb("rgba(70, 130, 180, 0.4)"), - c2 = c1.brighter(1.5), - c3 = c1.darker(-1.5); - test.rgbEqual(c2, c3.r, c3.g, c3.b, 0.4); - test.end(); -}); - -tape("rgb(\"black\").brighter() still returns black", function(test) { - var c1 = color.rgb("black"), - c2 = c1.brighter(1); - test.rgbEqual(c1, 0, 0, 0, 1); - test.rgbEqual(c2, 0, 0, 0, 1); - test.end(); -}); - -tape("rgb.darker(k) returns a darker color if k > 0", function(test) { - var c = color.rgb("rgba(165, 42, 42, 0.4)"); - test.rgbEqual(c.darker(0.5), 138, 35, 35, 0.4); - test.rgbEqual(c.darker(1), 115, 29, 29, 0.4); - test.rgbEqual(c.darker(2), 81, 21, 21, 0.4); - test.end(); -}); - -tape("rgb.darker(k) returns a copy", function(test) { - var c1 = color.rgb("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(1); - test.rgbEqual(c1, 70, 130, 180, 0.4); - test.rgbEqual(c2, 49, 91, 126, 0.4); - test.end(); -}); - -tape("rgb.darker() is equivalent to rgb.darker(1)", function(test) { - var c1 = color.rgb("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(), - c3 = c1.darker(1); - test.rgbEqual(c2, c3.r, c3.g, c3.b, 0.4); - test.end(); -}); - -tape("rgb.darker(k) is equivalent to rgb.brighter(-k)", function(test) { - var c1 = color.rgb("rgba(70, 130, 180, 0.4)"), - c2 = c1.darker(1.5), - c3 = c1.brighter(-1.5); - test.rgbEqual(c2, c3.r, c3.g, c3.b, 0.4); - test.end(); -}); - -tape("rgb.rgb() returns this", function(test) { - var c = color.rgb(70, 130, 180); - test.equal(c.rgb(), c); - test.end(); -}); - -tape("rgb.copy(…) returns a new rgb with the specified channel values", function(test) { - var c = color.rgb(70, 130, 180); - test.equal(c.copy() instanceof color.rgb, true); - test.equal(c.copy() + "", "rgb(70, 130, 180)"); - test.equal(c.copy({opacity: 0.2}) + "", "rgba(70, 130, 180, 0.2)"); - test.equal(c.copy({r: 20}) + "", "rgb(20, 130, 180)"); - test.equal(c.copy({r: 20, g: 40}) + "", "rgb(20, 40, 180)"); - test.end(); + assertRgbApproxEqual(rgb(new TestColor), 12, 34, 56, 0.4); +}); + +it("rgb.displayable() returns true if the color is within the RGB gamut and opacity is in [0,1]", () => { + assert.strictEqual(rgb("white").displayable(), true); + assert.strictEqual(rgb("red").displayable(), true); + assert.strictEqual(rgb("black").displayable(), true); + assert.strictEqual(rgb("invalid").displayable(), false); + assert.strictEqual(rgb(-1, 0, 0).displayable(), false); + assert.strictEqual(rgb(0, -1, 0).displayable(), false); + assert.strictEqual(rgb(0, 0, -1).displayable(), false); + assert.strictEqual(rgb(256, 0, 0).displayable(), false); + assert.strictEqual(rgb(0, 256, 0).displayable(), false); + assert.strictEqual(rgb(0, 0, 256).displayable(), false); + assert.strictEqual(rgb(0, 0, 255, 0).displayable(), true); + assert.strictEqual(rgb(0, 0, 255, 1.2).displayable(), false); + assert.strictEqual(rgb(0, 0, 255, -0.2).displayable(), false); +}); + +it("rgb.brighter(k) returns a brighter color if k > 0", () => { + const c = rgb("rgba(165, 42, 42, 0.4)"); + assertRgbApproxEqual(c.brighter(0.5), 197, 50, 50, 0.4); + assertRgbApproxEqual(c.brighter(1), 236, 60, 60, 0.4); + assertRgbApproxEqual(c.brighter(2), 337, 86, 86, 0.4); +}); + +it("rgb.brighter(k) returns a copy", () => { + const c1 = rgb("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(1); + assertRgbApproxEqual(c1, 70, 130, 180, 0.4); + assertRgbApproxEqual(c2, 100, 186, 257, 0.4); +}); + +it("rgb.brighter() is equivalent to rgb.brighter(1)", () => { + const c1 = rgb("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(); + const c3 = c1.brighter(1); + assertRgbApproxEqual(c2, c3.r, c3.g, c3.b, 0.4); +}); + +it("rgb.brighter(k) is equivalent to rgb.darker(-k)", () => { + const c1 = rgb("rgba(70, 130, 180, 0.4)"); + const c2 = c1.brighter(1.5); + const c3 = c1.darker(-1.5); + assertRgbApproxEqual(c2, c3.r, c3.g, c3.b, 0.4); +}); + +it("rgb(\"black\").brighter() still returns black", () => { + const c1 = rgb("black"); + const c2 = c1.brighter(1); + assertRgbApproxEqual(c1, 0, 0, 0, 1); + assertRgbApproxEqual(c2, 0, 0, 0, 1); +}); + +it("rgb.darker(k) returns a darker color if k > 0", () => { + const c = rgb("rgba(165, 42, 42, 0.4)"); + assertRgbApproxEqual(c.darker(0.5), 138, 35, 35, 0.4); + assertRgbApproxEqual(c.darker(1), 115, 29, 29, 0.4); + assertRgbApproxEqual(c.darker(2), 81, 21, 21, 0.4); +}); + +it("rgb.darker(k) returns a copy", () => { + const c1 = rgb("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(1); + assertRgbApproxEqual(c1, 70, 130, 180, 0.4); + assertRgbApproxEqual(c2, 49, 91, 126, 0.4); +}); + +it("rgb.darker() is equivalent to rgb.darker(1)", () => { + const c1 = rgb("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(); + const c3 = c1.darker(1); + assertRgbApproxEqual(c2, c3.r, c3.g, c3.b, 0.4); +}); + +it("rgb.darker(k) is equivalent to rgb.brighter(-k)", () => { + const c1 = rgb("rgba(70, 130, 180, 0.4)"); + const c2 = c1.darker(1.5); + const c3 = c1.brighter(-1.5); + assertRgbApproxEqual(c2, c3.r, c3.g, c3.b, 0.4); +}); + +it("rgb.rgb() returns this", () => { + const c = rgb(70, 130, 180); + assert.strictEqual(c.rgb(), c); +}); + +it("rgb.copy(…) returns a new rgb with the specified channel values", () => { + const c = rgb(70, 130, 180); + assert.strictEqual(c.copy() instanceof rgb, true); + assert.strictEqual(c.copy() + "", "rgb(70, 130, 180)"); + assert.strictEqual(c.copy({opacity: 0.2}) + "", "rgba(70, 130, 180, 0.2)"); + assert.strictEqual(c.copy({r: 20}) + "", "rgb(20, 130, 180)"); + assert.strictEqual(c.copy({r: 20, g: 40}) + "", "rgb(20, 40, 180)"); }); diff --git a/test/rgbEqual.js b/test/rgbEqual.js deleted file mode 100644 index 487dec1..0000000 --- a/test/rgbEqual.js +++ /dev/null @@ -1,28 +0,0 @@ -var tape = require("tape"), - color = require("../"); - -tape.Test.prototype.rgbStrictEqual = function(actual, r, g, b, opacity) { - this._assert(actual instanceof color.rgb - && (isNaN(r) ? isNaN(actual.r) && actual.r !== actual.r : actual.r === r) - && (isNaN(g) ? isNaN(actual.g) && actual.g !== actual.g : actual.g === g) - && (isNaN(b) ? isNaN(actual.b) && actual.b !== actual.b : actual.b === b) - && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity), { - message: "should be equal", - operator: "rgbStrictEqual", - actual: [actual.r, actual.g, actual.b, actual.opacity], - expected: [r, g, b, opacity] - }); -}; - -tape.Test.prototype.rgbEqual = function(actual, r, g, b, opacity) { - this._assert(actual instanceof color.rgb - && (isNaN(r) ? isNaN(actual.r) && actual.r !== actual.r : Math.round(actual.r) === Math.round(r)) - && (isNaN(g) ? isNaN(actual.g) && actual.g !== actual.g : Math.round(actual.g) === Math.round(g)) - && (isNaN(b) ? isNaN(actual.b) && actual.b !== actual.b : Math.round(actual.b) === Math.round(b)) - && (isNaN(opacity) ? isNaN(actual.opacity) && actual.opacity !== actual.opacity : actual.opacity === opacity), { - message: "should be equal", - operator: "rgbEqual", - actual: [Math.round(actual.r), Math.round(actual.g), Math.round(actual.b), actual.opacity], - expected: [Math.round(r), Math.round(g), Math.round(b), opacity] - }); -}; diff --git a/yarn.lock b/yarn.lock index 79cda26..521c82d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,74 +2,126 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: - "@babel/highlight" "^7.0.0" + "@babel/highlight" "^7.10.4" -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== +"@babel/code-frame@^7.10.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@eslint/eslintrc@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" + integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" -"@types/node@^12.6.2": - version "12.6.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c" - integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg== +"@types/node@*": + version "15.12.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.1.tgz#9b60797dee1895383a725f828a869c86c6caa5c2" + integrity sha512-zyxJM8I1c9q5sRMtVF+zdd13Jt6RU4r4qfhTd7lQubyThvLfx6yYekWSQjGCGV2Tkecgxnlpl/DNlb6Hg+dmEw== -acorn-jsx@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" - integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== -acorn@^6.0.7, acorn@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51" - integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q== +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -ajv@^6.10.0, ajv@^6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ajv@^8.0.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" + integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@4.1.1, ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -77,15 +129,25 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== brace-expansion@^1.1.7: version "1.1.11" @@ -95,6 +157,18 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -105,7 +179,12 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -114,22 +193,37 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +chalk@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" color-convert@^1.9.0: version "1.9.3" @@ -138,65 +232,63 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + commander@^2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -debug@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@4.3.1, debug@^4.0.1, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: - ms "^2.1.1" + ms "2.1.2" -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-properties@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== doctrine@^3.0.0: version "3.0.0" @@ -205,228 +297,232 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -es-abstract@^1.5.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + ansi-colors "^4.1.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@6: - version "6.1.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646" - integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ== +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@7: + version "7.28.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.28.0.tgz#435aa17a0b82c13bb2be9d51408b617e49c1e820" + integrity sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g== dependencies: - "@babel/code-frame" "^7.0.0" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.2" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" + chalk "^4.0.0" + cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^6.0.0" - esquery "^1.0.1" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^11.7.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.4.1" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" + levn "^0.4.1" + lodash.merge "^4.6.2" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.2" + optionator "^0.9.1" progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.0.0.tgz#716fc1f5a245ef5b9a7fdb1d7b0d3f02322e75f6" - integrity sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q== +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - escape-string-regexp "^1.0.5" + flat-cache "^3.0.4" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: - flat-cache "^2.0.1" + to-regex-range "^5.0.1" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + locate-path "^6.0.0" + path-exists "^4.0.0" -for-each@~0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - is-callable "^1.1.3" + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -glob-parent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" - integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob-parent@^5.1.2, glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.1.3, glob@~7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -435,44 +531,54 @@ glob@^7.1.3, glob@~7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +glob@^7.1.3: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.6.0, globals@^13.9.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" + integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== + dependencies: + type-fest "^0.20.2" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= - -has@^1.0.1, has@^1.0.3, has@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -import-fresh@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" - integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -490,39 +596,17 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.3, inherits@~2.0.4: +inherits@2: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inquirer@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" - integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -is-callable@^1.1.3, is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" is-extglob@^2.1.1: version "2.1.1" @@ -534,59 +618,58 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-glob@^4.0.0, is-glob@^4.0.1: +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== - dependencies: - has-symbols "^1.0.0" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -jest-worker@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" - integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== dependencies: - merge-stream "^1.0.1" - supports-color "^6.1.0" + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -596,89 +679,127 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + prelude-ls "^1.2.1" + type-check "~0.4.0" -lodash@^4.17.12, lodash@^4.17.14: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: - readable-stream "^2.0.1" + chalk "^4.0.0" -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -ms@^2.1.1: +mocha@8: + version "8.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -object-inspect@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== - -object-keys@^1.0.12: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== once@^1.3.0: version "1.4.0" @@ -687,29 +808,31 @@ once@^1.3.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - mimic-fn "^1.0.0" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" + yocto-queue "^0.1.0" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" parent-module@^1.0.0: version "1.0.1" @@ -718,30 +841,30 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== progress@^2.0.0: version "2.0.3" @@ -753,169 +876,135 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -readable-stream@^2.0.1: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@~1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== - dependencies: - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= - dependencies: - through "~2.3.4" - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -rollup-plugin-terser@5: - version "5.1.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.1.1.tgz#e9d2545ec8d467f96ba99b9216d2285aad8d5b66" - integrity sha512-McIMCDEY8EU6Y839C09UopeRR56wXHGdvKKjlfiZG/GrP6wvZQ62u2ko/Xh1MNH2M9WDL+obAAHySljIZYCuPQ== +rollup-plugin-terser@7: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== dependencies: - "@babel/code-frame" "^7.0.0" - jest-worker "^24.6.0" - rollup-pluginutils "^2.8.1" - serialize-javascript "^1.7.0" - terser "^4.1.0" + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" -rollup-pluginutils@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz#8fa6dd0697344938ef26c2c09d2488ce9e33ce97" - integrity sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg== - dependencies: - estree-walker "^0.6.1" +rollup@2: + version "2.50.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.50.6.tgz#24e2211caf9031081656e98a5e5e94d3b5e786e2" + integrity sha512-6c5CJPLVgo0iNaZWWliNu1Kl43tjP9LZcp6D/tkf2eLH2a9/WeHxg9vfTFl8QV/2SOyaJX37CEm9XuGM0rviUg== + optionalDependencies: + fsevents "~2.3.1" -rollup@1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.17.0.tgz#47ee8b04514544fc93b39bae06271244c8db7dfa" - integrity sha512-k/j1m0NIsI4SYgCJR4MWPstGJOWfJyd6gycKoMhyoKPVXxm+L49XtbUwZyFsrSU2YXsOkM4u1ll9CS/ZgJBUpw== - dependencies: - "@types/estree" "0.0.39" - "@types/node" "^12.6.2" - acorn "^6.2.0" +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= +semver@^7.2.1: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: - is-promise "^2.1.0" + lru-cache "^6.0.0" -rxjs@^6.4.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" - integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: - tslib "^1.9.0" - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^5.5.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== - -semver@^6.1.2: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -serialize-javascript@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" - integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== + randombytes "^2.1.0" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== dependencies: - shebang-regex "^1.0.0" + randombytes "^2.1.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" -signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" -source-map-support@~0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== +source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -string-width@^2.1.0: +"string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -923,30 +1012,14 @@ string-width@^2.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trim@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.0" - function-bind "^1.0.2" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: - safe-buffer "~5.1.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" strip-ansi@^4.0.0: version "4.0.0" @@ -955,17 +1028,24 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== dependencies: - ansi-regex "^4.1.0" + ansi-regex "^5.0.0" -strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" supports-color@^5.3.0: version "5.5.0" @@ -974,117 +1054,152 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" + +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" -table@^5.2.3: - version "5.4.4" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.4.tgz#6e0f88fdae3692793d1077fd172a4667afe986a6" - integrity sha512-IIfEAUx5QlODLblLrGTTLJA7Tk0iLSGBvgY8essPRVNGHAzThujww1YqHLs6h3HfTg55h++RzLHH5Xw/rfv+mg== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -tape@4: - version "4.11.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.11.0.tgz#63d41accd95e45a23a874473051c57fdbc58edc1" - integrity sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA== - dependencies: - deep-equal "~1.0.1" - defined "~1.0.0" - for-each "~0.3.3" - function-bind "~1.1.1" - glob "~7.1.4" - has "~1.0.3" - inherits "~2.0.4" - minimist "~1.2.0" - object-inspect "~1.6.0" - resolve "~1.11.1" - resumer "~0.0.0" - string.prototype.trim "~1.1.2" - through "~2.3.8" - -terser@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.2.tgz#b2656c8a506f7ce805a3f300a2ff48db022fa391" - integrity sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw== +terser@^5.0.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" + integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== dependencies: commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" + source-map "~0.7.2" + source-map-support "~0.5.19" text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through@^2.3.6, through@~2.3.4, through@~2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - os-tmpdir "~1.0.2" - -tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + is-number "^7.0.0" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - prelude-ls "~1.1.2" + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - v8-compile-cache@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" - integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 611e1c335118535e012cf1b184d0d9dda9f28abe Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Fri, 4 Jun 2021 16:14:53 -0700 Subject: [PATCH 24/34] 3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c9ff4ea..3cad2a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "d3-color", - "version": "2.0.0", + "version": "3.0.0", "description": "Color spaces! RGB, HSL, Cubehelix, Lab and HCL (Lch).", "homepage": "https://d3js.org/d3-color/", "repository": { From 93bc4ff5423ecbefb6607724384bf6ca788d13b6 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Sat, 5 Jun 2021 11:22:03 -0700 Subject: [PATCH 25/34] related d3/d3#3502; extract copyrights from LICENSE --- rollup.config.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rollup.config.js b/rollup.config.js index 804bba8..4c6ccad 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,6 +1,14 @@ +import {readFileSync} from "fs"; import {terser} from "rollup-plugin-terser"; import * as meta from "./package.json"; +// Extract copyrights from the LICENSE. +const copyright = readFileSync("./LICENSE", "utf-8") + .split(/\n/g) + .filter(line => /^Copyright\s+/.test(line)) + .map(line => line.replace(/^Copyright\s+/, "")) + .join(", "); + const config = { input: "src/index.js", external: Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)), @@ -10,7 +18,7 @@ const config = { format: "umd", indent: false, extend: true, - banner: `// ${meta.homepage} v${meta.version} Copyright ${(new Date).getFullYear()} ${meta.author.name}`, + banner: `// ${meta.homepage} v${meta.version} Copyright ${copyright}`, globals: Object.assign({}, ...Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)).map(key => ({[key]: "d3"}))) }, plugins: [] From 7d61bbe6e426a7f3d3f4520a8b31cfc92dc69ee7 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Sat, 5 Jun 2021 11:22:11 -0700 Subject: [PATCH 26/34] 3.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3cad2a9..c9dedb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "d3-color", - "version": "3.0.0", + "version": "3.0.1", "description": "Color spaces! RGB, HSL, Cubehelix, Lab and HCL (Lch).", "homepage": "https://d3js.org/d3-color/", "repository": { From 994d8fd95181484a5a27c5edc919aa625781432d Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 28 Mar 2022 09:08:43 -0700 Subject: [PATCH 27/34] avoid backtracking (#100) --- src/color.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/color.js b/src/color.js index 036d9f4..3e3ad49 100644 --- a/src/color.js +++ b/src/color.js @@ -6,8 +6,8 @@ export var darker = 0.7; export var brighter = 1 / darker; var reI = "\\s*([+-]?\\d+)\\s*", - reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", - reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), From 70e3a041f1890e63855fad693891652b36f48195 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 28 Mar 2022 10:30:51 -0700 Subject: [PATCH 28/34] clamp HSL format (#101) --- src/color.js | 12 ++++++++---- test/hsl-test.js | 7 +++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/color.js b/src/color.js index 3e3ad49..3af25a9 100644 --- a/src/color.js +++ b/src/color.js @@ -353,11 +353,15 @@ define(Hsl, hsl, extend(Color, { && (0 <= this.opacity && this.opacity <= 1); }, formatHsl: function() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + var a = this.opacity, + h = (this.h || 0) % 360, + s = Math.max(0, Math.min(1, this.s || 0)), + l = Math.max(0, Math.min(1, this.l || 0)); + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); return (a === 1 ? "hsl(" : "hsla(") - + (this.h || 0) + ", " - + (this.s || 0) * 100 + "%, " - + (this.l || 0) * 100 + "%" + + (h < 0 ? h + 360 : h) + ", " + + s * 100 + "%, " + + l * 100 + "%" + (a === 1 ? ")" : ", " + a + ")"); } })); diff --git a/test/hsl-test.js b/test/hsl-test.js index 5f5b9c7..d963916 100644 --- a/test/hsl-test.js +++ b/test/hsl-test.js @@ -38,6 +38,13 @@ it("hsl.formatHsl() formats as hsl(…) or hsla(…)", () => { assert.strictEqual(hsl("hsla(60, 100%, 20%, 0.4)").formatHsl(), "hsla(60, 100%, 20%, 0.4)"); }); +it("hsl.formatHsl() clamps to the expected range", () => { + assert.strictEqual(hsl(180, -100, -50).formatHsl(), "hsl(180, 0%, 0%)"); + assert.strictEqual(hsl(180, 150, 200).formatHsl(), "hsl(180, 100%, 100%)"); + assert.strictEqual(hsl(-90, 50, 50).formatHsl(), "hsl(270, 100%, 100%)"); + assert.strictEqual(hsl(420, 50, 50).formatHsl(), "hsl(60, 100%, 100%)"); +}); + it("hsl.formatHex() formats as #rrggbb", () => { assert.strictEqual(hsl("#abcdef").formatHex(), "#abcdef"); assert.strictEqual(hsl("hsl(60, 100%, 20%)").formatHex(), "#666600"); From ac660c6b6bd60a2f1cd255fe04ead7d1b053861d Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 28 Mar 2022 11:04:17 -0700 Subject: [PATCH 29/34] {rgb,hsl}.clamp() (#102) * {rgb,hsl}.clamp() * Update README --- README.md | 8 ++++++++ src/color.js | 45 ++++++++++++++++++++++++++++----------------- test/hsl-test.js | 12 ++++++++++++ test/rgb-test.js | 10 ++++++++++ 4 files changed, 58 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 22ce38c..a7f2d52 100644 --- a/README.md +++ b/README.md @@ -152,6 +152,10 @@ Constructs a new [RGB](https://en.wikipedia.org/wiki/RGB_color_model) color. The If *r*, *g* and *b* 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 RGB color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb). Note that unlike [*color*.rgb](#color_rgb) this method *always* returns a new instance, even if *color* is already an RGB color. +# *rgb*.clamp() [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns a new RGB color where the `r`, `g`, and `b` channels are clamped to the range [0, 255] and rounded to the nearest integer value, and the `opacity` is clamped to the range [0, 1]. + # d3.hsl(h, s, l[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source")
# d3.hsl(specifier)
# d3.hsl(color)
@@ -160,6 +164,10 @@ Constructs a new [HSL](https://en.wikipedia.org/wiki/HSL_and_HSV) color. The cha If *h*, *s* and *l* 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 HSL color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to HSL. (Colors already in the HSL color space skip the conversion to RGB.) +# *hsl*.clamp() [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns a new HSL color where the `h` channel is clamped to the range [0, 360), and the `s`, `l`, and `opacity` channels are clamped to the range [0, 1]. + # d3.lab(l, a, b[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/lab.js "Source")
# d3.lab(specifier)
# d3.lab(color)
diff --git a/src/color.js b/src/color.js index 3af25a9..6552e3d 100644 --- a/src/color.js +++ b/src/color.js @@ -251,6 +251,9 @@ define(Rgb, rgb, extend(Color, { rgb: function() { return this; }, + clamp: function() { + return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity)); + }, displayable: function() { return (-0.5 <= this.r && this.r < 255.5) && (-0.5 <= this.g && this.g < 255.5) @@ -268,16 +271,20 @@ function rgb_formatHex() { } function rgb_formatRgb() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "rgb(" : "rgba(") - + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.b) || 0)) - + (a === 1 ? ")" : ", " + a + ")"); + const a = clampa(this.opacity); + return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`; +} + +function clampa(opacity) { + return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity)); +} + +function clampi(value) { + return Math.max(0, Math.min(255, Math.round(value) || 0)); } function hex(value) { - value = Math.max(0, Math.min(255, Math.round(value) || 0)); + value = clampi(value); return (value < 16 ? "0" : "") + value.toString(16); } @@ -347,25 +354,29 @@ define(Hsl, hsl, extend(Color, { this.opacity ); }, + clamp: function() { + return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity)); + }, displayable: function() { return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1); }, formatHsl: function() { - var a = this.opacity, - h = (this.h || 0) % 360, - s = Math.max(0, Math.min(1, this.s || 0)), - l = Math.max(0, Math.min(1, this.l || 0)); - a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "hsl(" : "hsla(") - + (h < 0 ? h + 360 : h) + ", " - + s * 100 + "%, " - + l * 100 + "%" - + (a === 1 ? ")" : ", " + a + ")"); + const a = clampa(this.opacity); + return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`; } })); +function clamph(value) { + value = (value || 0) % 360; + return value < 0 ? value + 360 : value; +} + +function clampt(value) { + return Math.max(0, Math.min(1, value || 0)); +} + /* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) { return (h < 60 ? m1 + (m2 - m1) * h / 60 diff --git a/test/hsl-test.js b/test/hsl-test.js index d963916..930092d 100644 --- a/test/hsl-test.js +++ b/test/hsl-test.js @@ -89,6 +89,18 @@ it("hsl(h, s, l) does not clamp s and l channel values to [0,1]", () => { assertHslEqual(hsl(120, 0.2, 1.1), 120, 0.2, 1.1, 1); }); +it("hsl(h, s, l).clamp() clamps channel values", () => { + assertHslEqual(hsl(120, -0.1, -0.2).clamp(), 120, 0, 0, 1); + assertHslEqual(hsl(120, 1.1, 1.2).clamp(), 120, 1, 1, 1); + assertHslEqual(hsl(120, 2.1, 2.2).clamp(), 120, 1, 1, 1); + assertHslEqual(hsl(420, -0.1, -0.2).clamp(), 60, 0, 0, 1); + assertHslEqual(hsl(-420, -0.1, -0.2).clamp(), 300, 0, 0, 1); + assert.strictEqual(hsl(-420, -0.1, -0.2, NaN).clamp().opacity, 1); + assert.strictEqual(hsl(-420, -0.1, -0.2, 0.5).clamp().opacity, 0.5); + assert.strictEqual(hsl(-420, -0.1, -0.2, -1).clamp().opacity, 0); + assert.strictEqual(hsl(-420, -0.1, -0.2, 2).clamp().opacity, 1); +}); + it("hsl(h, s, l, opacity) does not clamp opacity to [0,1]", () => { assertHslEqual(hsl(120, 0.1, 0.5, -0.2), 120, 0.1, 0.5, -0.2); assertHslEqual(hsl(120, 0.9, 0.5, 1.2), 120, 0.9, 0.5, 1.2); diff --git a/test/rgb-test.js b/test/rgb-test.js index 32ebdf2..158a841 100644 --- a/test/rgb-test.js +++ b/test/rgb-test.js @@ -91,6 +91,16 @@ it("rgb(r, g, b) does not clamp channel values", () => { assertRgbApproxEqual(rgb(300, 400, 500), 300, 400, 500, 1); }); +it("rgb(r, g, b).clamp() rounds and clamps channel values", () => { + assertRgbApproxEqual(rgb(-10, -20, -30).clamp(), 0, 0, 0, 1); + assertRgbApproxEqual(rgb(10.5, 20.5, 30.5).clamp(), 11, 21, 31, 1); + assertRgbApproxEqual(rgb(300, 400, 500).clamp(), 255, 255, 255, 1); + assert.strictEqual(rgb(10.5, 20.5, 30.5, -1).clamp().opacity, 0); + assert.strictEqual(rgb(10.5, 20.5, 30.5, 0.5).clamp().opacity, 0.5); + assert.strictEqual(rgb(10.5, 20.5, 30.5, 2).clamp().opacity, 1); + assert.strictEqual(rgb(10.5, 20.5, 30.5, NaN).clamp().opacity, 1); +}); + it("rgb(r, g, b, opacity) does not clamp opacity", () => { assertRgbApproxEqual(rgb(-10, -20, -30, -0.2), -10, -20, -30, -0.2); assertRgbApproxEqual(rgb(300, 400, 500, 1.2), 300, 400, 500, 1.2); From e4bc34e46cba08c4b7209f2bea74ef570c000b86 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 28 Mar 2022 13:58:38 -0700 Subject: [PATCH 30/34] formatHex8 (#103) * formatHex8 * adopt template literals --- src/color.js | 24 +++++++++++++++++------- test/rgb-test.js | 7 +++++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/color.js b/src/color.js index 6552e3d..378a8cd 100644 --- a/src/color.js +++ b/src/color.js @@ -9,12 +9,12 @@ var reI = "\\s*([+-]?\\d+)\\s*", reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*", reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*", reHex = /^#([0-9a-f]{3,8})$/, - reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), - reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), - reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), - reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), - reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), - reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`), + reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`), + reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`), + reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`), + reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`), + reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`); var named = { aliceblue: 0xf0f8ff, @@ -176,6 +176,7 @@ define(Color, color, { }, hex: color_formatHex, // Deprecated! Use color.formatHex. formatHex: color_formatHex, + formatHex8: color_formatHex8, formatHsl: color_formatHsl, formatRgb: color_formatRgb, toString: color_formatRgb @@ -185,6 +186,10 @@ function color_formatHex() { return this.rgb().formatHex(); } +function color_formatHex8() { + return this.rgb().formatHex8(); +} + function color_formatHsl() { return hslConvert(this).formatHsl(); } @@ -262,12 +267,17 @@ define(Rgb, rgb, extend(Color, { }, hex: rgb_formatHex, // Deprecated! Use color.formatHex. formatHex: rgb_formatHex, + formatHex8: rgb_formatHex8, formatRgb: rgb_formatRgb, toString: rgb_formatRgb })); function rgb_formatHex() { - return "#" + hex(this.r) + hex(this.g) + hex(this.b); + return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`; +} + +function rgb_formatHex8() { + return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`; } function rgb_formatRgb() { diff --git a/test/rgb-test.js b/test/rgb-test.js index 158a841..94a347c 100644 --- a/test/rgb-test.js +++ b/test/rgb-test.js @@ -46,6 +46,13 @@ it("rgb.formatHex() formats as #rrggbb", () => { assert.strictEqual(rgb("hsla(60, 100%, 20%, 0.4)").formatHex(), "#666600"); }); +it("rgb.formatHex8() formats as #rrggbbaa", () => { + assert.strictEqual(rgb("#abcdef").formatHex8(), "#abcdefff"); + assert.strictEqual(rgb("hsl(60, 100%, 20%)").formatHex8(), "#666600ff"); + assert.strictEqual(rgb("rgba(12%, 34%, 56%, 0.4)").formatHex8(), "#1f578f66"); + assert.strictEqual(rgb("hsla(60, 100%, 20%, 0.4)").formatHex8(), "#66660066"); +}); + it("rgb.hex() is an alias for rgb.formatHex()", () => { assert.strictEqual(color.prototype.hex, color.prototype.formatHex); assert.strictEqual(rgb.prototype.hex, rgb.prototype.formatHex); From 5e9f7579dd32a74664f5000ee99aa87e3e463c2b Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 28 Mar 2022 15:42:43 -0700 Subject: [PATCH 31/34] method shorthand --- src/color.js | 26 +++++++++++++------------- src/cubehelix.js | 6 +++--- src/lab.js | 12 ++++++------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/color.js b/src/color.js index 378a8cd..75b68b4 100644 --- a/src/color.js +++ b/src/color.js @@ -168,10 +168,10 @@ var named = { }; define(Color, color, { - copy: function(channels) { + copy(channels) { return Object.assign(new this.constructor, this, channels); }, - displayable: function() { + displayable() { return this.rgb().displayable(); }, hex: color_formatHex, // Deprecated! Use color.formatHex. @@ -245,21 +245,21 @@ export function Rgb(r, g, b, opacity) { } define(Rgb, rgb, extend(Color, { - brighter: function(k) { + brighter(k) { k = k == null ? brighter : Math.pow(brighter, k); return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); }, - darker: function(k) { + darker(k) { k = k == null ? darker : Math.pow(darker, k); return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); }, - rgb: function() { + rgb() { return this; }, - clamp: function() { + clamp() { return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity)); }, - displayable: function() { + displayable() { return (-0.5 <= this.r && this.r < 255.5) && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) @@ -343,15 +343,15 @@ function Hsl(h, s, l, opacity) { } define(Hsl, hsl, extend(Color, { - brighter: function(k) { + brighter(k) { k = k == null ? brighter : Math.pow(brighter, k); return new Hsl(this.h, this.s, this.l * k, this.opacity); }, - darker: function(k) { + darker(k) { k = k == null ? darker : Math.pow(darker, k); return new Hsl(this.h, this.s, this.l * k, this.opacity); }, - rgb: function() { + rgb() { var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, @@ -364,15 +364,15 @@ define(Hsl, hsl, extend(Color, { this.opacity ); }, - clamp: function() { + clamp() { return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity)); }, - displayable: function() { + displayable() { return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1); }, - formatHsl: function() { + formatHsl() { const a = clampa(this.opacity); return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`; } diff --git a/src/cubehelix.js b/src/cubehelix.js index 83536dd..b3cf696 100644 --- a/src/cubehelix.js +++ b/src/cubehelix.js @@ -37,15 +37,15 @@ export function Cubehelix(h, s, l, opacity) { } define(Cubehelix, cubehelix, extend(Color, { - brighter: function(k) { + brighter(k) { k = k == null ? brighter : Math.pow(brighter, k); return new Cubehelix(this.h, this.s, this.l * k, this.opacity); }, - darker: function(k) { + darker(k) { k = k == null ? darker : Math.pow(darker, k); return new Cubehelix(this.h, this.s, this.l * k, this.opacity); }, - rgb: function() { + rgb() { var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), diff --git a/src/lab.js b/src/lab.js index 645e1a5..88c46e8 100644 --- a/src/lab.js +++ b/src/lab.js @@ -43,13 +43,13 @@ export function Lab(l, a, b, opacity) { } define(Lab, lab, extend(Color, { - brighter: function(k) { + brighter(k) { return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); }, - darker: function(k) { + darker(k) { return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); }, - rgb: function() { + rgb() { var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200; @@ -111,13 +111,13 @@ function hcl2lab(o) { } define(Hcl, hcl, extend(Color, { - brighter: function(k) { + brighter(k) { return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); }, - darker: function(k) { + darker(k) { return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); }, - rgb: function() { + rgb() { return hcl2lab(this).rgb(); } })); From ef94e0125cce176e2df2f877c70741f4e2856073 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 28 Mar 2022 15:45:15 -0700 Subject: [PATCH 32/34] update dependencies --- package.json | 4 +- yarn.lock | 605 ++++++++++++++++++++------------------------------- 2 files changed, 239 insertions(+), 370 deletions(-) diff --git a/package.json b/package.json index c9dedb2..8056bfa 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,8 @@ }, "sideEffects": false, "devDependencies": { - "eslint": "7", - "mocha": "8", + "eslint": "8", + "mocha": "9", "rollup": "2", "rollup-plugin-terser": "7" }, diff --git a/yarn.lock b/yarn.lock index 521c82d..60e6763 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,53 +2,60 @@ # yarn lockfile v1 -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.10.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: - "@babel/highlight" "^7.12.13" + "@babel/highlight" "^7.16.7" -"@babel/helper-validator-identifier@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" - integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" - integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== dependencies: - "@babel/helper-validator-identifier" "^7.14.0" + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@eslint/eslintrc@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" - integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg== +"@eslint/eslintrc@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" + integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" + debug "^4.3.2" + espree "^9.3.1" globals "^13.9.0" - ignore "^4.0.6" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" + js-yaml "^4.1.0" minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@types/node@*": - version "15.12.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.1.tgz#9b60797dee1895383a725f828a869c86c6caa5c2" - integrity sha512-zyxJM8I1c9q5sRMtVF+zdd13Jt6RU4r4qfhTd7lQubyThvLfx6yYekWSQjGCGV2Tkecgxnlpl/DNlb6Hg+dmEw== + version "17.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" + integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== "@ungap/promise-all-settled@1.1.2": version "1.1.2" @@ -56,14 +63,14 @@ integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.5.0, acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" @@ -75,30 +82,15 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" - integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@4.1.1, ansi-colors@^4.1.1: +ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" @@ -114,7 +106,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.1: +anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -122,23 +114,11 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -170,9 +150,9 @@ browser-stdout@1.3.1: integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== callsites@^3.0.0: version "3.1.0" @@ -180,9 +160,9 @@ callsites@^3.0.0: integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== chalk@^2.0.0: version "2.4.2" @@ -193,28 +173,28 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.5.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" cliui@^7.0.2: version "7.0.4" @@ -268,10 +248,17 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -debug@4.3.1, debug@^4.0.1, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +debug@^4.1.1, debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" @@ -281,9 +268,9 @@ decamelize@^4.0.0: integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== diff@5.0.0: version "5.0.0" @@ -302,13 +289,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -324,89 +304,80 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: esrecurse "^4.3.0" - estraverse "^4.1.1" + estraverse "^5.2.0" -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@7: - version "7.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.28.0.tgz#435aa17a0b82c13bb2be9d51408b617e49c1e820" - integrity sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g== +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@8: + version "8.12.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.12.0.tgz#c7a5bd1cfa09079aae64c9076c07eada66a46e8e" + integrity sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q== dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.2" + "@eslint/eslintrc" "^1.2.1" + "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" + glob-parent "^6.0.1" globals "^13.6.0" - ignore "^4.0.6" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" + regexpp "^3.2.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" + integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== dependencies: - acorn "^7.4.0" + acorn "^8.7.0" acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + eslint-visitor-keys "^3.3.0" esquery@^1.4.0: version "1.4.0" @@ -422,15 +393,10 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -488,16 +454,16 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.3.1: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -512,29 +478,24 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -glob-parent@^5.1.2, glob-parent@~5.1.0: +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@7.2.0, glob@^7.1.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -544,9 +505,9 @@ glob@^7.1.3: path-is-absolute "^1.0.0" globals@^13.6.0, globals@^13.9.0: - version "13.9.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" - integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== + version "13.13.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" + integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== dependencies: type-fest "^0.20.2" @@ -570,10 +531,10 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -613,20 +574,15 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -640,6 +596,11 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -659,31 +620,18 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -704,74 +652,64 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - -log-symbols@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: - yallist "^4.0.0" + chalk "^4.1.0" + is-unicode-supported "^0.1.0" merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -mocha@8: - version "8.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" - integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== +mocha@9: + version "9.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" + integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== dependencies: "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.5.1" - debug "4.3.1" + chokidar "3.5.3" + debug "4.3.3" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "7.1.6" + glob "7.2.0" growl "1.10.5" he "1.2.0" - js-yaml "4.0.0" - log-symbols "4.0.0" - minimatch "3.0.4" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "4.2.1" ms "2.1.3" - nanoid "3.1.20" - serialize-javascript "5.0.1" + nanoid "3.3.1" + serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.0" + workerpool "6.2.0" yargs "16.2.0" yargs-parser "20.2.4" yargs-unparser "2.0.0" @@ -786,10 +724,10 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@3.1.20: - version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== +nanoid@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== natural-compare@^1.4.0: version "1.4.0" @@ -857,20 +795,15 @@ path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -883,28 +816,23 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" -regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -928,28 +856,21 @@ rollup-plugin-terser@7: terser "^5.0.0" rollup@2: - version "2.50.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.50.6.tgz#24e2211caf9031081656e98a5e5e94d3b5e786e2" - integrity sha512-6c5CJPLVgo0iNaZWWliNu1Kl43tjP9LZcp6D/tkf2eLH2a9/WeHxg9vfTFl8QV/2SOyaJX37CEm9XuGM0rviUg== + version "2.70.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.1.tgz#824b1f1f879ea396db30b0fc3ae8d2fead93523e" + integrity sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA== optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -semver@^7.2.1: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -serialize-javascript@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" @@ -972,19 +893,10 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -source-map-support@~0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -999,41 +911,21 @@ source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" + strip-ansi "^6.0.1" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" @@ -1061,26 +953,15 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -table@^6.0.9: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== - dependencies: - ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" - terser@^5.0.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" - integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== + version "5.12.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c" + integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ== dependencies: + acorn "^8.5.0" commander "^2.20.0" source-map "~0.7.2" - source-map-support "~0.5.19" + source-map-support "~0.5.20" text-table@^0.2.0: version "0.2.0" @@ -1125,22 +1006,15 @@ which@2.0.2, which@^2.0.1: dependencies: isexe "^2.0.0" -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -workerpool@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" - integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== wrap-ansi@^7.0.0: version "7.0.0" @@ -1161,20 +1035,15 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== yargs-parser@^20.2.2: - version "20.2.7" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" - integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-unparser@2.0.0: version "2.0.0" From 75c19c40c246e4b3fbcfdeeba29249c51ccf6524 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 28 Mar 2022 15:45:23 -0700 Subject: [PATCH 33/34] update LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index b014515..fbe44bd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2010-2021 Mike Bostock +Copyright 2010-2022 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice From 7a1573ed260de4fd97d061975244841132adde92 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 28 Mar 2022 15:46:25 -0700 Subject: [PATCH 34/34] 3.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8056bfa..4034085 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "d3-color", - "version": "3.0.1", + "version": "3.1.0", "description": "Color spaces! RGB, HSL, Cubehelix, Lab and HCL (Lch).", "homepage": "https://d3js.org/d3-color/", "repository": {