diff --git a/.eslintrc.json b/.eslintrc.json index 8287875..7e80b00 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,9 +5,7 @@ "ecmaVersion": 8 }, "env": { - "es6": true, - "node": true, - "browser": true + "es6": true }, "rules": { "no-cond-assign": 0 diff --git a/.github/eslint.json b/.github/eslint.json new file mode 100644 index 0000000..c280fdb --- /dev/null +++ b/.github/eslint.json @@ -0,0 +1,18 @@ +{ + "problemMatcher": [ + { + "owner": "eslint-compact", + "pattern": [ + { + "regexp": "^(.+):\\sline\\s(\\d+),\\scol\\s(\\d+),\\s(Error|Warning|Info)\\s-\\s(.+)\\s\\((.+)\\)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5, + "code": 6 + } + ] + } + ] +} diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 0000000..7e5ee59 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,30 @@ +# https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [14.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: yarn --frozen-lockfile + - run: | + echo ::add-matcher::.github/eslint.json + yarn run eslint src test --format=compact + - run: yarn test diff --git a/LICENSE b/LICENSE index 6f3bc8f..b014515 100644 --- a/LICENSE +++ b/LICENSE @@ -1,58 +1,13 @@ -Copyright (c) 2010-2015, Michael Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* The name Michael Bostock may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -TERMS OF USE - EASING EQUATIONS - -Open source under the BSD License. - -Copyright 2001 Robert Penner -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -- Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright 2010-2021 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 +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/README.md b/README.md index 053757f..66ca0f7 100644 --- a/README.md +++ b/README.md @@ -16,24 +16,36 @@ To compute intermediate state, transitions leverage a variety of [built-in inter ## Installing -If you use NPM, `npm install d3-transition`. Otherwise, download the [latest release](https://github.com/d3/d3-transition/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-transition.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: +If you use npm, `npm install d3-transition`. You can also download the [latest release on GitHub](https://github.com/d3/d3-transition/releases/latest). For vanilla HTML in modern browsers, import d3-transition from Skypack: ```html - - - - - - - + +``` + +For legacy environments, you can load d3-transition’s UMD bundle from an npm-based CDN such as jsDelivr; a `d3` global is exported: + +```html + + + + + + + ``` -[Try d3-transition in your browser.](https://tonicdev.com/npm/d3-transition) +[Try d3-transition in your browser.](https://observablehq.com/collection/@d3/d3-transition) ## API Reference @@ -296,7 +308,7 @@ For each selected element, sets the [text content](http://www.w3.org/TR/DOM-Leve To interpolate text rather than to set it on start, use [*transition*.textTween](#transition_textTween) or append a replacement element and cross-fade opacity. Text is not interpolated by default because it is usually undesirable. # transition.textTween(factory) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/textTween.js), [Examples](https://observablehq.com/@d3/transition-texttween) - + If *factory* is specified and not null, assigns the text [tween](#transition_tween) to the specified interpolator *factory*. An interpolator factory is a function that returns an [interpolator](https://github.com/d3/d3-interpolate); when the transition starts, the *factory* is evaluated for each selected element, in order, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. The returned interpolator will then be invoked for each frame of the transition, in order, being passed the [eased](#transition_ease) time *t*, typically in the range [0, 1]. Lastly, the return value of the interpolator will be used to set the text. The interpolator must return a string. For example, to interpolate the text with integers from 0 to 100: diff --git a/d3-transition.sublime-project b/d3-transition.sublime-project deleted file mode 100644 index 772dfa5..0000000 --- a/d3-transition.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 31a04aa..39c1025 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,11 @@ "name": "d3-transition", "version": "2.0.0", "description": "Animated transitions for D3 selections.", + "homepage": "https://d3js.org/d3-transition/", + "repository": { + "type": "git", + "url": "https://github.com/d3/d3-transition.git" + }, "keywords": [ "d3", "d3-module", @@ -9,47 +14,49 @@ "transition", "animation" ], - "homepage": "https://d3js.org/d3-transition/", - "license": "BSD-3-Clause", + "license": "ISC", "author": { "name": "Mike Bostock", "url": "https://bost.ocks.org/mike" }, - "main": "dist/d3-transition.js", - "unpkg": "dist/d3-transition.min.js", - "jsdelivr": "dist/d3-transition.min.js", - "module": "src/index.js", - "repository": { - "type": "git", - "url": "https://github.com/d3/d3-transition.git" - }, + "type": "module", "files": [ "dist/**/*.js", "src/**/*.js" ], - "scripts": { - "pretest": "rollup -c", - "test": "tape 'test/**/*-test.js' && eslint src", - "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-transition.min.js", + "unpkg": "dist/d3-transition.min.js", + "exports": { + "umd": "./dist/d3-transition.min.js", + "default": "./src/index.js" }, "sideEffects": true, "dependencies": { - "d3-color": "1 - 2", - "d3-dispatch": "1 - 2", - "d3-ease": "1 - 2", - "d3-interpolate": "1 - 2", - "d3-timer": "1 - 2" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "devDependencies": { + "d3-selection": "2 - 3", + "eslint": "7", + "jsdom": "16", + "mocha": "9", + "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" }, "peerDependencies": { "d3-selection": "2" - }, - "devDependencies": { - "d3-selection": "2", - "eslint": "6", - "jsdom": "15", - "rollup": "1", - "rollup-plugin-terser": "5", - "tape": "4" } } diff --git a/rollup.config.js b/rollup.config.js index 65d24af..5e5323f 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, ...meta.peerDependencies}).filter(key => /^d3-/.test(key)).map(key => ({[key]: "d3"}))) }, plugins: [], diff --git a/test/.eslintrc b/test/.eslintrc deleted file mode 100644 index 5a357f6..0000000 --- a/test/.eslintrc +++ /dev/null @@ -1,15 +0,0 @@ -ecmaFeatures: - modules: true - -env: - es6: true - browser: true - node: true - -extends: - "eslint:recommended" - -rules: - no-cond-assign: 0 - no-sparse-arrays: 0 - no-unused-vars: 0 diff --git a/test/.eslintrc.json b/test/.eslintrc.json new file mode 100644 index 0000000..4fa23be --- /dev/null +++ b/test/.eslintrc.json @@ -0,0 +1,13 @@ +{ + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 8 + }, + "env": { + "mocha": true, + "node": true, + "es6": true, + "browser": true + } +} diff --git a/test/active-test.js b/test/active-test.js index 1d27513..cb303af 100644 --- a/test/active-test.js +++ b/test/active-test.js @@ -1,156 +1,154 @@ -var tape = require("tape"), - jsdom = require("./jsdom"), - d3_timer = require("d3-timer"), - d3_selection = require("d3-selection"), - d3_transition = require("../"); +import assert from "assert"; +import {select} from "d3-selection"; +import {timeout} from "d3-timer"; +import {active} from "../src/index.js"; +import it from "./jsdom.js"; -tape("d3.active(node) returns null if the specified node has no active transition with the null name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root); +it("active(node) returns null if the specified node has no active transition with the null name", async () => { + const root = document.documentElement; + const s = select(root); // No transitions pending. - test.strictEqual(d3_transition.active(root), null); + assert.strictEqual(active(root), null); // Two transitions created. - selection.transition().delay(50).duration(50); - selection.transition("foo").duration(50); - test.strictEqual(d3_transition.active(root), null); + s.transition().delay(50).duration(50); + s.transition("foo").duration(50); + assert.strictEqual(active(root), null); // One transition scheduled; one active with a different name. - d3_timer.timeout(function() { - test.strictEqual(d3_transition.active(root), null); - }); + await new Promise(resolve => timeout(() => { + assert.strictEqual(active(root), null); + resolve(); + })); // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(d3_transition.active(root), null); - test.end(); - }, 100); + await new Promise(resolve => timeout(() => { + assert.strictEqual(active(root), null); + resolve(); + }, 100)); }); -tape("d3.active(node, null) returns null if the specified node has no active transition with the null name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root); +it("active(node, null) returns null if the specified node has no active transition with the null name", async () => { + const root = document.documentElement; + const s = select(root); // No transitions pending. - test.strictEqual(d3_transition.active(root, null), null); + assert.strictEqual(active(root, null), null); // Two transitions created. - selection.transition().delay(50).duration(50); - selection.transition("foo").duration(50); - test.strictEqual(d3_transition.active(root, null), null); + s.transition().delay(50).duration(50); + s.transition("foo").duration(50); + assert.strictEqual(active(root, null), null); // One transition scheduled; one active with a different name. - d3_timer.timeout(function() { - test.strictEqual(d3_transition.active(root, null), null); - }); + await new Promise(resolve => timeout(() => { + assert.strictEqual(active(root, null), null); + resolve(); + })); // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(d3_transition.active(root, null), null); - test.end(); - }, 100); + await new Promise(resolve => timeout(() => { + assert.strictEqual(active(root, null), null); + resolve(); + }, 100)); }); -tape("d3.active(node, undefined) returns null if the specified node has no active transition with the null name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root); +it("active(node, undefined) returns null if the specified node has no active transition with the null name", async () => { + const root = document.documentElement; + const s = select(root); // No transitions pending. - test.strictEqual(d3_transition.active(root, undefined), null); + assert.strictEqual(active(root, undefined), null); // Two transitions created. - selection.transition().delay(50).duration(50); - selection.transition("foo").duration(50); - test.strictEqual(d3_transition.active(root, undefined), null); + s.transition().delay(50).duration(50); + s.transition("foo").duration(50); + assert.strictEqual(active(root, undefined), null); // One transition scheduled; one active with a different name. - d3_timer.timeout(function() { - test.strictEqual(d3_transition.active(root, undefined), null); - }); + await new Promise(resolve => timeout(() => { + assert.strictEqual(active(root, undefined), null); + resolve(); + })); // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(d3_transition.active(root, undefined), null); - test.end(); - }, 100); + await new Promise(resolve => timeout(() => { + assert.strictEqual(active(root, undefined), null); + resolve(); + }, 100)); }); -tape("d3.active(node, name) returns null if the specified node has no active transition with the specified name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root); +it("active(node, name) returns null if the specified node has no active transition with the specified name", async () => { + const root = document.documentElement; + const s = select(root); // No transitions pending. - test.strictEqual(d3_transition.active(root, "foo"), null); + assert.strictEqual(active(root, "foo"), null); // Two transitions created. - selection.transition("foo").delay(50).duration(50); - selection.transition().duration(50); - test.strictEqual(d3_transition.active(root, null), null); + s.transition("foo").delay(50).duration(50); + s.transition().duration(50); + assert.strictEqual(active(root, null), null); // One transition scheduled; one active with a different name. - test.strictEqual(d3_transition.active(root, "foo"), null); + assert.strictEqual(active(root, "foo"), null); // One transition scheduled. - d3_timer.timeout(function() { - test.strictEqual(d3_transition.active(root, "foo"), null); - }); + await new Promise(resolve => timeout(() => { + assert.strictEqual(active(root, "foo"), null); + resolve(); + })); // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(d3_transition.active(root, "foo"), null); - test.end(); - }, 100); + await new Promise(resolve => timeout(() => { + assert.strictEqual(active(root, "foo"), null); + resolve(); + }, 100)); }); -tape("d3.active(node) returns the active transition on the specified node with the null name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().on("start", check).tween("tween", tweened).on("end", ended); +it("active(node) returns the active transition on the specified node with the null name", async () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition().on("start", check).tween("tween", tweened).on("end", check); function check() { - var t = d3_transition.active(root); - test.deepEqual(t._groups, [[root]]); - test.deepEqual(t._parents, [null]); - test.strictEqual(t._name, null); - test.strictEqual(t._id, transition._id); + const a = active(root); + assert.deepStrictEqual(a._groups, [[root]]); + assert.deepStrictEqual(a._parents, [null]); + assert.strictEqual(a._name, null); + assert.strictEqual(a._id, t._id); } function tweened() { check(); - return function(t) { + return t => { if (t >= 1) check(); }; } - function ended() { - check(); - test.end(); - } + await t.end(); }); -tape("d3.active(node, name) returns the active transition on the specified node with the specified name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition("foo").on("start", check).tween("tween", tweened).on("end", ended); +it("active(node, name) returns the active transition on the specified node with the specified name", async () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition("foo").on("start", check).tween("tween", tweened).on("end", check); function check() { - var t = d3_transition.active(root, "foo"); - test.deepEqual(t._groups, [[root]]); - test.deepEqual(t._parents, [null]); - test.strictEqual(t._name, "foo"); - test.strictEqual(t._id, transition._id); + const a = active(root, "foo"); + assert.deepStrictEqual(a._groups, [[root]]); + assert.deepStrictEqual(a._parents, [null]); + assert.strictEqual(a._name, "foo"); + assert.strictEqual(a._id, t._id); } function tweened() { check(); - return function(t) { + return t => { if (t >= 1) check(); }; } - function ended() { - check(); - test.end(); - } + await t.end(); }); diff --git a/test/error-test.js b/test/error-test.js index f2742a1..f68ad9f 100644 --- a/test/error-test.js +++ b/test/error-test.js @@ -1,89 +1,69 @@ -var tape = require("tape"), - jsdom = require("./jsdom"), - d3_timer = require("d3-timer"), - d3_selection = require("d3-selection"), - d3_transition = require("../"); - -tape("transition.on(\"start\", error) terminates the transition", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().on("start", function() { throw new Error; }); - - process.once("uncaughtException", function() {}); - - // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(root.__transition, undefined); - test.end(); +import assert from "assert"; +import {select} from "d3-selection"; +import {timeout} from "d3-timer"; +import "../src/index.js"; +import it from "./jsdom.js"; + +describe("with an uncaught error", () => { + let listeners; + + beforeEach(() => { + listeners = process.listeners("uncaughtException"); + process.removeAllListeners("uncaughtException"); + process.once("uncaughtException", () => {}); }); -}); - -tape("transition.on(\"start\", error) with delay terminates the transition", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().delay(50).on("start", function() { throw new Error; }); - - process.once("uncaughtException", function() {}); - // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(root.__transition, undefined); - test.end(); - }, 50); -}); - -tape("transition.tween(\"foo\", error) terminates the transition", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().tween("foo", function() { throw new Error; }); - - process.once("uncaughtException", function() {}); - - // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(root.__transition, undefined); - test.end(); + afterEach(() => { + for (const listener of listeners) { + process.on("uncaughtException", listener); + } }); -}); -tape("transition.tween(\"foo\", error) with delay terminates the transition", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().delay(50).tween("foo", function() { throw new Error; }); - - process.once("uncaughtException", function() {}); - - // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(root.__transition, undefined); - test.end(); - }, 50); -}); - -tape("transition.tween(\"foo\", deferredError) terminates the transition", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().duration(50).tween("foo", function() { return function(t) { if (t === 1) throw new Error; }; }); + it("transition.on(\"start\", error) terminates the transition", async () => { + const root = document.documentElement; + const s = select(root); + s.transition().on("start", () => { throw new Error; }); + await new Promise(resolve => timeout(resolve)); + assert.strictEqual(root.__transition, undefined); + }); - process.once("uncaughtException", function() {}); + it("transition.on(\"start\", error) with delay terminates the transition", async () => { + const root = document.documentElement; + const s = select(root); + s.transition().delay(50).on("start", () => { throw new Error; }); + await new Promise(resolve => timeout(resolve, 50)); + assert.strictEqual(root.__transition, undefined); + }); - // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(root.__transition, undefined); - test.end(); - }, 50); -}); + it("transition.tween(\"foo\", error) terminates the transition", async () => { + const root = document.documentElement; + const s = select(root); + s.transition().tween("foo", () => { throw new Error; }); + await new Promise(resolve => timeout(resolve)); + assert.strictEqual(root.__transition, undefined); + }); -tape("transition.on(\"end\", error) terminates the transition", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().delay(50).duration(50).on("end", function() { throw new Error; }); + it("transition.tween(\"foo\", error) with delay terminates the transition", async () => { + const root = document.documentElement; + const s = select(root); + s.transition().delay(50).tween("foo", () => { throw new Error; }); + await new Promise(resolve => timeout(resolve, 50)); + assert.strictEqual(root.__transition, undefined); + }); - process.once("uncaughtException", function() {}); + it("transition.tween(\"foo\", deferredError) terminates the transition", async () => { + const root = document.documentElement; + const s = select(root); + s.transition().duration(50).tween("foo", () => { return function(t) { if (t === 1) throw new Error; }; }); + await new Promise(resolve => timeout(resolve, 50)); + assert.strictEqual(root.__transition, undefined); + }); - // No transitions remaining after the transition ends. - d3_timer.timeout(function() { - test.strictEqual(root.__transition, undefined); - test.end(); - }, 100); + it("transition.on(\"end\", error) terminates the transition", async () => { + const root = document.documentElement; + const s = select(root); + s.transition().delay(50).duration(50).on("end", () => { throw new Error; }); + await new Promise(resolve => timeout(resolve, 100)); + assert.strictEqual(root.__transition, undefined); + }); }); diff --git a/test/interrupt-test.js b/test/interrupt-test.js index 4eafbbc..0926903 100644 --- a/test/interrupt-test.js +++ b/test/interrupt-test.js @@ -1,29 +1,27 @@ -var tape = require("tape"), - jsdom = require("./jsdom"), - d3_selection = require("d3-selection"), - d3_transition = require("../"); +import assert from "assert"; +import {select} from "d3-selection"; +import {interrupt} from "../src/index.js"; +import it from "./jsdom.js"; -tape("d3.interrupt(node) cancels any pending transitions on the specified node", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition1 = selection.transition(), - transition2 = transition1.transition(); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, true); - d3_transition.interrupt(root); - test.equal(root.__transition, undefined); - test.end(); +it("interrupt(node) cancels any pending transitions on the specified node", () => { + const root = document.documentElement; + const s = select(root); + const t1 = s.transition(); + const t2 = t1.transition(); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, true); + interrupt(root); + assert.strictEqual(root.__transition, undefined); }); -tape("selection.interrupt(name) only cancels pending transitions with the specified name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition1 = selection.transition("foo"), - transition2 = selection.transition(); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, true); - d3_transition.interrupt(root, "foo"); - test.equal(transition1._id in root.__transition, false); - test.equal(transition2._id in root.__transition, true); - test.end(); +it("selection.interrupt(name) only cancels pending transitions with the specified name", () => { + const root = document.documentElement; + const s = select(root); + const t1 = s.transition("foo"); + const t2 = s.transition(); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, true); + interrupt(root, "foo"); + assert.strictEqual(t1._id in root.__transition, false); + assert.strictEqual(t2._id in root.__transition, true); }); diff --git a/test/jsdom.js b/test/jsdom.js index 1b4927b..e67cb93 100644 --- a/test/jsdom.js +++ b/test/jsdom.js @@ -1,5 +1,16 @@ -var jsdom = require("jsdom"); +import {JSDOM} from "jsdom"; -module.exports = function(html) { - return (new jsdom.JSDOM(html)).window.document; -}; +export default function jsdomit(message, html, run) { + if (arguments.length < 3) run = html, html = ""; + return it(message, async () => { + try { + const dom = new JSDOM(html); + global.window = dom.window; + global.document = dom.window.document; + await run(); + } finally { + delete global.window; + delete global.document; + } + }); +} diff --git a/test/selection/interrupt-test.js b/test/selection/interrupt-test.js index 633a39b..0ef6079 100644 --- a/test/selection/interrupt-test.js +++ b/test/selection/interrupt-test.js @@ -1,318 +1,280 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"), - d3_timer = require("d3-timer"), - state = require("../transition/state"); - -require("../../"); - -tape("selection.interrupt() returns the selection", function(test) { - var document = jsdom(), - selection = d3_selection.select(document); - test.equal(selection.interrupt(), selection); - test.end(); +import assert from "assert"; +import {select} from "d3-selection"; +import {timeout} from "d3-timer"; +import "../../src/index.js"; +import {CREATED, ENDED, ENDING, SCHEDULED, STARTED, STARTING} from "../../src/transition/schedule.js"; +import it from "../jsdom.js"; + +it("selection.interrupt() returns the selection", () => { + const s = select(document); + assert.strictEqual(s.interrupt(), s); }); -tape("selection.interrupt() cancels any pending transitions on the selected elements", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition1 = selection.transition(), - transition2 = transition1.transition(); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, true); - test.equal(selection.interrupt(), selection); - test.equal(root.__transition, undefined); - test.end(); +it("selection.interrupt() cancels any pending transitions on the selected elements", () => { + const root = document.documentElement; + const s = select(root); + const t1 = s.transition(); + const t2 = t1.transition(); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, true); + assert.strictEqual(s.interrupt(), s); + assert.strictEqual(root.__transition, undefined); }); -tape("selection.interrupt() only cancels pending transitions with the null name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition1 = selection.transition("foo"), - transition2 = selection.transition(); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, true); - test.equal(selection.interrupt(), selection); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, false); - test.end(); +it("selection.interrupt() only cancels pending transitions with the null name", () => { + const root = document.documentElement; + const s = select(root); + const t1 = s.transition("foo"); + const t2 = s.transition(); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, true); + assert.strictEqual(s.interrupt(), s); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, false); }); -tape("selection.interrupt(null) only cancels pending transitions with the null name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition1 = selection.transition("foo"), - transition2 = selection.transition(); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, true); - test.equal(selection.interrupt(null), selection); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, false); - test.end(); +it("selection.interrupt(null) only cancels pending transitions with the null name", () => { + const root = document.documentElement; + const s = select(root); + const t1 = s.transition("foo"); + const t2 = s.transition(); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, true); + assert.strictEqual(s.interrupt(null), s); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, false); }); -tape("selection.interrupt(undefined) only cancels pending transitions with the null name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition1 = selection.transition("foo"), - transition2 = selection.transition(); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, true); - test.equal(selection.interrupt(undefined), selection); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, false); - test.end(); +it("selection.interrupt(undefined) only cancels pending transitions with the null name", () => { + const root = document.documentElement; + const s = select(root); + const t1 = s.transition("foo"); + const t2 = s.transition(); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, true); + assert.strictEqual(s.interrupt(undefined), s); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, false); }); -tape("selection.interrupt(name) only cancels pending transitions with the specified name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition1 = selection.transition("foo"), - transition2 = selection.transition(); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, true); - test.equal(selection.interrupt("foo"), selection); - test.equal(transition1._id in root.__transition, false); - test.equal(transition2._id in root.__transition, true); - test.end(); +it("selection.interrupt(name) only cancels pending transitions with the specified name", () => { + const root = document.documentElement; + const s = select(root); + const t1 = s.transition("foo"); + const t2 = s.transition(); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, true); + assert.strictEqual(s.interrupt("foo"), s); + assert.strictEqual(t1._id in root.__transition, false); + assert.strictEqual(t2._id in root.__transition, true); }); -tape("selection.interrupt(name) coerces the name to a string", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition1 = selection.transition("foo"), - transition2 = selection.transition(); - test.equal(transition1._id in root.__transition, true); - test.equal(transition2._id in root.__transition, true); - test.equal(selection.interrupt({toString: function() { return "foo"; }}), selection); - test.equal(transition1._id in root.__transition, false); - test.equal(transition2._id in root.__transition, true); - test.end(); +it("selection.interrupt(name) coerces the name to a string", () => { + const root = document.documentElement; + const s = select(root); + const t1 = s.transition("foo"); + const t2 = s.transition(); + assert.strictEqual(t1._id in root.__transition, true); + assert.strictEqual(t2._id in root.__transition, true); + assert.strictEqual(s.interrupt({toString() { return "foo"; }}), s); + assert.strictEqual(t1._id in root.__transition, false); + assert.strictEqual(t2._id in root.__transition, true); }); -tape("selection.interrupt() does nothing if there is no transition on the selected elements", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root); - test.equal(root.__transition, undefined); - test.equal(selection.interrupt(), selection); - test.equal(root.__transition, undefined); - test.end(); +it("selection.interrupt() does nothing if there is no transition on the selected elements", () => { + const root = document.documentElement; + const s = select(root); + assert.strictEqual(root.__transition, undefined); + assert.strictEqual(s.interrupt(), s); + assert.strictEqual(root.__transition, undefined); }); -tape("selection.interrupt() dispatches an interrupt event to the started transition on the selected elements", function(test) { - var root = jsdom().documentElement, - interrupts = 0, - selection = d3_selection.select(root), - transition = selection.transition().on("interrupt", function() { ++interrupts; }); - d3_timer.timeout(function() { - var schedule = root.__transition[transition._id]; - test.equal(schedule.state, state.STARTED); - selection.interrupt(); - test.equal(schedule.timer._call, null); - test.equal(schedule.state, state.ENDED); - test.equal(root.__transition, undefined); - test.equal(interrupts, 1); - test.end(); - }); +it("selection.interrupt() dispatches an interrupt event to the started transition on the selected elements", async () => { + const root = document.documentElement; + let interrupts = 0; + const s = select(root); + const t = s.transition().on("interrupt", () => { ++interrupts; }); + await new Promise(resolve => timeout(() => { + const schedule = root.__transition[t._id]; + assert.strictEqual(schedule.state, STARTED); + s.interrupt(); + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(root.__transition, undefined); + assert.strictEqual(interrupts, 1); + resolve(); + })); }); -tape("selection.interrupt() destroys the schedule after dispatching the interrupt event", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().on("interrupt", interrupted); - - d3_timer.timeout(function() { - selection.interrupt(); - }); - +it("selection.interrupt() destroys the schedule after dispatching the interrupt event", async () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition().on("interrupt", interrupted); + await new Promise(resolve => timeout(() => { + s.interrupt(); + resolve(); + })); function interrupted() { - test.equal(transition.delay(), 0); - test.equal(transition.duration(), 250); - test.equal(transition.on("interrupt"), interrupted); - test.end(); + assert.strictEqual(t.delay(), 0); + assert.strictEqual(t.duration(), 250); + assert.strictEqual(t.on("interrupt"), interrupted); } }); -tape("selection.interrupt() does not dispatch an interrupt event to a starting transition", function(test) { - var root = jsdom().documentElement, - interrupts = 0, - selection = d3_selection.select(root), - transition = selection.transition().on("interrupt", function() { ++interrupts; }).on("start", started); - - function started() { - var schedule = root.__transition[transition._id]; - test.equal(schedule.state, state.STARTING); - selection.interrupt(); - test.equal(schedule.timer._call, null); - test.equal(schedule.state, state.ENDED); - test.equal(root.__transition, undefined); - test.equal(interrupts, 0); - test.end(); - } +it("selection.interrupt() does not dispatch an interrupt event to a starting transition", async () => { + const root = document.documentElement; + let interrupts = 0; + const s = select(root); + const t = s.transition().on("interrupt", () => { ++interrupts; }); + await new Promise(resolve => t.on("start", () => { + const schedule = root.__transition[t._id]; + assert.strictEqual(schedule.state, STARTING); + s.interrupt(); + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(root.__transition, undefined); + assert.strictEqual(interrupts, 0); + resolve(); + })); }); -tape("selection.interrupt() prevents a created transition from starting", function(test) { - var root = jsdom().documentElement, - starts = 0, - selection = d3_selection.select(root), - transition = selection.transition().on("start", function() { ++starts; }), - schedule = root.__transition[transition._id]; - - test.equal(schedule.state, state.CREATED); - selection.interrupt(); - test.equal(schedule.timer._call, null); - test.equal(schedule.state, state.ENDED); - test.equal(root.__transition, undefined); - - d3_timer.timeout(function() { - test.equal(starts, 0); - test.end(); - }, 10); +it("selection.interrupt() prevents a created transition from starting", async () => { + const root = document.documentElement; + let starts = 0; + const s = select(root); + const t = s.transition().on("start", () => { ++starts; }); + const schedule = root.__transition[t._id]; + assert.strictEqual(schedule.state, CREATED); + s.interrupt(); + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(root.__transition, undefined); + await new Promise(resolve => timeout(resolve, 10)); + assert.strictEqual(starts, 0); }); -tape("selection.interrupt() prevents a scheduled transition from starting", function(test) { - var root = jsdom().documentElement, - starts = 0, - selection = d3_selection.select(root), - transition = selection.transition().delay(50).on("start", function() { ++starts; }), - schedule = root.__transition[transition._id]; - - d3_timer.timeout(function() { - test.equal(schedule.state, state.SCHEDULED); - selection.interrupt(); - test.equal(schedule.timer._call, null); - test.equal(schedule.state, state.ENDED); - test.equal(root.__transition, undefined); - }); - - d3_timer.timeout(function() { - test.equal(starts, 0); - test.end(); - }, 60); +it("selection.interrupt() prevents a scheduled transition from starting", async () => { + const root = document.documentElement; + let starts = 0; + const s = select(root); + const t = s.transition().delay(50).on("start", () => { ++starts; }); + const schedule = root.__transition[t._id]; + await new Promise(resolve => timeout(resolve)); + assert.strictEqual(schedule.state, SCHEDULED); + s.interrupt(); + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(root.__transition, undefined); + await new Promise(resolve => timeout(resolve, 60)); + assert.strictEqual(starts, 0); }); -tape("selection.interrupt() prevents a starting transition from initializing tweens", function(test) { - var root = jsdom().documentElement, - tweens = 0, - selection = d3_selection.select(root), - transition = selection.transition().tween("tween", function() { ++tweens; }).on("start", started), - schedule = root.__transition[transition._id]; - - function started() { - test.equal(schedule.state, state.STARTING); - selection.interrupt(); - test.equal(schedule.timer._call, null); - test.equal(schedule.state, state.ENDED); - test.equal(root.__transition, undefined); - } - - d3_timer.timeout(function() { - test.equal(tweens, 0); - test.end(); - }, 10); +it("selection.interrupt() prevents a starting transition from initializing tweens", async () => { + const root = document.documentElement; + let tweens = 0; + const s = select(root); + const t = s.transition().tween("tween", () => { ++tweens; }); + const schedule = root.__transition[t._id]; + await new Promise(resolve => t.on("start", () => { + assert.strictEqual(schedule.state, STARTING); + s.interrupt(); + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(root.__transition, undefined); + resolve(); + })); + await new Promise(resolve => timeout(resolve, 10)); + assert.strictEqual(tweens, 0); }); -tape("selection.interrupt() during tween initialization prevents an active transition from continuing", function(test) { - var root = jsdom().documentElement, - tweens = 0, - selection = d3_selection.select(root), - transition = selection.transition().tween("tween", function() { selection.interrupt(); return function() { ++tweens; }; }), - schedule = root.__transition[transition._id]; - - d3_timer.timeout(function() { - test.equal(schedule.timer._call, null); - test.equal(schedule.state, state.ENDED); - test.equal(root.__transition, undefined); - test.equal(tweens, 0); - test.end(); - }, 10); +it("selection.interrupt() during tween initialization prevents an active transition from continuing", async () => { + const root = document.documentElement; + let tweens = 0; + const s = select(root); + const t = s.transition().tween("tween", () => { s.interrupt(); return () => { ++tweens; }; }); + const schedule = root.__transition[t._id]; + await new Promise(resolve => timeout(resolve, 10)); + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(root.__transition, undefined); + assert.strictEqual(tweens, 0); }); -tape("selection.interrupt() prevents an active transition from continuing", function(test) { - var root = jsdom().documentElement, - interrupted = false, - tweens = 0, - selection = d3_selection.select(root), - transition = selection.transition().tween("tween", function() { return function() { if (interrupted) ++tweens; }; }), - schedule = root.__transition[transition._id]; - - d3_timer.timeout(function() { +it("selection.interrupt() prevents an active transition from continuing", async () => { + const root = document.documentElement; + let interrupted = false; + let tweens = 0; + const s = select(root); + const t = s.transition().tween("tween", () => () => { if (interrupted) ++tweens; }); + const schedule = root.__transition[t._id]; + await new Promise(resolve => timeout(() => { interrupted = true; - test.equal(schedule.state, state.STARTED); - selection.interrupt(); - test.equal(schedule.timer._call, null); - test.equal(schedule.state, state.ENDED); - test.equal(root.__transition, undefined); - }, 10); - - d3_timer.timeout(function() { - test.equal(tweens, 0); - test.end(); - }, 50); + assert.strictEqual(schedule.state, STARTED); + s.interrupt(); + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(root.__transition, undefined); + resolve(); + }, 10)); + await new Promise(resolve => timeout(resolve, 50)); + assert.strictEqual(tweens, 0); }); -tape("selection.interrupt() during the final tween invocation prevents the end event from being dispatched", function(test) { - var root = jsdom().documentElement, - ends = 0, - selection = d3_selection.select(root), - transition = selection.transition().duration(50).tween("tween", tween).on("end", function() { ++ends; }), - schedule = root.__transition[transition._id]; - +it("selection.interrupt() during the final tween invocation prevents the end event from being dispatched", async () => { + const root = document.documentElement; + let ends = 0; + const s = select(root); + const t = s.transition().duration(50).tween("tween", tween).on("end", () => { ++ends; }); + const schedule = root.__transition[t._id]; function tween() { - return function(t) { + return (t) => { if (t >= 1) { - test.equal(schedule.state, state.ENDING); - selection.interrupt(); + assert.strictEqual(schedule.state, ENDING); + s.interrupt(); } }; } - - d3_timer.timeout(function() { - test.equal(schedule.timer._call, null); - test.equal(schedule.state, state.ENDED); - test.equal(root.__transition, undefined); - test.equal(ends, 0); - test.end(); - }, 60); + await new Promise(resolve => timeout(() => { + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(root.__transition, undefined); + assert.strictEqual(ends, 0); + resolve(); + }, 60)); }); -tape("selection.interrupt() has no effect on an ended transition", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().duration(50).on("end", ended), - schedule = root.__transition[transition._id]; - - function ended() { - d3_timer.timeout(function() { - test.equal(schedule.state, state.ENDED); - test.equal(schedule.timer._call, null); - selection.interrupt(); - test.equal(schedule.state, state.ENDED); - test.equal(schedule.timer._call, null); - test.equal(root.__transition, undefined); - test.end(); - }); - } +it("selection.interrupt() has no effect on an ended transition", async () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition().duration(50); + const schedule = root.__transition[t._id]; + await t.end(); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(schedule.timer._call, null); + s.interrupt(); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(root.__transition, undefined); }); -tape("selection.interrupt() has no effect on an interrupting transition", function(test) { - var root = jsdom().documentElement, - interrupts = 0, - selection = d3_selection.select(root), - transition = selection.transition().duration(50).on("interrupt", interrupted), - schedule = root.__transition[transition._id]; - - d3_timer.timeout(function() { - test.equal(schedule.state, state.STARTED); - selection.interrupt(); - test.equal(schedule.state, state.ENDED); - test.equal(schedule.timer._call, null); - test.equal(interrupts, 1); - test.end(); - }); +it("selection.interrupt() has no effect on an interrupting transition", async () => { + const root = document.documentElement; + let interrupts = 0; + const s = select(root); + const t = s.transition().duration(50).on("interrupt", interrupted); + const schedule = root.__transition[t._id]; function interrupted() { ++interrupts; - selection.interrupt(); + s.interrupt(); } + + await new Promise(resolve => timeout(() => { + assert.strictEqual(schedule.state, STARTED); + s.interrupt(); + assert.strictEqual(schedule.state, ENDED); + assert.strictEqual(schedule.timer._call, null); + assert.strictEqual(interrupts, 1); + resolve(); + })); }); diff --git a/test/selection/transition-test.js b/test/selection/transition-test.js index 53b8693..1d9066f 100644 --- a/test/selection/transition-test.js +++ b/test/selection/transition-test.js @@ -1,152 +1,124 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_timer = require("d3-timer"), - d3_ease = require("d3-ease"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {easeBounce, easeCubic} from "d3-ease"; +import {select, selectAll} from "d3-selection"; +import {now, timeout} from "d3-timer"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("selection.transition() returns an instanceof d3.transition", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition(); - test.equal(transition instanceof d3_transition.transition, true); - test.end(); +it("selection.transition() returns an instanceof transition", () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition(); + assert.strictEqual(t instanceof transition, true); }); -tape("selection.transition() uses the default timing parameters", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition(), - schedule = root.__transition[transition._id]; - test.equal(schedule.time, d3_timer.now()); - test.equal(schedule.delay, 0); - test.equal(schedule.duration, 250); - test.equal(schedule.ease, d3_ease.easeCubic); - test.end(); +it("selection.transition() uses the default timing parameters", () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition(); + const schedule = root.__transition[t._id]; + assert.strictEqual(schedule.time, now()); + assert.strictEqual(schedule.delay, 0); + assert.strictEqual(schedule.duration, 250); + assert.strictEqual(schedule.ease, easeCubic); }); -tape("selection.transition() assigns a monotonically-increasing id", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition1 = selection.transition(), - transition2 = selection.transition(), - transition3 = selection.transition(); - test.ok(transition2._id > transition1._id); - test.ok(transition3._id > transition2._id); - test.end(); +it("selection.transition() assigns a monotonically-increasing id", () => { + const root = document.documentElement; + const s = select(root); + const t1 = s.transition(); + const t2 = s.transition(); + const t3 = s.transition(); + assert(t2._id > t1._id); + assert(t3._id > t2._id); }); -tape("selection.transition() uses a default name of null", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition(), - schedule = root.__transition[transition._id]; - test.strictEqual(schedule.name, null); - test.end(); +it("selection.transition() uses a default name of null", () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition(); + const schedule = root.__transition[t._id]; + assert.strictEqual(schedule.name, null); }); -tape("selection.transition(null) uses a name of null", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition(null), - schedule = root.__transition[transition._id]; - test.strictEqual(schedule.name, null); - test.end(); +it("selection.transition(null) uses a name of null", () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition(null); + const schedule = root.__transition[t._id]; + assert.strictEqual(schedule.name, null); }); -tape("selection.transition(undefined) uses a name of null", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition(undefined), - schedule = root.__transition[transition._id]; - test.strictEqual(schedule.name, null); - test.end(); +it("selection.transition(undefined) uses a name of null", () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition(undefined); + const schedule = root.__transition[t._id]; + assert.strictEqual(schedule.name, null); }); -tape("selection.transition(name) uses the specified name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition("foo"), - schedule = root.__transition[transition._id]; - test.strictEqual(schedule.name, "foo"); - test.end(); +it("selection.transition(name) uses the specified name", () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition("foo"); + const schedule = root.__transition[t._id]; + assert.strictEqual(schedule.name, "foo"); }); -tape("selection.transition(name) coerces the name to a string", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition({toString: function() { return "foo"; }}), - schedule = root.__transition[transition._id]; - test.strictEqual(schedule.name, "foo"); - test.end(); +it("selection.transition(name) coerces the name to a string", () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition({toString() { return "foo"; }}); + const schedule = root.__transition[t._id]; + assert.strictEqual(schedule.name, "foo"); }); -tape("selection.transition(transition) inherits the id, name and timing from the corresponding parent in the specified transition", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - selection = d3_selection.selectAll([one, two]), - transition = selection.transition().delay(function(d, i) { return i * 50; }).duration(100).ease(d3_ease.easeBounce), - schedule1 = one.__transition[transition._id], - schedule2 = two.__transition[transition._id], - transition1b = d3_selection.select(one.firstChild).transition(transition), - schedule1b = one.firstChild.__transition[transition._id]; - - test.equal(transition1b._id, transition._id); - test.equal(schedule1b.name, schedule1.name); - test.equal(schedule1b.delay, schedule1.delay); - test.equal(schedule1b.duration, schedule1.duration); - test.equal(schedule1b.ease, schedule1.ease); - test.equal(schedule1b.time, schedule1.time); - - d3_timer.timeout(function() { - var transition2b = d3_selection.select(two.firstChild).transition(transition), - schedule2b = two.firstChild.__transition[transition._id]; - - test.equal(transition2b._id, transition._id); - test.equal(schedule2b.name, schedule2.name); - test.equal(schedule2b.delay, schedule2.delay); - test.equal(schedule2b.duration, schedule2.duration); - test.equal(schedule2b.ease, schedule2.ease); - test.equal(schedule2b.time, schedule2.time); - test.end(); - }, 10); +it("selection.transition(transition) inherits the id, name and timing from the corresponding parent in the specified transition", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const s = selectAll([one, two]); + const t = s.transition().delay(function(d, i) { return i * 50; }).duration(100).ease(easeBounce); + const schedule1 = one.__transition[t._id]; + const schedule2 = two.__transition[t._id]; + const t1b = select(one.firstChild).transition(t); + const schedule1b = one.firstChild.__transition[t._id]; + assert.strictEqual(t1b._id, t._id); + assert.strictEqual(schedule1b.name, schedule1.name); + assert.strictEqual(schedule1b.delay, schedule1.delay); + assert.strictEqual(schedule1b.duration, schedule1.duration); + assert.strictEqual(schedule1b.ease, schedule1.ease); + assert.strictEqual(schedule1b.time, schedule1.time); + await new Promise(resolve => timeout(resolve, 10)); + const t2b = select(two.firstChild).transition(t); + const schedule2b = two.firstChild.__transition[t._id]; + assert.strictEqual(t2b._id, t._id); + assert.strictEqual(schedule2b.name, schedule2.name); + assert.strictEqual(schedule2b.delay, schedule2.delay); + assert.strictEqual(schedule2b.duration, schedule2.duration); + assert.strictEqual(schedule2b.ease, schedule2.ease); + assert.strictEqual(schedule2b.time, schedule2.time); }); -tape("selection.transition(transition) reselects the existing transition with the specified transition’s id, if any", function(test) { - var root = jsdom().documentElement, - foo = function foo() {}, - bar = function bar() {}, - selection = d3_selection.select(root), - transition1 = selection.transition().tween("tween", foo), - schedule1 = root.__transition[transition1._id], - transition2 = selection.transition(transition1).tween("tween", bar), - schedule2 = root.__transition[transition2._id]; - - test.equal(transition1._id, transition2._id); - test.equal(schedule1, schedule2); - test.equal(transition1.tween("tween"), bar); - test.equal(transition2.tween("tween"), bar); - test.end(); +it("selection.transition(transition) reselects the existing transition with the specified transition’s id, if any", () => { + const root = document.documentElement; + const foo = () => {}; + const bar = () => {}; + const s = select(root); + const t1 = s.transition().tween("tween", foo); + const schedule1 = root.__transition[t1._id]; + const t2 = s.transition(t1).tween("tween", bar); + const schedule2 = root.__transition[t2._id]; + assert.strictEqual(t1._id, t2._id); + assert.strictEqual(schedule1, schedule2); + assert.strictEqual(t1.tween("tween"), bar); + assert.strictEqual(t2.tween("tween"), bar); }); -tape("selection.transition(transition) throws an error if the specified transition is not found", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.select(one).transition(), - transition2 = d3_selection.select(two).transition().delay(50); - try { - d3_selection.select(two).transition(transition1); - test.fail(); - } catch (error) { - test.deepEqual(error.message, `transition ${transition1._id} not found`); - } - try { - d3_selection.select(one).transition(transition2); - test.fail(); - } catch (error) { - test.deepEqual(error.message, `transition ${transition2._id} not found`); - } - test.end(); +it("selection.transition(transition) throws an error if the specified transition is not found", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = select(one).transition(); + const t2 = select(two).transition().delay(50); + assert.throws(() => select(two).transition(t1), /transition .* not found/); + assert.throws(() => select(one).transition(t2), /transition .* not found/); }); diff --git a/test/transition/attr-test.js b/test/transition/attr-test.js index 6af348d..cb3fa5f 100644 --- a/test/transition/attr-test.js +++ b/test/transition/attr-test.js @@ -1,303 +1,255 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_ease = require("d3-ease"), - d3_timer = require("d3-timer"), - d3_interpolate = require("d3-interpolate"), - d3_selection = require("d3-selection"); - -require("../../"); - -tape("transition.attr(name, value) creates an tween to the specified value", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("red", "blue"), - selection = d3_selection.select(root).attr("fill", "red"), - transition = selection.transition().attr("fill", "blue"); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("fill"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.attr(name, value) creates a namespaced tween to the specified value", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("red", "blue"), - selection = d3_selection.select(root).attr("svg:fill", "red"), - transition = selection.transition().attr("svg:fill", "blue"); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "fill"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.attr(name, value) creates an tween to the value returned by the specified function", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("red", "blue"), - selection = d3_selection.select(root).attr("fill", "red"), - transition = selection.transition().attr("fill", function() { return "blue"; }); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("fill"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.attr(name, value) creates a namespaced tween to the value returned by the specified function", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("red", "blue"), - selection = d3_selection.select(root).attr("svg:fill", "red"), - transition = selection.transition().attr("svg:fill", function() { return "blue"; }); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "fill"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.attr(name, constant) is a noop if the string-coerced value matches the current value on tween initialization", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("foo", 1), - transition = selection.transition().attr("foo", 1); - - d3_timer.timeout(function(elapsed) { - root.setAttribute("foo", 2); - }, 125); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), "2"); - test.end(); - }, 250); -}); - -tape("transition.attr(ns:name, constant) is a noop if the string-coerced value matches the current value on tween initialization", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("svg:foo", 1), - transition = selection.transition().attr("svg:foo", 1); - - d3_timer.timeout(function(elapsed) { - root.setAttributeNS("http://www.w3.org/2000/svg", "foo", 2); - }, 125); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "foo"), "2"); - test.end(); - }, 250); -}); - -tape("transition.attr(name, function) is a noop if the string-coerced value matches the current value on tween initialization", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("foo", 1), - transition = selection.transition().attr("foo", function() { return 1; }); - - d3_timer.timeout(function(elapsed) { - root.setAttribute("foo", 2); - }, 125); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), "2"); - test.end(); - }, 250); -}); - -tape("transition.attr(ns:name, function) is a noop if the string-coerced value matches the current value on tween initialization", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("svg:foo", 1), - transition = selection.transition().attr("svg:foo", function() { return 1; }); - - d3_timer.timeout(function(elapsed) { - root.setAttributeNS("http://www.w3.org/2000/svg", "foo", 2); - }, 125); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "foo"), "2"); - test.end(); - }, 250); -}); - -tape("transition.attr(name, constant) uses interpolateNumber if value is a number", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("foo", "15px"), - transition = selection.transition().attr("foo", 10); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), "NaN"); - test.end(); - }, 125); -}); - -tape("transition.attr(name, function) uses interpolateNumber if value is a number", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("foo", "15px"), - transition = selection.transition().attr("foo", () => 10); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), "NaN"); - test.end(); - }, 125); -}); - -tape("transition.attr(name, value) immediately evaluates the specified function with the expected context and arguments", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - ease = d3_ease.easeCubic, - duration = 250, - interpolate1 = d3_interpolate.interpolateRgb("cyan", "red"), - interpolate2 = d3_interpolate.interpolateRgb("magenta", "green"), - selection = d3_selection.selectAll([one, two]).data(["red", "green"]), - result = [], - transition = selection.transition().attr("fill", function(d, i, nodes) { result.push([d, i, nodes, this]); return d; }); - - test.deepEqual(result, [ +import assert from "assert"; +import {easeCubic} from "d3-ease"; +import {interpolateNumber, interpolateRgb, interpolateString} from "d3-interpolate"; +import {select, selectAll} from "d3-selection"; +import {timeout} from "d3-timer"; +import "../../src/index.js"; +import it from "../jsdom.js"; + +it("transition.attr(name, value) creates an tween to the specified value", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("red", "blue"); + const s = select(root).attr("fill", "red"); + s.transition().attr("fill", "blue"); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttribute("fill"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.attr(name, value) creates a namespaced tween to the specified value", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("red", "blue"); + const s = select(root).attr("svg:fill", "red"); + s.transition().attr("svg:fill", "blue"); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "fill"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.attr(name, value) creates an tween to the value returned by the specified function", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("red", "blue"); + const s = select(root).attr("fill", "red"); + s.transition().attr("fill", function() { return "blue"; }); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttribute("fill"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.attr(name, value) creates a namespaced tween to the value returned by the specified function", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("red", "blue"); + const s = select(root).attr("svg:fill", "red"); + s.transition().attr("svg:fill", function() { return "blue"; }); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "fill"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.attr(name, constant) is a noop if the string-coerced value matches the current value on tween initialization", async () => { + const root = document.documentElement; + const s = select(root).attr("foo", 1); + s.transition().attr("foo", 1); + timeout(() => root.setAttribute("foo", 2), 125); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.getAttribute("foo"), "2"); + resolve(); + }, 250)); +}); + +it("transition.attr(ns:name, constant) is a noop if the string-coerced value matches the current value on tween initialization", async () => { + const root = document.documentElement; + const s = select(root).attr("svg:foo", 1); + s.transition().attr("svg:foo", 1); + timeout(() => root.setAttributeNS("http://www.w3.org/2000/svg", "foo", 2), 125); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "foo"), "2"); + resolve(); + }, 250)); +}); + +it("transition.attr(name, function) is a noop if the string-coerced value matches the current value on tween initialization", async () => { + const root = document.documentElement; + const s = select(root).attr("foo", 1); + s.transition().attr("foo", function() { return 1; }); + timeout(() => root.setAttribute("foo", 2), 125); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.getAttribute("foo"), "2"); + resolve(); + }, 250)); +}); + +it("transition.attr(ns:name, function) is a noop if the string-coerced value matches the current value on tween initialization", async () => { + const root = document.documentElement; + const s = select(root).attr("svg:foo", 1); + s.transition().attr("svg:foo", function() { return 1; }); + timeout(() => root.setAttributeNS("http://www.w3.org/2000/svg", "foo", 2), 125); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "foo"), "2"); + resolve(); + }, 250)); +}); + +it("transition.attr(name, constant) uses interpolateNumber if value is a number", async () => { + const root = document.documentElement; + const s = select(root).attr("foo", "15px"); + s.transition().attr("foo", 10); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.getAttribute("foo"), "NaN"); + resolve(); + }, 125)); +}); + +it("transition.attr(name, function) uses interpolateNumber if value is a number", async () => { + const root = document.documentElement; + const s = select(root).attr("foo", "15px"); + s.transition().attr("foo", () => 10); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.getAttribute("foo"), "NaN"); + resolve(); + }, 125)); +}); + +it("transition.attr(name, value) immediately evaluates the specified function with the expected context and arguments", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const ease = easeCubic; + const duration = 250; + const interpolate1 = interpolateRgb("cyan", "red"); + const interpolate2 = interpolateRgb("magenta", "green"); + const s = selectAll([one, two]).data(["red", "green"]); + const result = []; + s.transition().attr("fill", function(d, i, nodes) { result.push([d, i, nodes, this]); return d; }); + assert.deepStrictEqual(result, [ ["red", 0, [one, two], one], ["green", 1, [one, two], two] ]); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(one.getAttribute("fill"), interpolate1(ease(elapsed / duration))); - test.strictEqual(two.getAttribute("fill"), interpolate2(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.attr(name, value) constructs an interpolator using the current value on start", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("red", "blue"), - selection = d3_selection.select(root), - transition = selection.transition().on("start", function() { selection.attr("fill", "red"); }).attr("fill", function() { return "blue"; }); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("fill"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.attr(name, null) creates an tween which removes the specified attribute post-start", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("fill", "red"), - transition = selection.transition().attr("fill", null).on("start", started); - - function started() { - test.equal(root.getAttribute("fill"), "red"); - } - - d3_timer.timeout(function(elapsed) { - test.equal(root.hasAttribute("fill"), false); - test.end(); - }); -}); - -tape("transition.attr(name, null) creates an tween which removes the specified namespaced attribute post-start", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("svg:fill", "red"), - transition = selection.transition().attr("svg:fill", null).on("start", started); - - function started() { - test.equal(root.getAttributeNS("http://www.w3.org/2000/svg", "fill"), "red"); - } - - d3_timer.timeout(function(elapsed) { - test.equal(root.hasAttributeNS("http://www.w3.org/2000/svg", "fill"), false); - test.end(); - }); -}); - -tape("transition.attr(name, value) creates an tween which removes the specified attribute post-start if the specified function returns null", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("fill", "red"), - transition = selection.transition().attr("fill", function() {}).on("start", started); - - function started() { - test.equal(root.getAttribute("fill"), "red"); - } - - d3_timer.timeout(function(elapsed) { - test.equal(root.hasAttribute("fill"), false); - test.end(); - }); -}); - -tape("transition.attr(name, value) creates an tween which removes the specified namespaced attribute post-start if the specified function returns null", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("svg:fill", "red"), - transition = selection.transition().attr("svg:fill", function() {}).on("start", started); - - function started() { - test.equal(root.getAttributeNS("http://www.w3.org/2000/svg", "fill"), "red"); - } - - d3_timer.timeout(function(elapsed) { - test.equal(root.hasAttributeNS("http://www.w3.org/2000/svg", "fill"), false); - test.end(); - }); -}); - -tape("transition.attr(name, value) interpolates numbers", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateNumber(1, 2), - selection = d3_selection.select(root).attr("foo", 1), - transition = selection.transition().attr("foo", 2); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), interpolate(ease(elapsed / duration)) + ""); - test.end(); - }, 125); -}); - -tape("transition.attr(name, value) interpolates strings", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateString("1px", "2px"), - selection = d3_selection.select(root).attr("foo", "1px"), - transition = selection.transition().attr("foo", "2px"); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.attr(name, value) interpolates colors", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("#f00", "#00f"), - selection = d3_selection.select(root).attr("foo", "#f00"), - transition = selection.transition().attr("foo", "#00f"); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.attr(name, value) creates an attrTween with the specified name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("fill", "red"), - transition = selection.transition().attr("fill", "blue"); - test.equal(transition.attrTween("fill").call(root).call(root, 0.5), "rgb(128, 0, 128)"); - test.end(); -}); - -tape("transition.attr(name, value) creates a tween with the name \"attr.name\"", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("fill", "red"), - transition = selection.transition().attr("fill", "blue"); - transition.tween("attr.fill").call(root).call(root, 0.5); - test.equal(root.getAttribute("fill"), "rgb(128, 0, 128)"); - test.end(); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(one.getAttribute("fill"), interpolate1(ease(elapsed / duration))); + assert.strictEqual(two.getAttribute("fill"), interpolate2(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.attr(name, value) constructs an interpolator using the current value on start", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("red", "blue"); + const s = select(root); + s.transition().on("start", function() { s.attr("fill", "red"); }).attr("fill", function() { return "blue"; }); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttribute("fill"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.attr(name, null) creates an tween which removes the specified attribute post-start", async () => { + const root = document.documentElement; + const s = select(root).attr("fill", "red"); + const started = () => assert.strictEqual(root.getAttribute("fill"), "red"); + s.transition().attr("fill", null).on("start", started); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.hasAttribute("fill"), false); + resolve(); + })); +}); + +it("transition.attr(name, null) creates an tween which removes the specified namespaced attribute post-start", async () => { + const root = document.documentElement; + const s = select(root).attr("svg:fill", "red"); + const started = () => assert.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "fill"), "red"); + s.transition().attr("svg:fill", null).on("start", started); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.hasAttributeNS("http://www.w3.org/2000/svg", "fill"), false); + resolve(); + })); +}); + +it("transition.attr(name, value) creates an tween which removes the specified attribute post-start if the specified function returns null", async () => { + const root = document.documentElement; + const s = select(root).attr("fill", "red"); + const started = () => assert.strictEqual(root.getAttribute("fill"), "red"); + s.transition().attr("fill", function() {}).on("start", started); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.hasAttribute("fill"), false); + resolve(); + })); +}); + +it("transition.attr(name, value) creates an tween which removes the specified namespaced attribute post-start if the specified function returns null", async () => { + const root = document.documentElement; + const s = select(root).attr("svg:fill", "red"); + const started = () => assert.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "fill"), "red"); + s.transition().attr("svg:fill", function() {}).on("start", started); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.hasAttributeNS("http://www.w3.org/2000/svg", "fill"), false); + resolve(); + })); +}); + +it("transition.attr(name, value) interpolates numbers", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateNumber(1, 2); + const s = select(root).attr("foo", 1); + s.transition().attr("foo", 2); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttribute("foo"), interpolate(ease(elapsed / duration)) + ""); + resolve(); + }, 125)); +}); + +it("transition.attr(name, value) interpolates strings", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateString("1px", "2px"); + const s = select(root).attr("foo", "1px"); + s.transition().attr("foo", "2px"); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttribute("foo"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.attr(name, value) interpolates colors", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("#f00", "#00f"); + const s = select(root).attr("foo", "#f00"); + s.transition().attr("foo", "#00f"); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttribute("foo"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.attr(name, value) creates an attrTween with the specified name", async () => { + const root = document.documentElement; + const s = select(root).attr("fill", "red"); + const t = s.transition().attr("fill", "blue"); + assert.strictEqual(t.attrTween("fill").call(root).call(root, 0.5), "rgb(128, 0, 128)"); +}); + +it("transition.attr(name, value) creates a tween with the name \"attr.name\"", async () => { + const root = document.documentElement; + const s = select(root).attr("fill", "red"); + const t = s.transition().attr("fill", "blue"); + t.tween("attr.fill").call(root).call(root, 0.5); + assert.strictEqual(root.getAttribute("fill"), "rgb(128, 0, 128)"); }); diff --git a/test/transition/attrTween-test.js b/test/transition/attrTween-test.js index 8c57c83..7e5c714 100644 --- a/test/transition/attrTween-test.js +++ b/test/transition/attrTween-test.js @@ -1,134 +1,108 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_ease = require("d3-ease"), - d3_timer = require("d3-timer"), - d3_interpolate = require("d3-interpolate"), - d3_selection = require("d3-selection"), - state = require("./state"); - -require("../../"); - -tape("transition.attrTween(name, value) defines an attribute tween using the interpolator returned by the specified function", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - transition = d3_selection.select(root).transition().attrTween("foo", function() { return interpolate; }); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), interpolate(d3_ease.easeCubic(elapsed / 250))); - test.end(); - }, 125); +import assert from "assert"; +import {easeCubic} from "d3-ease"; +import {interpolateHcl} from "d3-interpolate"; +import {select, selectAll} from "d3-selection"; +import {timeout, now} from "d3-timer"; +import "../../src/index.js"; +import {ENDING} from "../../src/transition/schedule.js"; +import it from "../jsdom.js"; + +it("transition.attrTween(name, value) defines an attribute tween using the interpolator returned by the specified function", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + select(root).transition().attrTween("foo", () => interpolate); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttribute("foo"), interpolate(easeCubic(elapsed / 250))); + resolve(); + }, 125)); }); -tape("transition.attrTween(name, value) invokes the value function with the expected context and arguments", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - result = [], - transition = d3_selection.selectAll([one, two]).data(["one", "two"]).transition().attrTween("foo", function(d, i, nodes) { result.push([d, i, nodes, this]); }); - - d3_timer.timeout(function(elapsed) { - test.deepEqual(result, [ - ["one", 0, [one, two], one], - ["two", 1, [one, two], two] - ]); - test.end(); - }); +it("transition.attrTween(name, value) invokes the value function with the expected context and arguments", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const result = []; + selectAll([one, two]).data(["one", "two"]).transition().attrTween("foo", function(d, i, nodes) { result.push([d, i, nodes, this]); }); + await new Promise(resolve => timeout(resolve)); + assert.deepStrictEqual(result, [ + ["one", 0, [one, two], one], + ["two", 1, [one, two], two] + ]); }); -tape("transition.attrTween(name, value) passes the eased time to the interpolator", function(test) { - var root = jsdom().documentElement, - then = d3_timer.now(), - duration = 250, - ease = d3_ease.easeCubic, - transition = d3_selection.select(root).transition().attrTween("foo", function() { return interpolate; }).on("end", function() { test.end(); }), - schedule = root.__transition[transition._id]; - +it("transition.attrTween(name, value) passes the eased time to the interpolator", async () => { + const root = document.documentElement; + const then = now(); + const duration = 250; + const ease = easeCubic; + const t = select(root).transition().attrTween("foo", () => interpolate); + const schedule = root.__transition[t._id]; function interpolate(t) { - "use strict"; - test.equal(this, root); - test.equal(t, schedule.state === state.ENDING ? 1 : ease((d3_timer.now() - then) / duration)); + assert.strictEqual(this, root); + assert.strictEqual(t, schedule.state === ENDING ? 1 : ease((now() - then) / duration)); } + await t.end(); }); -tape("transition.attrTween(name, value) allows the specified function to return null for a noop", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).attr("foo", "42").attr("svg:bar", "43"), - transition = selection.transition().attrTween("foo", function() {}).attrTween("svg:bar", function() {}); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), "42"); - test.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "bar"), "43"); - test.end(); - }, 125); +it("transition.attrTween(name, value) allows the specified function to return null for a noop", async () => { + const root = document.documentElement; + const s = select(root).attr("foo", "42").attr("svg:bar", "43"); + s.transition().attrTween("foo", () => {}).attrTween("svg:bar", () => {}); + await new Promise(resolve => timeout(resolve, 125)); + assert.strictEqual(root.getAttribute("foo"), "42"); + assert.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "bar"), "43"); }); -tape("transition.attrTween(name, value) defines a namespaced attribute tween using the interpolator returned by the specified function", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - transition = d3_selection.select(root).transition().attrTween("svg:foo", function() { return interpolate; }); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "foo"), interpolate(d3_ease.easeCubic(elapsed / 250))); - test.end(); - }, 125); +it("transition.attrTween(name, value) defines a namespaced attribute tween using the interpolator returned by the specified function", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + select(root).transition().attrTween("svg:foo", () => interpolate); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttributeNS("http://www.w3.org/2000/svg", "foo"), interpolate(easeCubic(elapsed / 250))); + resolve(); + }, 125)); }); -tape("transition.attrTween(name, value) coerces the specified name to a string", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - transition = d3_selection.select(root).transition().attrTween({toString: function() { return "foo"; }}, function() { return interpolate; }); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.getAttribute("foo"), interpolate(d3_ease.easeCubic(elapsed / 250))); - test.end(); - }, 125); +it("transition.attrTween(name, value) coerces the specified name to a string", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + select(root).transition().attrTween({toString() { return "foo"; }}, () => interpolate); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.getAttribute("foo"), interpolate(easeCubic(elapsed / 250))); + resolve(); + }, 125)); }); -tape("transition.attrTween(name, value) throws an error if value is not null and not a function", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition(); - test.throws(function() { transition.attrTween("foo", 42); }); - test.end(); +it("transition.attrTween(name, value) throws an error if value is not null and not a function", async () => { + const root = document.documentElement; + const t = select(root).transition(); + assert.throws(() => { t.attrTween("foo", 42); }); }); -tape("transition.attrTween(name, null) removes the specified attribute tween", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - transition = d3_selection.select(root).transition().attrTween("foo", function() { return interpolate; }).attrTween("foo", null); - - test.equal(transition.attrTween("foo"), null); - test.equal(transition.tween("attr.foo"), null); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.hasAttribute("foo"), false); - test.end(); - }, 125); +it("transition.attrTween(name, null) removes the specified attribute tween", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + const t = select(root).transition().attrTween("foo", () => interpolate).attrTween("foo", null); + assert.strictEqual(t.attrTween("foo"), null); + assert.strictEqual(t.tween("attr.foo"), null); + await new Promise(resolve => timeout(resolve, 125)); + assert.strictEqual(root.hasAttribute("foo"), false); }); -tape("transition.attrTween(name) returns the attribute tween with the specified name", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - tween = function() { return interpolate; }, - transition = d3_selection.select(root).transition().attrTween("foo", tween).on("start", started).on("end", ended); - - test.equal(transition.attrTween("foo"), tween); - test.equal(transition.attrTween("bar"), null); - - function started() { - test.equal(transition.attrTween("foo"), tween); - } - - function ended() { - test.equal(transition.attrTween("foo"), tween); - test.end(); - } +it("transition.attrTween(name) returns the attribute tween with the specified name", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + const tween = () => interpolate; + const started = () => assert.strictEqual(t.attrTween("foo"), tween); + const ended = () => assert.strictEqual(t.attrTween("foo"), tween); + const t = select(root).transition().attrTween("foo", tween).on("start", started).on("end", ended); + assert.strictEqual(t.attrTween("foo"), tween); + assert.strictEqual(t.attrTween("bar"), null); + await t.end(); }); -tape("transition.attrTween(name) coerces the specified name to a string", function(test) { - var root = jsdom().documentElement, - tween = function() {}, - transition = d3_selection.select(root).transition().attrTween("color", tween); - - test.equal(transition.attrTween({toString: function() { return "color"; }}), tween); - test.end(); +it("transition.attrTween(name) coerces the specified name to a string", async () => { + const root = document.documentElement; + const tween = () => {}; + const t = select(root).transition().attrTween("color", tween); + assert.strictEqual(t.attrTween({toString() { return "color"; }}), tween); }); diff --git a/test/transition/call-test.js b/test/transition/call-test.js index ba07c31..2eee84c 100644 --- a/test/transition/call-test.js +++ b/test/transition/call-test.js @@ -1,8 +1,8 @@ -var tape = require("tape"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {selection} from "d3-selection"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("transition.call is the same as selection.call", function(test) { - test.equal(d3_transition.transition.prototype.call, d3_selection.selection.prototype.call); - test.end(); +it("transition.call is the same as selection.call", () => { + assert.strictEqual(transition.prototype.call, selection.prototype.call); }); diff --git a/test/transition/delay-test.js b/test/transition/delay-test.js index 30a271f..c4a69dd 100644 --- a/test/transition/delay-test.js +++ b/test/transition/delay-test.js @@ -1,76 +1,63 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"); +import assert from "assert"; +import {select, selectAll} from "d3-selection"; +import it from "../jsdom.js"; +import "../../src/index.js"; -require("../../"); - -tape("transition.delay() returns the delay for the first non-null node", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.select(one).transition(), - transition2 = d3_selection.select(two).transition().delay(50); - test.strictEqual(one.__transition[transition1._id].delay, 0); - test.strictEqual(two.__transition[transition2._id].delay, 50); - test.strictEqual(transition1.delay(), 0); - test.strictEqual(transition2.delay(), 50); - test.strictEqual(d3_selection.select(one).transition(transition1).delay(), 0); - test.strictEqual(d3_selection.select(two).transition(transition2).delay(), 50); - test.strictEqual(d3_selection.selectAll([null, one]).transition(transition1).delay(), 0); - test.strictEqual(d3_selection.selectAll([null, two]).transition(transition2).delay(), 50); - test.end(); +it("transition.delay() returns the delay for the first non-null node", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = select(one).transition(); + const t2 = select(two).transition().delay(50); + assert.strictEqual(one.__transition[t1._id].delay, 0); + assert.strictEqual(two.__transition[t2._id].delay, 50); + assert.strictEqual(t1.delay(), 0); + assert.strictEqual(t2.delay(), 50); + assert.strictEqual(select(one).transition(t1).delay(), 0); + assert.strictEqual(select(two).transition(t2).delay(), 50); + assert.strictEqual(selectAll([null, one]).transition(t1).delay(), 0); + assert.strictEqual(selectAll([null, two]).transition(t2).delay(), 50); }); -tape("transition.delay(number) sets the delay for each selected element to the specified number", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().delay(50); - test.strictEqual(one.__transition[transition._id].delay, 50); - test.strictEqual(two.__transition[transition._id].delay, 50); - test.end(); +it("transition.delay(number) sets the delay for each selected element to the specified number", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().delay(50); + assert.strictEqual(one.__transition[t._id].delay, 50); + assert.strictEqual(two.__transition[t._id].delay, 50); }); -tape("transition.delay(value) coerces the specified value to a number", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().delay("50"); - test.strictEqual(one.__transition[transition._id].delay, 50); - test.strictEqual(two.__transition[transition._id].delay, 50); - test.end(); +it("transition.delay(value) coerces the specified value to a number", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().delay("50"); + assert.strictEqual(one.__transition[t._id].delay, 50); + assert.strictEqual(two.__transition[t._id].delay, 50); }); -tape("transition.delay(function) passes the expected arguments and context to the function", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - result = [], - selection = d3_selection.selectAll([one, two]).data(["one", "two"]), - transition = selection.transition().delay(function(d, i, nodes) { result.push([d, i, nodes, this]); }); - test.deepEqual(result, [ - ["one", 0, transition._groups[0], one], - ["two", 1, transition._groups[0], two] +it("transition.delay(function) passes the expected arguments and context to the function", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const result = []; + const s = selectAll([one, two]).data(["one", "two"]); + const t = s.transition().delay(function(d, i, nodes) { result.push([d, i, nodes, this]); }); + assert.deepStrictEqual(result, [ + ["one", 0, t._groups[0], one], + ["two", 1, t._groups[0], two] ]); - test.end(); }); -tape("transition.delay(function) sets the delay for each selected element to the number returned by the specified function", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().delay(function(d, i) { return i * 20; }); - test.strictEqual(one.__transition[transition._id].delay, 0); - test.strictEqual(two.__transition[transition._id].delay, 20); - test.end(); +it("transition.delay(function) sets the delay for each selected element to the number returned by the specified function", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().delay(function(d, i) { return i * 20; }); + assert.strictEqual(one.__transition[t._id].delay, 0); + assert.strictEqual(two.__transition[t._id].delay, 20); }); -tape("transition.delay(function) coerces the value returned by the specified function to a number", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().delay(function(d, i) { return i * 20 + ""; }); - test.strictEqual(one.__transition[transition._id].delay, 0); - test.strictEqual(two.__transition[transition._id].delay, 20); - test.end(); +it("transition.delay(function) coerces the value returned by the specified function to a number", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().delay(function(d, i) { return i * 20 + ""; }); + assert.strictEqual(one.__transition[t._id].delay, 0); + assert.strictEqual(two.__transition[t._id].delay, 20); }); diff --git a/test/transition/duration-test.js b/test/transition/duration-test.js index 4fd170d..00f7adf 100644 --- a/test/transition/duration-test.js +++ b/test/transition/duration-test.js @@ -1,76 +1,63 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"); +import assert from "assert"; +import {select, selectAll} from "d3-selection"; +import "../../src/index.js"; +import it from "../jsdom.js"; -require("../../"); - -tape("transition.duration() returns the duration for the first non-null node", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.select(one).transition(), - transition2 = d3_selection.select(two).transition().duration(50); - test.strictEqual(one.__transition[transition1._id].duration, 250); - test.strictEqual(two.__transition[transition2._id].duration, 50); - test.strictEqual(transition1.duration(), 250); - test.strictEqual(transition2.duration(), 50); - test.strictEqual(d3_selection.select(one).transition(transition1).duration(), 250); - test.strictEqual(d3_selection.select(two).transition(transition2).duration(), 50); - test.strictEqual(d3_selection.selectAll([null, one]).transition(transition1).duration(), 250); - test.strictEqual(d3_selection.selectAll([null, two]).transition(transition2).duration(), 50); - test.end(); +it("transition.duration() returns the duration for the first non-null node", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = select(one).transition(); + const t2 = select(two).transition().duration(50); + assert.strictEqual(one.__transition[t1._id].duration, 250); + assert.strictEqual(two.__transition[t2._id].duration, 50); + assert.strictEqual(t1.duration(), 250); + assert.strictEqual(t2.duration(), 50); + assert.strictEqual(select(one).transition(t1).duration(), 250); + assert.strictEqual(select(two).transition(t2).duration(), 50); + assert.strictEqual(selectAll([null, one]).transition(t1).duration(), 250); + assert.strictEqual(selectAll([null, two]).transition(t2).duration(), 50); }); -tape("transition.duration(number) sets the duration for each selected element to the specified number", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().duration(50); - test.strictEqual(one.__transition[transition._id].duration, 50); - test.strictEqual(two.__transition[transition._id].duration, 50); - test.end(); +it("transition.duration(number) sets the duration for each selected element to the specified number", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().duration(50); + assert.strictEqual(one.__transition[t._id].duration, 50); + assert.strictEqual(two.__transition[t._id].duration, 50); }); -tape("transition.duration(value) coerces the specified value to a number", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().duration("50"); - test.strictEqual(one.__transition[transition._id].duration, 50); - test.strictEqual(two.__transition[transition._id].duration, 50); - test.end(); +it("transition.duration(value) coerces the specified value to a number", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().duration("50"); + assert.strictEqual(one.__transition[t._id].duration, 50); + assert.strictEqual(two.__transition[t._id].duration, 50); }); -tape("transition.duration(function) passes the expected arguments and context to the function", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - result = [], - selection = d3_selection.selectAll([one, two]).data(["one", "two"]), - transition = selection.transition().duration(function(d, i, nodes) { result.push([d, i, nodes, this]); }); - test.deepEqual(result, [ - ["one", 0, transition._groups[0], one], - ["two", 1, transition._groups[0], two] +it("transition.duration(function) passes the expected arguments and context to the function", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const result = []; + const s = selectAll([one, two]).data(["one", "two"]); + const t = s.transition().duration(function(d, i, nodes) { result.push([d, i, nodes, this]); }); + assert.deepStrictEqual(result, [ + ["one", 0, t._groups[0], one], + ["two", 1, t._groups[0], two] ]); - test.end(); }); -tape("transition.duration(function) sets the duration for each selected element to the number returned by the specified function", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().duration(function(d, i) { return i * 20; }); - test.strictEqual(one.__transition[transition._id].duration, 0); - test.strictEqual(two.__transition[transition._id].duration, 20); - test.end(); +it("transition.duration(function) sets the duration for each selected element to the number returned by the specified function", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().duration(function(d, i) { return i * 20; }); + assert.strictEqual(one.__transition[t._id].duration, 0); + assert.strictEqual(two.__transition[t._id].duration, 20); }); -tape("transition.duration(function) coerces the value returned by the specified function to a number", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().duration(function(d, i) { return i * 20 + ""; }); - test.strictEqual(one.__transition[transition._id].duration, 0); - test.strictEqual(two.__transition[transition._id].duration, 20); - test.end(); +it("transition.duration(function) coerces the value returned by the specified function to a number", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().duration(function(d, i) { return i * 20 + ""; }); + assert.strictEqual(one.__transition[t._id].duration, 0); + assert.strictEqual(two.__transition[t._id].duration, 20); }); diff --git a/test/transition/each-test.js b/test/transition/each-test.js index 5e6b5c7..74ec6b1 100644 --- a/test/transition/each-test.js +++ b/test/transition/each-test.js @@ -1,20 +1,18 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {select, selectAll, selection} from "d3-selection"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("transition.each is the same as selection.each", function(test) { - test.equal(d3_transition.transition.prototype.each, d3_selection.selection.prototype.each); - test.end(); +it("transition.each is the same as selection.each", () => { + assert.strictEqual(transition.prototype.each, selection.prototype.each); }); -tape("transition.each() runs as expected", function(test) { - var root = jsdom().documentElement; - var a = 0; - d3_selection.select(root).transition().each(() => {++a}); - test.equal(a, 1); +it("transition.each() runs as expected", () => { + const root = document.documentElement; + let a = 0; + select(root).transition().each(() => { ++a; }); + assert.strictEqual(a, 1); a = 0; - d3_selection.selectAll([null, root]).transition().each(() => {++a}); - test.equal(a, 1); - test.end(); + selectAll([null, root]).transition().each(() => { ++a; }); + assert.strictEqual(a, 1); }); diff --git a/test/transition/ease-test.js b/test/transition/ease-test.js index a52c6f4..d2d8c98 100644 --- a/test/transition/ease-test.js +++ b/test/transition/ease-test.js @@ -1,72 +1,68 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_ease = require("d3-ease"), - d3_timer = require("d3-timer"), - d3_selection = require("d3-selection"), - state = require("./state"); +import assert from "assert"; +import {easeBounce, easeCubic} from "d3-ease"; +import {select, selectAll} from "d3-selection"; +import {timeout} from "d3-timer"; +import "../../src/index.js"; +import {ENDING, RUNNING} from "../../src/transition/schedule.js"; +import it from "../jsdom.js"; -require("../../"); - -tape("transition.ease() returns the easing function for the first non-null node", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.select(one).transition(), - transition2 = d3_selection.select(two).transition().ease(d3_ease.easeBounce); - test.strictEqual(one.__transition[transition1._id].ease, d3_ease.easeCubic); - test.strictEqual(two.__transition[transition2._id].ease, d3_ease.easeBounce); - test.strictEqual(transition1.ease(), d3_ease.easeCubic); - test.strictEqual(transition2.ease(), d3_ease.easeBounce); - test.strictEqual(d3_selection.select(one).transition(transition1).ease(), d3_ease.easeCubic); - test.strictEqual(d3_selection.select(two).transition(transition2).ease(), d3_ease.easeBounce); - test.strictEqual(d3_selection.selectAll([null, one]).transition(transition1).ease(), d3_ease.easeCubic); - test.strictEqual(d3_selection.selectAll([null, two]).transition(transition2).ease(), d3_ease.easeBounce); - test.end(); +it("transition.ease() returns the easing function for the first non-null node", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = select(one).transition(); + const t2 = select(two).transition().ease(easeBounce); + assert.strictEqual(one.__transition[t1._id].ease, easeCubic); + assert.strictEqual(two.__transition[t2._id].ease, easeBounce); + assert.strictEqual(t1.ease(), easeCubic); + assert.strictEqual(t2.ease(), easeBounce); + assert.strictEqual(select(one).transition(t1).ease(), easeCubic); + assert.strictEqual(select(two).transition(t2).ease(), easeBounce); + assert.strictEqual(selectAll([null, one]).transition(t1).ease(), easeCubic); + assert.strictEqual(selectAll([null, two]).transition(t2).ease(), easeBounce); }); -tape("transition.ease(ease) throws an error if ease is not a function", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition(); - test.throws(function() { transition.ease(42); }); - test.throws(function() { transition.ease(null); }); - test.end(); +it("transition.ease(ease) throws an error if ease is not a function", () => { + const root = document.documentElement; + const t = select(root).transition(); + assert.throws(() => { t.ease(42); }); + assert.throws(() => { t.ease(null); }); }); -tape("transition.ease(ease) sets the easing function for each selected element to the specified function", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().ease(d3_ease.easeBounce); - test.strictEqual(one.__transition[transition._id].ease, d3_ease.easeBounce); - test.strictEqual(two.__transition[transition._id].ease, d3_ease.easeBounce); - test.end(); +it("transition.ease(ease) sets the easing function for each selected element to the specified function", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().ease(easeBounce); + assert.strictEqual(one.__transition[t._id].ease, easeBounce); + assert.strictEqual(two.__transition[t._id].ease, easeBounce); }); -tape("transition.ease(ease) passes the easing function the normalized time in [0, 1]", function(test) { - var root = jsdom().documentElement, - actual, - ease = function(t) { actual = t; return t; }; +it("transition.ease(ease) passes the easing function the normalized time in [0, 1]", async () => { + let actual; + const root = document.documentElement; + const ease = t => { actual = t; return t; }; - d3_selection.select(root).transition().ease(ease); + select(root).transition().ease(ease); - d3_timer.timeout(function(now) { - test.equal(actual, now / 250); - test.end(); - }, 100); + await new Promise(resolve => timeout((elapsed) => { + assert.strictEqual(actual, elapsed / 250); + resolve() + }, 100)); }); -tape("transition.ease(ease) does not invoke the easing function on the last frame", function(test) { - var root = jsdom().documentElement, - ease = function(t) { test.equal(schedule.state, state.RUNNING); return t; }, - transition = d3_selection.select(root).transition().ease(ease).on("end", function() { test.end(); }), - schedule = root.__transition[transition._id]; +it("transition.ease(ease) does not invoke the easing function on the last frame", async () => { + const root = document.documentElement; + const ease = t => { assert.strictEqual(schedule.state, RUNNING); return t; }; + const t = select(root).transition().ease(ease); + const schedule = root.__transition[t._id]; + await t.end(); }); -tape("transition.ease(ease) observes the eased time returned by the easing function", function(test) { - var root = jsdom().documentElement, - expected, - ease = function() { return expected = Math.random() * 2 - 0.5; }, - tween = function() { return function(t) { test.equal(t, schedule.state === state.ENDING ? 1 : expected); }; }, - transition = d3_selection.select(root).transition().ease(ease).tween("tween", tween).on("end", function() { test.end(); }), - schedule = root.__transition[transition._id]; +it("transition.ease(ease) observes the eased time returned by the easing function", async () => { + const root = document.documentElement; + let expected; + const ease = () => { return expected = Math.random() * 2 - 0.5; }; + const tween = () => { return t => { assert.strictEqual(t, schedule.state === ENDING ? 1 : expected); }; }; + const t = select(root).transition().ease(ease).tween("tween", tween); + const schedule = root.__transition[t._id]; + await t.end(); }); diff --git a/test/transition/easeVarying-test.js b/test/transition/easeVarying-test.js index 893a77d..5f0c7a7 100644 --- a/test/transition/easeVarying-test.js +++ b/test/transition/easeVarying-test.js @@ -1,43 +1,27 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_ease = require("d3-ease"), - d3_timer = require("d3-timer"), - d3_selection = require("d3-selection"), - state = require("./state"); +import assert from "assert"; +import {easePolyIn} from "d3-ease"; +import {select} from "d3-selection"; +import "../../src/index.js"; +import it from "../jsdom.js"; -require("../../"); - -tape("transition.easeVarying(factory) accepts an easing function factory", function(test) { - var document = jsdom("

"), - transition = d3_selection.select(document) - .selectAll("h1").data([{ exponent: 3 }, { exponent: 4 }]) - .transition(); - transition.easeVarying(d => d3_ease.easePolyIn.exponent(d.exponent)); - test.equal(transition.ease()(.5), d3_ease.easePolyIn.exponent(3)(0.5)); - test.end(); +it("transition.easeVarying(factory) accepts an easing function factory", "

", () => { + const t = select(document).selectAll("h1").data([{exponent: 3}, {exponent: 4}]).transition(); + t.easeVarying(d => easePolyIn.exponent(d.exponent)); + assert.strictEqual(t.ease()(0.5), easePolyIn.exponent(3)(0.5)); }); -tape("transition.easeVarying(factory)’ factory receives datum, index, group with the node as this", function(test) { - var document = jsdom("

"), - transition = d3_selection.select(document) - .selectAll("h1").data([{ exponent: 3 }, { exponent: 4 }]) - .transition(); - transition.easeVarying(function(d, i, e) { - test.equal(e.length, 2); - test.equal(d.exponent, i + 3); - test.equal(this, e[i]); - return t => t; - }); - test.end(); +it("transition.easeVarying(factory) passes factory datum, index, group with the node as this", "

", () => { + const t = select(document).selectAll("h1").data([{exponent: 3}, {exponent: 4}]).transition(); + const results = []; + t.easeVarying(function(d, i, e) { results.push([d, i, e, this]); return t => t; }); + assert.deepStrictEqual(results, [ + [{exponent: 3}, 0, [...t], document.querySelector("#one")], + [{exponent: 4}, 1, [...t], document.querySelector("#two")], + ]); }); -tape("transition.easeVarying() throws an error if the argument is not a function", function(test) { - var document = jsdom("

"), - transition = d3_selection.select(document) - .selectAll("h1").data([{ exponent: 3 }, { exponent: 4 }]) - .transition(); - test.throws(function() { transition.easeVarying(); }); - test.throws(function() { transition.easeVarying("a"); }); - test.end(); +it("transition.easeVarying() throws an error if the argument is not a function", "

", () => { + const t = select(document).selectAll("h1").data([{exponent: 3}, {exponent: 4}]).transition(); + assert.throws(() => { t.easeVarying(); }); + assert.throws(() => { t.easeVarying("a"); }); }); - diff --git a/test/transition/empty-test.js b/test/transition/empty-test.js index a0b070a..1802cef 100644 --- a/test/transition/empty-test.js +++ b/test/transition/empty-test.js @@ -1,8 +1,7 @@ -var tape = require("tape"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {selection} from "d3-selection"; +import {transition} from "../../src/index.js"; -tape("transition.empty is the same as selection.empty", function(test) { - test.equal(d3_transition.transition.prototype.empty, d3_selection.selection.prototype.empty); - test.end(); +it("transition.empty is the same as selection.empty", () => { + assert.strictEqual(transition.prototype.empty, selection.prototype.empty); }); diff --git a/test/transition/filter-test.js b/test/transition/filter-test.js index 09678a2..d06fea1 100644 --- a/test/transition/filter-test.js +++ b/test/transition/filter-test.js @@ -1,32 +1,28 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {selectAll} from "d3-selection"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("transition.filter(selector) retains the elements matching the specified selector", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }), - transition2 = transition1.filter("#two"); - test.equal(transition2 instanceof d3_transition.transition, true); - test.deepEqual(transition2._groups, [[two]]); - test.equal(transition2._parents, transition1._parents); - test.equal(transition2._name, transition1._name); - test.equal(transition2._id, transition1._id); - test.end(); +it("transition.filter(selector) retains the elements matching the specified selector", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }); + const t2 = t1.filter("#two"); + assert.strictEqual(t2 instanceof transition, true); + assert.deepStrictEqual(t2._groups, [[two]]); + assert.strictEqual(t2._parents, t1._parents); + assert.strictEqual(t2._name, t1._name); + assert.strictEqual(t2._id, t1._id); }); -tape("transition.filter(function) retains the elements for which the specified function returns true", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }), - transition2 = transition1.filter(function() { return this === two; }); - test.equal(transition2 instanceof d3_transition.transition, true); - test.deepEqual(transition2._groups, [[two]]); - test.equal(transition2._parents, transition1._parents); - test.equal(transition2._name, transition1._name); - test.equal(transition2._id, transition1._id); - test.end(); +it("transition.filter(function) retains the elements for which the specified function returns true", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }); + const t2 = t1.filter(function() { return this === two; }); + assert.strictEqual(t2 instanceof transition, true); + assert.deepStrictEqual(t2._groups, [[two]]); + assert.strictEqual(t2._parents, t1._parents); + assert.strictEqual(t2._name, t1._name); + assert.strictEqual(t2._id, t1._id); }); diff --git a/test/transition/index-test.js b/test/transition/index-test.js index 9c7fa1b..b5ad4ac 100644 --- a/test/transition/index-test.js +++ b/test/transition/index-test.js @@ -1,83 +1,50 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_transition = require("../../"); +import assert from "assert"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("d3.transition() returns a transition on the document element with the null name", function(test) { - var document = global.document = jsdom(), - root = document.documentElement; - try { - var transition = d3_transition.transition(), - schedule = root.__transition[transition._id]; - test.equal(transition.node(), root); - test.strictEqual(schedule.name, null); - test.end(); - } finally { - delete global.document; - } +it("transition() returns a transition on the document element with the null name", () => { + const root = document.documentElement; + const t = transition(); + const schedule = root.__transition[t._id]; + assert.strictEqual(t.node(), root); + assert.strictEqual(schedule.name, null); }); -tape("d3.transition(null) returns a transition on the document element with the null name", function(test) { - var document = global.document = jsdom(), - root = document.documentElement; - try { - var transition = d3_transition.transition(null), - schedule = root.__transition[transition._id]; - test.equal(transition.node(), root); - test.strictEqual(schedule.name, null); - test.end(); - } finally { - delete global.document; - } +it("transition(null) returns a transition on the document element with the null name", () => { + const root = document.documentElement; + const t = transition(null); + const schedule = root.__transition[t._id]; + assert.strictEqual(t.node(), root); + assert.strictEqual(schedule.name, null); }); -tape("d3.transition(undefined) returns a transition on the document element with the null name", function(test) { - var document = global.document = jsdom(), - root = document.documentElement; - try { - var transition = d3_transition.transition(undefined), - schedule = root.__transition[transition._id]; - test.equal(transition.node(), root); - test.strictEqual(schedule.name, null); - test.end(); - } finally { - delete global.document; - } +it("transition(undefined) returns a transition on the document element with the null name", () => { + const root = document.documentElement; + const t = transition(undefined); + const schedule = root.__transition[t._id]; + assert.strictEqual(t.node(), root); + assert.strictEqual(schedule.name, null); }); -tape("d3.transition(name) returns a transition on the document element with the specified name", function(test) { - var document = global.document = jsdom(), - root = document.documentElement; - try { - var transition = d3_transition.transition("foo"), - schedule = root.__transition[transition._id]; - test.equal(transition.node(), root); - test.strictEqual(schedule.name, "foo"); - test.end(); - } finally { - delete global.document; - } +it("transition(name) returns a transition on the document element with the specified name", () => { + const root = document.documentElement; + const t = transition("foo"); + const schedule = root.__transition[t._id]; + assert.strictEqual(t.node(), root); + assert.strictEqual(schedule.name, "foo"); }); -tape("d3.transition.prototype can be extended", function(test) { - global.document = jsdom(); +it("transition.prototype can be extended", () => { try { - var pass = 0; - d3_transition.transition.prototype.test = function() { return ++pass; }; - test.equal(d3_transition.transition().test(), 1); - test.equal(pass, 1); - test.end(); + let pass = 0; + transition.prototype.test = () => { return ++pass; }; + assert.strictEqual(transition().test(), 1); + assert.strictEqual(pass, 1); } finally { - delete d3_transition.transition.prototype.test; - delete global.document; + delete transition.prototype.test; } }); -tape("transitions are instanceof d3.transition", function(test) { - global.document = jsdom(); - try { - test.equal(d3_transition.transition() instanceof d3_transition.transition, true); - test.end(); - } finally { - delete global.document; - } +it("transitions are instanceof transition", () => { + assert.strictEqual(transition() instanceof transition, true); }); diff --git a/test/transition/merge-test.js b/test/transition/merge-test.js index 0ffa2e9..dd4d698 100644 --- a/test/transition/merge-test.js +++ b/test/transition/merge-test.js @@ -1,30 +1,26 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {select, selectAll} from "d3-selection"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("transition.merge(other) merges elements from the specified other transition for null elements in this transition", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition0 = d3_selection.select(document.documentElement).transition(), - transition1 = d3_selection.selectAll([null, two]).transition(transition0), - transition2 = d3_selection.selectAll([one, null]).transition(transition0), - transition3 = transition1.merge(transition2); - test.equal(transition3 instanceof d3_transition.transition, true); - test.deepEqual(transition3._groups, [[one, two]]); - test.equal(transition3._parents, transition1._parents); - test.equal(transition3._name, transition1._name); - test.equal(transition3._id, transition1._id); - test.end(); +it("transition.merge(other) merges elements from the specified other transition for null elements in this transition", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t0 = select(document.documentElement).transition(); + const t1 = selectAll([null, two]).transition(t0); + const t2 = selectAll([one, null]).transition(t0); + const t3 = t1.merge(t2); + assert.strictEqual(t3 instanceof transition, true); + assert.deepStrictEqual(t3._groups, [[one, two]]); + assert.strictEqual(t3._parents, t1._parents); + assert.strictEqual(t3._name, t1._name); + assert.strictEqual(t3._id, t1._id); }); -tape("transition.merge(other) throws an error if the other transition has a different id", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.selectAll([null, two]).transition(), - transition2 = d3_selection.selectAll([one, null]).transition(); - test.throws(function() { transition1.merge(transition2); }); - test.end(); +it("transition.merge(other) throws an error if the other transition has a different id", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = selectAll([null, two]).transition(); + const t2 = selectAll([one, null]).transition(); + assert.throws(() => { t1.merge(t2); }); }); diff --git a/test/transition/node-test.js b/test/transition/node-test.js index e5e2f6f..e8c0460 100644 --- a/test/transition/node-test.js +++ b/test/transition/node-test.js @@ -1,8 +1,8 @@ -var tape = require("tape"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {selection} from "d3-selection"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("transition.node is the same as selection.node", function(test) { - test.equal(d3_transition.transition.prototype.node, d3_selection.selection.prototype.node); - test.end(); +it("transition.node is the same as selection.node", () => { + assert.strictEqual(transition.prototype.node, selection.prototype.node); }); diff --git a/test/transition/nodes-test.js b/test/transition/nodes-test.js index d69926a..ea27864 100644 --- a/test/transition/nodes-test.js +++ b/test/transition/nodes-test.js @@ -1,8 +1,8 @@ -var tape = require("tape"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {selection} from "d3-selection"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("transition.nodes is the same as selection.nodes", function(test) { - test.equal(d3_transition.transition.prototype.nodes, d3_selection.selection.prototype.nodes); - test.end(); +it("transition.nodes is the same as selection.nodes", () => { + assert.strictEqual(transition.prototype.nodes, selection.prototype.nodes); }); diff --git a/test/transition/on-test.js b/test/transition/on-test.js index 3f1d6f3..4ef7a63 100644 --- a/test/transition/on-test.js +++ b/test/transition/on-test.js @@ -1,139 +1,116 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_timer = require("d3-timer"), - d3_selection = require("d3-selection"), - state = require("./state"); - -require("../../"); - -tape("transition.on(type, listener) throws an error if listener is not a function", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition(); - test.throws(function() { transition.on("start", 42); }); - test.end(); +import assert from "assert"; +import {select, selectAll} from "d3-selection"; +import {timeout} from "d3-timer"; +import "../../src/index.js"; +import {ENDED, ENDING, STARTING} from "../../src/transition/schedule.js"; +import it from "../jsdom.js"; + +it("transition.on(type, listener) throws an error if listener is not a function", async () => { + const root = document.documentElement; + const t = select(root).transition(); + assert.throws(() => { t.on("start", 42); }); }); -tape("transition.on(typename) returns the listener with the specified typename, if any", function(test) { - var root = jsdom().documentElement, - foo = function() {}, - bar = function() {}, - transition = d3_selection.select(root).transition().on("start", foo).on("start.bar", bar); - test.equal(transition.on("start"), foo); - test.equal(transition.on("start.foo"), undefined); - test.equal(transition.on("start.bar"), bar); - test.equal(transition.on("end"), undefined); - test.end(); +it("transition.on(typename) returns the listener with the specified typename, if any", async () => { + const root = document.documentElement; + const foo = () => {}; + const bar = () => {}; + const t = select(root).transition().on("start", foo).on("start.bar", bar); + assert.strictEqual(t.on("start"), foo); + assert.strictEqual(t.on("start.foo"), undefined); + assert.strictEqual(t.on("start.bar"), bar); + assert.strictEqual(t.on("end"), undefined); }); -tape("transition.on(typename) throws an error if the specified type is not supported", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition(); - test.throws(function() { transition.on("foo"); }); - test.end(); +it("transition.on(typename) throws an error if the specified type is not supported", async () => { + const root = document.documentElement; + const t = select(root).transition(); + assert.throws(() => { t.on("foo"); }); }); -tape("transition.on(typename, listener) throws an error if the specified type is not supported", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition(); - test.throws(function() { transition.on("foo", function() {}); }); - test.end(); +it("transition.on(typename, listener) throws an error if the specified type is not supported", async () => { + const root = document.documentElement; + const t = select(root).transition(); + assert.throws(() => { t.on("foo", () => {}); }); }); -tape("transition.on(typename, listener) throws an error if the specified listener is not a function", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition(); - test.throws(function() { transition.on("foo", 42); }); - test.end(); +it("transition.on(typename, listener) throws an error if the specified listener is not a function", async () => { + const root = document.documentElement; + const t = select(root).transition(); + assert.throws(() => { t.on("foo", 42); }); }); -tape("transition.on(typename, null) removes the listener with the specified typename, if any", function(test) { - var root = jsdom().documentElement, - starts = 0, - transition = d3_selection.select(root).transition().on("start.foo", function() { ++starts; }), - schedule = root.__transition[transition._id]; - - test.equal(transition.on("start.foo", null), transition); - test.equal(transition.on("start.foo"), undefined); - test.equal(schedule.on.on("start.foo"), undefined); - - d3_timer.timeout(function() { - test.equal(starts, 0); - test.end(); - }); +it("transition.on(typename, null) removes the listener with the specified typename, if any", async () => { + const root = document.documentElement; + let starts = 0; + const t = select(root).transition().on("start.foo", () => { ++starts; }); + const schedule = root.__transition[t._id]; + assert.strictEqual(t.on("start.foo", null), t); + assert.strictEqual(t.on("start.foo"), undefined); + assert.strictEqual(schedule.on.on("start.foo"), undefined); + await new Promise(resolve => timeout(resolve)); + assert.strictEqual(starts, 0); }); -tape("transition.on(\"start\", listener) registers a listener for the start event", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition().on("start", started), - schedule = root.__transition[transition._id]; - - function started() { - test.equal(schedule.state, state.STARTING); - test.end(); - } +it("transition.on(\"start\", listener) registers a listener for the start event", async () => { + const root = document.documentElement; + const t = select(root).transition(); + const schedule = root.__transition[t._id]; + await new Promise(resolve => t.on("start", () => { + assert.strictEqual(schedule.state, STARTING) + resolve(); + })); }); -tape("transition.on(\"interrupt\", listener) registers a listener for the interrupt event (during start)", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().on("interrupt", interrupted), - schedule = root.__transition[transition._id]; - - function interrupted() { - test.equal(schedule.state, state.ENDED); - test.end(); - } - - d3_timer.timeout(function() { - selection.interrupt(); - }); +it("transition.on(\"interrupt\", listener) registers a listener for the interrupt event (during start)", async () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition(); + const schedule = root.__transition[t._id]; + timeout(() => s.interrupt()); + await new Promise(resolve => t.on("interrupt", () => { + assert.strictEqual(schedule.state, ENDED); + resolve(); + })); }); -tape("transition.on(\"interrupt\", listener) registers a listener for the interrupt event (during run)", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().on("interrupt", interrupted), - schedule = root.__transition[transition._id]; - - function interrupted() { - test.equal(schedule.state, state.ENDED); - test.end(); - } - - d3_timer.timeout(function() { - selection.interrupt(); - }, 50); +it("transition.on(\"interrupt\", listener) registers a listener for the interrupt event (during run)", async () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition(); + const schedule = root.__transition[t._id]; + timeout(() => s.interrupt(), 50); + await new Promise(resolve => t.on("interrupt", () => { + assert.strictEqual(schedule.state, ENDED); + resolve(); + })); }); -tape("transition.on(\"end\", listener) registers a listener for the end event", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition().duration(50).on("end", ended), - schedule = root.__transition[transition._id]; - - function ended() { - test.equal(schedule.state, state.ENDING); - test.end(); - } +it("transition.on(\"end\", listener) registers a listener for the end event", async () => { + const root = document.documentElement; + const t = select(root).transition().duration(50); + const schedule = root.__transition[t._id]; + await new Promise(resolve => t.on("end", () => { + assert.strictEqual(schedule.state, ENDING); + resolve(); + })); }); -tape("transition.on(typename, listener) uses copy-on-write to apply changes", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - foo = function() {}, - bar = function() {}, - transition = d3_selection.selectAll([one, two]).transition(), - schedule1 = one.__transition[transition._id], - schedule2 = two.__transition[transition._id]; - - transition.on("start", foo); - test.equal(schedule1.on.on("start"), foo); - test.equal(schedule2.on, schedule1.on); - transition.on("start", bar); - test.equal(schedule1.on.on("start"), bar); - test.equal(schedule2.on, schedule1.on); - d3_selection.select(two).transition(transition).on("start", foo); - test.equal(schedule1.on.on("start"), bar); - test.equal(schedule2.on.on("start"), foo); - test.end(); +it("transition.on(typename, listener) uses copy-on-write to apply changes", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const foo = () => {}; + const bar = () => {}; + const t = selectAll([one, two]).transition(); + const schedule1 = one.__transition[t._id]; + const schedule2 = two.__transition[t._id]; + t.on("start", foo); + assert.strictEqual(schedule1.on.on("start"), foo); + assert.strictEqual(schedule2.on, schedule1.on); + t.on("start", bar); + assert.strictEqual(schedule1.on.on("start"), bar); + assert.strictEqual(schedule2.on, schedule1.on); + select(two).transition(t).on("start", foo); + assert.strictEqual(schedule1.on.on("start"), bar); + assert.strictEqual(schedule2.on.on("start"), foo); }); diff --git a/test/transition/remove-test.js b/test/transition/remove-test.js index 4af4b78..e222367 100644 --- a/test/transition/remove-test.js +++ b/test/transition/remove-test.js @@ -1,49 +1,47 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_timer = require("d3-timer"), - d3_selection = require("d3-selection"); - -require("../../"); - -tape("transition.remove() creates an end listener to remove the element", function(test) { - var document = jsdom(), - root = document.documentElement, - body = document.body, - selection = d3_selection.select(body), - transition = selection.transition().remove().on("start", started).on("end", ended); +import assert from "assert"; +import {select} from "d3-selection"; +import {timeout} from "d3-timer"; +import "../../src/index.js"; +import it from "../jsdom.js"; + +it("transition.remove() creates an end listener to remove the element", async () => { + const root = document.documentElement; + const body = document.body; + const s = select(body); + const t = s.transition().remove().on("start", started).on("end", ended); + const end = t.end(); function started() { - test.equal(body.parentNode, root); + assert.strictEqual(body.parentNode, root); } function ended() { - test.equal(body.parentNode, null); - test.end(); + assert.strictEqual(body.parentNode, null); } - d3_timer.timeout(function(elapsed) { - test.equal(body.parentNode, root); - }); + await new Promise(resolve => timeout(resolve)); + assert.strictEqual(body.parentNode, root); + await end; }); -tape("transition.remove() creates an end listener named end.remove", function(test) { - var document = jsdom(), - root = document.documentElement, - body = document.body, - selection = d3_selection.select(body), - transition = selection.transition().remove().on("start", started).on("end", ended); - - transition.on("end.remove").call(body); - test.equal(body.parentNode, null); - transition.on("end.remove", null); - root.appendChild(body); +it("transition.remove() creates an end listener named end.remove", async () => { + const root = document.documentElement; + const body = document.body; + const s = select(body); + const t = s.transition().remove().on("start", started).on("end", ended); + const end = t.end(); function started() { - test.equal(body.parentNode, root); + assert.strictEqual(body.parentNode, root); } function ended() { - test.equal(body.parentNode, root); - test.end(); + assert.strictEqual(body.parentNode, root); } + + t.on("end.remove").call(body); + assert.strictEqual(body.parentNode, null); + t.on("end.remove", null); + root.appendChild(body); + await end; }); diff --git a/test/transition/select-test.js b/test/transition/select-test.js index 7bd24f9..fef73ab 100644 --- a/test/transition/select-test.js +++ b/test/transition/select-test.js @@ -1,40 +1,36 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {selectAll} from "d3-selection"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("transition.select(selector) selects the descendants matching the specified selector, then derives a transition", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }), - transition2 = transition1.select("child"); - test.equal(transition2 instanceof d3_transition.transition, true); - test.deepEqual(transition2._groups, [[one.firstChild, two.firstChild]]); - test.equal(transition2._parents, transition1._parents); - test.equal(transition2._name, transition1._name); - test.equal(transition2._id, transition1._id); - test.equal(one.firstChild.__data__, 1); - test.equal(two.firstChild.__data__, 2); - test.equal(one.firstChild.__transition[transition1._id].delay, 10); - test.equal(two.firstChild.__transition[transition1._id].delay, 20); - test.end(); +it("transition.select(selector) selects the descendants matching the specified selector, then derives a transition", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }); + const t2 = t1.select("child"); + assert.strictEqual(t2 instanceof transition, true); + assert.deepStrictEqual(t2._groups, [[one.firstChild, two.firstChild]]); + assert.strictEqual(t2._parents, t1._parents); + assert.strictEqual(t2._name, t1._name); + assert.strictEqual(t2._id, t1._id); + assert.strictEqual(one.firstChild.__data__, 1); + assert.strictEqual(two.firstChild.__data__, 2); + assert.strictEqual(one.firstChild.__transition[t1._id].delay, 10); + assert.strictEqual(two.firstChild.__transition[t1._id].delay, 20); }); -tape("transition.select(function) selects the descendants returned by the specified function, then derives a transition", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }), - transition2 = transition1.select(function() { return this.firstChild; }); - test.equal(transition2 instanceof d3_transition.transition, true); - test.deepEqual(transition2._groups, [[one.firstChild, two.firstChild]]); - test.equal(transition2._parents, transition1._parents); - test.equal(transition2._name, transition1._name); - test.equal(transition2._id, transition1._id); - test.equal(one.firstChild.__data__, 1); - test.equal(two.firstChild.__data__, 2); - test.equal(one.firstChild.__transition[transition1._id].delay, 10); - test.equal(two.firstChild.__transition[transition1._id].delay, 20); - test.end(); +it("transition.select(function) selects the descendants returned by the specified function, then derives a transition", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }); + const t2 = t1.select(function() { return this.firstChild; }); + assert.strictEqual(t2 instanceof transition, true); + assert.deepStrictEqual(t2._groups, [[one.firstChild, two.firstChild]]); + assert.strictEqual(t2._parents, t1._parents); + assert.strictEqual(t2._name, t1._name); + assert.strictEqual(t2._id, t1._id); + assert.strictEqual(one.firstChild.__data__, 1); + assert.strictEqual(two.firstChild.__data__, 2); + assert.strictEqual(one.firstChild.__transition[t1._id].delay, 10); + assert.strictEqual(two.firstChild.__transition[t1._id].delay, 20); }); diff --git a/test/transition/selectAll-test.js b/test/transition/selectAll-test.js index cfc2a17..20185f2 100644 --- a/test/transition/selectAll-test.js +++ b/test/transition/selectAll-test.js @@ -1,40 +1,36 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {selectAll} from "d3-selection"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("transition.selectAll(selector) selects the descendants matching the specified selector, then derives a transition", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }), - transition2 = transition1.selectAll("child"); - test.equal(transition2 instanceof d3_transition.transition, true); - test.deepEqual(transition2._groups, [[one.firstChild], [two.firstChild]]); - test.deepEqual(transition2._parents, [one, two]); - test.equal(transition2._name, transition1._name); - test.equal(transition2._id, transition1._id); - test.equal("__data__" in one.firstChild, false); - test.equal("__data__" in two.firstChild, false); - test.equal(one.firstChild.__transition[transition1._id].delay, 10); - test.equal(two.firstChild.__transition[transition1._id].delay, 20); - test.end(); +it("transition.selectAll(selector) selects the descendants matching the specified selector, then derives a transition", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }); + const t2 = t1.selectAll("child"); + assert.strictEqual(t2 instanceof transition, true); + assert.deepStrictEqual(t2._groups.map(group => Array.from(group)), [[one.firstChild], [two.firstChild]]); + assert.deepStrictEqual(t2._parents, [one, two]); + assert.strictEqual(t2._name, t1._name); + assert.strictEqual(t2._id, t1._id); + assert.strictEqual("__data__" in one.firstChild, false); + assert.strictEqual("__data__" in two.firstChild, false); + assert.strictEqual(one.firstChild.__transition[t1._id].delay, 10); + assert.strictEqual(two.firstChild.__transition[t1._id].delay, 20); }); -tape("transition.selectAll(function) selects the descendants returned by the specified function, then derives a transition", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition1 = d3_selection.selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }), - transition2 = transition1.selectAll(function() { return [this.firstChild]; }); - test.equal(transition2 instanceof d3_transition.transition, true); - test.deepEqual(transition2._groups, [[one.firstChild], [two.firstChild]]); - test.deepEqual(transition2._parents, [one, two]); - test.equal(transition2._name, transition1._name); - test.equal(transition2._id, transition1._id); - test.equal("__data__" in one.firstChild, false); - test.equal("__data__" in two.firstChild, false); - test.equal(one.firstChild.__transition[transition1._id].delay, 10); - test.equal(two.firstChild.__transition[transition1._id].delay, 20); - test.end(); +it("transition.selectAll(function) selects the descendants returned by the specified function, then derives a transition", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t1 = selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; }); + const t2 = t1.selectAll(function() { return [this.firstChild]; }); + assert.strictEqual(t2 instanceof transition, true); + assert.deepStrictEqual(t2._groups, [[one.firstChild], [two.firstChild]]); + assert.deepStrictEqual(t2._parents, [one, two]); + assert.strictEqual(t2._name, t1._name); + assert.strictEqual(t2._id, t1._id); + assert.strictEqual("__data__" in one.firstChild, false); + assert.strictEqual("__data__" in two.firstChild, false); + assert.strictEqual(one.firstChild.__transition[t1._id].delay, 10); + assert.strictEqual(two.firstChild.__transition[t1._id].delay, 20); }); diff --git a/test/transition/selection-test.js b/test/transition/selection-test.js index 9208d8c..1e7789e 100644 --- a/test/transition/selection-test.js +++ b/test/transition/selection-test.js @@ -1,16 +1,13 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"); +import assert from "assert"; +import {select, selection} from "d3-selection"; +import "../../src/index.js"; +import it from "../jsdom.js"; -require("../../"); - -tape("transition.selection() returns the transition’s selection", function(test) { - var document = jsdom("

one

two

"), - selection0 = d3_selection.select(document.body).selectAll("h1"), - transition = selection0.transition(), - selection1 = transition.selection(); - test.ok(selection1 instanceof d3_selection.selection); - test.equal(selection1._groups, selection0._groups); - test.equal(selection1._parents, selection0._parents); - test.end(); +it("transition.selection() returns the transition’s selection", "

one

two

", () => { + const s0 = select(document.body).selectAll("h1"); + const t = s0.transition(); + const s1 = t.selection(); + assert(s1 instanceof selection); + assert.strictEqual(s1._groups, s0._groups); + assert.strictEqual(s1._parents, s0._parents); }); diff --git a/test/transition/size-test.js b/test/transition/size-test.js index eb18b18..bd39f17 100644 --- a/test/transition/size-test.js +++ b/test/transition/size-test.js @@ -1,16 +1,14 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_selection = require("d3-selection"), - d3_transition = require("../../"); +import assert from "assert"; +import {select, selectAll, selection} from "d3-selection"; +import {transition} from "../../src/index.js"; +import it from "../jsdom.js"; -tape("transition.size is the same as selection.size", function(test) { - test.equal(d3_transition.transition.prototype.size, d3_selection.selection.prototype.size); - test.end(); +it("transition.size is the same as selection.size", () => { + assert.strictEqual(transition.prototype.size, selection.prototype.size); }); -tape("transition.size() returns the expected value", function(test) { - var root = jsdom().documentElement; - test.equal(d3_selection.select(root).transition().size(), 1); - test.equal(d3_selection.selectAll([null, root]).transition().size(), 1); - test.end(); +it("transition.size() returns the expected value", () => { + const root = document.documentElement; + assert.strictEqual(select(root).transition().size(), 1); + assert.strictEqual(selectAll([null, root]).transition().size(), 1); }); diff --git a/test/transition/state.js b/test/transition/state.js deleted file mode 100644 index eb88f04..0000000 --- a/test/transition/state.js +++ /dev/null @@ -1,7 +0,0 @@ -exports.CREATED = 0; -exports.SCHEDULED = 1; -exports.STARTING = 2; -exports.STARTED = 3; -exports.RUNNING = 4; -exports.ENDING = 5; -exports.ENDED = 6; diff --git a/test/transition/style-test.js b/test/transition/style-test.js index 4562100..6610561 100644 --- a/test/transition/style-test.js +++ b/test/transition/style-test.js @@ -1,239 +1,203 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_ease = require("d3-ease"), - d3_timer = require("d3-timer"), - d3_interpolate = require("d3-interpolate"), - d3_selection = require("d3-selection"); - -require("../../"); - -tape("transition.style(name, value) creates an tween to the specified value", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("red", "blue"), - selection = d3_selection.select(root).style("color", "red"), - transition = selection.transition().style("color", "blue"); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.style(name, value) creates an tween to the value returned by the specified function", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("red", "blue"), - selection = d3_selection.select(root).style("color", "red"), - transition = selection.transition().style("color", function() { return "blue"; }); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.style(name, value) immediately evaluates the specified function with the expected context and arguments", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - ease = d3_ease.easeCubic, - duration = 250, - interpolate1 = d3_interpolate.interpolateRgb("cyan", "red"), - interpolate2 = d3_interpolate.interpolateRgb("magenta", "green"), - selection = d3_selection.selectAll([one, two]).data(["red", "green"]), - result = [], - transition = selection.transition().style("color", function(d, i, nodes) { result.push([d, i, nodes, this]); return d; }); - - test.deepEqual(result, [ +import assert from "assert"; +import {easeCubic} from "d3-ease"; +import {interpolateNumber, interpolateRgb, interpolateString} from "d3-interpolate"; +import {select, selectAll} from "d3-selection"; +import {timeout} from "d3-timer"; +import "../../src/index.js"; +import it from "../jsdom.js"; + +it("transition.style(name, value) creates an tween to the specified value", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("red", "blue"); + const s = select(root).style("color", "red"); + s.transition().style("color", "blue"); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.style(name, value) creates an tween to the value returned by the specified function", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("red", "blue"); + const s = select(root).style("color", "red"); + s.transition().style("color", () => "blue"); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.style(name, value) immediately evaluates the specified function with the expected context and arguments", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const ease = easeCubic; + const duration = 250; + const interpolate1 = interpolateRgb("cyan", "red"); + const interpolate2 = interpolateRgb("magenta", "green"); + const t = selectAll([one, two]).data(["red", "green"]); + const result = []; + t.transition().style("color", function(d, i, nodes) { result.push([d, i, nodes, this]); return d; }); + assert.deepStrictEqual(result, [ ["red", 0, [one, two], one], ["green", 1, [one, two], two] ]); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(one.style.getPropertyValue("color"), interpolate1(ease(elapsed / duration))); - test.strictEqual(two.style.getPropertyValue("color"), interpolate2(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.style(name, value) recycles tweens ", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - transition = d3_selection.selectAll([one, two]).transition().style("color", "red"); - test.strictEqual(one.__transition[transition._id].tween, two.__transition[transition._id].tween); - test.end(); -}); - -tape("transition.style(name, value) constructs an interpolator using the current value on start", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("red", "blue"), - selection = d3_selection.select(root), - transition = selection.transition().on("start", function() { selection.style("color", "red"); }).style("color", function() { return "blue"; }); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.style(name, null) creates an tween which removes the specified style post-start", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("color", "red"), - transition = selection.transition().style("color", null).on("start", started); - - function started() { - test.equal(root.style.getPropertyValue("color"), "red"); - } - - d3_timer.timeout(function(elapsed) { - test.equal(root.style.getPropertyValue("color"), ""); - test.end(); - }); -}); - -tape("transition.style(name, null) creates an tween which removes the specified style post-start", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("color", "red"), - transition = selection.transition().style("color", () => null).on("start", started); - - function started() { - test.equal(root.style.getPropertyValue("color"), "red"); - } - - d3_timer.timeout(function(elapsed) { - test.equal(root.style.getPropertyValue("color"), ""); - test.end(); - }); -}); - -tape("transition.style(name, value) creates an tween which removes the specified style post-start if the specified function returns null", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("color", "red"), - transition = selection.transition().style("color", function() {}).on("start", started); - - function started() { - test.equal(root.style.getPropertyValue("color"), "red"); - } - - d3_timer.timeout(function(elapsed) { - test.equal(root.style.getPropertyValue("color"), ""); - test.end(); - }); -}); - -tape("transition.style(name, constant) is a noop if the string-coerced value matches the current value on tween initialization", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("opacity", 1), - transition = selection.transition().style("opacity", 1); - - d3_timer.timeout(function(elapsed) { - root.style.opacity = 0.5; - }, 125); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("opacity"), "0.5"); - test.end(); - }, 250); -}); - -tape("transition.style(name, function) is a noop if the string-coerced value matches the current value on tween initialization", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("opacity", 1), - transition = selection.transition().style("opacity", function() { return 1; }); - - d3_timer.timeout(function(elapsed) { - root.style.opacity = 0.5; - }, 125); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("opacity"), "0.5"); - test.end(); - }, 250); -}); - -tape("transition.style(name, value) interpolates numbers", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateNumber(0, 1), - selection = d3_selection.select(root).style("opacity", 0), - transition = selection.transition().style("opacity", 1); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("opacity"), interpolate(ease(elapsed / duration)) + ""); - test.end(); - }, 125); -}); - -tape("transition.style(name, constant) uses interpolateNumber if value is a number", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("font-size", "15px"), - transition = selection.transition().style("font-size", 10); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("font-size"), "NaN"); - test.end(); - }, 125); -}); - -tape("transition.style(name, function) uses interpolateNumber if value is a number", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("font-size", "15px"), - transition = selection.transition().style("font-size", () => 10); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("font-size"), "NaN"); - test.end(); - }, 125); -}); - -tape("transition.style(name, value) interpolates strings", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateString("1px", "2px"), - selection = d3_selection.select(root).style("font-size", "1px"), - transition = selection.transition().style("font-size", "2px"); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("font-size"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.style(name, value) interpolates colors", function(test) { - var root = jsdom().documentElement, - ease = d3_ease.easeCubic, - duration = 250, - interpolate = d3_interpolate.interpolateRgb("#f00", "#00f"), - selection = d3_selection.select(root).style("color", "#f00"), - transition = selection.transition().style("color", "#00f"); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / duration))); - test.end(); - }, 125); -}); - -tape("transition.style(name, value) creates an styleTween with the specified name", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("color", "red"), - transition = selection.transition().style("color", "blue"); - test.equal(transition.styleTween("color").call(root).call(root, 0.5), "rgb(128, 0, 128)"); - test.end(); -}); - -tape("transition.style(name, value) creates a tween with the name \"style.name\"", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("color", "red"), - transition = selection.transition().style("color", "blue"); - transition.tween("style.color").call(root).call(root, 0.5); - test.equal(root.style.getPropertyValue("color"), "rgb(128, 0, 128)"); - test.end(); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(one.style.getPropertyValue("color"), interpolate1(ease(elapsed / duration))); + assert.strictEqual(two.style.getPropertyValue("color"), interpolate2(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.style(name, value) recycles tweens ", "

", () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const t = selectAll([one, two]).transition().style("color", "red"); + assert.strictEqual(one.__transition[t._id].tween, two.__transition[t._id].tween); +}); + +it("transition.style(name, value) constructs an interpolator using the current value on start", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("red", "blue"); + const s = select(root); + s.transition().on("start", () => { s.style("color", "red"); }).style("color", () => "blue"); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.style(name, null) creates an tween which removes the specified style post-start", async () => { + const root = document.documentElement; + const started = () => assert.strictEqual(root.style.getPropertyValue("color"), "red"); + const s = select(root).style("color", "red"); + s.transition().style("color", null).on("start", started); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.style.getPropertyValue("color"), ""); + resolve(); + })); +}); + +it("transition.style(name, null) creates an tween which removes the specified style post-start", async () => { + const root = document.documentElement; + const started = () => assert.strictEqual(root.style.getPropertyValue("color"), "red"); + const selection = select(root).style("color", "red"); + selection.transition().style("color", () => null).on("start", started); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.style.getPropertyValue("color"), ""); + resolve(); + })); +}); + +it("transition.style(name, value) creates an tween which removes the specified style post-start if the specified function returns null", async () => { + const root = document.documentElement; + const started = () => assert.strictEqual(root.style.getPropertyValue("color"), "red"); + const selection = select(root).style("color", "red"); + selection.transition().style("color", function() {}).on("start", started); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.style.getPropertyValue("color"), ""); + resolve(); + })); +}); + +it("transition.style(name, constant) is a noop if the string-coerced value matches the current value on tween initialization", async () => { + const root = document.documentElement; + const selection = select(root).style("opacity", 1); + selection.transition().style("opacity", 1); + timeout(() => { root.style.opacity = 0.5; }, 125); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.style.getPropertyValue("opacity"), "0.5"); + resolve(); + }, 250)); +}); + +it("transition.style(name, function) is a noop if the string-coerced value matches the current value on tween initialization", async () => { + const root = document.documentElement; + const selection = select(root).style("opacity", 1); + selection.transition().style("opacity", function() { return 1; }); + timeout(() => { root.style.opacity = 0.5; }, 125); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.style.getPropertyValue("opacity"), "0.5"); + resolve(); + }, 250)); +}); + +it("transition.style(name, value) interpolates numbers", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateNumber(0, 1); + const s = select(root).style("opacity", 0); + s.transition().style("opacity", 1); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.style.getPropertyValue("opacity"), interpolate(ease(elapsed / duration)) + ""); + resolve(); + }, 125)); +}); + +it("transition.style(name, constant) uses interpolateNumber if value is a number", async () => { + const root = document.documentElement; + const s = select(root).style("font-size", "15px"); + s.transition().style("font-size", 10); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.style.getPropertyValue("font-size"), "15px"); // ignores NaN + resolve(); + }, 125)); +}); + +it("transition.style(name, function) uses interpolateNumber if value is a number", async () => { + const root = document.documentElement; + const s = select(root).style("font-size", "15px"); + s.transition().style("font-size", () => 10); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.style.getPropertyValue("font-size"), "15px"); // ignores NaN + resolve(); + }, 125)); +}); + +it("transition.style(name, value) interpolates strings", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateString("1px", "2px"); + const s = select(root).style("font-size", "1px"); + s.transition().style("font-size", "2px"); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.style.getPropertyValue("font-size"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.style(name, value) interpolates colors", async () => { + const root = document.documentElement; + const ease = easeCubic; + const duration = 250; + const interpolate = interpolateRgb("#f00", "#00f"); + const s = select(root).style("color", "#f00"); + s.transition().style("color", "#00f"); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / duration))); + resolve(); + }, 125)); +}); + +it("transition.style(name, value) creates an styleTween with the specified name", async () => { + const root = document.documentElement; + const s = select(root).style("color", "red"); + const t = s.transition().style("color", "blue"); + assert.strictEqual(t.styleTween("color").call(root).call(root, 0.5), "rgb(128, 0, 128)"); +}); + +it("transition.style(name, value) creates a tween with the name \"style.name\"", async () => { + const root = document.documentElement; + const s = select(root).style("color", "red"); + const t = s.transition().style("color", "blue"); + t.tween("style.color").call(root).call(root, 0.5); + assert.strictEqual(root.style.getPropertyValue("color"), "rgb(128, 0, 128)"); }); diff --git a/test/transition/styleTween-test.js b/test/transition/styleTween-test.js index fc5e06b..0bbfb05 100644 --- a/test/transition/styleTween-test.js +++ b/test/transition/styleTween-test.js @@ -1,138 +1,116 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_ease = require("d3-ease"), - d3_timer = require("d3-timer"), - d3_interpolate = require("d3-interpolate"), - d3_selection = require("d3-selection"), - state = require("./state"); - -require("../../"); - -tape("transition.styleTween(name, value) defines a style tween using the interpolator returned by the specified function", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - ease = d3_ease.easeCubic, - transition = d3_selection.select(root).transition().styleTween("color", function() { return interpolate; }); - - d3_timer.timeout(function(elapsed) { - test.deepEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / 250))); - test.deepEqual(root.style.getPropertyPriority("color"), ""); - test.end(); - }, 125); +import assert from "assert"; +import {easeCubic} from "d3-ease"; +import {interpolateHcl} from "d3-interpolate"; +import {select, selectAll} from "d3-selection"; +import {now, timeout} from "d3-timer"; +import "../../src/index.js"; +import {ENDING} from "../../src/transition/schedule.js"; +import it from "../jsdom.js"; + +it("transition.styleTween(name, value) defines a style tween using the interpolator returned by the specified function", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + const ease = easeCubic; + select(root).transition().styleTween("color", () => interpolate); + await new Promise(resolve => timeout(elapsed => { + assert.deepStrictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / 250))); + assert.deepStrictEqual(root.style.getPropertyPriority("color"), ""); + resolve(); + }, 125)); }); -tape("transition.styleTween(name, value, priority) defines a style tween using the interpolator returned by the specified function", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - ease = d3_ease.easeCubic, - transition = d3_selection.select(root).transition().styleTween("color", function() { return interpolate; }, "important"); - - d3_timer.timeout(function(elapsed) { - test.deepEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / 250))); - test.deepEqual(root.style.getPropertyPriority("color"), "important"); - test.end(); - }, 125); +it("transition.styleTween(name, value, priority) defines a style tween using the interpolator returned by the specified function", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + const ease = easeCubic; + select(root).transition().styleTween("color", () => interpolate, "important"); + await new Promise(resolve => timeout(elapsed => { + assert.deepStrictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / 250))); + assert.deepStrictEqual(root.style.getPropertyPriority("color"), "important"); + resolve(); + }, 125)); }); -tape("transition.styleTween(name, value) invokes the value function with the expected context and arguments", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - result = [], - transition = d3_selection.selectAll([one, two]).data(["one", "two"]).transition().styleTween("color", function(d, i, nodes) { result.push([d, i, nodes, this]); }); - - d3_timer.timeout(function(elapsed) { - test.deepEqual(result, [ - ["one", 0, [one, two], one], - ["two", 1, [one, two], two] - ]); - test.end(); - }); +it("transition.styleTween(name, value) invokes the value function with the expected context and arguments", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const result = []; + selectAll([one, two]).data(["one", "two"]).transition().styleTween("color", function(d, i, nodes) { result.push([d, i, nodes, this]); }); + await new Promise(resolve => timeout(resolve)); + assert.deepStrictEqual(result, [ + ["one", 0, [one, two], one], + ["two", 1, [one, two], two] + ]); }); -tape("transition.styleTween(name, value) passes the eased time to the interpolator", function(test) { - var root = jsdom().documentElement, - then = d3_timer.now(), - duration = 250, - ease = d3_ease.easeCubic, - transition = d3_selection.select(root).transition().styleTween("color", function() { return interpolate; }).on("end", function() { test.end(); }), - schedule = root.__transition[transition._id]; - +it("transition.styleTween(name, value) passes the eased time to the interpolator", async () => { + const root = document.documentElement; + const then = now(); + const duration = 250; + const ease = easeCubic; + const t = select(root).transition().styleTween("color", () => interpolate); + const schedule = root.__transition[t._id]; function interpolate(t) { - "use strict"; - test.equal(this, root); - test.equal(t, schedule.state === state.ENDING ? 1 : ease((d3_timer.now() - then) / duration)); + assert.strictEqual(this, root); + assert.strictEqual(t, schedule.state === ENDING ? 1 : ease((now() - then) / duration)); } + await t.end(); }); -tape("transition.styleTween(name, value) allows the specified function to return null for a noop", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root).style("color", "red"), - transition = selection.transition().styleTween("color", function() {}); - - d3_timer.timeout(function(elapsed) { - test.deepEqual(root.style.getPropertyValue("color"), "red"); - test.end(); - }, 125); +it("transition.styleTween(name, value) allows the specified function to return null for a noop", async () => { + const root = document.documentElement; + const s = select(root).style("color", "red"); + s.transition().styleTween("color", () => {}); + await new Promise(resolve => timeout(() => { + assert.deepStrictEqual(root.style.getPropertyValue("color"), "red"); + resolve(); + }, 125)); }); -tape("transition.styleTween(name, value) coerces the specified name to a string", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - ease = d3_ease.easeCubic, - transition = d3_selection.select(root).transition().styleTween({toString: function() { return "color"; }}, function() { return interpolate; }); - - d3_timer.timeout(function(elapsed) { - test.deepEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / 250))); - test.end(); - }, 125); +it("transition.styleTween(name, value) coerces the specified name to a string", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + const ease = easeCubic; + select(root).transition().styleTween({toString() { return "color"; }}, () => interpolate); + await new Promise(resolve => timeout(elapsed => { + assert.deepStrictEqual(root.style.getPropertyValue("color"), interpolate(ease(elapsed / 250))); + resolve(); + }, 125)); }); -tape("transition.styleTween(name, value) throws an error if value is not null and not a function", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition(); - test.throws(function() { transition.styleTween("color", 42); }); - test.end(); +it("transition.styleTween(name, value) throws an error if value is not null and not a function", async () => { + const root = document.documentElement; + const t = select(root).transition(); + assert.throws(() => { t.styleTween("color", 42); }); }); -tape("transition.styleTween(name, null) removes the specified style tween", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - transition = d3_selection.select(root).transition().styleTween("color", function() { return interpolate; }).styleTween("color", null); - - test.equal(transition.styleTween("color"), null); - test.equal(transition.tween("style.color"), null); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(root.style.getPropertyValue("color"), ""); - test.end(); - }, 125); +it("transition.styleTween(name, null) removes the specified style tween", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + const t = select(root).transition().styleTween("color", () => interpolate).styleTween("color", null); + assert.strictEqual(t.styleTween("color"), null); + assert.strictEqual(t.tween("style.color"), null); + await new Promise(resolve => timeout(() => { + assert.strictEqual(root.style.getPropertyValue("color"), ""); + resolve(); + }, 125)); }); -tape("transition.styleTween(name) returns the style tween with the specified name", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - tween = function() { return interpolate; }, - transition = d3_selection.select(root).transition().styleTween("color", tween).on("start", started).on("end", ended); - - test.equal(transition.styleTween("color"), tween); - test.equal(transition.styleTween("bar"), null); - - function started() { - test.equal(transition.styleTween("color"), tween); - } - - function ended() { - test.equal(transition.styleTween("color"), tween); - test.end(); - } +it("transition.styleTween(name) returns the style tween with the specified name", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + const tween = () => interpolate; + const started = () => { assert.strictEqual(t.styleTween("color"), tween); }; + const ended = () => { assert.strictEqual(t.styleTween("color"), tween); }; + const t = select(root).transition().styleTween("color", tween).on("start", started).on("end", ended); + assert.strictEqual(t.styleTween("color"), tween); + assert.strictEqual(t.styleTween("bar"), null); + await t.end(); }); -tape("transition.styleTween(name) coerces the specified name to a string", function(test) { - var root = jsdom().documentElement, - tween = function() {}, - transition = d3_selection.select(root).transition().styleTween("color", tween); - - test.equal(transition.styleTween({toString: function() { return "color"; }}), tween); - test.end(); +it("transition.styleTween(name) coerces the specified name to a string", async () => { + const root = document.documentElement; + const tween = () => {}; + const t = select(root).transition().styleTween("color", tween); + assert.strictEqual(t.styleTween({toString() { return "color"; }}), tween); }); diff --git a/test/transition/text-test.js b/test/transition/text-test.js index c1e0359..fe3e76f 100644 --- a/test/transition/text-test.js +++ b/test/transition/text-test.js @@ -1,65 +1,55 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_timer = require("d3-timer"), - d3_selection = require("d3-selection"); - -require("../../"); - -tape("transition.text(value) creates a tween to set the text content to the specified value post-start", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().text("hello").on("start", started); - - function started() { - test.equal(root.textContent, ""); - } - - d3_timer.timeout(function(elapsed) { - test.equal(root.textContent, "hello"); - test.end(); - }); +import assert from "assert"; +import {select, selectAll} from "d3-selection"; +import "../../src/index.js"; +import it from "../jsdom.js"; + +it("transition.text(value) creates a tween to set the text content to the specified value post-start", async () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition().text("hello"); + + await new Promise(resolve => t.on("start", () => { + assert.strictEqual(root.textContent, ""); + resolve(); + })); + + assert.strictEqual(root.textContent, "hello"); }); -tape("transition.text(value) creates a tween to set the text content to the value returned by the specified function post-start", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().text(function() { return "hello"; }).on("start", started); +it("transition.text(value) creates a tween to set the text content to the value returned by the specified function post-start", async () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition().text(() => "hello"); - function started() { - test.equal(root.textContent, ""); - } + await new Promise(resolve => t.on("start", () => { + assert.strictEqual(root.textContent, ""); + resolve(); + })); - d3_timer.timeout(function(elapsed) { - test.equal(root.textContent, "hello"); - test.end(); - }); + assert.strictEqual(root.textContent, "hello"); }); -tape("transition.text(value) immediately evaluates the specified function with the expected context and arguments", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - selection = d3_selection.selectAll([one, two]).data(["red", "green"]), - result = [], - transition = selection.transition().text(function(d, i, nodes) { result.push([d, i, nodes, this]); return d; }); +it("transition.text(value) immediately evaluates the specified function with the expected context and arguments", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const s = selectAll([one, two]).data(["red", "green"]); + const result = []; + const t = s.transition().text(function(d, i, nodes) { result.push([d, i, nodes, this]); return d; }); - test.deepEqual(result, [ + assert.deepStrictEqual(result, [ ["red", 0, [one, two], one], ["green", 1, [one, two], two] ]); - d3_timer.timeout(function(elapsed) { - test.strictEqual(one.textContent, "red"); - test.strictEqual(two.textContent, "green"); - test.end(); - }); + await new Promise(resolve => t.on("start", resolve)); + assert.strictEqual(one.textContent, "red"); + assert.strictEqual(two.textContent, "green"); }); -tape("transition.text(value) creates a tween with the name \"text\"", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().text("hello"); - test.equal(transition.tween("text").call(root), undefined); - test.equal(root.textContent, "hello"); - test.end(); +it("transition.text(value) creates a tween with the name \"text\"", () => { + const root = document.documentElement; + const s = select(root); + const t = s.transition().text("hello"); + assert.strictEqual(t.tween("text").call(root), undefined); + assert.strictEqual(root.textContent, "hello"); }); diff --git a/test/transition/textTween-test.js b/test/transition/textTween-test.js index 03f1cf0..3f31bbf 100644 --- a/test/transition/textTween-test.js +++ b/test/transition/textTween-test.js @@ -1,38 +1,33 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_ease = require("d3-ease"), - d3_timer = require("d3-timer"), - d3_interpolate = require("d3-interpolate"), - d3_selection = require("d3-selection"), - state = require("./state"); +import assert from "assert"; +import {easeCubic} from "d3-ease"; +import {interpolateHcl} from "d3-interpolate"; +import {select} from "d3-selection"; +import {timeout} from "d3-timer"; +import "../../src/index.js"; +import it from "../jsdom.js"; -require("../../"); - -tape("transition.textTween(value) defines a text tween using the interpolator returned by the specified function", function(test) { - var root = jsdom().documentElement, - interpolate = d3_interpolate.interpolateHcl("red", "blue"), - ease = d3_ease.easeCubic, - transition = d3_selection.select(root).transition().textTween(function() { return interpolate; }); - - d3_timer.timeout(function(elapsed) { - test.deepEqual(root.textContent, interpolate(ease(elapsed / 250))); - test.end(); - }, 125); +it("transition.textTween(value) defines a text tween using the interpolator returned by the specified function", async () => { + const root = document.documentElement; + const interpolate = interpolateHcl("red", "blue"); + const ease = easeCubic; + select(root).transition().textTween(() => interpolate); + await new Promise(resolve => timeout(elapsed => { + assert.deepStrictEqual(root.textContent, interpolate(ease(elapsed / 250))); + resolve(); + }, 125)); }); -tape("transition.textTween() returns the existing text tween", function(test) { - var root = jsdom().documentElement, - factory = function() {}, - transition = d3_selection.select(root).transition().textTween(factory); - test.strictEqual(transition.textTween(), factory); - test.end(); +it("transition.textTween() returns the existing text tween", () => { + const root = document.documentElement; + const factory = () => {}; + const t = select(root).transition().textTween(factory); + assert.strictEqual(t.textTween(), factory); }); -tape("transition.textTween(null) removes an existing text tween", function(test) { - var root = jsdom().documentElement, - factory = function() {}, - transition = d3_selection.select(root).transition().textTween(factory); - transition.textTween(undefined); - test.strictEqual(transition.textTween(), null); - test.end(); +it("transition.textTween(null) removes an existing text tween", () => { + const root = document.documentElement; + const factory = () => {}; + const t = select(root).transition().textTween(factory); + t.textTween(undefined); + assert.strictEqual(t.textTween(), null); }); diff --git a/test/transition/transition-test.js b/test/transition/transition-test.js index 3a181ea..d840e65 100644 --- a/test/transition/transition-test.js +++ b/test/transition/transition-test.js @@ -1,24 +1,19 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_timer = require("d3-timer"), - d3_selection = require("d3-selection"); +import assert from "assert"; +import {select} from "d3-selection"; +import {timeout} from "d3-timer"; +import "../../src/index.js"; +import it from "../jsdom.js"; -require("../../"); - -tape("transition.transition() allows preceeding transitions with zero duration to end naturally", function(test) { - var end0 = false, - end1 = false, - end2 = false, - root = jsdom().documentElement, - selection = d3_selection.select(root), - transition0 = selection.transition().duration(0).on("end", function() { end0 = true; }), - transition1 = selection.transition().duration(0).on("end", function() { end1 = true; }), - transition2 = transition0.transition().duration(0).on("end", function() { end2 = true; }); - - d3_timer.timeout(function(elapsed) { - test.equal(end0, true); - test.equal(end1, true); - test.equal(end2, true); - test.end(); - }, 50); +it("transition.transition() allows preceeding transitions with zero duration to end naturally", async () => { + let end0 = false; + let end1 = false; + let end2 = false; + const s = select(document.documentElement); + const t = s.transition().duration(0).on("end", () => { end0 = true; }); + s.transition().duration(0).on("end", () => { end1 = true; }); + t.transition().duration(0).on("end", () => { end2 = true; }); + await new Promise(resolve => timeout(resolve, 50)); + assert.strictEqual(end0, true); + assert.strictEqual(end1, true); + assert.strictEqual(end2, true); }); diff --git a/test/transition/tween-test.js b/test/transition/tween-test.js index 98c1914..c0d91fd 100644 --- a/test/transition/tween-test.js +++ b/test/transition/tween-test.js @@ -1,163 +1,133 @@ -var tape = require("tape"), - jsdom = require("../jsdom"), - d3_ease = require("d3-ease"), - d3_timer = require("d3-timer"), - d3_interpolate = require("d3-interpolate"), - d3_selection = require("d3-selection"), - state = require("./state"); - -require("../../"); - -tape("transition.tween(name, value) defines an tween using the interpolator returned by the specified function", function(test) { - var root = jsdom().documentElement, - value, - interpolate = function(t) { value = t; }, - transition = d3_selection.select(root).transition().tween("foo", function() { return interpolate; }); - - d3_timer.timeout(function(elapsed) { - test.equal(value, d3_ease.easeCubic(elapsed / 250)); - test.end(); - }, 125); +import assert from "assert"; +import {easeCubic} from "d3-ease"; +import {select, selectAll} from "d3-selection"; +import {now, timeout} from "d3-timer"; +import "../../src/index.js"; +import {ENDING} from "../../src/transition/schedule.js"; +import it from "../jsdom.js"; + +it("transition.tween(name, value) defines an tween using the interpolator returned by the specified function", async () => { + const root = document.documentElement; + let value; + const interpolate = t => { value = t; }; + select(root).transition().tween("foo", () => interpolate); + await new Promise(resolve => timeout(elapsed => { + assert.strictEqual(value, easeCubic(elapsed / 250)); + resolve(); + }, 125)); }); -tape("transition.tween(name, value) invokes the value function with the expected context and arguments", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - result = [], - transition = d3_selection.selectAll([one, two]).data(["one", "two"]).transition().tween("foo", function(d, i, nodes) { result.push([d, i, nodes, this]); }); - - d3_timer.timeout(function(elapsed) { - test.deepEqual(result, [ - ["one", 0, [one, two], one], - ["two", 1, [one, two], two] - ]); - test.end(); - }); +it("transition.tween(name, value) invokes the value function with the expected context and arguments", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const result = []; + selectAll([one, two]).data(["one", "two"]).transition().tween("foo", function(d, i, nodes) { result.push([d, i, nodes, this]); }); + await new Promise(resolve => timeout(resolve)); + assert.deepStrictEqual(result, [ + ["one", 0, [one, two], one], + ["two", 1, [one, two], two] + ]); }); -tape("transition.tween(name, value) passes the eased time to the interpolator", function(test) { - var root = jsdom().documentElement, - then = d3_timer.now(), - duration = 250, - ease = d3_ease.easeCubic, - transition = d3_selection.select(root).transition().tween("foo", function() { return interpolate; }).on("end", function() { test.end(); }), - schedule = root.__transition[transition._id]; - +it("transition.tween(name, value) passes the eased time to the interpolator", async () => { + const root = document.documentElement; + const then = now(); + const duration = 250; + const ease = easeCubic; + const t = select(root).transition().tween("foo", () => interpolate); + const schedule = root.__transition[t._id]; function interpolate(t) { - "use strict"; - test.equal(this, root); - test.equal(t, schedule.state === state.ENDING ? 1 : ease((d3_timer.now() - then) / duration)); + assert.strictEqual(this, root); + assert.strictEqual(t, schedule.state === ENDING ? 1 : ease((now() - then) / duration)); } + await t.end(); }); -tape("transition.tween(name, value) allows the specified function to return null for a noop", function(test) { - var root = jsdom().documentElement, - selection = d3_selection.select(root), - transition = selection.transition().tween("foo", function() {}); - - test.end(); +it("transition.tween(name, value) allows the specified function to return null for a noop", async () => { + const root = document.documentElement; + const s = select(root); + s.transition().tween("foo", () => {}); }); -tape("transition.tween(name, value) uses copy-on-write to apply changes", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - foo = function() {}, - bar = function() {}, - transition = d3_selection.selectAll([one, two]).transition(), - schedule1 = one.__transition[transition._id], - schedule2 = two.__transition[transition._id]; - - transition.tween("foo", foo); - test.deepEqual(schedule1.tween, [{name: "foo", value: foo}]); - test.equal(schedule2.tween, schedule1.tween); - transition.tween("foo", bar); - test.deepEqual(schedule1.tween, [{name: "foo", value: bar}]); - test.equal(schedule2.tween, schedule1.tween); - d3_selection.select(two).transition(transition).tween("foo", foo); - test.deepEqual(schedule1.tween, [{name: "foo", value: bar}]); - test.deepEqual(schedule2.tween, [{name: "foo", value: foo}]); - test.end(); +it("transition.tween(name, value) uses copy-on-write to apply changes", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const foo = () => {}; + const bar = () => {}; + const t = selectAll([one, two]).transition(); + const schedule1 = one.__transition[t._id]; + const schedule2 = two.__transition[t._id]; + t.tween("foo", foo); + assert.deepStrictEqual(schedule1.tween, [{name: "foo", value: foo}]); + assert.strictEqual(schedule2.tween, schedule1.tween); + t.tween("foo", bar); + assert.deepStrictEqual(schedule1.tween, [{name: "foo", value: bar}]); + assert.strictEqual(schedule2.tween, schedule1.tween); + select(two).transition(t).tween("foo", foo); + assert.deepStrictEqual(schedule1.tween, [{name: "foo", value: bar}]); + assert.deepStrictEqual(schedule2.tween, [{name: "foo", value: foo}]); }); -tape("transition.tween(name, value) uses copy-on-write to apply removals", function(test) { - var document = jsdom("

"), - one = document.querySelector("#one"), - two = document.querySelector("#two"), - foo = function() {}, - transition = d3_selection.selectAll([one, two]).transition(), - schedule1 = one.__transition[transition._id], - schedule2 = two.__transition[transition._id]; - - transition.tween("foo", foo); - test.deepEqual(schedule1.tween, [{name: "foo", value: foo}]); - test.equal(schedule2.tween, schedule1.tween); - transition.tween("bar", null); - test.deepEqual(schedule1.tween, [{name: "foo", value: foo}]); - test.equal(schedule2.tween, schedule1.tween); - transition.tween("foo", null); - test.deepEqual(schedule1.tween, []); - test.equal(schedule2.tween, schedule1.tween); - d3_selection.select(two).transition(transition).tween("foo", foo); - test.deepEqual(schedule1.tween, []); - test.deepEqual(schedule2.tween, [{name: "foo", value: foo}]); - test.end(); +it("transition.tween(name, value) uses copy-on-write to apply removals", "

", async () => { + const one = document.querySelector("#one"); + const two = document.querySelector("#two"); + const foo = () => {}; + const t = selectAll([one, two]).transition(); + const schedule1 = one.__transition[t._id]; + const schedule2 = two.__transition[t._id]; + t.tween("foo", foo); + assert.deepStrictEqual(schedule1.tween, [{name: "foo", value: foo}]); + assert.strictEqual(schedule2.tween, schedule1.tween); + t.tween("bar", null); + assert.deepStrictEqual(schedule1.tween, [{name: "foo", value: foo}]); + assert.strictEqual(schedule2.tween, schedule1.tween); + t.tween("foo", null); + assert.deepStrictEqual(schedule1.tween, []); + assert.strictEqual(schedule2.tween, schedule1.tween); + select(two).transition(t).tween("foo", foo); + assert.deepStrictEqual(schedule1.tween, []); + assert.deepStrictEqual(schedule2.tween, [{name: "foo", value: foo}]); }); -tape("transition.tween(name, value) coerces the specified name to a string", function(test) { - var root = jsdom().documentElement, - tween = function() {}, - transition = d3_selection.select(root).transition().tween({toString: function() { return "foo"; }}, tween); - - test.equal(transition.tween("foo"), tween); - test.end(); +it("transition.tween(name, value) coerces the specified name to a string", async () => { + const root = document.documentElement; + const tween = () => {}; + const t = select(root).transition().tween({toString() { return "foo"; }}, tween); + assert.strictEqual(t.tween("foo"), tween); }); -tape("transition.tween(name) coerces the specified name to a string", function(test) { - var root = jsdom().documentElement, - tween = function() {}, - transition = d3_selection.select(root).transition().tween("foo", tween); - - test.equal(transition.tween({toString: function() { return "foo"; }}), tween); - test.end(); +it("transition.tween(name) coerces the specified name to a string", async () => { + const root = document.documentElement; + const tween = () => {}; + const t = select(root).transition().tween("foo", tween); + assert.strictEqual(t.tween({toString() { return "foo"; }}), tween); }); -tape("transition.tween(name, value) throws an error if value is not null and not a function", function(test) { - var root = jsdom().documentElement, - transition = d3_selection.select(root).transition(); - test.throws(function() { transition.tween("foo", 42); }); - test.end(); +it("transition.tween(name, value) throws an error if value is not null and not a function", async () => { + const root = document.documentElement; + const t = select(root).transition(); + assert.throws(() => { t.tween("foo", 42); }); }); -tape("transition.tween(name, null) removes the specified tween", function(test) { - var root = jsdom().documentElement, - frames = 0, - interpolate = function() { ++frames; }, - transition = d3_selection.select(root).transition().tween("foo", function() { return interpolate; }).tween("foo", null); - - test.equal(transition.tween("foo"), null); - - d3_timer.timeout(function(elapsed) { - test.strictEqual(frames, 0); - test.end(); - }, 125); +it("transition.tween(name, null) removes the specified tween", async () => { + const root = document.documentElement; + let frames = 0; + const interpolate = () => { ++frames; }; + const t = select(root).transition().tween("foo", () => interpolate).tween("foo", null); + assert.strictEqual(t.tween("foo"), null); + await new Promise(resolve => timeout(() => { + assert.strictEqual(frames, 0); + resolve(); + }, 125)); }); -tape("transition.tween(name) returns the tween with the specified name", function(test) { - var root = jsdom().documentElement, - tween = function() {}, - transition = d3_selection.select(root).transition().tween("foo", tween).on("start", started).on("end", ended); - - test.equal(transition.tween("foo"), tween); - test.equal(transition.tween("bar"), null); - - function started() { - test.equal(transition.tween("foo"), tween); - } - - function ended() { - test.equal(transition.tween("foo"), tween); - test.end(); - } +it("transition.tween(name) returns the tween with the specified name", async () => { + const root = document.documentElement; + const tween = () => {}; + const started = () => { assert.strictEqual(t.tween("foo"), tween); } + const ended = () => { assert.strictEqual(t.tween("foo"), tween); } + const t = select(root).transition().tween("foo", tween).on("start", started).on("end", ended); + assert.strictEqual(t.tween("foo"), tween); + assert.strictEqual(t.tween("bar"), null); + await t.end(); }); diff --git a/yarn.lock b/yarn.lock index 4912692..1100f44 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,92 +2,161 @@ # 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" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@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== -abab@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== +"@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-globals@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" - integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== +abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" + acorn "^7.1.1" + acorn-walk "^7.1.1" -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== +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-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.1.1, 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.2.4: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.3.0.tgz#1193f9b96c4e8232f00b11a9edff81b2c8b98b88" + integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw== -acorn@^6.0.1, acorn@^6.0.7, acorn@^6.1.1, 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== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: - 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.6.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.0.tgz#60cc45d9c46a477d80d92c48076d972c342e5720" + integrity sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ== + 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" @@ -95,59 +164,30 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -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== -async-limiter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== +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== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== - 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= - -bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" + 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" @@ -157,10 +197,22 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +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-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +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" @@ -172,12 +224,12 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +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, chalk@^2.1.0, chalk@^2.4.2: +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== @@ -186,22 +238,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== +chalk@^4.0.0, chalk@^4.1.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" -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= +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: - 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= + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" color-convert@^1.9.0: version "1.9.3" @@ -210,12 +277,24 @@ 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= -combined-stream@^1.0.6, combined-stream@~1.0.6: +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== + +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -223,125 +302,114 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: delayed-stream "~1.0.0" 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.2, 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" -cssom@0.3.x, cssom@^0.3.6: +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: - cssom "0.3.x" + cssom "~0.3.6" -"d3-color@1 - 2": - version "1.3.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.3.0.tgz#675818359074215b020dc1d41d518136dcb18fa9" - integrity sha512-NHODMBlj59xPAwl2BDiO2Mog6V+PrGRtBfWKqKRrs9MCqlSkIEb0Z/SfY7jW29ReHTDC/j+vwXhnZcXI3+3fbg== +"d3-color@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.0.1.tgz#03316e595955d1fcd39d9f3610ad41bb90194d0a" + integrity sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw== -"d3-dispatch@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-2.0.0.tgz#8a18e16f76dd3fcaef42163c97b926aa9b55e7cf" - integrity sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA== +"d3-dispatch@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== -"d3-ease@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-2.0.0.tgz#fd1762bfca00dae4bacea504b1d628ff290ac563" - integrity sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ== +"d3-ease@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== -"d3-interpolate@1 - 2": - version "2.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" - integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== +"d3-interpolate@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: - d3-color "1 - 2" + d3-color "1 - 3" -d3-selection@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-2.0.0.tgz#94a11638ea2141b7565f883780dabc7ef6a61066" - integrity sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA== +"d3-selection@2 - 3": + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== -"d3-timer@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6" - integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA== +"d3-timer@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: - assert-plus "^1.0.0" + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" -data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== +debug@4, 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: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" + ms "2.1.2" -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== - dependencies: - ms "^2.1.1" +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-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= +decimal.js@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== -deep-is@~0.1.3: +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= - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +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" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -349,259 +417,227 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: - webidl-conversions "^4.0.2" + webidl-conversions "^5.0.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" +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== -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== +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= -escodegen@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" - integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" + esprima "^4.0.1" + estraverse "^5.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -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" +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" +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" - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: 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, estraverse@^4.2.0: - 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= - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -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" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + 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, 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" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +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== -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +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== + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" fs.realpath@^1.0.0: @@ -609,34 +645,32 @@ fs.realpath@^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= -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" +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.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== +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.7, 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" @@ -645,58 +679,58 @@ 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== - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== +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: - ajv "^6.5.5" - har-schema "^2.0.0" + 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-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== -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== +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== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: - function-bind "^1.1.1" + whatwg-encoding "^1.0.5" -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: - whatwg-encoding "^1.0.1" + "@tootallnate/once" "1" + agent-base "6" + debug "4" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + agent-base "6" + debug "4" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +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== @@ -708,10 +742,10 @@ ignore@^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" @@ -729,44 +763,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" - -ip-regex@^2.1.0: +is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -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= + 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" @@ -778,108 +785,103 @@ 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-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== -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-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== -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +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" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -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.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.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" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@15: - version "15.1.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.1.1.tgz#21ed01f81d95ef4327f3e564662aef5e65881252" - integrity sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ== - dependencies: - abab "^2.0.0" - acorn "^6.1.1" - acorn-globals "^4.3.2" - array-equal "^1.0.0" - cssom "^0.3.6" - cssstyle "^1.2.2" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.1" - html-encoding-sniffer "^1.0.2" - nwsapi "^2.1.4" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.7" - saxes "^3.1.9" - symbol-tree "^3.2.2" - tough-cookie "^3.0.1" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" +jsdom@16: + version "16.6.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" + integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^7.0.0" + whatwg-url "^8.5.0" + ws "^7.4.5" xml-name-validator "^3.0.0" json-schema-traverse@^0.4.1: @@ -887,32 +889,25 @@ 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@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +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= -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= +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: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" + prelude-ls "^1.2.1" + type-check "~0.4.0" -levn@^0.3.0, 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= @@ -920,103 +915,132 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= +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" -lodash@^4.17.11, 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== +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= -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= - dependencies: - readable-stream "^2.0.1" +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== -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== +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= -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== +lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +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: - mime-db "1.40.0" + chalk "^4.1.0" + is-unicode-supported "^0.1.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== + +mime-db@1.48.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== + +mime-types@^2.1.12: + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + dependencies: + mime-db "1.48.0" -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@9: + version "9.0.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.0.0.tgz#67ce848170cb6426f9e84c57e38376dc9017bab4" + integrity sha512-GRGG/q9bIaUkHJB9NL+KZNjDhMBHB30zW3bZW9qOiYr+QChyLjPzswaxFWkI1q6lGlSL28EQYzAi2vKWNkPx+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" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.7" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.23" + 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.4" + 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.23: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== 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== - -nwsapi@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" - integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -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== +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== -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== +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== once@^1.3.0: version "1.4.0" @@ -1025,29 +1049,43 @@ 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= - dependencies: - mimic-fn "^1.0.0" - -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" - fast-levenshtein "~2.0.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" + word-wrap "~1.2.3" -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= +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: + 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" + +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: + yocto-queue "^0.1.0" + +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" @@ -1056,273 +1094,177 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +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== -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +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== -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +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== 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= -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== - 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== -psl@^1.1.24, psl@^1.1.28: - version "1.2.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.2.0.tgz#df12b5b1b3a30f51c329eacbdef98f3a6e136dc6" - integrity sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA== - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +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" -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== +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" -request-promise-core@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" - integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== - dependencies: - lodash "^4.17.11" - -request-promise-native@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" - integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== - dependencies: - request-promise-core "1.1.2" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" +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== - 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" - -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@1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.17.0.tgz#47ee8b04514544fc93b39bae06271244c8db7dfa" - integrity sha512-k/j1m0NIsI4SYgCJR4MWPstGJOWfJyd6gycKoMhyoKPVXxm+L49XtbUwZyFsrSU2YXsOkM4u1ll9CS/ZgJBUpw== +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: - "@types/estree" "0.0.39" - "@types/node" "^12.6.2" - acorn "^6.2.0" + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" -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= - dependencies: - is-promise "^2.1.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== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +rollup@2: + version "2.51.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.51.0.tgz#ffd847882283998fc8611cd57af917f173b4ab5c" + integrity sha512-ITLt9sScNCBVspSHauw/W49lEZ0vjN8LyCzSNsNaqT67vTss2lYEfOyxltX8hjrhr1l/rQwmZ2wazzEqhZ/fUg== + optionalDependencies: + fsevents "~2.3.1" -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== +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== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"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== -saxes@^3.1.9: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== dependencies: - xmlchars "^2.1.1" - -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== + xmlchars "^2.2.0" -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== +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@^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== +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: + 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" @@ -1332,32 +1274,17 @@ source-map@^0.6.0, source-map@~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= -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -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== @@ -1365,30 +1292,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" @@ -1397,17 +1308,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" @@ -1416,121 +1334,73 @@ 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" -symbol-tree@^3.2.2: +symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -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== +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== 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" + is-number "^7.0.0" -tough-cookie@^2.3.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.1.2" -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== +tr46@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" punycode "^2.1.1" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -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== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= +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: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" @@ -1539,116 +1409,170 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +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== + +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + 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= - -uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - 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== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" + 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== -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: - browser-process-hrtime "^0.1.2" + browser-process-hrtime "^1.0.0" -w3c-xmlserializer@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" -whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" + integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + lodash "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" -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, 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.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.4.tgz#6a972b6df82e38d50248ee2820aa98e2d0ad3090" + integrity sha512-jGWPzsUqzkow8HoAvqaPWTUPCrlPJaJ5tY8Iz7n1uCz3tTp6s3CDG0FF1NsX42WNlkRSW6Mr+CDZGnNoSsKa7g== + +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" - -ws@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.1.1.tgz#f9942dc868b6dffb72c14fd8f2ba05f77a4d5983" - integrity sha512-o41D/WmDeca0BqYhsr3nJzQyg9NF5X8l/UdnFNux9cS3lwB+swm8qGWX5rn+aD6xfBU3rGmtHij7g7x6LxFU3A== - dependencies: - async-limiter "^1.0.0" +ws@^7.4.5: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xmlchars@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.1.1.tgz#ef1a81c05bff629c2280007f12daca21bd6f6c93" - integrity sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w== +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +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==