From 419765bc83e4f4355ba470e4928e0be1b53ce5f6 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 18 Oct 2020 14:33:58 -0700 Subject: [PATCH 001/107] update contributor guide and publish scripts --- docs/contributor_guide.md | 171 ++++---------------------------------- package.json | 6 +- scripts/write-version.js | 11 ++- 3 files changed, 32 insertions(+), 156 deletions(-) diff --git a/docs/contributor_guide.md b/docs/contributor_guide.md index 68c3d9e2..5d94112f 100644 --- a/docs/contributor_guide.md +++ b/docs/contributor_guide.md @@ -8,10 +8,14 @@ If you are looking for documentation on _how to use_ the library, the [user guid In this guide: -- [Developer requirements](#developer-requirements) -- [Testing](#testing) -- [Continuous integration](#continuous-integration) -- [Release process](#release-process) +- [tween.js contributor guide](#tweenjs-contributor-guide) + - [Developer requirements](#developer-requirements) + - [Testing](#testing) + - [Unit tests](#unit-tests) + - [Code style and lint tests](#code-style-and-lint-tests) + - [Other types of tests](#other-types-of-tests) + - [Continuous integration](#continuous-integration) + - [Release process](#release-process) ## Developer requirements @@ -82,33 +86,17 @@ The tests are executed using [nodeunit](https://www.npmjs.com/package/nodeunit). **TODO:** the tests should also work if opening `test/unit/nodeunit.html` in a browser, but they are broken right now. There is [an open issue](https://github.com/tweenjs/tween.js/issues/307) to make them work again. -### Correction and style tests +### Code style and lint tests -We use [JSCS](http://jscs.info/) and [JSHint](http://jshint.com/) to ensure the code style is uniform. +We use [Prettier](https://prettier.io) and [ESLint](https://eslint.org) to ensure the code style is uniform. -#### JSCS - -This tool helps us spot mostly 'cosmetic' code style issues. For example, white spaces versus tabs, spaces between brackets, etc. - -To run it: - -```bash -npm run test-style -``` - -The rules for JSCS are in `test/jscs.json`. - -#### JSHint - -This tool helps us spot code quality issues. For example, using the right equality operator, unused variables, etc. - -To run it: +To automatically format code and report any errors for pieces of code that aren't automatically formattable, run: ```bash -npm run test-correctness +npm run test-lint ``` -The rules for JSHint are in `test/jshintrc`. +The Prettier rules are in `.prettierrc.js` and ESLint rules are in `.eslintrc.js`. ### Other types of tests @@ -118,137 +106,14 @@ There's an [open issue](https://github.com/tweenjs/discuss/issues/3) to track wo ## Continuous integration -We have implemented a continuous integration system that does things automatically for us. It runs the tests automatically each time a pull request is made, and it can also publish new releases automatically in certain cases. +We use GitHub Actions for continuous integration so that a build and tests will run for every pull request. The `.github/workflows/tests.yml` file tells GitHub what to run; in our case we run `npm install` followed by `npm test` in the OSes and versions of Node.js specified in that file. -If proposed changes in a pull request break anything, contributors get feedback without having to wait for a human to have a look at the code. Also, the request cannot be merged until the tests pass. - -We are using the Travis CI platform to run the tests. You will find a little information area at the bottom of the pull request page, letting you know about the state of the tests. - -Example of all checks passing: - -![Automated checks OK](./imgs/pull-request-checks.png) - -And when checks fail: - -![Automated checks failing](./imgs/pull-request-checks-failing.png) - -If a pull request is updated by adding new commits, the tests will run again. - -Travis is configured with the `.travis.yml` file (if you don't see it with your file explorer or the Finder, it's because the file name starts with a dot and so it's _hidden_--try opening it with the terminal). +**TODO:** Add macOS and Windows to OSes that the tests run on. Help! :) ## Release process -We use the [semantic-release](https://github.com/semantic-release/semantic-release) tool in combination with Travis to automatically [create releases on GitHub](https://github.com/tweenjs/tween.js/releases) and publish them [to npm](https://npmjs.org). - -Each time a pull request is merged, Travis will run the tests. If they pass without errors, Travis will run the `after_success` step: - -```yaml -after_success: - - npm run semantic-release -``` - -This in turn will run the `semantic-release` script in `package.json`: - -```json -"semantic-release": "semantic-release pre && npm publish && semantic-release post" -``` - -And when the new release is made: - -- `semantic-release` determines the next version number -- a new entry is added to the GitHub releases list, along with a list of all the commits included in the change, and a ZIP file with that version, for people who want to download ZIPs -- the git commit is tagged with the version number (tools like [Bower](http://bower.io/) use tags) -- it is also published to npm, with the new version number in `package.json`. - -**Note:** the default configuration option for `semantic-release` is to run only if the branch name is `master`. Otherwise, we would be generating lots of pushes and releases, as Travis runs with each pull request! - -Please also note that the version number in `package.json` is intentionally `0.0.0-development`, as we do not want to encourage anyone to modify this manually, but we also cannot remove the `version` field from the file or installing modules using the git repository directly will fail. - -### How the new version number is determined - -Like npm, `semantic-release` follows the [semver](http://semver.org/) convention, so each release is identified by a unique `MAJOR.MINOR.PATCH` version number. For example, given version `1.2.3`: 1 = major, 2 = minor, 3 = patch. - -In this system, breaking changes (e.g. the API is modified, and updating to a new version might require updating the code that uses the library) should increase the major number. If there are backwards compatible changes (e.g. a new feature that does not modify existing APIs) the minor number will increase. Smaller changes, such as a documentation update, only increase the patch number. - -`semantic-release` uses the commit messages to decide on the next version number automatically. - -This is really _great_, because keeping track of version numbers or deciding on whether a new release should be a major or minor change is an extremely boring task, best left to machines. - -For this to work automatically, the commit messages need to follow a certain syntax: - -`: .` - -The following table lists the types of commits and their effect on version numbers, using [the default behaviour](https://github.com/semantic-release/commit-analyzer/blob/master/src/index.js). - -| Type of commit | Description | Version increase? | -| --------------- | ----------------------------------------------------------------------- | ----------------- | -| fix | fixes a bug but does not change the API | Increases PATCH | -| style | formatting changes | | -| docs | adding/removing/changing docs | | -| refactor | rewriting code but not breaking changes, adding features or fixing bugs | | -| test | changes in tests, e.g. adding a missing one) | | -| feat | adding new features which do not change the API | Increases MINOR | -| BREAKING CHANGE | changes the API | Increases MAJOR | - -### How to install and configure `semantic-release` - -This is mostly for informational purposes, as `semantic-release` is already configured with Travis and contributors shouldn't need to worry about this, but it is good to document everything. - -#### Option 1: using the CLI utility - -First install the global cli utility: - -```bash -npm install -g semantic-release-cli -``` - -Then in an existing node.js based project (i.e. a `package.json` already exists): - -```bash -semantic-release-cli setup -``` - -It will ask you a series of questions to set up `semantic-release` on the project. If all goes well, the next time you push to GitHub, a new release will automatically happen. - -You will need to have TravisCI enabled in your account. - -#### Option 2: manually - -Install the module: - -```bash -npm install --save-dev semantic-release -``` - -Edit `package.json` to add the `semantic-release` script: - -```javascript -"scripts": { - //... - "semantic-release": "semantic-release pre && npm publish && semantic-release post" - //... -}, -``` - -Create a `.travis.yml` file if it doesn't exist yet (here is [help creating `travis.yml` files](https://docs.travis-ci.com/user/getting-started/)), or [have a look at ours](https://github.com/tweenjs/tween.js/blob/master/.travis.yml). - -Add an `after_success` section to `.travis.yml`, in order to run `semantic-release`: - -```yaml -after_success: - - npm run semantic-release -``` - -Now we need to enable the project in Travis CI, so make sure you have an account there and are logged in. - -Enable the project in Travis (if you're the maintainer) or ask the maintainer to enable it, in the [Travis settings page](https://travis-ci.org/profile/). - -Click on the cog near to the project name to configure some options. - -Scroll down until you see _Environment Variables_. - -Add tokens for `GH_TOKEN` and `NPM_TOKEN`. Make sure both variables are hidden: `Display value in build log` should be `Off`. +Currently the release process is manual. -You can get tokens from [npm](https://www.npmjs.com/settings/tokens) and from [GitHub](https://github.com/settings/tokens). These allow services such as Travis to act on your behalf, which is why you need to ensure they are not displayed in the build log. +When ready to make a release on the `master` branch, ensure there are no un-committed changes, then run `npm run release:patch` to release a new version with its patch number bumped, `npm run release:minor` to release a new version with its minor number bumped, or `npm run release:major` to release a new version with its major number bumped. -Hopefully, now each time you commit and push to GitHub `semantic-release` will run (if using the `master` branch as described above) and maybe a new version will be published. +Tip: see [semver.org](https://semver.org) and the [npm-semver](https://docs.npmjs.com/misc/semver) docs to learn about semantic versioning. diff --git a/package.json b/package.json index a446e672..6b00fc47 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,11 @@ "test-lint": "npm run prettier -- --check && eslint 'src/**/*.ts'", "lint": "npm run prettier -- --write && eslint 'src/**/*.ts' --fix", "prettier": "prettier './**/*.{js,ts,md,json,html,css}'", - "prepare": "npm run build" + "prepare": "npm run build", + "version": "npm test && git add .", + "release:patch": "npm version patch --message 'v%s' && npm publish && git push --follow-tags", + "release:minor": "npm version minor --message 'v%s' && npm publish && git push --follow-tags", + "release:major": "npm version major --message 'v%s' && npm publish && git push --follow-tags" }, "author": "tween.js contributors (https://github.com/tweenjs/tween.js/graphs/contributors)", "devDependencies": { diff --git a/scripts/write-version.js b/scripts/write-version.js index b806274b..8bab95c6 100644 --- a/scripts/write-version.js +++ b/scripts/write-version.js @@ -1,9 +1,16 @@ const fs = require('fs') const {version} = require('../package.json') +function handleError(error) { + if (error) { + console.error(error) + process.exit(1) + } +} + fs.open('./src/Version.ts', 'w', (error, fd) => { - if (error) process.exit(1) + handleError(error) fs.write(fd, [`const VERSION = '${version}'`, 'export default VERSION', ''].join('\n'), error => { - if (error) process.exit(1) + handleError(error) }) }) From 2e7dddd0498fbff2186578f37c62733f14a75f67 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 18 Oct 2020 15:06:33 -0700 Subject: [PATCH 002/107] update CI name and README badges Removed the flattr badge. Let's add a new badge for contributions that go to the team as a whole, if we want to, later. --- .github/workflows/tests.yml | 2 +- README.md | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 598d2682..17dce164 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,7 +1,7 @@ # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions -name: Node.js CI +name: build and tests on: push: diff --git a/README.md b/README.md index 42ee76b5..39cb62f1 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,9 @@ JavaScript tweening engine for easy animations, incorporating optimised Robert Penner's equations. [![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Travis tests][travis-image]][travis-url] -[![Flattr this][flattr-image]][flattr-url] [![CDNJS][cdnjs-image]][cdnjs-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build and Tests][ci-image]][ci-url] Do you use tween.js? If you have some time, please fill out [this short survey](https://docs.google.com/forms/d/e/1FAIpQLScJ0xnsS1m4mdXGRmGFPVd_CYi0Ah224lLYc4UP-fmakQjNHw/viewform?usp=sf_link). @@ -275,9 +274,7 @@ Maintainers: [mikebolt](https://github.com/mikebolt), [sole](https://github.com/ [npm-url]: https://npmjs.org/package/@tweenjs/tween.js [downloads-image]: https://img.shields.io/npm/dm/@tweenjs/tween.js.svg [downloads-url]: https://npmjs.org/package/@tweenjs/tween.js -[travis-image]: https://travis-ci.org/tweenjs/tween.js.svg?branch=master -[travis-url]: https://travis-ci.org/tweenjs/tween.js -[flattr-image]: https://api.flattr.com/button/flattr-badge-large.png -[flattr-url]: https://flattr.com/thing/45014/tween-js +[ci-image]: https://github.com/tweenjs/tween.js/workflows/build%20and%20tests/badge.svg?branch=master +[ci-url]: https://github.com/tweenjs/tween.js/actions [cdnjs-image]: https://img.shields.io/cdnjs/v/tween.js.svg [cdnjs-url]: https://cdnjs.com/libraries/tween.js From 49f6e7560e14ae01d579708d8d8b7f725344b78d Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Mon, 19 Oct 2020 00:44:49 -0700 Subject: [PATCH 003/107] fix the exports so that they are ES Module compliant (don't use CommonJS typed export in TypeScript) This keeps backwards compatibility with how the CommonJS, UMD, and AMD modules work, but fixes the TypeScript ESM exports. --- package-lock.json | 12 +++++++++--- package.json | 4 ++-- scripts/adjust-d.ts.js | 13 +++---------- src/Group.ts | 4 ++-- src/Index.ts | 32 ++++++++++++++++++-------------- src/Now.ts | 12 ++++++------ src/Tween.ts | 24 ++++++++++++++---------- src/Version.ts | 2 +- src/mainGroup.ts | 3 +++ 9 files changed, 58 insertions(+), 48 deletions(-) create mode 100644 src/mainGroup.ts diff --git a/package-lock.json b/package-lock.json index 64ecd2f8..69854def 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2762,6 +2762,12 @@ "requires": { "glob": "^7.1.3" } + }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true } } }, @@ -2969,9 +2975,9 @@ "dev": true }, "typescript": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", - "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index 6b00fc47..927e8e9c 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ ], "dependencies": {}, "scripts": { - "build": "rimraf dist && node scripts/write-version.js && npm run tsc && npm run rollup-build && npm run tsc-d.ts && npm run adjust-d.ts", + "build": "rimraf dist && rimraf .tmp && node scripts/write-version.js && npm run tsc && npm run rollup-build && npm run tsc-d.ts && npm run adjust-d.ts", "rollup-build": "rollup -c ./rollup.config.js", "tsc": "tsc", "tsc-watch": "tsc --watch", @@ -55,6 +55,6 @@ "rollup": "^0.57.1", "rollup-plugin-typescript": "^1.0.1", "tslib": "^1.10.0", - "typescript": "^3.9.0" + "typescript": "^4.0.0" } } diff --git a/scripts/adjust-d.ts.js b/scripts/adjust-d.ts.js index 0c86bfdd..10fe9447 100644 --- a/scripts/adjust-d.ts.js +++ b/scripts/adjust-d.ts.js @@ -12,7 +12,7 @@ let content = fs.readFileSync(file) + '' content = content .replace(/\r\n/g, '\n') .replace(/\s*export default [^;{]+;/g, '') - .replace(/export (default )?/g, '') + .replace(/export (default )?(?!{)/g, '') .replace(/(}\n)?declare module [^{]+{/g, '') .replace(/import [^;]+;/g, '') .replace(/}\n$/, '') @@ -20,15 +20,8 @@ content = content .replace(/}\n(\s*)([^\s])/g, '}\n\n$1$2') .replace(/\n\n(\s*\n)+/g, '\n\n') -content = `declare module "TWEEN" { +content = `declare module "@tweenjs/tween.js" { ${content} - export default TWEEN; -} - -declare module "@tweenjs/tween.js" { - import TWEEN from "TWEEN"; - export = TWEEN; -} -` +} ` fs.writeFileSync(file, content) diff --git a/src/Group.ts b/src/Group.ts index 623b7e86..a3b1191a 100644 --- a/src/Group.ts +++ b/src/Group.ts @@ -1,4 +1,4 @@ -import NOW from './Now' +import now from './Now' import type {Tween, UnknownProps} from './Tween' /** @@ -43,7 +43,7 @@ export default class Group { return false } - time = time !== undefined ? time : NOW() + time = time !== undefined ? time : now() // Tweens are updated in "batches". If you add a new tween during an // update, then the new tween will be updated in the next batch. diff --git a/src/Index.ts b/src/Index.ts index f2a76a86..573908d9 100644 --- a/src/Index.ts +++ b/src/Index.ts @@ -7,29 +7,33 @@ * Thank you all, you're awesome! */ -import NOW from './Now' -import Group from './Group' import Easing from './Easing' +import Group from './Group' import Interpolation from './Interpolation' +import now from './Now' import Sequence from './Sequence' import Tween from './Tween' import VERSION from './Version' +import {mainGroup} from './mainGroup' + +const nextId = Sequence.nextId /** * Controlling groups of tweens * * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween + * In these cases, you may want to create your own smaller groups of tweens. */ -class Main extends Group { - public version = VERSION - public now = NOW - public Group = Group - public Easing = Easing - public Interpolation = Interpolation - public nextId = Sequence.nextId - public Tween = Tween -} +const TWEEN = mainGroup + +// This is the best way to export things in a way that's compatible with both ES +// Modules and CommonJS, without build hacks, and so as not to break the +// existing API. +// https://github.com/rollup/rollup/issues/1961#issuecomment-423037881 +const getAll = TWEEN.getAll.bind(TWEEN) +const removeAll = TWEEN.removeAll.bind(TWEEN) +const add = TWEEN.add.bind(TWEEN) +const remove = TWEEN.remove.bind(TWEEN) +const update = TWEEN.update.bind(TWEEN) -const TWEEN = new Main() -export default TWEEN +export {Easing, Group, Interpolation, now, Sequence, nextId, Tween, VERSION, getAll, removeAll, add, remove, update} diff --git a/src/Now.ts b/src/Now.ts index c4c0eab8..663631ad 100644 --- a/src/Now.ts +++ b/src/Now.ts @@ -1,11 +1,11 @@ -let NOW: () => number +let now: () => number // Include a performance.now polyfill. // In node.js, use process.hrtime. // eslint-disable-next-line // @ts-ignore if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - NOW = function (): number { + now = function (): number { // eslint-disable-next-line // @ts-ignore const time = process.hrtime() @@ -18,17 +18,17 @@ if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrt else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { // This must be bound, because directly assigning this function // leads to an invocation exception in Chrome. - NOW = self.performance.now.bind(self.performance) + now = self.performance.now.bind(self.performance) } // Use Date.now if it is available. else if (Date.now !== undefined) { - NOW = Date.now + now = Date.now } // Otherwise, use 'new Date().getTime()'. else { - NOW = function (): number { + now = function (): number { return new Date().getTime() } } -export default NOW +export default now diff --git a/src/Tween.ts b/src/Tween.ts index d93708ff..b84cad00 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -7,10 +7,15 @@ * Thank you all, you're awesome! */ +import Easing from './Easing' +import Interpolation from './Interpolation' +import {mainGroup} from './mainGroup' +import Sequence from './Sequence' +import now from './Now' + import type {EasingFunction} from './Easing' import type {InterpolationFunction} from './Interpolation' import type Group from './Group' -import TWEEN from './Index' export class Tween { private _isPaused = false @@ -27,8 +32,8 @@ export class Tween { private _reversed = false private _delayTime = 0 private _startTime = 0 - private _easingFunction: EasingFunction = TWEEN.Easing.Linear.None - private _interpolationFunction: InterpolationFunction = TWEEN.Interpolation.Linear + private _easingFunction: EasingFunction = Easing.Linear.None + private _interpolationFunction: InterpolationFunction = Interpolation.Linear private _chainedTweens: Array> = [] private _onStartCallback?: (object: T) => void private _onStartCallbackFired = false @@ -36,10 +41,10 @@ export class Tween { private _onRepeatCallback?: (object: T) => void private _onCompleteCallback?: (object: T) => void private _onStopCallback?: (object: T) => void - private _id = TWEEN.nextId() + private _id = Sequence.nextId() private _isChainStopped = false - constructor(private _object: T, private _group: Group = TWEEN) {} + constructor(private _object: T, private _group: Group = mainGroup) {} getId(): number { return this._id @@ -101,8 +106,7 @@ export class Tween { this._isChainStopped = false - this._startTime = - time !== undefined ? (typeof time === 'string' ? TWEEN.now() + parseFloat(time) : time) : TWEEN.now() + this._startTime = time !== undefined ? (typeof time === 'string' ? now() + parseFloat(time) : time) : now() this._startTime += this._delayTime this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat) @@ -219,7 +223,7 @@ export class Tween { this._isPaused = true - this._pauseStart = time === undefined ? TWEEN.now() : time + this._pauseStart = time === undefined ? now() : time // eslint-disable-next-line // @ts-ignore FIXME? @@ -235,7 +239,7 @@ export class Tween { this._isPaused = false - this._startTime += (time === undefined ? TWEEN.now() : time) - this._pauseStart + this._startTime += (time === undefined ? now() : time) - this._pauseStart this._pauseStart = 0 @@ -323,7 +327,7 @@ export class Tween { let property let elapsed - time = time !== undefined ? time : TWEEN.now() + time = time !== undefined ? time : now() const endTime = this._startTime + this._duration diff --git a/src/Version.ts b/src/Version.ts index 2d726b2b..1c665d89 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '18.5.0' +const VERSION = '18.6.0' export default VERSION diff --git a/src/mainGroup.ts b/src/mainGroup.ts new file mode 100644 index 00000000..eb6c1597 --- /dev/null +++ b/src/mainGroup.ts @@ -0,0 +1,3 @@ +import Group from './Group' + +export const mainGroup = new Group() From 9b71c9ddc74e7c276d894c2733eb5a9553b90f70 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Mon, 19 Oct 2020 01:38:43 -0700 Subject: [PATCH 004/107] Remove outdated comments in README --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 39cb62f1..feba2602 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,7 @@ JavaScript tweening engine for easy animations, incorporating optimised Robert P [![NPM Downloads][downloads-image]][downloads-url] [![Build and Tests][ci-image]][ci-url] -Do you use tween.js? If you have some time, please fill out [this short survey](https://docs.google.com/forms/d/e/1FAIpQLScJ0xnsS1m4mdXGRmGFPVd_CYi0Ah224lLYc4UP-fmakQjNHw/viewform?usp=sf_link). - -**Update Note** In v18 the script you should include has moved from `src/Tween.js` to `dist/tween.umd.js`. See the [installation section](#Installation) below. v18 is not yet available on CDNJS. +**Update Note** In v18 the script you should include has moved from `src/Tween.js` to `dist/tween.umd.js`. See the [installation section](#Installation) below. --- From 6ae48a7afd64a94a812a8e9a87d921d93b0ee049 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Mon, 19 Oct 2020 23:21:25 -0700 Subject: [PATCH 005/107] remove unused dependency --- package-lock.json | 10 ---------- package.json | 1 - 2 files changed, 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 69854def..0b6c45ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2382,16 +2382,6 @@ } } }, - "rollup-plugin-typescript": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript/-/rollup-plugin-typescript-1.0.1.tgz", - "integrity": "sha512-rwJDNn9jv/NsKZuyBb/h0jsclP4CJ58qbvZt2Q9zDIGILF2LtdtvCqMOL+Gq9IVq5MTrTlHZNrn8h7VjQgd8tw==", - "dev": true, - "requires": { - "resolve": "^1.10.0", - "rollup-pluginutils": "^2.5.0" - } - }, "rollup-pluginutils": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", diff --git a/package.json b/package.json index 927e8e9c..dbf600b4 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "prettier": "^2.0.0", "rimraf": "^3.0.0", "rollup": "^0.57.1", - "rollup-plugin-typescript": "^1.0.1", "tslib": "^1.10.0", "typescript": "^4.0.0" } From 04788de0d02e87fc18574e05714984befc50dbcd Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Mon, 19 Oct 2020 23:37:44 -0700 Subject: [PATCH 006/107] Add myself to the maintainers list. In the future I'd like to replace this with a more representative auto-generated list. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 39cb62f1..6177fdce 100644 --- a/README.md +++ b/README.md @@ -253,7 +253,7 @@ If you want to add any feature or change existing features, you _must_ run the t ## People -Maintainers: [mikebolt](https://github.com/mikebolt), [sole](https://github.com/sole). +Maintainers: [mikebolt](https://github.com/mikebolt), [sole](https://github.com/sole), [Joe Pea (@trusktr)](https://github.com/trusktr). [All contributors](http://github.com/tweenjs/tween.js/contributors). From 825bd2b4667b8402127a468a5bf2b46e2b385106 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Tue, 20 Oct 2020 00:01:09 -0700 Subject: [PATCH 007/107] fix: restore default export for backwards compat Brings back default exports for backwards compatibility, but this time in a way that works with AMD and CJS module formats without build tool hacks. Uses rollup-plugin-dts to generate the type declaration for the bundle output, removing the brittle regex-based wrangling we were doing. --- package-lock.json | 181 +++++++++++------------------------------ package.json | 9 +- rollup.config.js | 57 +++++++------ scripts/adjust-d.ts.js | 27 ------ src/Index.ts | 18 ++++ tsconfig.json | 1 + 6 files changed, 105 insertions(+), 188 deletions(-) delete mode 100644 scripts/adjust-d.ts.js diff --git a/package-lock.json b/package-lock.json index 0b6c45ae..0ddc94b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,6 +54,13 @@ "@babel/types": "^7.7.4" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true, + "optional": true + }, "@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", @@ -118,15 +125,6 @@ "to-fast-properties": "^2.0.0" } }, - "@types/acorn": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.5.tgz", - "integrity": "sha512-603sPiZ4GVRHPvn6vNgEAvJewKsy+zwRWYS2MeIMemgoAtcjlw2G3lALxrb9OPA17J28bkB71R33yXlQbUatCA==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -139,12 +137,6 @@ "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", "dev": true }, - "@types/estree": { - "version": "0.0.40", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.40.tgz", - "integrity": "sha512-p3KZgMto/JyxosKGmnLDJ/dG5wf+qTRMUjHJcspC2oQKa4jP7mz+tv0ND56lLBu3ojHlhzY33Ol+khLyNmilkA==", - "dev": true - }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", @@ -225,23 +217,6 @@ "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - } - } - }, "acorn-jsx": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", @@ -651,15 +626,6 @@ "assert-plus": "^1.0.0" } }, - "date-time": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-2.1.0.tgz", - "integrity": "sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g==", - "dev": true, - "requires": { - "time-zone": "^1.0.0" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -969,12 +935,6 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -1151,6 +1111,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, "function-loop": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", @@ -1446,23 +1413,6 @@ "is-extglob": "^2.1.1" } }, - "is-reference": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", - "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", - "dev": true, - "requires": { - "@types/estree": "0.0.39" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - } - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -1691,12 +1641,6 @@ } } }, - "locate-character": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-2.0.5.tgz", - "integrity": "sha512-n2GmejDXtOPBAZdIiEFy5dJ5N38xBCXLNOtw2WpB9kGh6pnrEuKlwYI+Tkpofc4wDtVXHtoAOJaMRlYG/oYaxg==", - "dev": true - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -2079,12 +2023,6 @@ "json-parse-better-errors": "^1.0.1" } }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", - "dev": true - }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -2168,15 +2106,6 @@ "fast-diff": "^1.1.2" } }, - "pretty-ms": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-3.2.0.tgz", - "integrity": "sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q==", - "dev": true, - "requires": { - "parse-ms": "^1.0.0" - } - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2315,12 +2244,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", - "dev": true - }, "resolve": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", @@ -2356,39 +2279,45 @@ } }, "rollup": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.57.1.tgz", - "integrity": "sha512-I18GBqP0qJoJC1K1osYjreqA8VAKovxuI3I81RSk0Dmr4TgloI0tAULjZaox8OsJ+n7XRrhH6i0G2By/pj1LCA==", - "dev": true, - "requires": { - "@types/acorn": "^4.0.3", - "acorn": "^5.5.3", - "acorn-dynamic-import": "^3.0.0", - "date-time": "^2.1.0", - "is-reference": "^1.1.0", - "locate-character": "^2.0.5", - "pretty-ms": "^3.1.0", - "require-relative": "^0.8.7", - "rollup-pluginutils": "^2.0.1", - "signal-exit": "^3.0.2", - "sourcemap-codec": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - } + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.0.tgz", + "integrity": "sha512-0FIG1jY88uhCP2yP4CfvtKEqPDRmsUwfY1kEOOM+DH/KOGATgaIFd/is1+fQOxsvh62ELzcFfKonwKWnHhrqmw==", + "dev": true, + "requires": { + "fsevents": "~2.1.2" } }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "rollup-plugin-dts": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-1.4.10.tgz", + "integrity": "sha512-bL6MBXc8lK7D5b/tYbHaglxs4ZxMQTQilGA6Xm9KQBEj4h9ZwIDlAsvDooGjJ/cOw23r3POTRtSCEyTHxtzHJg==", "dev": true, "requires": { - "estree-walker": "^0.6.1" + "@babel/code-frame": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } } }, "run-async": { @@ -2494,12 +2423,6 @@ } } }, - "sourcemap-codec": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", - "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", - "dev": true - }, "spawn-wrap": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", @@ -2841,12 +2764,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", - "dev": true - }, "tmatch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", diff --git a/package.json b/package.json index dbf600b4..d9eb3c23 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", "version": "18.6.0", "main": "dist/tween.cjs.js", - "types": "dist/index.d.ts", + "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", "files": [ "dist", @@ -25,12 +25,10 @@ ], "dependencies": {}, "scripts": { - "build": "rimraf dist && rimraf .tmp && node scripts/write-version.js && npm run tsc && npm run rollup-build && npm run tsc-d.ts && npm run adjust-d.ts", + "build": "rimraf dist .tmp && node scripts/write-version.js && npm run tsc && npm run rollup-build", "rollup-build": "rollup -c ./rollup.config.js", "tsc": "tsc", "tsc-watch": "tsc --watch", - "tsc-d.ts": "tsc --declaration --emitDeclarationOnly --esModuleInterop --outFile dist/index.d.ts", - "adjust-d.ts": "node scripts/adjust-d.ts.js", "test": "npm run build && npm run test-unit && npm run test-lint", "test-unit": "nodeunit test/unit/nodeunitheadless.js", "test-lint": "npm run prettier -- --check && eslint 'src/**/*.ts'", @@ -52,7 +50,8 @@ "nodeunit": "^0.11.3", "prettier": "^2.0.0", "rimraf": "^3.0.0", - "rollup": "^0.57.1", + "rollup": "^2.0.0", + "rollup-plugin-dts": "1.4.10", "tslib": "^1.10.0", "typescript": "^4.0.0" } diff --git a/rollup.config.js b/rollup.config.js index bbee9fdb..8641d95a 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,24 +1,33 @@ -export default { - input: '.tmp/Index.js', - // https://github.com/rollup/rollup/wiki/Troubleshooting#this-is-undefined - context: 'this', - output: [ - { - file: 'dist/tween.umd.js', - name: 'TWEEN', - format: 'umd', - }, - { - file: 'dist/tween.amd.js', - format: 'amd', - }, - { - file: 'dist/tween.cjs.js', - format: 'cjs', - }, - { - file: 'dist/tween.esm.js', - format: 'es', - }, - ], -} +import dts from 'rollup-plugin-dts' + +export default [ + { + input: '.tmp/Index.js', + // https://github.com/rollup/rollup/wiki/Troubleshooting#this-is-undefined + context: 'this', + output: [ + { + file: 'dist/tween.umd.js', + name: 'TWEEN', + format: 'umd', + }, + { + file: 'dist/tween.amd.js', + format: 'amd', + }, + { + file: 'dist/tween.cjs.js', + format: 'cjs', + }, + { + file: 'dist/tween.esm.js', + format: 'es', + }, + ], + }, + { + input: './.tmp/Index.d.ts', + output: [{file: 'dist/tween.d.ts', format: 'es'}], + plugins: [dts()], + }, +] diff --git a/scripts/adjust-d.ts.js b/scripts/adjust-d.ts.js deleted file mode 100644 index 10fe9447..00000000 --- a/scripts/adjust-d.ts.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Make adjustments to the definition generated by Typescript - */ - -var fs = require('fs') -var path = require('path') - -var file = path.join(__dirname, '../dist/index.d.ts') - -let content = fs.readFileSync(file) + '' - -content = content - .replace(/\r\n/g, '\n') - .replace(/\s*export default [^;{]+;/g, '') - .replace(/export (default )?(?!{)/g, '') - .replace(/(}\n)?declare module [^{]+{/g, '') - .replace(/import [^;]+;/g, '') - .replace(/}\n$/, '') - .replace(/;\n(\s*)\//g, ';\n\n$1/') - .replace(/}\n(\s*)([^\s])/g, '}\n\n$1$2') - .replace(/\n\n(\s*\n)+/g, '\n\n') - -content = `declare module "@tweenjs/tween.js" { -${content} -} ` - -fs.writeFileSync(file, content) diff --git a/src/Index.ts b/src/Index.ts index 573908d9..cd7960c1 100644 --- a/src/Index.ts +++ b/src/Index.ts @@ -37,3 +37,21 @@ const remove = TWEEN.remove.bind(TWEEN) const update = TWEEN.update.bind(TWEEN) export {Easing, Group, Interpolation, now, Sequence, nextId, Tween, VERSION, getAll, removeAll, add, remove, update} + +const exports = { + Easing, + Group, + Interpolation, + now, + Sequence, + nextId, + Tween, + VERSION, + getAll, + removeAll, + add, + remove, + update, +} + +export default exports diff --git a/tsconfig.json b/tsconfig.json index 96cded1b..2fbb75ea 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "baseUrl": ".", "outDir": "./.tmp", + "declaration": true, "strict": true, "importsNotUsedAsValues": "error", "sourceMap": true, From f96e9716537b627dba90e3db35863f64e8d911e9 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Tue, 20 Oct 2020 00:10:20 -0700 Subject: [PATCH 008/107] v18.6.1 --- dist/index.d.ts | 273 --------------------------------------------- dist/tween.amd.js | 269 ++++++++++++++++++++++++--------------------- dist/tween.cjs.js | 265 +++++++++++++++++++++++--------------------- dist/tween.d.ts | 256 ++++++++++++++++++++++++++++++++++++++++++ dist/tween.esm.js | 253 +++++++++++++++++++++--------------------- dist/tween.umd.js | 275 ++++++++++++++++++++++++---------------------- package-lock.json | 2 +- package.json | 2 +- src/Version.ts | 2 +- 9 files changed, 809 insertions(+), 788 deletions(-) delete mode 100644 dist/index.d.ts create mode 100644 dist/tween.d.ts diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index fedf6b3e..00000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,273 +0,0 @@ -declare module "TWEEN" { - - type EasingFunction = (amount: number) => number; - - /** - * The Ease class provides a collection of easing functions for use with tween.js. - */ - const Easing: { - Linear: { - None: (amount: number) => number; - }; - Quadratic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Cubic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Quartic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Quintic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Sinusoidal: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Exponential: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Circular: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Elastic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Back: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Bounce: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - }; - - let NOW: () => number; - - /** - * - */ - type InterpolationFunction = (v: number[], k: number) => number; - - /** - * - */ - const Interpolation: { - Linear: (v: number[], k: number) => number; - Bezier: (v: number[], k: number) => number; - CatmullRom: (v: number[], k: number) => number; - Utils: { - Linear: (p0: number, p1: number, t: number) => number; - Bernstein: (n: number, i: number) => number; - Factorial: (n: number) => number; - CatmullRom: (p0: number, p1: number, p2: number, p3: number, t: number) => number; - }; - }; - - /** - * Utils - */ - class Sequence { - private static _nextId; - static nextId(): number; - } - - const VERSION = "18.5.0"; - - /** - * Controlling groups of tweens - * - * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween - */ - class Main extends Group { - version: string; - now: () => number; - Group: typeof Group; - Easing: { - Linear: { - None: (amount: number) => number; - }; - Quadratic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Cubic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Quartic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Quintic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Sinusoidal: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Exponential: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Circular: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Elastic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Back: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Bounce: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - }; - Interpolation: { - Linear: (v: number[], k: number) => number; - Bezier: (v: number[], k: number) => number; - CatmullRom: (v: number[], k: number) => number; - Utils: { - Linear: (p0: number, p1: number, t: number) => number; - Bernstein: (n: number, i: number) => number; - Factorial: (n: number) => number; - CatmullRom: (p0: number, p1: number, p2: number, p3: number, t: number) => number; - }; - }; - nextId: typeof Sequence.nextId; - Tween: typeof Tween; - } - - const TWEEN: Main; - - /** - * Tween.js - Licensed under the MIT license - * https://github.com/tweenjs/tween.js - * ---------------------------------------------- - * - * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors. - * Thank you all, you're awesome! - */ - - - - class Tween { - private _object; - private _group; - private _isPaused; - private _pauseStart; - private _valuesStart; - private _valuesEnd; - private _valuesStartRepeat; - private _duration; - private _initialRepeat; - private _repeat; - private _repeatDelayTime?; - private _yoyo; - private _isPlaying; - private _reversed; - private _delayTime; - private _startTime; - private _easingFunction; - private _interpolationFunction; - private _chainedTweens; - private _onStartCallback?; - private _onStartCallbackFired; - private _onUpdateCallback?; - private _onRepeatCallback?; - private _onCompleteCallback?; - private _onStopCallback?; - private _id; - private _isChainStopped; - constructor(_object: T, _group?: Group); - getId(): number; - isPlaying(): boolean; - isPaused(): boolean; - to(properties: UnknownProps, duration?: number): this; - duration(d: number): this; - start(time: number): this; - private _setupProperties; - stop(): this; - end(): this; - pause(time: number): this; - resume(time: number): this; - stopChainedTweens(): this; - group(group: Group): this; - delay(amount: number): this; - repeat(times: number): this; - repeatDelay(amount: number): this; - yoyo(yoyo: boolean): this; - easing(easingFunction: EasingFunction): this; - interpolation(interpolationFunction: InterpolationFunction): this; - chain(...tweens: Array>): this; - onStart(callback: (object: T) => void): this; - onUpdate(callback: (object: T, elapsed: number) => void): this; - onRepeat(callback: (object: T) => void): this; - onComplete(callback: (object: T) => void): this; - onStop(callback: (object: T) => void): this; - update(time: number): boolean; - private _updateProperties; - private _handleRelativeValue; - private _swapEndStartRepeatValues; - } - - type UnknownProps = Record; - - /** - * Controlling groups of tweens - * - * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween - */ - class Group { - private _tweens; - private _tweensAddedDuringUpdate; - getAll(): Array>; - removeAll(): void; - add(tween: Tween): void; - remove(tween: Tween): void; - update(time: number, preserve?: boolean): boolean; - } - - export default TWEEN; -} - -declare module "@tweenjs/tween.js" { - import TWEEN from "TWEEN"; - export = TWEEN; -} diff --git a/dist/tween.amd.js b/dist/tween.amd.js index 35b6da38..a81a0d00 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -1,90 +1,4 @@ -define(function () { 'use strict'; - - var NOW; - // Include a performance.now polyfill. - // In node.js, use process.hrtime. - // eslint-disable-next-line - // @ts-ignore - if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - NOW = function () { - // eslint-disable-next-line - // @ts-ignore - var time = process.hrtime(); - // Convert [seconds, nanoseconds] to milliseconds. - return time[0] * 1000 + time[1] / 1000000; - }; - } - // In a browser, use self.performance.now if it is available. - else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { - // This must be bound, because directly assigning this function - // leads to an invocation exception in Chrome. - NOW = self.performance.now.bind(self.performance); - } - // Use Date.now if it is available. - else if (Date.now !== undefined) { - NOW = Date.now; - } - // Otherwise, use 'new Date().getTime()'. - else { - NOW = function () { - return new Date().getTime(); - }; - } - var NOW$1 = NOW; - - /** - * Controlling groups of tweens - * - * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween - */ - var Group = /** @class */ (function () { - function Group() { - this._tweens = {}; - this._tweensAddedDuringUpdate = {}; - } - Group.prototype.getAll = function () { - var _this = this; - return Object.keys(this._tweens).map(function (tweenId) { - return _this._tweens[tweenId]; - }); - }; - Group.prototype.removeAll = function () { - this._tweens = {}; - }; - Group.prototype.add = function (tween) { - this._tweens[tween.getId()] = tween; - this._tweensAddedDuringUpdate[tween.getId()] = tween; - }; - Group.prototype.remove = function (tween) { - delete this._tweens[tween.getId()]; - delete this._tweensAddedDuringUpdate[tween.getId()]; - }; - Group.prototype.update = function (time, preserve) { - var tweenIds = Object.keys(this._tweens); - if (tweenIds.length === 0) { - return false; - } - time = time !== undefined ? time : NOW$1(); - // Tweens are updated in "batches". If you add a new tween during an - // update, then the new tween will be updated in the next batch. - // If you remove a tween during an update, it may or may not be updated. - // However, if the removed tween was added during the current batch, - // then it will not be updated. - while (tweenIds.length > 0) { - this._tweensAddedDuringUpdate = {}; - for (var i = 0; i < tweenIds.length; i++) { - var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time) === false && !preserve) { - delete this._tweens[tweenIds[i]]; - } - } - tweenIds = Object.keys(this._tweensAddedDuringUpdate); - } - return true; - }; - return Group; - }()); +define(['exports'], function (exports) { 'use strict'; /** * The Ease class provides a collection of easing functions for use with tween.js. @@ -273,6 +187,92 @@ define(function () { 'use strict'; }, }; + var now; + // Include a performance.now polyfill. + // In node.js, use process.hrtime. + // eslint-disable-next-line + // @ts-ignore + if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { + now = function () { + // eslint-disable-next-line + // @ts-ignore + var time = process.hrtime(); + // Convert [seconds, nanoseconds] to milliseconds. + return time[0] * 1000 + time[1] / 1000000; + }; + } + // In a browser, use self.performance.now if it is available. + else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { + // This must be bound, because directly assigning this function + // leads to an invocation exception in Chrome. + now = self.performance.now.bind(self.performance); + } + // Use Date.now if it is available. + else if (Date.now !== undefined) { + now = Date.now; + } + // Otherwise, use 'new Date().getTime()'. + else { + now = function () { + return new Date().getTime(); + }; + } + var now$1 = now; + + /** + * Controlling groups of tweens + * + * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. + * In these cases, you may want to create your own smaller groups of tween + */ + var Group = /** @class */ (function () { + function Group() { + this._tweens = {}; + this._tweensAddedDuringUpdate = {}; + } + Group.prototype.getAll = function () { + var _this = this; + return Object.keys(this._tweens).map(function (tweenId) { + return _this._tweens[tweenId]; + }); + }; + Group.prototype.removeAll = function () { + this._tweens = {}; + }; + Group.prototype.add = function (tween) { + this._tweens[tween.getId()] = tween; + this._tweensAddedDuringUpdate[tween.getId()] = tween; + }; + Group.prototype.remove = function (tween) { + delete this._tweens[tween.getId()]; + delete this._tweensAddedDuringUpdate[tween.getId()]; + }; + Group.prototype.update = function (time, preserve) { + var tweenIds = Object.keys(this._tweens); + if (tweenIds.length === 0) { + return false; + } + time = time !== undefined ? time : now$1(); + // Tweens are updated in "batches". If you add a new tween during an + // update, then the new tween will be updated in the next batch. + // If you remove a tween during an update, it may or may not be updated. + // However, if the removed tween was added during the current batch, + // then it will not be updated. + while (tweenIds.length > 0) { + this._tweensAddedDuringUpdate = {}; + for (var i = 0; i < tweenIds.length; i++) { + var tween = this._tweens[tweenIds[i]]; + if (tween && tween.update(time) === false && !preserve) { + delete this._tweens[tweenIds[i]]; + } + } + tweenIds = Object.keys(this._tweensAddedDuringUpdate); + } + return true; + }; + return Group; + }()); + /** * */ @@ -366,6 +366,8 @@ define(function () { 'use strict'; return Sequence; }()); + var mainGroup = new Group(); + /** * Tween.js - Licensed under the MIT license * https://github.com/tweenjs/tween.js @@ -376,7 +378,7 @@ define(function () { 'use strict'; */ var Tween = /** @class */ (function () { function Tween(_object, _group) { - if (_group === void 0) { _group = TWEEN; } + if (_group === void 0) { _group = mainGroup; } this._object = _object; this._group = _group; this._isPaused = false; @@ -392,11 +394,11 @@ define(function () { 'use strict'; this._reversed = false; this._delayTime = 0; this._startTime = 0; - this._easingFunction = TWEEN.Easing.Linear.None; - this._interpolationFunction = TWEEN.Interpolation.Linear; + this._easingFunction = Easing.Linear.None; + this._interpolationFunction = Interpolation.Linear; this._chainedTweens = []; this._onStartCallbackFired = false; - this._id = TWEEN.nextId(); + this._id = Sequence.nextId(); this._isChainStopped = false; } Tween.prototype.getId = function () { @@ -409,7 +411,6 @@ define(function () { 'use strict'; return this._isPaused; }; Tween.prototype.to = function (properties, duration) { - // to (properties, duration) { for (var prop in properties) { this._valuesEnd[prop] = properties[prop]; } @@ -443,8 +444,7 @@ define(function () { 'use strict'; this._isPaused = false; this._onStartCallbackFired = false; this._isChainStopped = false; - this._startTime = - time !== undefined ? (typeof time === 'string' ? TWEEN.now() + parseFloat(time) : time) : TWEEN.now(); + this._startTime = time !== undefined ? (typeof time === 'string' ? now$1() + parseFloat(time) : time) : now$1(); this._startTime += this._delayTime; this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat); return this; @@ -533,7 +533,7 @@ define(function () { 'use strict'; return this; } this._isPaused = true; - this._pauseStart = time === undefined ? TWEEN.now() : time; + this._pauseStart = time === undefined ? now$1() : time; // eslint-disable-next-line // @ts-ignore FIXME? this._group.remove(this); @@ -544,7 +544,7 @@ define(function () { 'use strict'; return this; } this._isPaused = false; - this._startTime += (time === undefined ? TWEEN.now() : time) - this._pauseStart; + this._startTime += (time === undefined ? now$1() : time) - this._pauseStart; this._pauseStart = 0; // eslint-disable-next-line // @ts-ignore FIXME? @@ -617,6 +617,7 @@ define(function () { 'use strict'; Tween.prototype.update = function (time) { var property; var elapsed; + time = time !== undefined ? time : now$1(); var endTime = this._startTime + this._duration; if (time > endTime && !this._isPlaying) { return false; @@ -746,7 +747,7 @@ define(function () { 'use strict'; return Tween; }()); - var VERSION = '18.5.0'; + var VERSION = '18.6.1'; /** * Tween.js - Licensed under the MIT license @@ -756,42 +757,54 @@ define(function () { 'use strict'; * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors. * Thank you all, you're awesome! */ - var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); + var nextId = Sequence.nextId; /** * Controlling groups of tweens * * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween + * In these cases, you may want to create your own smaller groups of tweens. */ - var Main = /** @class */ (function (_super) { - __extends(Main, _super); - function Main() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.version = VERSION; - _this.now = NOW$1; - _this.Group = Group; - _this.Easing = Easing; - _this.Interpolation = Interpolation; - _this.nextId = Sequence.nextId; - _this.Tween = Tween; - return _this; - } - return Main; - }(Group)); - var TWEEN = new Main(); + var TWEEN = mainGroup; + // This is the best way to export things in a way that's compatible with both ES + // Modules and CommonJS, without build hacks, and so as not to break the + // existing API. + // https://github.com/rollup/rollup/issues/1961#issuecomment-423037881 + var getAll = TWEEN.getAll.bind(TWEEN); + var removeAll = TWEEN.removeAll.bind(TWEEN); + var add = TWEEN.add.bind(TWEEN); + var remove = TWEEN.remove.bind(TWEEN); + var update = TWEEN.update.bind(TWEEN); + var exports$1 = { + Easing: Easing, + Group: Group, + Interpolation: Interpolation, + now: now$1, + Sequence: Sequence, + nextId: nextId, + Tween: Tween, + VERSION: VERSION, + getAll: getAll, + removeAll: removeAll, + add: add, + remove: remove, + update: update, + }; + + exports.Easing = Easing; + exports.Group = Group; + exports.Interpolation = Interpolation; + exports.Sequence = Sequence; + exports.Tween = Tween; + exports.VERSION = VERSION; + exports.add = add; + exports.default = exports$1; + exports.getAll = getAll; + exports.nextId = nextId; + exports.now = now$1; + exports.remove = remove; + exports.removeAll = removeAll; + exports.update = update; - return TWEEN; + Object.defineProperty(exports, '__esModule', { value: true }); }); diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index 4665e438..01376263 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -1,90 +1,6 @@ 'use strict'; -var NOW; -// Include a performance.now polyfill. -// In node.js, use process.hrtime. -// eslint-disable-next-line -// @ts-ignore -if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - NOW = function () { - // eslint-disable-next-line - // @ts-ignore - var time = process.hrtime(); - // Convert [seconds, nanoseconds] to milliseconds. - return time[0] * 1000 + time[1] / 1000000; - }; -} -// In a browser, use self.performance.now if it is available. -else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { - // This must be bound, because directly assigning this function - // leads to an invocation exception in Chrome. - NOW = self.performance.now.bind(self.performance); -} -// Use Date.now if it is available. -else if (Date.now !== undefined) { - NOW = Date.now; -} -// Otherwise, use 'new Date().getTime()'. -else { - NOW = function () { - return new Date().getTime(); - }; -} -var NOW$1 = NOW; - -/** - * Controlling groups of tweens - * - * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween - */ -var Group = /** @class */ (function () { - function Group() { - this._tweens = {}; - this._tweensAddedDuringUpdate = {}; - } - Group.prototype.getAll = function () { - var _this = this; - return Object.keys(this._tweens).map(function (tweenId) { - return _this._tweens[tweenId]; - }); - }; - Group.prototype.removeAll = function () { - this._tweens = {}; - }; - Group.prototype.add = function (tween) { - this._tweens[tween.getId()] = tween; - this._tweensAddedDuringUpdate[tween.getId()] = tween; - }; - Group.prototype.remove = function (tween) { - delete this._tweens[tween.getId()]; - delete this._tweensAddedDuringUpdate[tween.getId()]; - }; - Group.prototype.update = function (time, preserve) { - var tweenIds = Object.keys(this._tweens); - if (tweenIds.length === 0) { - return false; - } - time = time !== undefined ? time : NOW$1(); - // Tweens are updated in "batches". If you add a new tween during an - // update, then the new tween will be updated in the next batch. - // If you remove a tween during an update, it may or may not be updated. - // However, if the removed tween was added during the current batch, - // then it will not be updated. - while (tweenIds.length > 0) { - this._tweensAddedDuringUpdate = {}; - for (var i = 0; i < tweenIds.length; i++) { - var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time) === false && !preserve) { - delete this._tweens[tweenIds[i]]; - } - } - tweenIds = Object.keys(this._tweensAddedDuringUpdate); - } - return true; - }; - return Group; -}()); +Object.defineProperty(exports, '__esModule', { value: true }); /** * The Ease class provides a collection of easing functions for use with tween.js. @@ -273,6 +189,92 @@ var Easing = { }, }; +var now; +// Include a performance.now polyfill. +// In node.js, use process.hrtime. +// eslint-disable-next-line +// @ts-ignore +if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { + now = function () { + // eslint-disable-next-line + // @ts-ignore + var time = process.hrtime(); + // Convert [seconds, nanoseconds] to milliseconds. + return time[0] * 1000 + time[1] / 1000000; + }; +} +// In a browser, use self.performance.now if it is available. +else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { + // This must be bound, because directly assigning this function + // leads to an invocation exception in Chrome. + now = self.performance.now.bind(self.performance); +} +// Use Date.now if it is available. +else if (Date.now !== undefined) { + now = Date.now; +} +// Otherwise, use 'new Date().getTime()'. +else { + now = function () { + return new Date().getTime(); + }; +} +var now$1 = now; + +/** + * Controlling groups of tweens + * + * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. + * In these cases, you may want to create your own smaller groups of tween + */ +var Group = /** @class */ (function () { + function Group() { + this._tweens = {}; + this._tweensAddedDuringUpdate = {}; + } + Group.prototype.getAll = function () { + var _this = this; + return Object.keys(this._tweens).map(function (tweenId) { + return _this._tweens[tweenId]; + }); + }; + Group.prototype.removeAll = function () { + this._tweens = {}; + }; + Group.prototype.add = function (tween) { + this._tweens[tween.getId()] = tween; + this._tweensAddedDuringUpdate[tween.getId()] = tween; + }; + Group.prototype.remove = function (tween) { + delete this._tweens[tween.getId()]; + delete this._tweensAddedDuringUpdate[tween.getId()]; + }; + Group.prototype.update = function (time, preserve) { + var tweenIds = Object.keys(this._tweens); + if (tweenIds.length === 0) { + return false; + } + time = time !== undefined ? time : now$1(); + // Tweens are updated in "batches". If you add a new tween during an + // update, then the new tween will be updated in the next batch. + // If you remove a tween during an update, it may or may not be updated. + // However, if the removed tween was added during the current batch, + // then it will not be updated. + while (tweenIds.length > 0) { + this._tweensAddedDuringUpdate = {}; + for (var i = 0; i < tweenIds.length; i++) { + var tween = this._tweens[tweenIds[i]]; + if (tween && tween.update(time) === false && !preserve) { + delete this._tweens[tweenIds[i]]; + } + } + tweenIds = Object.keys(this._tweensAddedDuringUpdate); + } + return true; + }; + return Group; +}()); + /** * */ @@ -366,6 +368,8 @@ var Sequence = /** @class */ (function () { return Sequence; }()); +var mainGroup = new Group(); + /** * Tween.js - Licensed under the MIT license * https://github.com/tweenjs/tween.js @@ -376,7 +380,7 @@ var Sequence = /** @class */ (function () { */ var Tween = /** @class */ (function () { function Tween(_object, _group) { - if (_group === void 0) { _group = TWEEN; } + if (_group === void 0) { _group = mainGroup; } this._object = _object; this._group = _group; this._isPaused = false; @@ -392,11 +396,11 @@ var Tween = /** @class */ (function () { this._reversed = false; this._delayTime = 0; this._startTime = 0; - this._easingFunction = TWEEN.Easing.Linear.None; - this._interpolationFunction = TWEEN.Interpolation.Linear; + this._easingFunction = Easing.Linear.None; + this._interpolationFunction = Interpolation.Linear; this._chainedTweens = []; this._onStartCallbackFired = false; - this._id = TWEEN.nextId(); + this._id = Sequence.nextId(); this._isChainStopped = false; } Tween.prototype.getId = function () { @@ -409,7 +413,6 @@ var Tween = /** @class */ (function () { return this._isPaused; }; Tween.prototype.to = function (properties, duration) { - // to (properties, duration) { for (var prop in properties) { this._valuesEnd[prop] = properties[prop]; } @@ -443,8 +446,7 @@ var Tween = /** @class */ (function () { this._isPaused = false; this._onStartCallbackFired = false; this._isChainStopped = false; - this._startTime = - time !== undefined ? (typeof time === 'string' ? TWEEN.now() + parseFloat(time) : time) : TWEEN.now(); + this._startTime = time !== undefined ? (typeof time === 'string' ? now$1() + parseFloat(time) : time) : now$1(); this._startTime += this._delayTime; this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat); return this; @@ -533,7 +535,7 @@ var Tween = /** @class */ (function () { return this; } this._isPaused = true; - this._pauseStart = time === undefined ? TWEEN.now() : time; + this._pauseStart = time === undefined ? now$1() : time; // eslint-disable-next-line // @ts-ignore FIXME? this._group.remove(this); @@ -544,7 +546,7 @@ var Tween = /** @class */ (function () { return this; } this._isPaused = false; - this._startTime += (time === undefined ? TWEEN.now() : time) - this._pauseStart; + this._startTime += (time === undefined ? now$1() : time) - this._pauseStart; this._pauseStart = 0; // eslint-disable-next-line // @ts-ignore FIXME? @@ -617,6 +619,7 @@ var Tween = /** @class */ (function () { Tween.prototype.update = function (time) { var property; var elapsed; + time = time !== undefined ? time : now$1(); var endTime = this._startTime + this._duration; if (time > endTime && !this._isPlaying) { return false; @@ -746,7 +749,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.5.0'; +var VERSION = '18.6.1'; /** * Tween.js - Licensed under the MIT license @@ -756,40 +759,50 @@ var VERSION = '18.5.0'; * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors. * Thank you all, you're awesome! */ -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); +var nextId = Sequence.nextId; /** * Controlling groups of tweens * * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween + * In these cases, you may want to create your own smaller groups of tweens. */ -var Main = /** @class */ (function (_super) { - __extends(Main, _super); - function Main() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.version = VERSION; - _this.now = NOW$1; - _this.Group = Group; - _this.Easing = Easing; - _this.Interpolation = Interpolation; - _this.nextId = Sequence.nextId; - _this.Tween = Tween; - return _this; - } - return Main; -}(Group)); -var TWEEN = new Main(); +var TWEEN = mainGroup; +// This is the best way to export things in a way that's compatible with both ES +// Modules and CommonJS, without build hacks, and so as not to break the +// existing API. +// https://github.com/rollup/rollup/issues/1961#issuecomment-423037881 +var getAll = TWEEN.getAll.bind(TWEEN); +var removeAll = TWEEN.removeAll.bind(TWEEN); +var add = TWEEN.add.bind(TWEEN); +var remove = TWEEN.remove.bind(TWEEN); +var update = TWEEN.update.bind(TWEEN); +var exports$1 = { + Easing: Easing, + Group: Group, + Interpolation: Interpolation, + now: now$1, + Sequence: Sequence, + nextId: nextId, + Tween: Tween, + VERSION: VERSION, + getAll: getAll, + removeAll: removeAll, + add: add, + remove: remove, + update: update, +}; -module.exports = TWEEN; +exports.Easing = Easing; +exports.Group = Group; +exports.Interpolation = Interpolation; +exports.Sequence = Sequence; +exports.Tween = Tween; +exports.VERSION = VERSION; +exports.add = add; +exports.default = exports$1; +exports.getAll = getAll; +exports.nextId = nextId; +exports.now = now$1; +exports.remove = remove; +exports.removeAll = removeAll; +exports.update = update; diff --git a/dist/tween.d.ts b/dist/tween.d.ts new file mode 100644 index 00000000..674ace0b --- /dev/null +++ b/dist/tween.d.ts @@ -0,0 +1,256 @@ +declare type EasingFunction = (amount: number) => number; +/** + * The Ease class provides a collection of easing functions for use with tween.js. + */ +declare const Easing: { + Linear: { + None: (amount: number) => number; + }; + Quadratic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Cubic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Quartic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Quintic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Sinusoidal: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Exponential: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Circular: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Elastic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Back: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Bounce: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; +}; + +/** + * + */ +declare type InterpolationFunction = (v: number[], k: number) => number; +/** + * + */ +declare const Interpolation: { + Linear: (v: number[], k: number) => number; + Bezier: (v: number[], k: number) => number; + CatmullRom: (v: number[], k: number) => number; + Utils: { + Linear: (p0: number, p1: number, t: number) => number; + Bernstein: (n: number, i: number) => number; + Factorial: (n: number) => number; + CatmullRom: (p0: number, p1: number, p2: number, p3: number, t: number) => number; + }; +}; + +declare class Tween { + private _object; + private _group; + private _isPaused; + private _pauseStart; + private _valuesStart; + private _valuesEnd; + private _valuesStartRepeat; + private _duration; + private _initialRepeat; + private _repeat; + private _repeatDelayTime?; + private _yoyo; + private _isPlaying; + private _reversed; + private _delayTime; + private _startTime; + private _easingFunction; + private _interpolationFunction; + private _chainedTweens; + private _onStartCallback?; + private _onStartCallbackFired; + private _onUpdateCallback?; + private _onRepeatCallback?; + private _onCompleteCallback?; + private _onStopCallback?; + private _id; + private _isChainStopped; + constructor(_object: T, _group?: Group); + getId(): number; + isPlaying(): boolean; + isPaused(): boolean; + to(properties: UnknownProps, duration?: number): this; + duration(d: number): this; + start(time?: number): this; + private _setupProperties; + stop(): this; + end(): this; + pause(time: number): this; + resume(time: number): this; + stopChainedTweens(): this; + group(group: Group): this; + delay(amount: number): this; + repeat(times: number): this; + repeatDelay(amount: number): this; + yoyo(yoyo: boolean): this; + easing(easingFunction: EasingFunction): this; + interpolation(interpolationFunction: InterpolationFunction): this; + chain(...tweens: Array>): this; + onStart(callback: (object: T) => void): this; + onUpdate(callback: (object: T, elapsed: number) => void): this; + onRepeat(callback: (object: T) => void): this; + onComplete(callback: (object: T) => void): this; + onStop(callback: (object: T) => void): this; + update(time?: number): boolean; + private _updateProperties; + private _handleRelativeValue; + private _swapEndStartRepeatValues; +} +declare type UnknownProps = Record; + +/** + * Controlling groups of tweens + * + * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. + * In these cases, you may want to create your own smaller groups of tween + */ +declare class Group { + private _tweens; + private _tweensAddedDuringUpdate; + getAll(): Array>; + removeAll(): void; + add(tween: Tween): void; + remove(tween: Tween): void; + update(time: number, preserve?: boolean): boolean; +} + +declare let now: () => number; + +/** + * Utils + */ +declare class Sequence { + private static _nextId; + static nextId(): number; +} + +declare const VERSION = "18.6.1"; + +declare const nextId: typeof Sequence.nextId; +declare const getAll: () => Tween>[]; +declare const removeAll: () => void; +declare const add: (tween: Tween>) => void; +declare const remove: (tween: Tween>) => void; +declare const update: (time: number, preserve?: boolean | undefined) => boolean; +declare const exports: { + Easing: { + Linear: { + None: (amount: number) => number; + }; + Quadratic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Cubic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Quartic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Quintic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Sinusoidal: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Exponential: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Circular: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Elastic: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Back: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + Bounce: { + In: (amount: number) => number; + Out: (amount: number) => number; + InOut: (amount: number) => number; + }; + }; + Group: typeof Group; + Interpolation: { + Linear: (v: number[], k: number) => number; + Bezier: (v: number[], k: number) => number; + CatmullRom: (v: number[], k: number) => number; + Utils: { + Linear: (p0: number, p1: number, t: number) => number; + Bernstein: (n: number, i: number) => number; + Factorial: (n: number) => number; + CatmullRom: (p0: number, p1: number, p2: number, p3: number, t: number) => number; + }; + }; + now: () => number; + Sequence: typeof Sequence; + nextId: typeof Sequence.nextId; + Tween: typeof Tween; + VERSION: string; + getAll: () => Tween>[]; + removeAll: () => void; + add: (tween: Tween>) => void; + remove: (tween: Tween>) => void; + update: (time: number, preserve?: boolean | undefined) => boolean; +}; + +export default exports; +export { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, getAll, nextId, now, remove, removeAll, update }; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 22b36eea..276077be 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -1,89 +1,3 @@ -var NOW; -// Include a performance.now polyfill. -// In node.js, use process.hrtime. -// eslint-disable-next-line -// @ts-ignore -if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - NOW = function () { - // eslint-disable-next-line - // @ts-ignore - var time = process.hrtime(); - // Convert [seconds, nanoseconds] to milliseconds. - return time[0] * 1000 + time[1] / 1000000; - }; -} -// In a browser, use self.performance.now if it is available. -else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { - // This must be bound, because directly assigning this function - // leads to an invocation exception in Chrome. - NOW = self.performance.now.bind(self.performance); -} -// Use Date.now if it is available. -else if (Date.now !== undefined) { - NOW = Date.now; -} -// Otherwise, use 'new Date().getTime()'. -else { - NOW = function () { - return new Date().getTime(); - }; -} -var NOW$1 = NOW; - -/** - * Controlling groups of tweens - * - * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween - */ -var Group = /** @class */ (function () { - function Group() { - this._tweens = {}; - this._tweensAddedDuringUpdate = {}; - } - Group.prototype.getAll = function () { - var _this = this; - return Object.keys(this._tweens).map(function (tweenId) { - return _this._tweens[tweenId]; - }); - }; - Group.prototype.removeAll = function () { - this._tweens = {}; - }; - Group.prototype.add = function (tween) { - this._tweens[tween.getId()] = tween; - this._tweensAddedDuringUpdate[tween.getId()] = tween; - }; - Group.prototype.remove = function (tween) { - delete this._tweens[tween.getId()]; - delete this._tweensAddedDuringUpdate[tween.getId()]; - }; - Group.prototype.update = function (time, preserve) { - var tweenIds = Object.keys(this._tweens); - if (tweenIds.length === 0) { - return false; - } - time = time !== undefined ? time : NOW$1(); - // Tweens are updated in "batches". If you add a new tween during an - // update, then the new tween will be updated in the next batch. - // If you remove a tween during an update, it may or may not be updated. - // However, if the removed tween was added during the current batch, - // then it will not be updated. - while (tweenIds.length > 0) { - this._tweensAddedDuringUpdate = {}; - for (var i = 0; i < tweenIds.length; i++) { - var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time) === false && !preserve) { - delete this._tweens[tweenIds[i]]; - } - } - tweenIds = Object.keys(this._tweensAddedDuringUpdate); - } - return true; - }; - return Group; -}()); - /** * The Ease class provides a collection of easing functions for use with tween.js. */ @@ -271,6 +185,92 @@ var Easing = { }, }; +var now; +// Include a performance.now polyfill. +// In node.js, use process.hrtime. +// eslint-disable-next-line +// @ts-ignore +if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { + now = function () { + // eslint-disable-next-line + // @ts-ignore + var time = process.hrtime(); + // Convert [seconds, nanoseconds] to milliseconds. + return time[0] * 1000 + time[1] / 1000000; + }; +} +// In a browser, use self.performance.now if it is available. +else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { + // This must be bound, because directly assigning this function + // leads to an invocation exception in Chrome. + now = self.performance.now.bind(self.performance); +} +// Use Date.now if it is available. +else if (Date.now !== undefined) { + now = Date.now; +} +// Otherwise, use 'new Date().getTime()'. +else { + now = function () { + return new Date().getTime(); + }; +} +var now$1 = now; + +/** + * Controlling groups of tweens + * + * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. + * In these cases, you may want to create your own smaller groups of tween + */ +var Group = /** @class */ (function () { + function Group() { + this._tweens = {}; + this._tweensAddedDuringUpdate = {}; + } + Group.prototype.getAll = function () { + var _this = this; + return Object.keys(this._tweens).map(function (tweenId) { + return _this._tweens[tweenId]; + }); + }; + Group.prototype.removeAll = function () { + this._tweens = {}; + }; + Group.prototype.add = function (tween) { + this._tweens[tween.getId()] = tween; + this._tweensAddedDuringUpdate[tween.getId()] = tween; + }; + Group.prototype.remove = function (tween) { + delete this._tweens[tween.getId()]; + delete this._tweensAddedDuringUpdate[tween.getId()]; + }; + Group.prototype.update = function (time, preserve) { + var tweenIds = Object.keys(this._tweens); + if (tweenIds.length === 0) { + return false; + } + time = time !== undefined ? time : now$1(); + // Tweens are updated in "batches". If you add a new tween during an + // update, then the new tween will be updated in the next batch. + // If you remove a tween during an update, it may or may not be updated. + // However, if the removed tween was added during the current batch, + // then it will not be updated. + while (tweenIds.length > 0) { + this._tweensAddedDuringUpdate = {}; + for (var i = 0; i < tweenIds.length; i++) { + var tween = this._tweens[tweenIds[i]]; + if (tween && tween.update(time) === false && !preserve) { + delete this._tweens[tweenIds[i]]; + } + } + tweenIds = Object.keys(this._tweensAddedDuringUpdate); + } + return true; + }; + return Group; +}()); + /** * */ @@ -364,6 +364,8 @@ var Sequence = /** @class */ (function () { return Sequence; }()); +var mainGroup = new Group(); + /** * Tween.js - Licensed under the MIT license * https://github.com/tweenjs/tween.js @@ -374,7 +376,7 @@ var Sequence = /** @class */ (function () { */ var Tween = /** @class */ (function () { function Tween(_object, _group) { - if (_group === void 0) { _group = TWEEN; } + if (_group === void 0) { _group = mainGroup; } this._object = _object; this._group = _group; this._isPaused = false; @@ -390,11 +392,11 @@ var Tween = /** @class */ (function () { this._reversed = false; this._delayTime = 0; this._startTime = 0; - this._easingFunction = TWEEN.Easing.Linear.None; - this._interpolationFunction = TWEEN.Interpolation.Linear; + this._easingFunction = Easing.Linear.None; + this._interpolationFunction = Interpolation.Linear; this._chainedTweens = []; this._onStartCallbackFired = false; - this._id = TWEEN.nextId(); + this._id = Sequence.nextId(); this._isChainStopped = false; } Tween.prototype.getId = function () { @@ -407,7 +409,6 @@ var Tween = /** @class */ (function () { return this._isPaused; }; Tween.prototype.to = function (properties, duration) { - // to (properties, duration) { for (var prop in properties) { this._valuesEnd[prop] = properties[prop]; } @@ -441,8 +442,7 @@ var Tween = /** @class */ (function () { this._isPaused = false; this._onStartCallbackFired = false; this._isChainStopped = false; - this._startTime = - time !== undefined ? (typeof time === 'string' ? TWEEN.now() + parseFloat(time) : time) : TWEEN.now(); + this._startTime = time !== undefined ? (typeof time === 'string' ? now$1() + parseFloat(time) : time) : now$1(); this._startTime += this._delayTime; this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat); return this; @@ -531,7 +531,7 @@ var Tween = /** @class */ (function () { return this; } this._isPaused = true; - this._pauseStart = time === undefined ? TWEEN.now() : time; + this._pauseStart = time === undefined ? now$1() : time; // eslint-disable-next-line // @ts-ignore FIXME? this._group.remove(this); @@ -542,7 +542,7 @@ var Tween = /** @class */ (function () { return this; } this._isPaused = false; - this._startTime += (time === undefined ? TWEEN.now() : time) - this._pauseStart; + this._startTime += (time === undefined ? now$1() : time) - this._pauseStart; this._pauseStart = 0; // eslint-disable-next-line // @ts-ignore FIXME? @@ -615,6 +615,7 @@ var Tween = /** @class */ (function () { Tween.prototype.update = function (time) { var property; var elapsed; + time = time !== undefined ? time : now$1(); var endTime = this._startTime + this._duration; if (time > endTime && !this._isPlaying) { return false; @@ -744,7 +745,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.5.0'; +var VERSION = '18.6.1'; /** * Tween.js - Licensed under the MIT license @@ -754,40 +755,38 @@ var VERSION = '18.5.0'; * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors. * Thank you all, you're awesome! */ -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); +var nextId = Sequence.nextId; /** * Controlling groups of tweens * * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween + * In these cases, you may want to create your own smaller groups of tweens. */ -var Main = /** @class */ (function (_super) { - __extends(Main, _super); - function Main() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.version = VERSION; - _this.now = NOW$1; - _this.Group = Group; - _this.Easing = Easing; - _this.Interpolation = Interpolation; - _this.nextId = Sequence.nextId; - _this.Tween = Tween; - return _this; - } - return Main; -}(Group)); -var TWEEN = new Main(); +var TWEEN = mainGroup; +// This is the best way to export things in a way that's compatible with both ES +// Modules and CommonJS, without build hacks, and so as not to break the +// existing API. +// https://github.com/rollup/rollup/issues/1961#issuecomment-423037881 +var getAll = TWEEN.getAll.bind(TWEEN); +var removeAll = TWEEN.removeAll.bind(TWEEN); +var add = TWEEN.add.bind(TWEEN); +var remove = TWEEN.remove.bind(TWEEN); +var update = TWEEN.update.bind(TWEEN); +var exports = { + Easing: Easing, + Group: Group, + Interpolation: Interpolation, + now: now$1, + Sequence: Sequence, + nextId: nextId, + Tween: Tween, + VERSION: VERSION, + getAll: getAll, + removeAll: removeAll, + add: add, + remove: remove, + update: update, +}; -export default TWEEN; +export default exports; +export { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, getAll, nextId, now$1 as now, remove, removeAll, update }; diff --git a/dist/tween.umd.js b/dist/tween.umd.js index 7efbae51..cf1b2855 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -1,94 +1,8 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.TWEEN = factory()); -}(this, (function () { 'use strict'; - - var NOW; - // Include a performance.now polyfill. - // In node.js, use process.hrtime. - // eslint-disable-next-line - // @ts-ignore - if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - NOW = function () { - // eslint-disable-next-line - // @ts-ignore - var time = process.hrtime(); - // Convert [seconds, nanoseconds] to milliseconds. - return time[0] * 1000 + time[1] / 1000000; - }; - } - // In a browser, use self.performance.now if it is available. - else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { - // This must be bound, because directly assigning this function - // leads to an invocation exception in Chrome. - NOW = self.performance.now.bind(self.performance); - } - // Use Date.now if it is available. - else if (Date.now !== undefined) { - NOW = Date.now; - } - // Otherwise, use 'new Date().getTime()'. - else { - NOW = function () { - return new Date().getTime(); - }; - } - var NOW$1 = NOW; - - /** - * Controlling groups of tweens - * - * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween - */ - var Group = /** @class */ (function () { - function Group() { - this._tweens = {}; - this._tweensAddedDuringUpdate = {}; - } - Group.prototype.getAll = function () { - var _this = this; - return Object.keys(this._tweens).map(function (tweenId) { - return _this._tweens[tweenId]; - }); - }; - Group.prototype.removeAll = function () { - this._tweens = {}; - }; - Group.prototype.add = function (tween) { - this._tweens[tween.getId()] = tween; - this._tweensAddedDuringUpdate[tween.getId()] = tween; - }; - Group.prototype.remove = function (tween) { - delete this._tweens[tween.getId()]; - delete this._tweensAddedDuringUpdate[tween.getId()]; - }; - Group.prototype.update = function (time, preserve) { - var tweenIds = Object.keys(this._tweens); - if (tweenIds.length === 0) { - return false; - } - time = time !== undefined ? time : NOW$1(); - // Tweens are updated in "batches". If you add a new tween during an - // update, then the new tween will be updated in the next batch. - // If you remove a tween during an update, it may or may not be updated. - // However, if the removed tween was added during the current batch, - // then it will not be updated. - while (tweenIds.length > 0) { - this._tweensAddedDuringUpdate = {}; - for (var i = 0; i < tweenIds.length; i++) { - var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time) === false && !preserve) { - delete this._tweens[tweenIds[i]]; - } - } - tweenIds = Object.keys(this._tweensAddedDuringUpdate); - } - return true; - }; - return Group; - }()); + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.TWEEN = {})); +}(this, (function (exports) { 'use strict'; /** * The Ease class provides a collection of easing functions for use with tween.js. @@ -277,6 +191,92 @@ }, }; + var now; + // Include a performance.now polyfill. + // In node.js, use process.hrtime. + // eslint-disable-next-line + // @ts-ignore + if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { + now = function () { + // eslint-disable-next-line + // @ts-ignore + var time = process.hrtime(); + // Convert [seconds, nanoseconds] to milliseconds. + return time[0] * 1000 + time[1] / 1000000; + }; + } + // In a browser, use self.performance.now if it is available. + else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { + // This must be bound, because directly assigning this function + // leads to an invocation exception in Chrome. + now = self.performance.now.bind(self.performance); + } + // Use Date.now if it is available. + else if (Date.now !== undefined) { + now = Date.now; + } + // Otherwise, use 'new Date().getTime()'. + else { + now = function () { + return new Date().getTime(); + }; + } + var now$1 = now; + + /** + * Controlling groups of tweens + * + * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. + * In these cases, you may want to create your own smaller groups of tween + */ + var Group = /** @class */ (function () { + function Group() { + this._tweens = {}; + this._tweensAddedDuringUpdate = {}; + } + Group.prototype.getAll = function () { + var _this = this; + return Object.keys(this._tweens).map(function (tweenId) { + return _this._tweens[tweenId]; + }); + }; + Group.prototype.removeAll = function () { + this._tweens = {}; + }; + Group.prototype.add = function (tween) { + this._tweens[tween.getId()] = tween; + this._tweensAddedDuringUpdate[tween.getId()] = tween; + }; + Group.prototype.remove = function (tween) { + delete this._tweens[tween.getId()]; + delete this._tweensAddedDuringUpdate[tween.getId()]; + }; + Group.prototype.update = function (time, preserve) { + var tweenIds = Object.keys(this._tweens); + if (tweenIds.length === 0) { + return false; + } + time = time !== undefined ? time : now$1(); + // Tweens are updated in "batches". If you add a new tween during an + // update, then the new tween will be updated in the next batch. + // If you remove a tween during an update, it may or may not be updated. + // However, if the removed tween was added during the current batch, + // then it will not be updated. + while (tweenIds.length > 0) { + this._tweensAddedDuringUpdate = {}; + for (var i = 0; i < tweenIds.length; i++) { + var tween = this._tweens[tweenIds[i]]; + if (tween && tween.update(time) === false && !preserve) { + delete this._tweens[tweenIds[i]]; + } + } + tweenIds = Object.keys(this._tweensAddedDuringUpdate); + } + return true; + }; + return Group; + }()); + /** * */ @@ -370,6 +370,8 @@ return Sequence; }()); + var mainGroup = new Group(); + /** * Tween.js - Licensed under the MIT license * https://github.com/tweenjs/tween.js @@ -380,7 +382,7 @@ */ var Tween = /** @class */ (function () { function Tween(_object, _group) { - if (_group === void 0) { _group = TWEEN; } + if (_group === void 0) { _group = mainGroup; } this._object = _object; this._group = _group; this._isPaused = false; @@ -396,11 +398,11 @@ this._reversed = false; this._delayTime = 0; this._startTime = 0; - this._easingFunction = TWEEN.Easing.Linear.None; - this._interpolationFunction = TWEEN.Interpolation.Linear; + this._easingFunction = Easing.Linear.None; + this._interpolationFunction = Interpolation.Linear; this._chainedTweens = []; this._onStartCallbackFired = false; - this._id = TWEEN.nextId(); + this._id = Sequence.nextId(); this._isChainStopped = false; } Tween.prototype.getId = function () { @@ -413,7 +415,6 @@ return this._isPaused; }; Tween.prototype.to = function (properties, duration) { - // to (properties, duration) { for (var prop in properties) { this._valuesEnd[prop] = properties[prop]; } @@ -447,8 +448,7 @@ this._isPaused = false; this._onStartCallbackFired = false; this._isChainStopped = false; - this._startTime = - time !== undefined ? (typeof time === 'string' ? TWEEN.now() + parseFloat(time) : time) : TWEEN.now(); + this._startTime = time !== undefined ? (typeof time === 'string' ? now$1() + parseFloat(time) : time) : now$1(); this._startTime += this._delayTime; this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat); return this; @@ -537,7 +537,7 @@ return this; } this._isPaused = true; - this._pauseStart = time === undefined ? TWEEN.now() : time; + this._pauseStart = time === undefined ? now$1() : time; // eslint-disable-next-line // @ts-ignore FIXME? this._group.remove(this); @@ -548,7 +548,7 @@ return this; } this._isPaused = false; - this._startTime += (time === undefined ? TWEEN.now() : time) - this._pauseStart; + this._startTime += (time === undefined ? now$1() : time) - this._pauseStart; this._pauseStart = 0; // eslint-disable-next-line // @ts-ignore FIXME? @@ -621,6 +621,7 @@ Tween.prototype.update = function (time) { var property; var elapsed; + time = time !== undefined ? time : now$1(); var endTime = this._startTime + this._duration; if (time > endTime && !this._isPlaying) { return false; @@ -750,7 +751,7 @@ return Tween; }()); - var VERSION = '18.5.0'; + var VERSION = '18.6.1'; /** * Tween.js - Licensed under the MIT license @@ -760,42 +761,54 @@ * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors. * Thank you all, you're awesome! */ - var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); + var nextId = Sequence.nextId; /** * Controlling groups of tweens * * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween + * In these cases, you may want to create your own smaller groups of tweens. */ - var Main = /** @class */ (function (_super) { - __extends(Main, _super); - function Main() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.version = VERSION; - _this.now = NOW$1; - _this.Group = Group; - _this.Easing = Easing; - _this.Interpolation = Interpolation; - _this.nextId = Sequence.nextId; - _this.Tween = Tween; - return _this; - } - return Main; - }(Group)); - var TWEEN = new Main(); + var TWEEN = mainGroup; + // This is the best way to export things in a way that's compatible with both ES + // Modules and CommonJS, without build hacks, and so as not to break the + // existing API. + // https://github.com/rollup/rollup/issues/1961#issuecomment-423037881 + var getAll = TWEEN.getAll.bind(TWEEN); + var removeAll = TWEEN.removeAll.bind(TWEEN); + var add = TWEEN.add.bind(TWEEN); + var remove = TWEEN.remove.bind(TWEEN); + var update = TWEEN.update.bind(TWEEN); + var exports$1 = { + Easing: Easing, + Group: Group, + Interpolation: Interpolation, + now: now$1, + Sequence: Sequence, + nextId: nextId, + Tween: Tween, + VERSION: VERSION, + getAll: getAll, + removeAll: removeAll, + add: add, + remove: remove, + update: update, + }; + + exports.Easing = Easing; + exports.Group = Group; + exports.Interpolation = Interpolation; + exports.Sequence = Sequence; + exports.Tween = Tween; + exports.VERSION = VERSION; + exports.add = add; + exports.default = exports$1; + exports.getAll = getAll; + exports.nextId = nextId; + exports.now = now$1; + exports.remove = remove; + exports.removeAll = removeAll; + exports.update = update; - return TWEEN; + Object.defineProperty(exports, '__esModule', { value: true }); }))); diff --git a/package-lock.json b/package-lock.json index 0ddc94b7..6a6373d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@tweenjs/tween.js", - "version": "18.6.0", + "version": "18.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d9eb3c23..d11b7c46 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", - "version": "18.6.0", + "version": "18.6.1", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", diff --git a/src/Version.ts b/src/Version.ts index 1c665d89..f1ccb127 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '18.6.0' +const VERSION = '18.6.1' export default VERSION From 72d79473f4eb2f97a0f2896d4684ec058d75003e Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Tue, 20 Oct 2020 13:04:08 -0700 Subject: [PATCH 009/107] fix: fix the end method not working --- src/Index.ts | 2 ++ src/Tween.ts | 23 ++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/Index.ts b/src/Index.ts index cd7960c1..0fc403c5 100644 --- a/src/Index.ts +++ b/src/Index.ts @@ -36,6 +36,8 @@ const add = TWEEN.add.bind(TWEEN) const remove = TWEEN.remove.bind(TWEEN) const update = TWEEN.update.bind(TWEEN) +// NOTE! Make sure both lists of exports below are kept in sync: + export {Easing, Group, Interpolation, now, Sequence, nextId, Tween, VERSION, getAll, removeAll, add, remove, update} const exports = { diff --git a/src/Tween.ts b/src/Tween.ts index b84cad00..e81fdb4b 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -212,6 +212,7 @@ export class Tween { } end(): this { + this._goToEnd = true this.update(Infinity) return this } @@ -323,23 +324,27 @@ export class Tween { return this } - update(time?: number): boolean { + private _goToEnd = false + + update(time = now()): boolean { let property let elapsed - time = time !== undefined ? time : now() - const endTime = this._startTime + this._duration - if (time > endTime && !this._isPlaying) { - return false - } + if (!this._goToEnd) { + if (time > endTime && !this._isPlaying) { + return false + } - // If the tween was already finished, - if (!this.isPlaying) { - this.start(time) + // If the tween was already finished, + if (!this._isPlaying) { + this.start(time) + } } + this._goToEnd = false + if (time < this._startTime) { return true } From 03de96b847f0d8ecacb54c4eb09c18baf63e7ead Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Tue, 20 Oct 2020 15:49:52 -0700 Subject: [PATCH 010/107] fix: tween goin backwards in time wasn't working --- src/Group.ts | 2 +- src/Tween.ts | 14 ++++---------- test/unit/tests.js | 3 +++ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/Group.ts b/src/Group.ts index a3b1191a..19028b90 100644 --- a/src/Group.ts +++ b/src/Group.ts @@ -56,7 +56,7 @@ export default class Group { for (let i = 0; i < tweenIds.length; i++) { const tween = this._tweens[tweenIds[i]] - if (tween && tween.update(time) === false && !preserve) { + if (tween && tween.update(time, preserve) === false && !preserve) { delete this._tweens[tweenIds[i]] } } diff --git a/src/Tween.ts b/src/Tween.ts index e81fdb4b..14527433 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -326,21 +326,15 @@ export class Tween { private _goToEnd = false - update(time = now()): boolean { + update(time = now(), preserve = false): boolean { let property let elapsed const endTime = this._startTime + this._duration - if (!this._goToEnd) { - if (time > endTime && !this._isPlaying) { - return false - } - - // If the tween was already finished, - if (!this._isPlaying) { - this.start(time) - } + if (!this._goToEnd && !this._isPlaying) { + if (time > endTime) return false + if (!preserve) this.start(time) } this._goToEnd = false diff --git a/test/unit/tests.js b/test/unit/tests.js index e47adf07..b29dd312 100644 --- a/test/unit/tests.js +++ b/test/unit/tests.js @@ -153,6 +153,9 @@ t1.start(0) t2.start(0) + // To be able to make a tween go backward in time, it must be + // updated with preserve set to true. Otherwise, the + // backward-in-time feature does not apply. TWEEN.update(200, true) TWEEN.update(2500, true) TWEEN.update(500, true) From f0c83a7ec81577b0b1e97d8bf9443d23ec81fbea Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Tue, 20 Oct 2020 15:50:07 -0700 Subject: [PATCH 011/107] TEMP: dist files for testing --- dist/tween.amd.js | 21 ++++++++++++--------- dist/tween.cjs.js | 21 ++++++++++++--------- dist/tween.d.ts | 3 ++- dist/tween.esm.js | 21 ++++++++++++--------- dist/tween.umd.js | 21 ++++++++++++--------- package.json | 1 + 6 files changed, 51 insertions(+), 37 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index a81a0d00..c81d8ecf 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -262,7 +262,7 @@ define(['exports'], function (exports) { 'use strict'; this._tweensAddedDuringUpdate = {}; for (var i = 0; i < tweenIds.length; i++) { var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time) === false && !preserve) { + if (tween && tween.update(time, preserve) === false && !preserve) { delete this._tweens[tweenIds[i]]; } } @@ -400,6 +400,7 @@ define(['exports'], function (exports) { 'use strict'; this._onStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; + this._goToEnd = false; } Tween.prototype.getId = function () { return this._id; @@ -525,6 +526,7 @@ define(['exports'], function (exports) { 'use strict'; return this; }; Tween.prototype.end = function () { + this._goToEnd = true; this.update(Infinity); return this; }; @@ -614,18 +616,19 @@ define(['exports'], function (exports) { 'use strict'; this._onStopCallback = callback; return this; }; - Tween.prototype.update = function (time) { + Tween.prototype.update = function (time, preserve) { + if (time === void 0) { time = now$1(); } + if (preserve === void 0) { preserve = false; } var property; var elapsed; - time = time !== undefined ? time : now$1(); var endTime = this._startTime + this._duration; - if (time > endTime && !this._isPlaying) { - return false; - } - // If the tween was already finished, - if (!this.isPlaying) { - this.start(time); + if (!this._goToEnd && !this._isPlaying) { + if (time > endTime) + return false; + if (!preserve) + this.start(time); } + this._goToEnd = false; if (time < this._startTime) { return true; } diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index 01376263..f72e8dd8 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -264,7 +264,7 @@ var Group = /** @class */ (function () { this._tweensAddedDuringUpdate = {}; for (var i = 0; i < tweenIds.length; i++) { var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time) === false && !preserve) { + if (tween && tween.update(time, preserve) === false && !preserve) { delete this._tweens[tweenIds[i]]; } } @@ -402,6 +402,7 @@ var Tween = /** @class */ (function () { this._onStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; + this._goToEnd = false; } Tween.prototype.getId = function () { return this._id; @@ -527,6 +528,7 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.end = function () { + this._goToEnd = true; this.update(Infinity); return this; }; @@ -616,18 +618,19 @@ var Tween = /** @class */ (function () { this._onStopCallback = callback; return this; }; - Tween.prototype.update = function (time) { + Tween.prototype.update = function (time, preserve) { + if (time === void 0) { time = now$1(); } + if (preserve === void 0) { preserve = false; } var property; var elapsed; - time = time !== undefined ? time : now$1(); var endTime = this._startTime + this._duration; - if (time > endTime && !this._isPlaying) { - return false; - } - // If the tween was already finished, - if (!this.isPlaying) { - this.start(time); + if (!this._goToEnd && !this._isPlaying) { + if (time > endTime) + return false; + if (!preserve) + this.start(time); } + this._goToEnd = false; if (time < this._startTime) { return true; } diff --git a/dist/tween.d.ts b/dist/tween.d.ts index 674ace0b..a4b597d7 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -131,7 +131,8 @@ declare class Tween { onRepeat(callback: (object: T) => void): this; onComplete(callback: (object: T) => void): this; onStop(callback: (object: T) => void): this; - update(time?: number): boolean; + private _goToEnd; + update(time?: number, preserve?: boolean): boolean; private _updateProperties; private _handleRelativeValue; private _swapEndStartRepeatValues; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 276077be..e2252cae 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -260,7 +260,7 @@ var Group = /** @class */ (function () { this._tweensAddedDuringUpdate = {}; for (var i = 0; i < tweenIds.length; i++) { var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time) === false && !preserve) { + if (tween && tween.update(time, preserve) === false && !preserve) { delete this._tweens[tweenIds[i]]; } } @@ -398,6 +398,7 @@ var Tween = /** @class */ (function () { this._onStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; + this._goToEnd = false; } Tween.prototype.getId = function () { return this._id; @@ -523,6 +524,7 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.end = function () { + this._goToEnd = true; this.update(Infinity); return this; }; @@ -612,18 +614,19 @@ var Tween = /** @class */ (function () { this._onStopCallback = callback; return this; }; - Tween.prototype.update = function (time) { + Tween.prototype.update = function (time, preserve) { + if (time === void 0) { time = now$1(); } + if (preserve === void 0) { preserve = false; } var property; var elapsed; - time = time !== undefined ? time : now$1(); var endTime = this._startTime + this._duration; - if (time > endTime && !this._isPlaying) { - return false; - } - // If the tween was already finished, - if (!this.isPlaying) { - this.start(time); + if (!this._goToEnd && !this._isPlaying) { + if (time > endTime) + return false; + if (!preserve) + this.start(time); } + this._goToEnd = false; if (time < this._startTime) { return true; } diff --git a/dist/tween.umd.js b/dist/tween.umd.js index cf1b2855..c64d9cc9 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -266,7 +266,7 @@ this._tweensAddedDuringUpdate = {}; for (var i = 0; i < tweenIds.length; i++) { var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time) === false && !preserve) { + if (tween && tween.update(time, preserve) === false && !preserve) { delete this._tweens[tweenIds[i]]; } } @@ -404,6 +404,7 @@ this._onStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; + this._goToEnd = false; } Tween.prototype.getId = function () { return this._id; @@ -529,6 +530,7 @@ return this; }; Tween.prototype.end = function () { + this._goToEnd = true; this.update(Infinity); return this; }; @@ -618,18 +620,19 @@ this._onStopCallback = callback; return this; }; - Tween.prototype.update = function (time) { + Tween.prototype.update = function (time, preserve) { + if (time === void 0) { time = now$1(); } + if (preserve === void 0) { preserve = false; } var property; var elapsed; - time = time !== undefined ? time : now$1(); var endTime = this._startTime + this._duration; - if (time > endTime && !this._isPlaying) { - return false; - } - // If the tween was already finished, - if (!this.isPlaying) { - this.start(time); + if (!this._goToEnd && !this._isPlaying) { + if (time > endTime) + return false; + if (!preserve) + this.start(time); } + this._goToEnd = false; if (time < this._startTime) { return true; } diff --git a/package.json b/package.json index d11b7c46..317901ea 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "rollup-build": "rollup -c ./rollup.config.js", "tsc": "tsc", "tsc-watch": "tsc --watch", + "examples": "npx serve .", "test": "npm run build && npm run test-unit && npm run test-lint", "test-unit": "nodeunit test/unit/nodeunitheadless.js", "test-lint": "npm run prettier -- --check && eslint 'src/**/*.ts'", From 5e4afc3d4e1e650ce9a94f400effbffff6719bfa Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Tue, 20 Oct 2020 16:29:01 -0700 Subject: [PATCH 012/107] add tests for the last fixes --- test/unit/tests.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test/unit/tests.js b/test/unit/tests.js index b29dd312..1c00fe9f 100644 --- a/test/unit/tests.js +++ b/test/unit/tests.js @@ -514,6 +514,28 @@ test.done() }, + 'Ensure tweens start without calling start() method.': function (test) { + var obj = {x: 0}, + t = new TWEEN.Tween(obj) + + t.to({x: 1000}, 1000) + let started = false + t.onStart(() => (started = true)) + t.onComplete(() => (started = false)) + + t.update(0) + test.deepEqual(started, true) + test.deepEqual(obj.x, 0) + t.update(500) + test.deepEqual(started, true) + test.deepEqual(obj.x, 500) + t.update(1000) + test.deepEqual(obj.x, 1000) + test.deepEqual(started, false) + + test.done() + }, + 'Test TWEEN.Tween.stop()': function (test) { var obj = {}, t = new TWEEN.Tween(obj) @@ -1200,6 +1222,24 @@ test.done() }, + 'Ensure Tween.end() works after stopping a tween.': function (test) { + var object = {x: 0, y: -50, z: 1000} + var target = {x: 50, y: 123, z: '+234'} + + var tween = new TWEEN.Tween(object).to(target, 1000) + + tween.start(300) + tween.update(500) + tween.stop() + tween.end() + + test.equal(object.x, 50) + test.equal(object.y, 123) + test.equal(object.z, 1234) + + test.done() + }, + 'Test delay adds delay before each repeat': function (test) { // If repeatDelay isn't specified then delay is used since // that's the way it worked before repeatDelay was added. From e274d7b5fce1c8c4c6069d3b1f3ab49ba1d25ecd Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Tue, 20 Oct 2020 16:36:04 -0700 Subject: [PATCH 013/107] v18.6.2 --- dist/tween.amd.js | 2 +- dist/tween.cjs.js | 2 +- dist/tween.d.ts | 2 +- dist/tween.esm.js | 2 +- dist/tween.umd.js | 2 +- package-lock.json | 2 +- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index c81d8ecf..b0778f74 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -750,7 +750,7 @@ define(['exports'], function (exports) { 'use strict'; return Tween; }()); - var VERSION = '18.6.1'; + var VERSION = '18.6.2'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index f72e8dd8..a5ebc736 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -752,7 +752,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.6.1'; +var VERSION = '18.6.2'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index a4b597d7..4fa8ca69 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -165,7 +165,7 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "18.6.1"; +declare const VERSION = "18.6.2"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween>[]; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index e2252cae..216bd631 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -748,7 +748,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.6.1'; +var VERSION = '18.6.2'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index c64d9cc9..0e69104f 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -754,7 +754,7 @@ return Tween; }()); - var VERSION = '18.6.1'; + var VERSION = '18.6.2'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index 6a6373d0..db5d62da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@tweenjs/tween.js", - "version": "18.6.1", + "version": "18.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 317901ea..ab570928 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", - "version": "18.6.1", + "version": "18.6.2", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", diff --git a/src/Version.ts b/src/Version.ts index f1ccb127..d2c0a874 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '18.6.1' +const VERSION = '18.6.2' export default VERSION From b7bf53e9aeb6376a1e0df1687360f019bb55021d Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Wed, 21 Oct 2020 14:32:35 -0700 Subject: [PATCH 014/107] fix: some APIs didn't work with tweens having no groups Added corresponding tests. fixes #570 fixes #576 --- examples/01_bars.html | 2 +- src/Group.ts | 7 ++--- src/Tween.ts | 33 ++++++++++---------- test/unit/tests.js | 70 ++++++++++++++++++++++++++++++++++++------- 4 files changed, 82 insertions(+), 30 deletions(-) diff --git a/examples/01_bars.html b/examples/01_bars.html index 7620e50c..b347590c 100644 --- a/examples/01_bars.html +++ b/examples/01_bars.html @@ -58,7 +58,7 @@

01 _ Bars

.easing(TWEEN.Easing.Back.Out) .start() - var tweenBack = new TWEEN.Tween(elem, false) + var tweenBack = new TWEEN.Tween(elem) .to({x: startValue}, 4000) .delay(Math.random() * 1000) .onUpdate(updateCallback) diff --git a/src/Group.ts b/src/Group.ts index 19028b90..21973e19 100644 --- a/src/Group.ts +++ b/src/Group.ts @@ -36,15 +36,13 @@ export default class Group { delete this._tweensAddedDuringUpdate[tween.getId()] } - update(time: number, preserve?: boolean): boolean { + update(time: number = now(), preserve = false): boolean { let tweenIds = Object.keys(this._tweens) if (tweenIds.length === 0) { return false } - time = time !== undefined ? time : now() - // Tweens are updated in "batches". If you add a new tween during an // update, then the new tween will be updated in the next batch. // If you remove a tween during an update, it may or may not be updated. @@ -55,8 +53,9 @@ export default class Group { for (let i = 0; i < tweenIds.length; i++) { const tween = this._tweens[tweenIds[i]] + const autoStart = !preserve - if (tween && tween.update(time, preserve) === false && !preserve) { + if (tween && tween.update(time, autoStart) === false && !preserve) { delete this._tweens[tweenIds[i]] } } diff --git a/src/Tween.ts b/src/Tween.ts index 14527433..27ef2059 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -44,7 +44,7 @@ export class Tween { private _id = Sequence.nextId() private _isChainStopped = false - constructor(private _object: T, private _group: Group = mainGroup) {} + constructor(private _object: T, private _group: Group | false = mainGroup) {} getId(): number { return this._id @@ -81,8 +81,7 @@ export class Tween { } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this) + this._group && this._group.add(this as any) this._repeat = this._initialRepeat @@ -197,8 +196,7 @@ export class Tween { } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this) + this._group && this._group.remove(this as any) this._isPlaying = false @@ -217,36 +215,34 @@ export class Tween { return this } - pause(time: number): this { + pause(time: number = now()): this { if (this._isPaused || !this._isPlaying) { return this } this._isPaused = true - this._pauseStart = time === undefined ? now() : time + this._pauseStart = time // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this) + this._group && this._group.remove(this as any) return this } - resume(time: number): this { + resume(time: number = now()): this { if (!this._isPaused || !this._isPlaying) { return this } this._isPaused = false - this._startTime += (time === undefined ? now() : time) - this._pauseStart + this._startTime += time - this._pauseStart this._pauseStart = 0 // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this) + this._group && this._group.add(this as any) return this } @@ -326,7 +322,14 @@ export class Tween { private _goToEnd = false - update(time = now(), preserve = false): boolean { + /** + * @returns true if the tween is still playing after the update, false + * otherwise (calling update on a paused tween still returns true because + * it is still playing, just paused). + */ + update(time = now(), autoStart = true): boolean { + if (this._isPaused) return true + let property let elapsed @@ -334,7 +337,7 @@ export class Tween { if (!this._goToEnd && !this._isPlaying) { if (time > endTime) return false - if (!preserve) this.start(time) + if (autoStart) this.start(time) } this._goToEnd = false diff --git a/test/unit/tests.js b/test/unit/tests.js index 1c00fe9f..7dc837e8 100644 --- a/test/unit/tests.js +++ b/test/unit/tests.js @@ -1567,6 +1567,32 @@ test.done() }, + 'Ensure tweens work without any group': function (test) { + var obj = {x: 0}, + t = new TWEEN.Tween(obj, false) + + t.to({x: 1000}, 1000) + + t.start(0) + test.equal(obj.x, 0) + t.update(500) + test.equal(obj.x, 500) + t.pause(600) + test.equal(obj.x, 500) + t.update(750) + test.equal(obj.x, 500) + t.resume(800) + test.equal(obj.x, 500) + t.update(1000) + test.equal(obj.x, 800) + t.update(1001) + test.equal(obj.x, 801) + t.stop().end() + test.equal(obj.x, 1000) + + test.done() + }, + 'Stopping a tween within an update callback will not cause an error.': function (test) { TWEEN.removeAll() @@ -1623,48 +1649,72 @@ t.to({x: 1.0}, 1000) TWEEN.removeAll() - test.equal(TWEEN.getAll().length, 0) t.start(0) - test.equal(TWEEN.getAll().length, 1) test.equal(t.isPaused(), false) TWEEN.update(400) - test.equal(obj.x, 0.4) t.pause(450) - test.equal(t.isPaused(), true) test.equal(TWEEN.getAll().length, 0) test.equal(obj.x, 0.4) TWEEN.update(900) - test.equal(obj.x, 0.4) TWEEN.update(3000) - test.equal(obj.x, 0.4) t.resume(3200) - // values do not change until an update test.equal(obj.x, 0.4) - test.equal(TWEEN.getAll().length, 1) test.equal(t.isPaused(), false) TWEEN.update(3500) - test.equal(obj.x, 0.75) TWEEN.update(5000) - test.equal(obj.x, 1.0) + test.done() + }, + 'Test TWEEN.Tween.pause() and TWEEN.Tween.resume(), without groups': function (test) { + var obj = {x: 0.0}, + t = new TWEEN.Tween(obj, false) + + t.to({x: 1.0}, 1000) + + t.start(0) + test.equal(t.isPaused(), false) + + t.update(400) + test.equal(obj.x, 0.4) + + t.pause(450) + test.equal(t.isPaused(), true) + test.equal(obj.x, 0.4) + + t.update(900) + test.equal(obj.x, 0.4) + + t.update(3000) + test.equal(obj.x, 0.4) + + t.resume(3200) + // values do not change until an update + test.equal(obj.x, 0.4) + test.equal(t.isPaused(), false) + + t.update(3500) + test.equal(obj.x, 0.75) + + t.update(5000) + test.equal(obj.x, 1.0) test.done() }, From 91a34c107c84d01a61cc307e986e2e7f6bea9d17 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Wed, 21 Oct 2020 16:51:03 -0700 Subject: [PATCH 015/107] fix: get dynamic to working again (for simple objects), add tests fixes #545 --- examples/07_dynamic_to.html | 2 ++ src/Tween.ts | 8 +++++--- test/unit/tests.js | 39 +++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/examples/07_dynamic_to.html b/examples/07_dynamic_to.html index 26da9f48..dcda6ab0 100644 --- a/examples/07_dynamic_to.html +++ b/examples/07_dynamic_to.html @@ -47,6 +47,7 @@

07 _ dynamic to

new TWEEN.Tween(rabbit) .to({x: width - 50, y: height - 50}, 3000) + .easing(TWEEN.Easing.Exponential.InOut) .onUpdate(function (object) { // draw background context.fillStyle = 'rgb(240,250,240)' @@ -78,6 +79,7 @@

07 _ dynamic to

new TWEEN.Tween(fox) .to(rabbit, 3000) + .easing(TWEEN.Easing.Exponential.InOut) .onUpdate(function (object) { // draw fox context.fillStyle = 'rgb(200,80,80)' diff --git a/src/Tween.ts b/src/Tween.ts index 27ef2059..91e08f08 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -59,9 +59,11 @@ export class Tween { } to(properties: UnknownProps, duration?: number): this { - for (const prop in properties) { - this._valuesEnd[prop] = properties[prop] - } + // TODO? restore this, then update the 07_dynamic_to example to set fox + // tween's to on each update. That way the behavior is opt-in (there's + // currently no opt-out). + // for (const prop in properties) this._valuesEnd[prop] = properties[prop] + this._valuesEnd = Object.create(properties) if (duration !== undefined) { this._duration = duration diff --git a/test/unit/tests.js b/test/unit/tests.js index 7dc837e8..1a5d6ae4 100644 --- a/test/unit/tests.js +++ b/test/unit/tests.js @@ -536,6 +536,45 @@ test.done() }, + 'Test Tween.to() tweening towards a dynamic object': function (test) { + const rabbit = {x: 1000, y: 0} + const tr = new TWEEN.Tween(rabbit) + tr.to({y: 1000}, 1000) + tr.start(0) + + const fox = {x: 0, y: 0} + const tf = new TWEEN.Tween(fox) + tf.to(rabbit) // fox chase rabbit! + tf.start(0) + + tr.update(200) + tf.update(200) + test.equal(rabbit.x, 1000) + test.equal(rabbit.y, 200) + test.equal(fox.x, 200) + test.equal(fox.y, 40) + tr.update(500) + tf.update(500) + test.equal(rabbit.x, 1000) + test.equal(rabbit.y, 500) + test.equal(fox.x, 500) + test.equal(fox.y, 250) + tr.update(800) + tf.update(800) + test.equal(rabbit.x, 1000) + test.equal(rabbit.y, 800) + test.equal(fox.x, 800) + test.equal(fox.y, 640) + tr.update(1000) + tf.update(1000) + test.equal(rabbit.x, 1000) + test.equal(rabbit.y, 1000) + test.equal(fox.x, 1000) + test.equal(fox.y, 1000) + + test.done() + }, + 'Test TWEEN.Tween.stop()': function (test) { var obj = {}, t = new TWEEN.Tween(obj) From 60535f4c19abecf02e6b5437921f8bfc60cf97de Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Wed, 21 Oct 2020 18:17:36 -0700 Subject: [PATCH 016/107] v18.6.3 --- dist/tween.amd.js | 47 ++++++++++++++++++++++++++++------------------- dist/tween.cjs.js | 47 ++++++++++++++++++++++++++++------------------- dist/tween.d.ts | 21 +++++++++++++-------- dist/tween.esm.js | 47 ++++++++++++++++++++++++++++------------------- dist/tween.umd.js | 47 ++++++++++++++++++++++++++++------------------- package-lock.json | 2 +- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 128 insertions(+), 87 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index b0778f74..f171508a 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -248,11 +248,12 @@ define(['exports'], function (exports) { 'use strict'; delete this._tweensAddedDuringUpdate[tween.getId()]; }; Group.prototype.update = function (time, preserve) { + if (time === void 0) { time = now$1(); } + if (preserve === void 0) { preserve = false; } var tweenIds = Object.keys(this._tweens); if (tweenIds.length === 0) { return false; } - time = time !== undefined ? time : now$1(); // Tweens are updated in "batches". If you add a new tween during an // update, then the new tween will be updated in the next batch. // If you remove a tween during an update, it may or may not be updated. @@ -262,7 +263,8 @@ define(['exports'], function (exports) { 'use strict'; this._tweensAddedDuringUpdate = {}; for (var i = 0; i < tweenIds.length; i++) { var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time, preserve) === false && !preserve) { + var autoStart = !preserve; + if (tween && tween.update(time, autoStart) === false && !preserve) { delete this._tweens[tweenIds[i]]; } } @@ -412,9 +414,11 @@ define(['exports'], function (exports) { 'use strict'; return this._isPaused; }; Tween.prototype.to = function (properties, duration) { - for (var prop in properties) { - this._valuesEnd[prop] = properties[prop]; - } + // TODO? restore this, then update the 07_dynamic_to example to set fox + // tween's to on each update. That way the behavior is opt-in (there's + // currently no opt-out). + // for (const prop in properties) this._valuesEnd[prop] = properties[prop] + this._valuesEnd = Object.create(properties); if (duration !== undefined) { this._duration = duration; } @@ -429,8 +433,7 @@ define(['exports'], function (exports) { 'use strict'; return this; } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this); + this._group && this._group.add(this); this._repeat = this._initialRepeat; if (this._reversed) { // If we were reversed (f.e. using the yoyo feature) then we need to @@ -516,8 +519,7 @@ define(['exports'], function (exports) { 'use strict'; return this; } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this); + this._group && this._group.remove(this); this._isPlaying = false; this._isPaused = false; if (this._onStopCallback) { @@ -531,26 +533,26 @@ define(['exports'], function (exports) { 'use strict'; return this; }; Tween.prototype.pause = function (time) { + if (time === void 0) { time = now$1(); } if (this._isPaused || !this._isPlaying) { return this; } this._isPaused = true; - this._pauseStart = time === undefined ? now$1() : time; + this._pauseStart = time; // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this); + this._group && this._group.remove(this); return this; }; Tween.prototype.resume = function (time) { + if (time === void 0) { time = now$1(); } if (!this._isPaused || !this._isPlaying) { return this; } this._isPaused = false; - this._startTime += (time === undefined ? now$1() : time) - this._pauseStart; + this._startTime += time - this._pauseStart; this._pauseStart = 0; // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this); + this._group && this._group.add(this); return this; }; Tween.prototype.stopChainedTweens = function () { @@ -616,16 +618,23 @@ define(['exports'], function (exports) { 'use strict'; this._onStopCallback = callback; return this; }; - Tween.prototype.update = function (time, preserve) { + /** + * @returns true if the tween is still playing after the update, false + * otherwise (calling update on a paused tween still returns true because + * it is still playing, just paused). + */ + Tween.prototype.update = function (time, autoStart) { if (time === void 0) { time = now$1(); } - if (preserve === void 0) { preserve = false; } + if (autoStart === void 0) { autoStart = true; } + if (this._isPaused) + return true; var property; var elapsed; var endTime = this._startTime + this._duration; if (!this._goToEnd && !this._isPlaying) { if (time > endTime) return false; - if (!preserve) + if (autoStart) this.start(time); } this._goToEnd = false; @@ -750,7 +759,7 @@ define(['exports'], function (exports) { 'use strict'; return Tween; }()); - var VERSION = '18.6.2'; + var VERSION = '18.6.3'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index a5ebc736..18bfc8e1 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -250,11 +250,12 @@ var Group = /** @class */ (function () { delete this._tweensAddedDuringUpdate[tween.getId()]; }; Group.prototype.update = function (time, preserve) { + if (time === void 0) { time = now$1(); } + if (preserve === void 0) { preserve = false; } var tweenIds = Object.keys(this._tweens); if (tweenIds.length === 0) { return false; } - time = time !== undefined ? time : now$1(); // Tweens are updated in "batches". If you add a new tween during an // update, then the new tween will be updated in the next batch. // If you remove a tween during an update, it may or may not be updated. @@ -264,7 +265,8 @@ var Group = /** @class */ (function () { this._tweensAddedDuringUpdate = {}; for (var i = 0; i < tweenIds.length; i++) { var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time, preserve) === false && !preserve) { + var autoStart = !preserve; + if (tween && tween.update(time, autoStart) === false && !preserve) { delete this._tweens[tweenIds[i]]; } } @@ -414,9 +416,11 @@ var Tween = /** @class */ (function () { return this._isPaused; }; Tween.prototype.to = function (properties, duration) { - for (var prop in properties) { - this._valuesEnd[prop] = properties[prop]; - } + // TODO? restore this, then update the 07_dynamic_to example to set fox + // tween's to on each update. That way the behavior is opt-in (there's + // currently no opt-out). + // for (const prop in properties) this._valuesEnd[prop] = properties[prop] + this._valuesEnd = Object.create(properties); if (duration !== undefined) { this._duration = duration; } @@ -431,8 +435,7 @@ var Tween = /** @class */ (function () { return this; } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this); + this._group && this._group.add(this); this._repeat = this._initialRepeat; if (this._reversed) { // If we were reversed (f.e. using the yoyo feature) then we need to @@ -518,8 +521,7 @@ var Tween = /** @class */ (function () { return this; } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this); + this._group && this._group.remove(this); this._isPlaying = false; this._isPaused = false; if (this._onStopCallback) { @@ -533,26 +535,26 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.pause = function (time) { + if (time === void 0) { time = now$1(); } if (this._isPaused || !this._isPlaying) { return this; } this._isPaused = true; - this._pauseStart = time === undefined ? now$1() : time; + this._pauseStart = time; // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this); + this._group && this._group.remove(this); return this; }; Tween.prototype.resume = function (time) { + if (time === void 0) { time = now$1(); } if (!this._isPaused || !this._isPlaying) { return this; } this._isPaused = false; - this._startTime += (time === undefined ? now$1() : time) - this._pauseStart; + this._startTime += time - this._pauseStart; this._pauseStart = 0; // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this); + this._group && this._group.add(this); return this; }; Tween.prototype.stopChainedTweens = function () { @@ -618,16 +620,23 @@ var Tween = /** @class */ (function () { this._onStopCallback = callback; return this; }; - Tween.prototype.update = function (time, preserve) { + /** + * @returns true if the tween is still playing after the update, false + * otherwise (calling update on a paused tween still returns true because + * it is still playing, just paused). + */ + Tween.prototype.update = function (time, autoStart) { if (time === void 0) { time = now$1(); } - if (preserve === void 0) { preserve = false; } + if (autoStart === void 0) { autoStart = true; } + if (this._isPaused) + return true; var property; var elapsed; var endTime = this._startTime + this._duration; if (!this._goToEnd && !this._isPlaying) { if (time > endTime) return false; - if (!preserve) + if (autoStart) this.start(time); } this._goToEnd = false; @@ -752,7 +761,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.6.2'; +var VERSION = '18.6.3'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index 4fa8ca69..c602cd44 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -105,7 +105,7 @@ declare class Tween { private _onStopCallback?; private _id; private _isChainStopped; - constructor(_object: T, _group?: Group); + constructor(_object: T, _group?: Group | false); getId(): number; isPlaying(): boolean; isPaused(): boolean; @@ -115,8 +115,8 @@ declare class Tween { private _setupProperties; stop(): this; end(): this; - pause(time: number): this; - resume(time: number): this; + pause(time?: number): this; + resume(time?: number): this; stopChainedTweens(): this; group(group: Group): this; delay(amount: number): this; @@ -132,7 +132,12 @@ declare class Tween { onComplete(callback: (object: T) => void): this; onStop(callback: (object: T) => void): this; private _goToEnd; - update(time?: number, preserve?: boolean): boolean; + /** + * @returns true if the tween is still playing after the update, false + * otherwise (calling update on a paused tween still returns true because + * it is still playing, just paused). + */ + update(time?: number, autoStart?: boolean): boolean; private _updateProperties; private _handleRelativeValue; private _swapEndStartRepeatValues; @@ -152,7 +157,7 @@ declare class Group { removeAll(): void; add(tween: Tween): void; remove(tween: Tween): void; - update(time: number, preserve?: boolean): boolean; + update(time?: number, preserve?: boolean): boolean; } declare let now: () => number; @@ -165,14 +170,14 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "18.6.2"; +declare const VERSION = "18.6.3"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween>[]; declare const removeAll: () => void; declare const add: (tween: Tween>) => void; declare const remove: (tween: Tween>) => void; -declare const update: (time: number, preserve?: boolean | undefined) => boolean; +declare const update: (time?: number, preserve?: boolean) => boolean; declare const exports: { Easing: { Linear: { @@ -250,7 +255,7 @@ declare const exports: { removeAll: () => void; add: (tween: Tween>) => void; remove: (tween: Tween>) => void; - update: (time: number, preserve?: boolean | undefined) => boolean; + update: (time?: number, preserve?: boolean) => boolean; }; export default exports; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 216bd631..7fe9e8ad 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -246,11 +246,12 @@ var Group = /** @class */ (function () { delete this._tweensAddedDuringUpdate[tween.getId()]; }; Group.prototype.update = function (time, preserve) { + if (time === void 0) { time = now$1(); } + if (preserve === void 0) { preserve = false; } var tweenIds = Object.keys(this._tweens); if (tweenIds.length === 0) { return false; } - time = time !== undefined ? time : now$1(); // Tweens are updated in "batches". If you add a new tween during an // update, then the new tween will be updated in the next batch. // If you remove a tween during an update, it may or may not be updated. @@ -260,7 +261,8 @@ var Group = /** @class */ (function () { this._tweensAddedDuringUpdate = {}; for (var i = 0; i < tweenIds.length; i++) { var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time, preserve) === false && !preserve) { + var autoStart = !preserve; + if (tween && tween.update(time, autoStart) === false && !preserve) { delete this._tweens[tweenIds[i]]; } } @@ -410,9 +412,11 @@ var Tween = /** @class */ (function () { return this._isPaused; }; Tween.prototype.to = function (properties, duration) { - for (var prop in properties) { - this._valuesEnd[prop] = properties[prop]; - } + // TODO? restore this, then update the 07_dynamic_to example to set fox + // tween's to on each update. That way the behavior is opt-in (there's + // currently no opt-out). + // for (const prop in properties) this._valuesEnd[prop] = properties[prop] + this._valuesEnd = Object.create(properties); if (duration !== undefined) { this._duration = duration; } @@ -427,8 +431,7 @@ var Tween = /** @class */ (function () { return this; } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this); + this._group && this._group.add(this); this._repeat = this._initialRepeat; if (this._reversed) { // If we were reversed (f.e. using the yoyo feature) then we need to @@ -514,8 +517,7 @@ var Tween = /** @class */ (function () { return this; } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this); + this._group && this._group.remove(this); this._isPlaying = false; this._isPaused = false; if (this._onStopCallback) { @@ -529,26 +531,26 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.pause = function (time) { + if (time === void 0) { time = now$1(); } if (this._isPaused || !this._isPlaying) { return this; } this._isPaused = true; - this._pauseStart = time === undefined ? now$1() : time; + this._pauseStart = time; // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this); + this._group && this._group.remove(this); return this; }; Tween.prototype.resume = function (time) { + if (time === void 0) { time = now$1(); } if (!this._isPaused || !this._isPlaying) { return this; } this._isPaused = false; - this._startTime += (time === undefined ? now$1() : time) - this._pauseStart; + this._startTime += time - this._pauseStart; this._pauseStart = 0; // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this); + this._group && this._group.add(this); return this; }; Tween.prototype.stopChainedTweens = function () { @@ -614,16 +616,23 @@ var Tween = /** @class */ (function () { this._onStopCallback = callback; return this; }; - Tween.prototype.update = function (time, preserve) { + /** + * @returns true if the tween is still playing after the update, false + * otherwise (calling update on a paused tween still returns true because + * it is still playing, just paused). + */ + Tween.prototype.update = function (time, autoStart) { if (time === void 0) { time = now$1(); } - if (preserve === void 0) { preserve = false; } + if (autoStart === void 0) { autoStart = true; } + if (this._isPaused) + return true; var property; var elapsed; var endTime = this._startTime + this._duration; if (!this._goToEnd && !this._isPlaying) { if (time > endTime) return false; - if (!preserve) + if (autoStart) this.start(time); } this._goToEnd = false; @@ -748,7 +757,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.6.2'; +var VERSION = '18.6.3'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index 0e69104f..679eaf47 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -252,11 +252,12 @@ delete this._tweensAddedDuringUpdate[tween.getId()]; }; Group.prototype.update = function (time, preserve) { + if (time === void 0) { time = now$1(); } + if (preserve === void 0) { preserve = false; } var tweenIds = Object.keys(this._tweens); if (tweenIds.length === 0) { return false; } - time = time !== undefined ? time : now$1(); // Tweens are updated in "batches". If you add a new tween during an // update, then the new tween will be updated in the next batch. // If you remove a tween during an update, it may or may not be updated. @@ -266,7 +267,8 @@ this._tweensAddedDuringUpdate = {}; for (var i = 0; i < tweenIds.length; i++) { var tween = this._tweens[tweenIds[i]]; - if (tween && tween.update(time, preserve) === false && !preserve) { + var autoStart = !preserve; + if (tween && tween.update(time, autoStart) === false && !preserve) { delete this._tweens[tweenIds[i]]; } } @@ -416,9 +418,11 @@ return this._isPaused; }; Tween.prototype.to = function (properties, duration) { - for (var prop in properties) { - this._valuesEnd[prop] = properties[prop]; - } + // TODO? restore this, then update the 07_dynamic_to example to set fox + // tween's to on each update. That way the behavior is opt-in (there's + // currently no opt-out). + // for (const prop in properties) this._valuesEnd[prop] = properties[prop] + this._valuesEnd = Object.create(properties); if (duration !== undefined) { this._duration = duration; } @@ -433,8 +437,7 @@ return this; } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this); + this._group && this._group.add(this); this._repeat = this._initialRepeat; if (this._reversed) { // If we were reversed (f.e. using the yoyo feature) then we need to @@ -520,8 +523,7 @@ return this; } // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this); + this._group && this._group.remove(this); this._isPlaying = false; this._isPaused = false; if (this._onStopCallback) { @@ -535,26 +537,26 @@ return this; }; Tween.prototype.pause = function (time) { + if (time === void 0) { time = now$1(); } if (this._isPaused || !this._isPlaying) { return this; } this._isPaused = true; - this._pauseStart = time === undefined ? now$1() : time; + this._pauseStart = time; // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.remove(this); + this._group && this._group.remove(this); return this; }; Tween.prototype.resume = function (time) { + if (time === void 0) { time = now$1(); } if (!this._isPaused || !this._isPlaying) { return this; } this._isPaused = false; - this._startTime += (time === undefined ? now$1() : time) - this._pauseStart; + this._startTime += time - this._pauseStart; this._pauseStart = 0; // eslint-disable-next-line - // @ts-ignore FIXME? - this._group.add(this); + this._group && this._group.add(this); return this; }; Tween.prototype.stopChainedTweens = function () { @@ -620,16 +622,23 @@ this._onStopCallback = callback; return this; }; - Tween.prototype.update = function (time, preserve) { + /** + * @returns true if the tween is still playing after the update, false + * otherwise (calling update on a paused tween still returns true because + * it is still playing, just paused). + */ + Tween.prototype.update = function (time, autoStart) { if (time === void 0) { time = now$1(); } - if (preserve === void 0) { preserve = false; } + if (autoStart === void 0) { autoStart = true; } + if (this._isPaused) + return true; var property; var elapsed; var endTime = this._startTime + this._duration; if (!this._goToEnd && !this._isPlaying) { if (time > endTime) return false; - if (!preserve) + if (autoStart) this.start(time); } this._goToEnd = false; @@ -754,7 +763,7 @@ return Tween; }()); - var VERSION = '18.6.2'; + var VERSION = '18.6.3'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index db5d62da..de298ba6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@tweenjs/tween.js", - "version": "18.6.2", + "version": "18.6.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ab570928..41b493cd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", - "version": "18.6.2", + "version": "18.6.3", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", diff --git a/src/Version.ts b/src/Version.ts index d2c0a874..184b88a8 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '18.6.2' +const VERSION = '18.6.3' export default VERSION From 3449a13dcf8fd6dd7525f325bb3fed405b142140 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Thu, 22 Oct 2020 00:44:19 -0700 Subject: [PATCH 017/107] fix: allow non-string-indexed types to be passed to Tween constructor in TypeScript This doesn't really improve the types in the internal Tween.js' implementation (that still needs work as there's lots of `any` floating around in there), but this at least lifts a restriction on the outside API for end users. fixes #554 --- src/Tween.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Tween.ts b/src/Tween.ts index 91e08f08..ec77aa74 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -21,7 +21,7 @@ export class Tween { private _isPaused = false private _pauseStart = 0 private _valuesStart: UnknownProps = {} - private _valuesEnd: UnknownProps = {} + private _valuesEnd: Record = {} private _valuesStartRepeat: UnknownProps = {} private _duration = 1000 private _initialRepeat = 0 @@ -477,11 +477,10 @@ export class Tween { private _swapEndStartRepeatValues(property: string): void { const tmp = this._valuesStartRepeat[property] + const endValue = this._valuesEnd[property] - if (typeof this._valuesEnd[property] === 'string') { - // eslint-disable-next-line - // @ts-ignore FIXME? - this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]) + if (typeof endValue === 'string') { + this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue) } else { this._valuesStartRepeat[property] = this._valuesEnd[property] } @@ -490,6 +489,7 @@ export class Tween { } } -export type UnknownProps = Record +// eslint-disable-next-line +export type UnknownProps = Record export default Tween From db581b5dfd07ecb1c013aee456ebee8757a6e5c0 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Thu, 22 Oct 2020 00:51:50 -0700 Subject: [PATCH 018/107] chore: improve dev script so output can be meaningfully watched This makes it work well in VS Code (f.e. it will use $ts-watch mode to read errors from stdout and display them in the "PROBLEMS" pane). Plus this tells newcomers how to quickly get things started in dev mode (watch mode) for easy dev cycles. --- package.json | 1 + rollup.config.js | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/package.json b/package.json index 41b493cd..6fc9c0cf 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ ], "dependencies": {}, "scripts": { + "dev": "(npm run tsc-watch -- --preserveWatchOutput & p1=$!; npm run rollup-build -- --watch & p2=$!; wait $p1 $p2)", "build": "rimraf dist .tmp && node scripts/write-version.js && npm run tsc && npm run rollup-build", "rollup-build": "rollup -c ./rollup.config.js", "tsc": "tsc", diff --git a/rollup.config.js b/rollup.config.js index 8641d95a..f25911b0 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -5,28 +5,34 @@ export default [ input: '.tmp/Index.js', // https://github.com/rollup/rollup/wiki/Troubleshooting#this-is-undefined context: 'this', + watch: {clearScreen: false}, output: [ { file: 'dist/tween.umd.js', name: 'TWEEN', format: 'umd', + exports: 'named', }, { file: 'dist/tween.amd.js', format: 'amd', + exports: 'named', }, { file: 'dist/tween.cjs.js', format: 'cjs', + exports: 'named', }, { file: 'dist/tween.esm.js', format: 'es', + exports: 'named', }, ], }, { input: './.tmp/Index.d.ts', + watch: {clearScreen: false}, output: [{file: 'dist/tween.d.ts', format: 'es'}], plugins: [dts()], }, From 78867502c15012941de56afeb3c118c26228eb58 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Thu, 22 Oct 2020 00:52:24 -0700 Subject: [PATCH 019/107] chore: improve the release scripts so they don't fail to push on new release branches --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6fc9c0cf..07627ad1 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,10 @@ "prettier": "prettier './**/*.{js,ts,md,json,html,css}'", "prepare": "npm run build", "version": "npm test && git add .", - "release:patch": "npm version patch --message 'v%s' && npm publish && git push --follow-tags", - "release:minor": "npm version minor --message 'v%s' && npm publish && git push --follow-tags", - "release:major": "npm version major --message 'v%s' && npm publish && git push --follow-tags" + "release:patch": "npm version patch --message 'v%s' && npm publish && npm run _release:push-branch", + "release:minor": "npm version minor --message 'v%s' && npm publish && npm run _release:push-branch", + "release:major": "npm version major --message 'v%s' && npm publish && npm run _release:push-branch", + "_release:push-branch": "git push --follow-tags --set-upstream origin `git rev-parse --abbrev-ref HEAD`" }, "author": "tween.js contributors (https://github.com/tweenjs/tween.js/graphs/contributors)", "devDependencies": { From 352da177a54cd0a540a4b4480b679be09665c941 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Thu, 22 Oct 2020 00:54:11 -0700 Subject: [PATCH 020/107] v18.6.4 --- dist/tween.amd.js | 9 ++++----- dist/tween.cjs.js | 9 ++++----- dist/tween.d.ts | 16 ++++++++-------- dist/tween.esm.js | 9 ++++----- dist/tween.umd.js | 9 ++++----- package-lock.json | 2 +- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 27 insertions(+), 31 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index f171508a..256dd33a 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -746,10 +746,9 @@ define(['exports'], function (exports) { 'use strict'; }; Tween.prototype._swapEndStartRepeatValues = function (property) { var tmp = this._valuesStartRepeat[property]; - if (typeof this._valuesEnd[property] === 'string') { - // eslint-disable-next-line - // @ts-ignore FIXME? - this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]); + var endValue = this._valuesEnd[property]; + if (typeof endValue === 'string') { + this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue); } else { this._valuesStartRepeat[property] = this._valuesEnd[property]; @@ -759,7 +758,7 @@ define(['exports'], function (exports) { 'use strict'; return Tween; }()); - var VERSION = '18.6.3'; + var VERSION = '18.6.4'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index 18bfc8e1..6b4d73d1 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -748,10 +748,9 @@ var Tween = /** @class */ (function () { }; Tween.prototype._swapEndStartRepeatValues = function (property) { var tmp = this._valuesStartRepeat[property]; - if (typeof this._valuesEnd[property] === 'string') { - // eslint-disable-next-line - // @ts-ignore FIXME? - this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]); + var endValue = this._valuesEnd[property]; + if (typeof endValue === 'string') { + this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue); } else { this._valuesStartRepeat[property] = this._valuesEnd[property]; @@ -761,7 +760,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.6.3'; +var VERSION = '18.6.4'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index c602cd44..ea216027 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -142,7 +142,7 @@ declare class Tween { private _handleRelativeValue; private _swapEndStartRepeatValues; } -declare type UnknownProps = Record; +declare type UnknownProps = Record; /** * Controlling groups of tweens @@ -170,13 +170,13 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "18.6.3"; +declare const VERSION = "18.6.4"; declare const nextId: typeof Sequence.nextId; -declare const getAll: () => Tween>[]; +declare const getAll: () => Tween>[]; declare const removeAll: () => void; -declare const add: (tween: Tween>) => void; -declare const remove: (tween: Tween>) => void; +declare const add: (tween: Tween>) => void; +declare const remove: (tween: Tween>) => void; declare const update: (time?: number, preserve?: boolean) => boolean; declare const exports: { Easing: { @@ -251,10 +251,10 @@ declare const exports: { nextId: typeof Sequence.nextId; Tween: typeof Tween; VERSION: string; - getAll: () => Tween>[]; + getAll: () => Tween>[]; removeAll: () => void; - add: (tween: Tween>) => void; - remove: (tween: Tween>) => void; + add: (tween: Tween>) => void; + remove: (tween: Tween>) => void; update: (time?: number, preserve?: boolean) => boolean; }; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 7fe9e8ad..610a1cdb 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -744,10 +744,9 @@ var Tween = /** @class */ (function () { }; Tween.prototype._swapEndStartRepeatValues = function (property) { var tmp = this._valuesStartRepeat[property]; - if (typeof this._valuesEnd[property] === 'string') { - // eslint-disable-next-line - // @ts-ignore FIXME? - this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]); + var endValue = this._valuesEnd[property]; + if (typeof endValue === 'string') { + this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue); } else { this._valuesStartRepeat[property] = this._valuesEnd[property]; @@ -757,7 +756,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.6.3'; +var VERSION = '18.6.4'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index 679eaf47..0d2f36eb 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -750,10 +750,9 @@ }; Tween.prototype._swapEndStartRepeatValues = function (property) { var tmp = this._valuesStartRepeat[property]; - if (typeof this._valuesEnd[property] === 'string') { - // eslint-disable-next-line - // @ts-ignore FIXME? - this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]); + var endValue = this._valuesEnd[property]; + if (typeof endValue === 'string') { + this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue); } else { this._valuesStartRepeat[property] = this._valuesEnd[property]; @@ -763,7 +762,7 @@ return Tween; }()); - var VERSION = '18.6.3'; + var VERSION = '18.6.4'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index de298ba6..ea959c9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@tweenjs/tween.js", - "version": "18.6.3", + "version": "18.6.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 07627ad1..a2359c08 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", - "version": "18.6.3", + "version": "18.6.4", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", diff --git a/src/Version.ts b/src/Version.ts index 184b88a8..09758d00 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '18.6.3' +const VERSION = '18.6.4' export default VERSION From 5767ff82b81a44ea65a24637d497367bc0bad37d Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Fri, 23 Oct 2020 16:11:23 -0700 Subject: [PATCH 021/107] chore: convert test code to TypeScript This is good for checking our own type definitions make sense. Some types were updated based on their usage in the tests. --- README.md | 6 +- package.json | 2 +- rollup.config.js | 6 + src/Tween.ts | 32 +- src/tests.ts | 1928 ++++++++++++++++++++++++++++++++ test/unit/nodeunitheadless.js | 8 +- test/unit/tests.js | 1935 --------------------------------- 7 files changed, 1956 insertions(+), 1961 deletions(-) create mode 100644 src/tests.ts delete mode 100644 test/unit/tests.js diff --git a/README.md b/README.md index f36ad1ef..9307b9c6 100644 --- a/README.md +++ b/README.md @@ -239,15 +239,13 @@ You need to install `npm` first--this comes with node.js, so install that one fi npm install ``` -if running the tests for the first time, to install additional dependencies for running tests, and then run +To run the tests run: ```bash npm test ``` -every time you want to run the tests. - -If you want to add any feature or change existing features, you _must_ run the tests to make sure you didn't break anything else. If you send a pull request (PR) to add something new and it doesn't have tests, or the tests don't pass, the PR won't be accepted. See [contributing](CONTRIBUTING.md) for more information. +If you want to add any feature or change existing features, you _must_ run the tests to make sure you didn't break anything else. Any pull request (PR) needs to have updated passing tests for feature changes (or new passing tests for new features), otherwise the PR won't be accepted. See [contributing](CONTRIBUTING.md) for more information. ## People diff --git a/package.json b/package.json index a2359c08..335b80ca 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "tsc": "tsc", "tsc-watch": "tsc --watch", "examples": "npx serve .", - "test": "npm run build && npm run test-unit && npm run test-lint", + "test": "npm run build && npm run test-lint && npm run test-unit", "test-unit": "nodeunit test/unit/nodeunitheadless.js", "test-lint": "npm run prettier -- --check && eslint 'src/**/*.ts'", "lint": "npm run prettier -- --write && eslint 'src/**/*.ts' --fix", diff --git a/rollup.config.js b/rollup.config.js index f25911b0..045c6332 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -30,6 +30,12 @@ export default [ }, ], }, + { + input: '.tmp/tests.js', + context: 'this', + watch: {clearScreen: false}, + output: [{file: '.tmp/tests.cjs.js', format: 'cjs', exports: 'named'}], + }, { input: './.tmp/Index.d.ts', watch: {clearScreen: false}, diff --git a/src/Tween.ts b/src/Tween.ts index ec77aa74..a7e85763 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -34,7 +34,8 @@ export class Tween { private _startTime = 0 private _easingFunction: EasingFunction = Easing.Linear.None private _interpolationFunction: InterpolationFunction = Interpolation.Linear - private _chainedTweens: Array> = [] + // eslint-disable-next-line + private _chainedTweens: Array> = [] private _onStartCallback?: (object: T) => void private _onStartCallbackFired = false private _onUpdateCallback?: (object: T, elapsed: number) => void @@ -72,7 +73,7 @@ export class Tween { return this } - duration(d: number): this { + duration(d = 1000): this { this._duration = d return this } @@ -256,68 +257,69 @@ export class Tween { return this } - group(group: Group): this { + group(group = mainGroup): this { this._group = group return this } - delay(amount: number): this { + delay(amount = 0): this { this._delayTime = amount return this } - repeat(times: number): this { + repeat(times = 0): this { this._initialRepeat = times this._repeat = times return this } - repeatDelay(amount: number): this { + repeatDelay(amount?: number): this { this._repeatDelayTime = amount return this } - yoyo(yoyo: boolean): this { + yoyo(yoyo = false): this { this._yoyo = yoyo return this } - easing(easingFunction: EasingFunction): this { + easing(easingFunction: EasingFunction = Easing.Linear.None): this { this._easingFunction = easingFunction return this } - interpolation(interpolationFunction: InterpolationFunction): this { + interpolation(interpolationFunction: InterpolationFunction = Interpolation.Linear): this { this._interpolationFunction = interpolationFunction return this } - chain(...tweens: Array>): this { + // eslint-disable-next-line + chain(...tweens: Array>): this { this._chainedTweens = tweens return this } - onStart(callback: (object: T) => void): this { + onStart(callback?: (object: T) => void): this { this._onStartCallback = callback return this } - onUpdate(callback: (object: T, elapsed: number) => void): this { + onUpdate(callback?: (object: T, elapsed: number) => void): this { this._onUpdateCallback = callback return this } - onRepeat(callback: (object: T) => void): this { + onRepeat(callback?: (object: T) => void): this { this._onRepeatCallback = callback return this } - onComplete(callback: (object: T) => void): this { + onComplete(callback?: (object: T) => void): this { this._onCompleteCallback = callback return this } - onStop(callback: (object: T) => void): this { + onStop(callback?: (object: T) => void): this { this._onStopCallback = callback return this } diff --git a/src/tests.ts b/src/tests.ts new file mode 100644 index 00000000..d0d94c28 --- /dev/null +++ b/src/tests.ts @@ -0,0 +1,1928 @@ +import * as TWEEN from './Index' + +export const tests = { + hello(test: Test): void { + test.ok(TWEEN !== null) + test.done() + }, + + // TWEEN tests + 'TWEEN.getAll'(test: Test): void { + test.ok(TWEEN.getAll() instanceof Array) + test.done() + }, + + 'TWEEN object stores tweens automatically on start'(test: Test): void { + const numTweensBefore = TWEEN.getAll().length, + t = new TWEEN.Tween({}) + + t.start() + + const numTweensAfter = TWEEN.getAll().length + + test.equal(numTweensBefore + 1, numTweensAfter) + test.done() + }, + + 'TWEEN.removeAll()'(test: Test): void { + const t = new TWEEN.Tween({}) + + TWEEN.removeAll() + + test.equal(TWEEN.getAll().length, 0, 'No tweens left') + + t.start() + + test.equal(TWEEN.getAll().length, 1, 'A tween has been added') + + TWEEN.removeAll() + + test.equal(TWEEN.getAll().length, 0, 'No tweens left') + test.done() + }, + + 'TWEEN.add()'(test: Test): void { + const all = TWEEN.getAll(), + numTweens = all.length, + t = new TWEEN.Tween({}) + + TWEEN.add(t) + + test.equal(numTweens + 1, TWEEN.getAll().length) + + test.done() + }, + + 'TWEEN.remove()'(test: Test): void { + const all = TWEEN.getAll(), + numTweens = all.length, + t = new TWEEN.Tween({}) + + TWEEN.add(t) + + test.ok(TWEEN.getAll().indexOf(t) != -1) + + TWEEN.remove(t) + + test.equal(numTweens, TWEEN.getAll().length) + test.equal(TWEEN.getAll().indexOf(t), -1) + test.done() + }, + + 'TWEEN.update() returns false when done (no tweens to animate)'(test: Test): void { + TWEEN.removeAll() + + test.deepEqual(TWEEN.update(), false) + test.done() + }, + + 'TWEEN.update() returns true when there are active tweens'(test: Test): void { + TWEEN.removeAll() + + const t = new TWEEN.Tween({}) + t.start() + + test.deepEqual(TWEEN.update(), true) + test.done() + }, + + 'TWEEN.update() removes tweens when they are finished'(test: Test): void { + TWEEN.removeAll() + + const t1 = new TWEEN.Tween({}).to({}, 1000), + t2 = new TWEEN.Tween({}).to({}, 2000) + + test.equal(TWEEN.getAll().length, 0) + + t1.start(0) + t2.start(0) + + test.equal(TWEEN.getAll().length, 2) + + TWEEN.update(0) + test.equal(TWEEN.getAll().length, 2) + + TWEEN.update(999) + test.equal(TWEEN.getAll().length, 2) + + TWEEN.update(1000) + test.equal(TWEEN.getAll().length, 1) + test.equal(TWEEN.getAll().indexOf(t1), -1) + test.ok(TWEEN.getAll().indexOf(t2) != -1) + test.done() + }, + 'TWEEN.update() does not remove tweens when they are finished with preserve flag'(test: Test): void { + TWEEN.removeAll() + + const t1 = new TWEEN.Tween({}).to({}, 1000), + t2 = new TWEEN.Tween({}).to({}, 2000) + + test.equal(TWEEN.getAll().length, 0) + + t1.start(0) + t2.start(0) + + test.equal(TWEEN.getAll().length, 2) + + TWEEN.update(0, true) + test.equal(TWEEN.getAll().length, 2) + + TWEEN.update(999, true) + test.equal(TWEEN.getAll().length, 2) + + TWEEN.update(1000, true) + test.equal(TWEEN.getAll().length, 2) + + TWEEN.update(1001, true) + test.equal(TWEEN.getAll().length, 2) + test.ok(TWEEN.getAll().indexOf(t1) != -1) + test.ok(TWEEN.getAll().indexOf(t2) != -1) + test.done() + }, + + 'Unremoved tweens which have been updated past their finish time may go backward in time'(test: Test): void { + TWEEN.removeAll() + + const target1 = {a: 0} + const target2 = {b: 0} + + const t1 = new TWEEN.Tween(target1).to({a: 1}, 1000), + t2 = new TWEEN.Tween(target2).to({b: 1}, 2000) + + t1.start(0) + t2.start(0) + + // To be able to make a tween go backward in time, it must be + // updated with preserve set to true. Otherwise, the + // backward-in-time feature does not apply. + TWEEN.update(200, true) + TWEEN.update(2500, true) + TWEEN.update(500, true) + + test.equal(TWEEN.getAll().length, 2) + test.equal(target1.a, 0.5) + test.equal(target2.b, 0.25) + + test.done() + }, + + // TWEEN.Tween tests + + constructor(test: Test): void { + const t = new TWEEN.Tween({}) + + test.ok(t instanceof TWEEN.Tween, 'Pass') + test.done() + }, + + 'Return the same tween instance for method chaining'(test: Test): void { + const t = new TWEEN.Tween({}) + + test.ok(t.to({}, 0) instanceof TWEEN.Tween) + test.equal(t.to({}, 0), t) + + test.ok(t.start() instanceof TWEEN.Tween) + test.equal(t.start(), t) + + test.ok(t.stop() instanceof TWEEN.Tween) + test.equal(t.stop(), t) + + test.ok(t.delay() instanceof TWEEN.Tween) + test.equal(t.delay(), t) + + test.ok(t.easing() instanceof TWEEN.Tween) + test.equal(t.easing(), t) + + test.ok(t.interpolation() instanceof TWEEN.Tween) + test.equal(t.interpolation(), t) + + test.ok(t.chain() instanceof TWEEN.Tween) + test.equal(t.chain(), t) + + test.ok(t.onStart() instanceof TWEEN.Tween) + test.equal(t.onStart(), t) + + test.ok(t.onStop() instanceof TWEEN.Tween) + test.equal(t.onStop(), t) + + test.ok(t.onUpdate() instanceof TWEEN.Tween) + test.equal(t.onUpdate(), t) + + test.ok(t.onComplete() instanceof TWEEN.Tween) + test.equal(t.onComplete(), t) + + test.ok(t.duration() instanceof TWEEN.Tween) + test.equal(t.duration(), t) + + test.ok(t.group() instanceof TWEEN.Tween) + test.equal(t.group(), t) + + test.done() + }, + + 'Tween existing property'(test: Test): void { + const obj = {x: 1}, + t = new TWEEN.Tween(obj) + + t.to({x: 2}, 1000) + t.start(0) + t.update(1000) + + test.deepEqual(obj.x, 2) + test.done() + }, + + 'Tween non-existing property'(test: Test): void { + const obj = {x: 1}, + t = new TWEEN.Tween(obj) + + t.to({y: 0}, 1000) + t.start(0) + t.update(1000) + + test.deepEqual(obj.x, 1) + // eslint-disable-next-line + // @ts-ignore + test.equal(obj.y, undefined) + test.done() + }, + + 'Tween non-null property'(test: Test): void { + const obj = {x: 1}, + t = new TWEEN.Tween(obj) + + t.to({x: 2}, 1000) + t.start(0) + t.update(1000) + + test.deepEqual(obj.x, 2) + test.ok(obj.x !== null) + test.done() + }, + + 'Tween function property'(test: Test): void { + const my_function = new Function() + + const obj = {x: my_function}, + t = new TWEEN.Tween(obj) + + t.to({x: my_function}) + t.start(0) + t.update(1000) + + test.ok(obj.x === my_function) + test.done() + }, + + 'Tween boolean property'(test: Test): void { + const obj = {x: true}, + t = new TWEEN.Tween(obj) + + t.to({x: new Function()}) + t.start(0) + t.update(1000) + + test.ok(typeof obj.x === 'boolean') + test.ok(obj.x === true) + test.done() + }, + + 'Tween null property'(test: Test): void { + const obj = {x: null}, + t = new TWEEN.Tween(obj) + + t.to({x: 2}, 1000) + t.start(0) + t.update(1000) + + test.deepEqual(obj.x, 2) + test.done() + }, + + 'Tween undefined property'(test: Test): void { + const obj = {}, + t = new TWEEN.Tween(obj) + + t.to({x: 2}, 1000) + t.start(0) + t.update(1000) + + // eslint-disable-next-line + // @ts-ignore + test.equal(obj.x, undefined) + test.done() + }, + + 'Tween relative positive value'(test: Test): void { + const obj = {x: 0}, + t = new TWEEN.Tween(obj) + + t.to({x: '+100'}, 1000) + t.start(0) + t.update(1000) + + test.equal(obj.x, 100) + test.done() + }, + + 'Tween relative negative value'(test: Test): void { + const obj = {x: 0}, + t = new TWEEN.Tween(obj) + + t.to({x: '-100'}, 1000) + t.start(0) + t.update(1000) + + test.equal(obj.x, -100) + test.done() + }, + + 'String values without a + or - sign should not be interpreted as relative'(test: Test): void { + const obj = {x: 100}, + t = new TWEEN.Tween(obj) + + t.to({x: '100'}, 1000) + t.start(0) + t.update(1000) + + test.equal(obj.x, 100) + test.done() + }, + + 'Tween relative positive value, with yoyo'(test: Test): void { + const obj = {x: 0}, + t = new TWEEN.Tween(obj) + + t.to({x: '+100'}, 1000) + t.repeat(1) + t.yoyo(true) + t.start(0) + + t.update(500) + test.equal(obj.x, 50) + t.update(1000) + test.equal(obj.x, 100) + t.update(1500) + test.equal(obj.x, 50) + t.update(2000) + test.equal(obj.x, 0) + + test.done() + }, + + 'Tween relative negative value, with yoyo'(test: Test): void { + const obj = {x: 0}, + t = new TWEEN.Tween(obj) + + t.to({x: '-100'}, 1000) + t.repeat(1) + t.yoyo(true) + t.start(0) + + t.update(500) + test.equal(obj.x, -50) + t.update(1000) + test.equal(obj.x, -100) + t.update(1500) + test.equal(obj.x, -50) + t.update(2000) + test.equal(obj.x, -0) + + test.done() + }, + + 'Tween relative positive array interpolation values'(test: Test): void { + const obj = {x: 0}, + t = new TWEEN.Tween(obj) + + t.to({x: ['+100', '+0', '-100', '+0']}, 2000) + t.start(0) + + t.update(250) + test.equal(obj.x, 50) + t.update(500) + test.equal(obj.x, 100) + t.update(750) + test.equal(obj.x, 50) + t.update(1000) + test.equal(obj.x, 0) + t.update(1250) + test.equal(obj.x, -50) + t.update(1500) + test.equal(obj.x, -100) + t.update(1750) + test.equal(obj.x, -50) + t.update(2000) + test.equal(obj.x, 0) + + test.done() + }, + + 'String values without a + or - sign should not be interpreted as relative with array interpolation values'( + test: Test, + ): void { + const obj = {x: 0}, + t = new TWEEN.Tween(obj) + + t.to({x: ['100', '0', '100', '0']}, 2000) + t.start(0) + + t.update(250) + test.equal(obj.x, 50) + t.update(500) + test.equal(obj.x, 100) + t.update(750) + test.equal(obj.x, 50) + t.update(1000) + test.equal(obj.x, 0) + t.update(1250) + test.equal(obj.x, 50) + t.update(1500) + test.equal(obj.x, 100) + t.update(1750) + test.equal(obj.x, 50) + t.update(2000) + test.equal(obj.x, 0) + + test.done() + }, + + 'animate values in an array'(test: Test): void { + const obj = [0, 0, 0], + t = new TWEEN.Tween(obj) + + t.to([1000, '-2000', '+2000'], 1000) + t.start(0) + + t.update(250) + test.equal(obj[0], 250) + test.equal(obj[1], -500) + test.equal(obj[2], 500) + t.update(500) + test.equal(obj[0], 500) + test.equal(obj[1], -1000) + test.equal(obj[2], 1000) + t.update(750) + test.equal(obj[0], 750) + test.equal(obj[1], -1500) + test.equal(obj[2], 1500) + t.update(1000) + test.equal(obj[0], 1000) + test.equal(obj[1], -2000) + test.equal(obj[2], 2000) + + test.done() + }, + + 'animate values in a nested array'(test: Test): void { + const obj = {a: [0, 0, 0]}, + t = new TWEEN.Tween(obj) + + t.to({a: [1000, '-2000', '+2000']}, 1000) + t.start(0) + + t.update(250) + test.equal(obj.a[0], 250) + test.equal(obj.a[1], -500) + test.equal(obj.a[2], 500) + t.update(500) + test.equal(obj.a[0], 500) + test.equal(obj.a[1], -1000) + test.equal(obj.a[2], 1000) + t.update(750) + test.equal(obj.a[0], 750) + test.equal(obj.a[1], -1500) + test.equal(obj.a[2], 1500) + t.update(1000) + test.equal(obj.a[0], 1000) + test.equal(obj.a[1], -2000) + test.equal(obj.a[2], 2000) + + test.done() + }, + + 'Test TWEEN.Tween.start()'(test: Test): void { + const obj = {}, + t = new TWEEN.Tween(obj) + + t.to({}, 1000) + + TWEEN.removeAll() + test.equal(TWEEN.getAll().length, 0) // TODO move to TWEEN test + + t.start(0) + + test.equal(TWEEN.getAll().length, 1) // TODO ditto + test.equal(TWEEN.getAll()[0], t) + test.done() + }, + + 'Ensure tweens start without calling start() method.'(test: Test): void { + const obj = {x: 0}, + t = new TWEEN.Tween(obj) + + t.to({x: 1000}, 1000) + let started = false + t.onStart(() => (started = true)) + t.onComplete(() => (started = false)) + + t.update(0) + test.deepEqual(started, true) + test.deepEqual(obj.x, 0) + t.update(500) + test.deepEqual(started, true) + test.deepEqual(obj.x, 500) + t.update(1000) + test.deepEqual(obj.x, 1000) + test.deepEqual(started, false) + + test.done() + }, + + 'Test Tween.to() tweening towards a dynamic object'(test: Test): void { + const rabbit = {x: 1000, y: 0} + const tr = new TWEEN.Tween(rabbit) + tr.to({y: 1000}, 1000) + tr.start(0) + + const fox = {x: 0, y: 0} + const tf = new TWEEN.Tween(fox) + tf.to(rabbit, 1000) // fox chase rabbit! + tf.start(0) + + tr.update(200) + tf.update(200) + test.equal(rabbit.x, 1000) + test.equal(rabbit.y, 200) + test.equal(fox.x, 200) + test.equal(fox.y, 40) + tr.update(500) + tf.update(500) + test.equal(rabbit.x, 1000) + test.equal(rabbit.y, 500) + test.equal(fox.x, 500) + test.equal(fox.y, 250) + tr.update(800) + tf.update(800) + test.equal(rabbit.x, 1000) + test.equal(rabbit.y, 800) + test.equal(fox.x, 800) + test.equal(fox.y, 640) + tr.update(1000) + tf.update(1000) + test.equal(rabbit.x, 1000) + test.equal(rabbit.y, 1000) + test.equal(fox.x, 1000) + test.equal(fox.y, 1000) + + test.done() + }, + + 'Test TWEEN.Tween.stop()'(test: Test): void { + const obj = {}, + t = new TWEEN.Tween(obj) + + t.to({x: 2}, 1000) + + TWEEN.removeAll() + + t.start() + t.stop() + + test.equal(TWEEN.getAll().length, 0) + test.done() + }, + + 'Test TWEEN.Tween.delay()'(test: Test): void { + const obj = {x: 1}, + t = new TWEEN.Tween(obj) + + t.to({x: 2}, 1000) + t.delay(500) + t.start(0) + + t.update(100) + + test.deepEqual(obj.x, 1, "Tween hasn't started yet") + + t.update(1000) + + test.ok(obj.x !== 1 && obj.x !== 2, "Tween has started but hasn't finished yet") + + t.update(1500) + + test.equal(obj.x, 2, 'Tween finishes when expected') + test.done() + }, + + // TODO: not really sure how to test this. Advice appreciated! + 'Test TWEEN.Tween.easing()'(test: Test): void { + const obj = {x: 0}, + t = new TWEEN.Tween(obj) + + t.to({x: 1}, 1000) + + t.easing(TWEEN.Easing.Quadratic.In) + t.start(0) + t.update(500) + test.equal(obj.x, TWEEN.Easing.Quadratic.In(0.5)) + test.done() + }, + + // TODO test interpolation() + + 'Test TWEEN.Tween.chain --with one tween'(test: Test): void { + const t = new TWEEN.Tween({}), + t2 = new TWEEN.Tween({}) + let tStarted = false, + tCompleted = false, + t2Started = false + + TWEEN.removeAll() + + t.to({}, 1000) + t2.to({}, 1000) + + t.chain(t2) + + t.onStart(function (): void { + tStarted = true + }) + + t.onComplete(function (): void { + tCompleted = true + }) + + t2.onStart(function (): void { + test.equal(tStarted, true) + test.equal(tCompleted, true) + test.equal(t2Started, false) + t2Started = true + }) + + test.equal(tStarted, false) + test.equal(t2Started, false) + + t.start(0) + TWEEN.update(0) + + test.equal(tStarted, true) + test.equal(t2Started, false) + + TWEEN.update(1000) + + test.equal(tCompleted, true) + + TWEEN.update(1001) + + test.equal(t2Started, true, 't2 is automatically started by t') + test.done() + }, + + 'Test TWEEN.Tween.chain --with several tweens in an array'(test: Test): void { + const t = new TWEEN.Tween({}), + chainedTweens = [], + numChained = 3 + let numChainedStarted = 0 + + TWEEN.removeAll() + + t.to({}, 1000) + + function onChainedStart(): void { + numChainedStarted++ + } + + for (let i = 0; i < numChained; i++) { + const chained = new TWEEN.Tween({}) + chained.to({}, 1000) + + chainedTweens.push(chained) + + chained.onStart(onChainedStart) + } + + t.chain(...chainedTweens) + + test.equal(numChainedStarted, 0) + + t.start(0) + TWEEN.update(0) + TWEEN.update(1000) + TWEEN.update(1001) + + test.equal(numChainedStarted, numChained, 'All chained tweens have been started') + test.done() + }, + + 'Test TWEEN.Tween.chain allows endless loops'(test: Test): void { + const obj = {x: 0}, + t1 = new TWEEN.Tween(obj).to({x: 100}, 1000), + t2 = new TWEEN.Tween(obj).to({x: 0}, 1000) + + TWEEN.removeAll() + + t1.chain(t2) + t2.chain(t1) + + test.equal(obj.x, 0) + + // x == 0 + t1.start(0) + TWEEN.update(0) + + test.equal(obj.x, 0) + + TWEEN.update(500) + test.equal(obj.x, 50) + + // there... (x == 100) + + TWEEN.update(1000) + test.equal(obj.x, 100) + + TWEEN.update(1500) + test.equal(obj.x, 50) + + // ... and back again (x == 0) + + TWEEN.update(2000) + test.equal(obj.x, 0) + + TWEEN.update(2500) + test.equal(obj.x, 50) + + TWEEN.update(3000) + test.equal(obj.x, 100) // and x == 100 again + + // Repeat the same test but with the tweens added in the + // opposite order. + const obj2 = {x: 0} + const t3 = new TWEEN.Tween(obj2).to({x: 200}, 1000) + const t4 = new TWEEN.Tween(obj2).to({x: 100}, 1000) + + t4.chain(t3) + t3.chain(t4) + + test.equal(obj2.x, 0) + + t4.start(0) + + TWEEN.update(0) + test.equal(obj2.x, 0) + + TWEEN.update(500) + test.equal(obj2.x, 50) + + TWEEN.update(1000) + test.equal(obj2.x, 100) + + TWEEN.update(1500) + test.equal(obj2.x, 150) + + TWEEN.update(2000) + test.equal(obj2.x, 0) + + TWEEN.update(2500) + test.equal(obj2.x, 50) + + TWEEN.update(3000) + test.equal(obj2.x, 100) + + TWEEN.update(3500) + test.equal(obj2.x, 150) + + TWEEN.update(4000) + test.equal(obj2.x, 0) + + TWEEN.update(4500) + test.equal(obj2.x, 50) + + test.done() + }, + + 'Test TWEEN.Tween.onStart'(test: Test): void { + const obj = {}, + t = new TWEEN.Tween(obj) + let counter = 0 + + t.to({x: 2}, 1000) + t.onStart(function (): void { + test.ok(true, 'onStart callback is called') + counter++ + }) + + test.deepEqual(counter, 0) + + t.start(0) + TWEEN.update(0) + + test.deepEqual(counter, 1) + + TWEEN.update(500) + + test.deepEqual(counter, 1, 'onStart callback is not called again') + test.done() + }, + + 'Test TWEEN.Tween.onStop'(test: Test): void { + const obj = {}, + t = new TWEEN.Tween(obj) + let counter = 0 + + t.to({x: 2}, 1000) + t.onStop(function (): void { + test.ok(true, 'onStop callback is called') + counter++ + }) + + test.deepEqual(counter, 0) + + t.stop() + TWEEN.update(0) + + test.deepEqual(counter, 0, "onStop callback not called when the tween hasn't started yet") + + t.start(0) + TWEEN.update(0) + t.stop() + + test.deepEqual(counter, 1, 'onStop callback is called if the tween has been started already and stop is invoked') + + TWEEN.update(500) + t.stop() + + test.deepEqual(counter, 1, 'onStop callback is not called again once the tween is stopped') + test.done() + }, + + 'Test TWEEN.Tween.onUpdate'(test: Test): void { + const obj = {}, + t = new TWEEN.Tween(obj) + let counter = 0 + + t.to({x: 2}, 1000) + t.onUpdate(function (): void { + counter++ + }) + + test.deepEqual(counter, 0) + + t.start(0) + + TWEEN.update(0) + test.deepEqual(counter, 1) + + TWEEN.update(500) + test.deepEqual(counter, 2) + + TWEEN.update(600) + test.deepEqual(counter, 3) + + TWEEN.update(1000) + test.deepEqual(counter, 4) + + TWEEN.update(1500) + test.deepEqual(counter, 4, 'onUpdate callback should not be called after the tween has finished') + + test.done() + }, + + 'Test TWEEN.Tween.onComplete'(test: Test): void { + const obj = {}, + t = new TWEEN.Tween(obj) + let counter = 0 + + t.to({x: 2}, 1000) + t.onComplete(function (): void { + counter++ + }) + + test.deepEqual(counter, 0) + + t.start(0) + + TWEEN.update(0) + test.deepEqual(counter, 0) + + TWEEN.update(500) + test.deepEqual(counter, 0) + + TWEEN.update(600) + test.deepEqual(counter, 0) + + TWEEN.update(1000) + test.deepEqual(counter, 1) + + TWEEN.update(1500) + test.deepEqual(counter, 1, 'onComplete callback must be called only once') + test.done() + }, + + 'TWEEN.Tween does not repeat by default'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj).to({x: 100}, 100) + + t.start(0) + + TWEEN.update(0) + test.equal(obj.x, 0) + + TWEEN.update(50) + test.equal(obj.x, 50) + + TWEEN.update(100) + test.equal(obj.x, 100) + + TWEEN.update(150) + test.equal(obj.x, 100) + test.done() + }, + + 'Test single repeat happens only once'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1) + + t.start(0) + + TWEEN.update(0) + test.equal(obj.x, 0) + + TWEEN.update(50) + test.equal(obj.x, 50) + + TWEEN.update(100) + test.equal(obj.x, 100) + + TWEEN.update(150) + test.equal(obj.x, 50) + + TWEEN.update(200) + test.equal(obj.x, 100) + test.done() + }, + + 'Test Infinity repeat happens forever'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(Infinity) + + t.start(0) + + TWEEN.update(0) + test.equal(obj.x, 0) + + TWEEN.update(50) + test.equal(obj.x, 50) + + TWEEN.update(100) + test.equal(obj.x, 100) + + TWEEN.update(150) + test.equal(obj.x, 50) + + TWEEN.update(200) + test.equal(obj.x, 100) + + TWEEN.update(250) + test.equal(obj.x, 50) + test.done() + }, + + 'Test tweening relatively with repeat'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0, y: 0}, + t = new TWEEN.Tween(obj).to({x: '+100', y: '-100'}, 100).repeat(1) + + t.start(0) + + TWEEN.update(0) + test.equal(obj.x, 0) + test.equal(obj.y, 0) + + TWEEN.update(50) + test.equal(obj.x, 50) + test.equal(obj.y, -50) + + TWEEN.update(100) + test.equal(obj.x, 100) + test.equal(obj.y, -100) + + TWEEN.update(150) + test.equal(obj.x, 150) + test.equal(obj.y, -150) + + TWEEN.update(200) + test.equal(obj.x, 200) + test.equal(obj.y, -200) + test.done() + }, + + 'Test yoyo with repeat Infinity happens forever'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(Infinity).yoyo(true) + + t.start(0) + + TWEEN.update(0) + test.equal(obj.x, 0) + + TWEEN.update(25) + test.equal(obj.x, 25) + + TWEEN.update(100) + test.equal(obj.x, 100) + + TWEEN.update(125) + test.equal(obj.x, 75) + + TWEEN.update(200) + test.equal(obj.x, 0) + + TWEEN.update(225) + test.equal(obj.x, 25) + test.done() + }, + + 'Test yoyo with repeat 1 happens once'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1).yoyo(true) + + t.start(0) + + TWEEN.update(0) + test.equal(obj.x, 0) + + TWEEN.update(25) + test.equal(obj.x, 25) + + TWEEN.update(100) + test.equal(obj.x, 100) + + TWEEN.update(125) + test.equal(obj.x, 75) + + TWEEN.update(200) + test.equal(obj.x, 0) + + TWEEN.update(225) + test.equal(obj.x, 0) + test.done() + }, + + 'Test yoyo works with arrays'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj) + .to({x: [100, 200]}, 100) + .repeat(1) + .yoyo(true) + + t.start(0) + + TWEEN.update(50) + test.equal(obj.x, 100) + + TWEEN.update(100) + test.equal(obj.x, 200) + + TWEEN.update(150) + test.equal(obj.x, 100) + + TWEEN.update(200) + test.equal(obj.x, 0) + + test.done() + }, + + 'Test yoyo can be stopped and restarted properly'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1).yoyo(true) + + t.start(0) + + TWEEN.update(0) + test.equal(obj.x, 0) + + TWEEN.update(25) + test.equal(obj.x, 25) + + TWEEN.update(100) + test.equal(obj.x, 100) + + TWEEN.update(125) + test.equal(obj.x, 75) + + t.stop() + t.start(0) + + TWEEN.update(0) + test.equal(obj.x, 0) + + TWEEN.update(25) + test.equal(obj.x, 25) + + TWEEN.update(100) + test.equal(obj.x, 100) + + TWEEN.update(125) + test.equal(obj.x, 75) + + TWEEN.update(200) + test.equal(obj.x, 0) + + TWEEN.update(225) + test.equal(obj.x, 0) + + test.done() + }, + + 'Test TWEEN.Tween.stopChainedTweens()'(test: Test): void { + const t = new TWEEN.Tween({}), + t2 = new TWEEN.Tween({}) + let tStarted = false, + tCompleted = false, + t2Started = false + + TWEEN.removeAll() + + t.to({}, 1000) + t2.delay(500).to({}, 1000) + + t.chain(t2) + t2.chain(t) + + t.onStart(function (): void { + tStarted = true + }) + + t.onComplete(function (): void { + tCompleted = true + }) + + t2.onStart(function (): void { + test.equal(tStarted, true) + test.equal(tCompleted, true) + test.equal(t2Started, false) + t2Started = true + }) + + test.equal(tStarted, false) + test.equal(t2Started, false) + + t.start(0) + TWEEN.update(1001) + t.stop() + + test.equal(tStarted, true) + test.equal(t2Started, false) + test.equal(TWEEN.getAll().length, 0) + + test.done() + }, + + 'Test TWEEN.Tween.chain progressess into chained tweens'(test: Test): void { + const obj = {t: 1000} + + // 1000 of nothing + const blank = new TWEEN.Tween({}).to({}, 1000) + + // tween obj.t from 1000 -> 2000 (in time with update time) + const next = new TWEEN.Tween(obj).to({t: 2000}, 1000) + + blank.chain(next).start(0) + + TWEEN.update(1500) + test.equal(obj.t, 1500) + + TWEEN.update(2000) + test.equal(obj.t, 2000) + + test.done() + }, + + 'Test that TWEEN.Tween.end sets the final values.'(test: Test): void { + const object1 = {x: 0, y: -50, z: 1000} + const target1 = {x: 50, y: 123, z: '+234'} + + const tween1 = new TWEEN.Tween(object1).to(target1, 1000) + + tween1.start() + tween1.end() + + test.equal(object1.x, 50) + test.equal(object1.y, 123) + test.equal(object1.z, 1234) + + const object2 = {x: 0, y: -50, z: 1000} + const target2 = {x: 50, y: 123, z: '+234'} + + const tween2 = new TWEEN.Tween(object2).to(target2, 1000) + + tween2.start(300) + tween2.update(500) + tween2.end() + + test.equal(object2.x, 50) + test.equal(object2.y, 123) + test.equal(object2.z, 1234) + + test.done() + }, + + 'Test that TWEEN.Tween.end calls the onComplete callback of the tween.'(test: Test): void { + test.expect(1) + + const tween1 = new TWEEN.Tween({}).to({}, 1000).onComplete(function (): void { + test.ok(true) + }) + + tween1.start() + tween1.end() + + test.done() + }, + + 'Ensure Tween.end() works after stopping a tween.'(test: Test): void { + const object = {x: 0, y: -50, z: 1000} + const target = {x: 50, y: 123, z: '+234'} + + const tween = new TWEEN.Tween(object).to(target, 1000) + + tween.start(300) + tween.update(500) + tween.stop() + tween.end() + + test.equal(object.x, 50) + test.equal(object.y, 123) + test.equal(object.z, 1234) + + test.done() + }, + + 'Test delay adds delay before each repeat'(test: Test): void { + // If repeatDelay isn't specified then delay is used since + // that's the way it worked before repeatDelay was added. + + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1).delay(100) + + t.start(0) + + TWEEN.update(100) + test.equal(obj.x, 0) + + TWEEN.update(150) + test.equal(obj.x, 50) + + TWEEN.update(200) + test.equal(obj.x, 100) + + TWEEN.update(250) + test.equal(obj.x, 100) + + TWEEN.update(300) + test.equal(obj.x, 0) + + TWEEN.update(350) + test.equal(obj.x, 50) + + TWEEN.update(400) + test.equal(obj.x, 100) + + test.done() + }, + + 'Test repeatDelay adds delay before each repeat'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1).repeatDelay(200) + + t.start(0) + + TWEEN.update(0) + test.equal(obj.x, 0) + + TWEEN.update(50) + test.equal(obj.x, 50) + + TWEEN.update(100) + test.equal(obj.x, 100) + + TWEEN.update(200) + test.equal(obj.x, 100) + + TWEEN.update(300) + test.equal(obj.x, 0) + + TWEEN.update(350) + test.equal(obj.x, 50) + + TWEEN.update(400) + test.equal(obj.x, 100) + + test.done() + }, + + 'Test repeatDelay and delay can be used together'(test: Test): void { + TWEEN.removeAll() + + const obj = {x: 0}, + t = new TWEEN.Tween(obj).to({x: 100}, 100).delay(100).repeat(1).repeatDelay(200) + + t.start(0) + + TWEEN.update(100) + test.equal(obj.x, 0) + + TWEEN.update(150) + test.equal(obj.x, 50) + + TWEEN.update(200) + test.equal(obj.x, 100) + + TWEEN.update(300) + test.equal(obj.x, 100) + + TWEEN.update(400) + test.equal(obj.x, 0) + + TWEEN.update(450) + test.equal(obj.x, 50) + + TWEEN.update(500) + test.equal(obj.x, 100) + + test.done() + }, + + 'Tween.js compatible with Object.defineProperty getter / setters'(test: Test): void { + const obj = {_x: 0, x: 0} + + Object.defineProperty(obj, 'x', { + get(): void { + return this._x + }, + set(x): void { + this._x = x + }, + }) + + test.equal(obj.x, 0) + + const t = new TWEEN.Tween(obj).to({x: 100}, 100) + + t.start(0) + + test.equal(obj.x, 0) + + TWEEN.update(37) + test.equal(obj.x, 37) + + TWEEN.update(100) + test.equal(obj.x, 100) + + TWEEN.update(115) + test.equal(obj.x, 100) + + test.done() + }, + + 'tween.isPlaying() is false before the tween starts'(test: Test): void { + TWEEN.removeAll() + + const t = new TWEEN.Tween({x: 0}).to({x: 1}, 100) + + test.equal(t.isPlaying(), false) + + test.done() + }, + + 'tween.isPlaying() is true when a tween is started and before it ends'(test: Test): void { + TWEEN.removeAll() + + const t = new TWEEN.Tween({x: 0}).to({x: 1}, 100) + t.start(0) + test.equal(t.isPlaying(), true) + + test.done() + }, + + 'tween.isPlaying() is false after a tween ends'(test: Test): void { + TWEEN.removeAll() + + const t = new TWEEN.Tween({x: 0}).to({x: 1}, 100) + t.start(0) + TWEEN.update(150) + test.equal(t.isPlaying(), false) + + test.done() + }, + + 'A zero-duration tween finishes at its starting time without an error.'(test: Test): void { + TWEEN.removeAll() + + const object = {x: 0} + const t = new TWEEN.Tween(object).to({x: 1}, 0) + t.start(0) + TWEEN.update(0) + + test.equal(t.isPlaying(), false) + test.equal(object.x, 1) + + test.done() + }, + + // Custom TWEEN.Group tests + + 'Custom group.getAll()'(test: Test): void { + const group = new TWEEN.Group() + test.ok(group.getAll() instanceof Array) + test.done() + }, + + 'Custom group stores tweens instead of global TWEEN group'(test: Test): void { + const group = new TWEEN.Group() + + const numGlobalTweensBefore = TWEEN.getAll().length + const numGroupTweensBefore = group.getAll().length + + const globalTween = new TWEEN.Tween({}) + const groupTweenA = new TWEEN.Tween({}, group) + const groupTweenB = new TWEEN.Tween({}, group) + + globalTween.start() + groupTweenA.start() + groupTweenB.start() + + test.equal(TWEEN.getAll().length, numGlobalTweensBefore + 1) + test.equal(group.getAll().length, numGroupTweensBefore + 2) + test.done() + }, + + "Custom group.removeAll() doesn't conflict with global TWEEN group"(test: Test): void { + const group = new TWEEN.Group() + + TWEEN.removeAll() + group.removeAll() + + test.equal(TWEEN.getAll().length, 0, 'No global tweens left') + test.equal(group.getAll().length, 0, 'No group tweens left') + + const globalTween = new TWEEN.Tween({}) + const groupTweenA = new TWEEN.Tween({}, group) + const groupTweenB = new TWEEN.Tween({}, group) + + globalTween.start() + groupTweenA.start() + groupTweenB.start() + + test.equal(TWEEN.getAll().length, 1, 'One global tween has been added') + test.equal(group.getAll().length, 2, 'Two group tweens have been added') + + group.removeAll() + + test.equal(TWEEN.getAll().length, 1, 'One global tween left') + test.equal(group.getAll().length, 0, 'No group tweens left') + + TWEEN.removeAll() + + test.equal(TWEEN.getAll().length, 0, 'No global tweens left') + + test.done() + }, + + "Global TWEEN.removeAll() doesn't conflict with custom group"(test: Test): void { + const group = new TWEEN.Group() + + TWEEN.removeAll() + group.removeAll() + + test.equal(TWEEN.getAll().length, 0, 'No global tweens left') + test.equal(group.getAll().length, 0, 'No group tweens left') + + const globalTween = new TWEEN.Tween({}) + const groupTweenA = new TWEEN.Tween({}, group) + const groupTweenB = new TWEEN.Tween({}, group) + + globalTween.start() + groupTweenA.start() + groupTweenB.start() + + test.equal(TWEEN.getAll().length, 1, 'One global tween has been added') + test.equal(group.getAll().length, 2, 'Two group tweens have been added') + + TWEEN.removeAll() + + test.equal(TWEEN.getAll().length, 0, 'No global tweens left') + test.equal(group.getAll().length, 2, 'Two group tweens left') + + group.removeAll() + + test.equal(group.getAll().length, 0, 'No group tweens left') + + test.done() + }, + + "Custom group.add() doesn't conflict with global TWEEN group, or vice versa"(test: Test): void { + const group = new TWEEN.Group() + + const globalTween = new TWEEN.Tween({}) + const groupTweenA = new TWEEN.Tween({}, group) + const groupTweenB = new TWEEN.Tween({}, group) + + const numGlobalTweens = TWEEN.getAll().length + const numGroupTweens = group.getAll().length + + TWEEN.add(globalTween) + group.add(groupTweenA) + group.add(groupTweenB) + + test.equal(numGlobalTweens + 1, TWEEN.getAll().length) + test.equal(numGroupTweens + 2, group.getAll().length) + + test.done() + }, + + "Custom group.update() doesn't conflict with global TWEEN group"(test: Test): void { + const group = new TWEEN.Group() + + const startObj = {x: 1} + const endObj = {x: 2} + const duration = 1000 + + const globalObj = {x: 1} + new TWEEN.Tween(globalObj).to(endObj, duration).start(0) + + const groupObj = {x: 1} + new TWEEN.Tween(groupObj, group).to(endObj, duration).start(0) + + group.update(duration) + + test.deepEqual(globalObj, startObj) + test.deepEqual(groupObj, endObj) + test.done() + }, + + "Global TWEEN.update() doesn't conflict with custom group"(test: Test): void { + const group = new TWEEN.Group() + + const startObj = {x: 1} + const endObj = {x: 2} + const duration = 1000 + + const globalObj = {x: 1} + new TWEEN.Tween(globalObj).to(endObj, duration).start(0) + + const groupObj = {x: 1} + new TWEEN.Tween(groupObj, group).to(endObj, duration).start(0) + + TWEEN.update(duration) + + test.deepEqual(globalObj, endObj) + test.deepEqual(groupObj, startObj) + test.done() + }, + + 'Ensure tweens work without any group'(test: Test): void { + const obj = {x: 0}, + t = new TWEEN.Tween(obj, false) + + t.to({x: 1000}, 1000) + + t.start(0) + test.equal(obj.x, 0) + t.update(500) + test.equal(obj.x, 500) + t.pause(600) + test.equal(obj.x, 500) + t.update(750) + test.equal(obj.x, 500) + t.resume(800) + test.equal(obj.x, 500) + t.update(1000) + test.equal(obj.x, 800) + t.update(1001) + test.equal(obj.x, 801) + t.stop().end() + test.equal(obj.x, 1000) + + test.done() + }, + + 'Stopping a tween within an update callback will not cause an error.'(test: Test): void { + TWEEN.removeAll() + + const tweenA = new TWEEN.Tween({x: 1, y: 2}) + .to({x: 3, y: 4}, 1000) + .onUpdate(function (): void { + tweenB.stop() + }) + .start(0) + const tweenB = new TWEEN.Tween({x: 5, y: 6}) + .to({x: 7, y: 8}) + .onUpdate(function (): void { + tweenA.stop() + }) + .start(0) + + let success = true + + try { + TWEEN.update(500) + } catch (exception) { + success = false + } finally { + test.ok(success) + test.done() + } + }, + + 'Set the duration with .duration'(test: Test): void { + const obj = {x: 1} + const t = new TWEEN.Tween(obj).to({x: 2}).duration(1000).start(0) + + t.update(1000) + + test.deepEqual(obj.x, 2) + test.done() + }, + + "Tween.group sets the tween's group."(test: Test): void { + const group = new TWEEN.Group() + + const groupTweenA = new TWEEN.Tween({}).group(group) + + groupTweenA.start() + + test.equal(group.getAll().length, 1) + test.done() + }, + + 'Test TWEEN.Tween.pause() and TWEEN.Tween.resume()'(test: Test): void { + const obj = {x: 0.0}, + t = new TWEEN.Tween(obj) + + t.to({x: 1.0}, 1000) + + TWEEN.removeAll() + test.equal(TWEEN.getAll().length, 0) + + t.start(0) + test.equal(TWEEN.getAll().length, 1) + test.equal(t.isPaused(), false) + + TWEEN.update(400) + test.equal(obj.x, 0.4) + + t.pause(450) + test.equal(t.isPaused(), true) + test.equal(TWEEN.getAll().length, 0) + test.equal(obj.x, 0.4) + + TWEEN.update(900) + test.equal(obj.x, 0.4) + + TWEEN.update(3000) + test.equal(obj.x, 0.4) + + t.resume(3200) + // values do not change until an update + test.equal(obj.x, 0.4) + test.equal(TWEEN.getAll().length, 1) + test.equal(t.isPaused(), false) + + TWEEN.update(3500) + test.equal(obj.x, 0.75) + + TWEEN.update(5000) + test.equal(obj.x, 1.0) + test.done() + }, + + 'Test TWEEN.Tween.pause() and TWEEN.Tween.resume(), without groups'(test: Test): void { + const obj = {x: 0.0}, + t = new TWEEN.Tween(obj, false) + + t.to({x: 1.0}, 1000) + + t.start(0) + test.equal(t.isPaused(), false) + + t.update(400) + test.equal(obj.x, 0.4) + + t.pause(450) + test.equal(t.isPaused(), true) + test.equal(obj.x, 0.4) + + t.update(900) + test.equal(obj.x, 0.4) + + t.update(3000) + test.equal(obj.x, 0.4) + + t.resume(3200) + // values do not change until an update + test.equal(obj.x, 0.4) + test.equal(t.isPaused(), false) + + t.update(3500) + test.equal(obj.x, 0.75) + + t.update(5000) + test.equal(obj.x, 1.0) + test.done() + }, + + 'Arrays in the object passed to to() are not modified by start().'(test: Test): void { + const start = {x: 10, y: 20} + const end = {x: 100, y: 200, values: ['a', 'b']} + const valuesArray = end.values + new TWEEN.Tween(start).to(end).start() + test.equal(valuesArray, end.values) + test.equal(end.values.length, 2) + test.equal(end.values[0], 'a') + test.equal(end.values[1], 'b') + test.done() + }, + + 'Tween.js animate nested object'(test: Test): void { + const obj = {scale: {x: 0}, alpha: 0} + + const t = new TWEEN.Tween(obj).to({scale: {x: 100}, alpha: 100}, 100) + t.start(0) + + test.equal(obj.scale.x, 0) + + TWEEN.update(37) + test.equal(obj.scale.x, 37) + test.equal(obj.alpha, 37) + + TWEEN.update(100) + test.equal(obj.scale.x, 100) + test.equal(obj.alpha, 100) + + TWEEN.update(115) + test.equal(obj.scale.x, 100) + test.equal(obj.alpha, 100) + + test.done() + }, + + 'Tween.js animate nested object including relative value'(test: Test): void { + const obj = {world: {hero: {scale: {x: 0}, x: 100}}, time: 0} + + const t = new TWEEN.Tween(obj).to({world: {hero: {scale: {x: 100}, x: '+100'}}, time: 100}, 100) + t.start(0) + + test.equal(obj.world.hero.scale.x, 0) + + TWEEN.update(37) + test.equal(obj.world.hero.scale.x, 37) + test.equal(obj.world.hero.x, 137) + test.equal(obj.time, 37) + + TWEEN.update(100) + test.equal(obj.world.hero.scale.x, 100) + test.equal(obj.world.hero.x, 200) + test.equal(obj.time, 100) + + TWEEN.update(115) + test.equal(obj.world.hero.scale.x, 100) + test.equal(obj.world.hero.x, 200) + test.equal(obj.time, 100) + + test.done() + }, + + 'Test TWEEN.Tween with nested objects'(test: Test): void { + const obj = {x: 0.0, y: 100, some: {value: 0.0, style: {opacity: 1.0}}}, + t = new TWEEN.Tween(obj) + + t.to({x: 1.0, y: 200, some: {value: 1.0, style: {opacity: 0.5}}}, 1000) + + TWEEN.removeAll() + + test.equal(TWEEN.getAll().length, 0) + + t.start(0) + + test.equal(TWEEN.getAll().length, 1) + test.equal(t.isPaused(), false) + + TWEEN.update(400) + + test.equal(obj.x, 0.4) + test.equal(obj.y, 140) + test.equal(obj.some.style.opacity, 0.8) + test.equal(obj.some.value, 0.4) + + TWEEN.update(750) + + test.equal(obj.x, 0.75) + test.equal(obj.y, 175) + test.equal(obj.some.style.opacity, 0.625) + test.equal(obj.some.value, 0.75) + + TWEEN.update(1000) + + test.equal(obj.x, 1.0) + test.equal(obj.y, 200) + test.equal(obj.some.style.opacity, 0.5) + test.equal(obj.some.value, 1.0) + + test.done() + }, + + 'Test TWEEN.Tween.pause() and .resume() with nested objects'(test: Test): void { + const obj = {x: 0.0, y: 100, some: {value: 0.0}}, + t = new TWEEN.Tween(obj) + + t.to({x: 1.0, y: 200, some: {value: 1.0}}, 1000) + + TWEEN.removeAll() + + test.equal(TWEEN.getAll().length, 0) + + t.start(0) + + test.equal(TWEEN.getAll().length, 1) + test.equal(t.isPaused(), false) + + TWEEN.update(400) + + test.equal(obj.x, 0.4) + test.equal(obj.y, 140) + test.equal(obj.some.value, 0.4) + + t.pause(450) + + test.equal(t.isPaused(), true) + test.equal(TWEEN.getAll().length, 0) + test.equal(obj.x, 0.4) + test.equal(obj.y, 140) + test.equal(obj.some.value, 0.4) + + TWEEN.update(900) + + test.equal(obj.x, 0.4) + test.equal(obj.y, 140) + test.equal(obj.some.value, 0.4) + + TWEEN.update(3000) + + test.equal(obj.x, 0.4) + test.equal(obj.y, 140) + test.equal(obj.some.value, 0.4) + + t.resume(3200) + + // values do not change until an update + test.equal(obj.x, 0.4) + test.equal(obj.y, 140) + test.equal(obj.some.value, 0.4) + + test.equal(TWEEN.getAll().length, 1) + test.equal(t.isPaused(), false) + + TWEEN.update(3500) + + test.equal(obj.x, 0.75) + test.equal(obj.y, 175) + test.equal(obj.some.value, 0.75) + + TWEEN.update(5000) + + test.equal(obj.x, 1.0) + test.equal(obj.y, 200) + test.equal(obj.some.value, 1.0) + + test.done() + }, +} + +type Test = { + ok(a: unknown, failMessage?: string): void + equal(a: unknown, b: unknown, failMessage?: string): void + deepEqual(a: unknown, b: unknown, failMessage?: string): void + expect(n: number): void + done(): void +} diff --git a/test/unit/nodeunitheadless.js b/test/unit/nodeunitheadless.js index e0f7b158..e991d175 100644 --- a/test/unit/nodeunitheadless.js +++ b/test/unit/nodeunitheadless.js @@ -1,6 +1,2 @@ -var TWEEN_uncompressed = require('../../dist/tween.cjs.js') -var getTests = require('./tests') - -module.exports = { - tween: getTests(TWEEN_uncompressed), -} +const {tests} = require('../../.tmp/tests.cjs.js') +module.exports = {tween: tests} diff --git a/test/unit/tests.js b/test/unit/tests.js deleted file mode 100644 index 1a5d6ae4..00000000 --- a/test/unit/tests.js +++ /dev/null @@ -1,1935 +0,0 @@ -~function () { - function getTests(TWEEN) { - var tests = { - hello: function (test) { - test.ok(TWEEN !== null) - test.done() - }, - - // TWEEN tests - 'TWEEN.getAll': function (test) { - test.ok(TWEEN.getAll() instanceof Array) - test.done() - }, - - 'TWEEN object stores tweens automatically on start': function (test) { - var numTweensBefore = TWEEN.getAll().length, - t = new TWEEN.Tween({}) - - t.start() - - var numTweensAfter = TWEEN.getAll().length - - test.equal(numTweensBefore + 1, numTweensAfter) - test.done() - }, - - 'TWEEN.removeAll()': function (test) { - var all = TWEEN.getAll(), - t = new TWEEN.Tween({}) - - TWEEN.removeAll() - - test.equal(TWEEN.getAll().length, 0, 'No tweens left') - - t.start() - - test.equal(TWEEN.getAll().length, 1, 'A tween has been added') - - TWEEN.removeAll() - - test.equal(TWEEN.getAll().length, 0, 'No tweens left') - test.done() - }, - - 'TWEEN.add()': function (test) { - var all = TWEEN.getAll(), - numTweens = all.length, - t = new TWEEN.Tween({}) - - TWEEN.add(t) - - test.equal(numTweens + 1, TWEEN.getAll().length) - - test.done() - }, - - 'TWEEN.remove()': function (test) { - var all = TWEEN.getAll(), - numTweens = all.length, - t = new TWEEN.Tween({}) - - TWEEN.add(t) - - test.ok(TWEEN.getAll().indexOf(t) != -1) - - TWEEN.remove(t) - - test.equal(numTweens, TWEEN.getAll().length) - test.equal(TWEEN.getAll().indexOf(t), -1) - test.done() - }, - - 'TWEEN.update() returns false when done (no tweens to animate)': function (test) { - TWEEN.removeAll() - - test.deepEqual(TWEEN.update(), false) - test.done() - }, - - 'TWEEN.update() returns true when there are active tweens': function (test) { - TWEEN.removeAll() - - var t = new TWEEN.Tween({}) - t.start() - - test.deepEqual(TWEEN.update(), true) - test.done() - }, - - 'TWEEN.update() removes tweens when they are finished': function (test) { - TWEEN.removeAll() - - var t1 = new TWEEN.Tween({}).to({}, 1000), - t2 = new TWEEN.Tween({}).to({}, 2000) - - test.equal(TWEEN.getAll().length, 0) - - t1.start(0) - t2.start(0) - - test.equal(TWEEN.getAll().length, 2) - - TWEEN.update(0) - test.equal(TWEEN.getAll().length, 2) - - TWEEN.update(999) - test.equal(TWEEN.getAll().length, 2) - - TWEEN.update(1000) - test.equal(TWEEN.getAll().length, 1) - test.equal(TWEEN.getAll().indexOf(t1), -1) - test.ok(TWEEN.getAll().indexOf(t2) != -1) - test.done() - }, - 'TWEEN.update() does not remove tweens when they are finished with preserve flag': function (test) { - TWEEN.removeAll() - - var t1 = new TWEEN.Tween({}).to({}, 1000), - t2 = new TWEEN.Tween({}).to({}, 2000) - - test.equal(TWEEN.getAll().length, 0) - - t1.start(0) - t2.start(0) - - test.equal(TWEEN.getAll().length, 2) - - TWEEN.update(0, true) - test.equal(TWEEN.getAll().length, 2) - - TWEEN.update(999, true) - test.equal(TWEEN.getAll().length, 2) - - TWEEN.update(1000, true) - test.equal(TWEEN.getAll().length, 2) - - TWEEN.update(1001, true) - test.equal(TWEEN.getAll().length, 2) - test.ok(TWEEN.getAll().indexOf(t1) != -1) - test.ok(TWEEN.getAll().indexOf(t2) != -1) - test.done() - }, - - 'Unremoved tweens which have been updated past their finish time may go backward in time': function (test) { - TWEEN.removeAll() - - var target1 = {a: 0} - var target2 = {b: 0} - - var t1 = new TWEEN.Tween(target1).to({a: 1}, 1000), - t2 = new TWEEN.Tween(target2).to({b: 1}, 2000) - - t1.start(0) - t2.start(0) - - // To be able to make a tween go backward in time, it must be - // updated with preserve set to true. Otherwise, the - // backward-in-time feature does not apply. - TWEEN.update(200, true) - TWEEN.update(2500, true) - TWEEN.update(500, true) - - test.equal(TWEEN.getAll().length, 2) - test.equal(target1.a, 0.5) - test.equal(target2.b, 0.25) - - test.done() - }, - - // TWEEN.Tween tests - - constructor: function (test) { - var t = new TWEEN.Tween({}) - - test.ok(t instanceof TWEEN.Tween, 'Pass') - test.done() - }, - - 'Return the same tween instance for method chaining': function (test) { - var t = new TWEEN.Tween({}) - - test.ok(t.to({}, 0) instanceof TWEEN.Tween) - test.equal(t.to({}, 0), t) - - test.ok(t.start() instanceof TWEEN.Tween) - test.equal(t.start(), t) - - test.ok(t.stop() instanceof TWEEN.Tween) - test.equal(t.stop(), t) - - test.ok(t.delay() instanceof TWEEN.Tween) - test.equal(t.delay(), t) - - test.ok(t.easing() instanceof TWEEN.Tween) - test.equal(t.easing(), t) - - test.ok(t.interpolation() instanceof TWEEN.Tween) - test.equal(t.interpolation(), t) - - test.ok(t.chain() instanceof TWEEN.Tween) - test.equal(t.chain(), t) - - test.ok(t.onStart() instanceof TWEEN.Tween) - test.equal(t.onStart(), t) - - test.ok(t.onStop() instanceof TWEEN.Tween) - test.equal(t.onStop(), t) - - test.ok(t.onUpdate() instanceof TWEEN.Tween) - test.equal(t.onUpdate(), t) - - test.ok(t.onComplete() instanceof TWEEN.Tween) - test.equal(t.onComplete(), t) - - test.ok(t.duration() instanceof TWEEN.Tween) - test.equal(t.duration(), t) - - test.ok(t.group() instanceof TWEEN.Tween) - test.equal(t.group(), t) - - test.done() - }, - - 'Tween existing property': function (test) { - var obj = {x: 1}, - t = new TWEEN.Tween(obj) - - t.to({x: 2}, 1000) - t.start(0) - t.update(1000) - - test.deepEqual(obj.x, 2) - test.done() - }, - - 'Tween non-existing property': function (test) { - var obj = {x: 1}, - t = new TWEEN.Tween(obj) - - t.to({y: 0}, 1000) - t.start(0) - t.update(1000) - - test.deepEqual(obj.x, 1) - test.equal(obj.y, undefined) - test.done() - }, - - 'Tween non-null property': function (test) { - var obj = {x: 1}, - t = new TWEEN.Tween(obj) - - t.to({x: 2}, 1000) - t.start(0) - t.update(1000) - - test.deepEqual(obj.x, 2) - test.ok(obj.x !== null) - test.done() - }, - - 'Tween function property': function (test) { - var my_function = function () {} - - var obj = {x: my_function}, - t = new TWEEN.Tween(obj) - - t.to({x: my_function}) - t.start(0) - t.update(1000) - - test.ok(obj.x === my_function) - test.done() - }, - - 'Tween boolean property': function (test) { - var obj = {x: true}, - t = new TWEEN.Tween(obj) - - t.to({x: function () {}}) - t.start(0) - t.update(1000) - - test.ok(typeof obj.x === 'boolean') - test.ok(obj.x) - test.done() - }, - - 'Tween null property': function (test) { - var obj = {x: null}, - t = new TWEEN.Tween(obj) - - t.to({x: 2}, 1000) - t.start(0) - t.update(1000) - - test.deepEqual(obj.x, 2) - test.done() - }, - - 'Tween undefined property': function (test) { - var obj = {}, - t = new TWEEN.Tween(obj) - - t.to({x: 2}, 1000) - t.start(0) - t.update(1000) - - test.equal(obj.x, undefined) - test.done() - }, - - 'Tween relative positive value': function (test) { - var obj = {x: 0}, - t = new TWEEN.Tween(obj) - - t.to({x: '+100'}, 1000) - t.start(0) - t.update(1000) - - test.equal(obj.x, 100) - test.done() - }, - - 'Tween relative negative value': function (test) { - var obj = {x: 0}, - t = new TWEEN.Tween(obj) - - t.to({x: '-100'}, 1000) - t.start(0) - t.update(1000) - - test.equal(obj.x, -100) - test.done() - }, - - 'String values without a + or - sign should not be interpreted as relative': function (test) { - var obj = {x: 100}, - t = new TWEEN.Tween(obj) - - t.to({x: '100'}, 1000) - t.start(0) - t.update(1000) - - test.equal(obj.x, 100) - test.done() - }, - - 'Tween relative positive value, with yoyo': function (test) { - var obj = {x: 0}, - t = new TWEEN.Tween(obj) - - t.to({x: '+100'}, 1000) - t.repeat(1) - t.yoyo(true) - t.start(0) - - t.update(500) - test.equal(obj.x, 50) - t.update(1000) - test.equal(obj.x, 100) - t.update(1500) - test.equal(obj.x, 50) - t.update(2000) - test.equal(obj.x, 0) - - test.done() - }, - - 'Tween relative negative value, with yoyo': function (test) { - var obj = {x: 0}, - t = new TWEEN.Tween(obj) - - t.to({x: '-100'}, 1000) - t.repeat(1) - t.yoyo(true) - t.start(0) - - t.update(500) - test.equal(obj.x, -50) - t.update(1000) - test.equal(obj.x, -100) - t.update(1500) - test.equal(obj.x, -50) - t.update(2000) - test.equal(obj.x, -0) - - test.done() - }, - - 'Tween relative positive array interpolation values': function (test) { - var obj = {x: 0}, - t = new TWEEN.Tween(obj) - - t.to({x: ['+100', '+0', '-100', '+0']}, 2000) - t.start(0) - - t.update(250) - test.equal(obj.x, 50) - t.update(500) - test.equal(obj.x, 100) - t.update(750) - test.equal(obj.x, 50) - t.update(1000) - test.equal(obj.x, 0) - t.update(1250) - test.equal(obj.x, -50) - t.update(1500) - test.equal(obj.x, -100) - t.update(1750) - test.equal(obj.x, -50) - t.update(2000) - test.equal(obj.x, 0) - - test.done() - }, - - 'String values without a + or - sign should not be interpreted as relative with array interpolation values': function ( - test, - ) { - var obj = {x: 0}, - t = new TWEEN.Tween(obj) - - t.to({x: ['100', '0', '100', '0']}, 2000) - t.start(0) - - t.update(250) - test.equal(obj.x, 50) - t.update(500) - test.equal(obj.x, 100) - t.update(750) - test.equal(obj.x, 50) - t.update(1000) - test.equal(obj.x, 0) - t.update(1250) - test.equal(obj.x, 50) - t.update(1500) - test.equal(obj.x, 100) - t.update(1750) - test.equal(obj.x, 50) - t.update(2000) - test.equal(obj.x, 0) - - test.done() - }, - - 'animate values in an array': function (test) { - var obj = [0, 0, 0], - t = new TWEEN.Tween(obj) - - t.to([1000, '-2000', '+2000'], 1000) - t.start(0) - - t.update(250) - test.equal(obj[0], 250) - test.equal(obj[1], -500) - test.equal(obj[2], 500) - t.update(500) - test.equal(obj[0], 500) - test.equal(obj[1], -1000) - test.equal(obj[2], 1000) - t.update(750) - test.equal(obj[0], 750) - test.equal(obj[1], -1500) - test.equal(obj[2], 1500) - t.update(1000) - test.equal(obj[0], 1000) - test.equal(obj[1], -2000) - test.equal(obj[2], 2000) - - test.done() - }, - - 'animate values in a nested array': function (test) { - var obj = {a: [0, 0, 0]}, - t = new TWEEN.Tween(obj) - - t.to({a: [1000, '-2000', '+2000']}, 1000) - t.start(0) - - t.update(250) - test.equal(obj.a[0], 250) - test.equal(obj.a[1], -500) - test.equal(obj.a[2], 500) - t.update(500) - test.equal(obj.a[0], 500) - test.equal(obj.a[1], -1000) - test.equal(obj.a[2], 1000) - t.update(750) - test.equal(obj.a[0], 750) - test.equal(obj.a[1], -1500) - test.equal(obj.a[2], 1500) - t.update(1000) - test.equal(obj.a[0], 1000) - test.equal(obj.a[1], -2000) - test.equal(obj.a[2], 2000) - - test.done() - }, - - 'Test TWEEN.Tween.start()': function (test) { - var obj = {}, - t = new TWEEN.Tween(obj) - - t.to({}, 1000) - - TWEEN.removeAll() - test.equal(TWEEN.getAll().length, 0) // TODO move to TWEEN test - - t.start(0) - - test.equal(TWEEN.getAll().length, 1) // TODO ditto - test.equal(TWEEN.getAll()[0], t) - test.done() - }, - - 'Ensure tweens start without calling start() method.': function (test) { - var obj = {x: 0}, - t = new TWEEN.Tween(obj) - - t.to({x: 1000}, 1000) - let started = false - t.onStart(() => (started = true)) - t.onComplete(() => (started = false)) - - t.update(0) - test.deepEqual(started, true) - test.deepEqual(obj.x, 0) - t.update(500) - test.deepEqual(started, true) - test.deepEqual(obj.x, 500) - t.update(1000) - test.deepEqual(obj.x, 1000) - test.deepEqual(started, false) - - test.done() - }, - - 'Test Tween.to() tweening towards a dynamic object': function (test) { - const rabbit = {x: 1000, y: 0} - const tr = new TWEEN.Tween(rabbit) - tr.to({y: 1000}, 1000) - tr.start(0) - - const fox = {x: 0, y: 0} - const tf = new TWEEN.Tween(fox) - tf.to(rabbit) // fox chase rabbit! - tf.start(0) - - tr.update(200) - tf.update(200) - test.equal(rabbit.x, 1000) - test.equal(rabbit.y, 200) - test.equal(fox.x, 200) - test.equal(fox.y, 40) - tr.update(500) - tf.update(500) - test.equal(rabbit.x, 1000) - test.equal(rabbit.y, 500) - test.equal(fox.x, 500) - test.equal(fox.y, 250) - tr.update(800) - tf.update(800) - test.equal(rabbit.x, 1000) - test.equal(rabbit.y, 800) - test.equal(fox.x, 800) - test.equal(fox.y, 640) - tr.update(1000) - tf.update(1000) - test.equal(rabbit.x, 1000) - test.equal(rabbit.y, 1000) - test.equal(fox.x, 1000) - test.equal(fox.y, 1000) - - test.done() - }, - - 'Test TWEEN.Tween.stop()': function (test) { - var obj = {}, - t = new TWEEN.Tween(obj) - - t.to({x: 2}, 1000) - - TWEEN.removeAll() - - t.start() - t.stop() - - test.equal(TWEEN.getAll().length, 0) - test.done() - }, - - 'Test TWEEN.Tween.delay()': function (test) { - var obj = {x: 1}, - t = new TWEEN.Tween(obj) - - t.to({x: 2}, 1000) - t.delay(500) - t.start(0) - - t.update(100) - - test.deepEqual(obj.x, 1, "Tween hasn't started yet") - - t.update(1000) - - test.ok(obj.x !== 1 && obj.x !== 2, "Tween has started but hasn't finished yet") - - t.update(1500) - - test.equal(obj.x, 2, 'Tween finishes when expected') - test.done() - }, - - // TODO: not really sure how to test this. Advice appreciated! - 'Test TWEEN.Tween.easing()': function (test) { - var obj = {x: 0}, - t = new TWEEN.Tween(obj) - - t.to({x: 1}, 1000) - - t.easing(TWEEN.Easing.Quadratic.In) - t.start(0) - t.update(500) - test.equal(obj.x, TWEEN.Easing.Quadratic.In(0.5)) - test.done() - }, - - // TODO test interpolation() - - 'Test TWEEN.Tween.chain --with one tween': function (test) { - var t = new TWEEN.Tween({}), - tStarted = false, - tCompleted = false, - t2 = new TWEEN.Tween({}), - t2Started = false - - TWEEN.removeAll() - - t.to({}, 1000) - t2.to({}, 1000) - - t.chain(t2) - - t.onStart(function () { - tStarted = true - }) - - t.onComplete(function () { - tCompleted = true - }) - - t2.onStart(function () { - test.equal(tStarted, true) - test.equal(tCompleted, true) - test.equal(t2Started, false) - t2Started = true - }) - - test.equal(tStarted, false) - test.equal(t2Started, false) - - t.start(0) - TWEEN.update(0) - - test.equal(tStarted, true) - test.equal(t2Started, false) - - TWEEN.update(1000) - - test.equal(tCompleted, true) - - TWEEN.update(1001) - - test.equal(t2Started, true, 't2 is automatically started by t') - test.done() - }, - - 'Test TWEEN.Tween.chain --with several tweens in an array': function (test) { - var t = new TWEEN.Tween({}), - chainedTweens = [], - numChained = 3, - numChainedStarted = 0 - - TWEEN.removeAll() - - t.to({}, 1000) - - function onChainedStart() { - numChainedStarted++ - } - - for (var i = 0; i < numChained; i++) { - var chained = new TWEEN.Tween({}) - chained.to({}, 1000) - - chainedTweens.push(chained) - - chained.onStart(onChainedStart) - } - - // NOTE: This is not the normal way to chain several tweens simultaneously - // The usual way would be to specify them explicitly: - // t.chain( tween1, tween2, ... tweenN) - // ... not to use apply to send an array of tweens - t.chain.apply(t, chainedTweens) - - test.equal(numChainedStarted, 0) - - t.start(0) - TWEEN.update(0) - TWEEN.update(1000) - TWEEN.update(1001) - - test.equal(numChainedStarted, numChained, 'All chained tweens have been started') - test.done() - }, - - 'Test TWEEN.Tween.chain allows endless loops': function (test) { - var obj = {x: 0}, - t1 = new TWEEN.Tween(obj).to({x: 100}, 1000), - t2 = new TWEEN.Tween(obj).to({x: 0}, 1000) - - TWEEN.removeAll() - - t1.chain(t2) - t2.chain(t1) - - test.equal(obj.x, 0) - - // x == 0 - t1.start(0) - TWEEN.update(0) - - test.equal(obj.x, 0) - - TWEEN.update(500) - test.equal(obj.x, 50) - - // there... (x == 100) - - TWEEN.update(1000) - test.equal(obj.x, 100) - - TWEEN.update(1500) - test.equal(obj.x, 50) - - // ... and back again (x == 0) - - TWEEN.update(2000) - test.equal(obj.x, 0) - - TWEEN.update(2500) - test.equal(obj.x, 50) - - TWEEN.update(3000) - test.equal(obj.x, 100) // and x == 100 again - - // Repeat the same test but with the tweens added in the - // opposite order. - var obj2 = {x: 0} - var t3 = new TWEEN.Tween(obj2).to({x: 200}, 1000) - var t4 = new TWEEN.Tween(obj2).to({x: 100}, 1000) - - t4.chain(t3) - t3.chain(t4) - - test.equal(obj2.x, 0) - - t4.start(0) - - TWEEN.update(0) - test.equal(obj2.x, 0) - - TWEEN.update(500) - test.equal(obj2.x, 50) - - TWEEN.update(1000) - test.equal(obj2.x, 100) - - TWEEN.update(1500) - test.equal(obj2.x, 150) - - TWEEN.update(2000) - test.equal(obj2.x, 0) - - TWEEN.update(2500) - test.equal(obj2.x, 50) - - TWEEN.update(3000) - test.equal(obj2.x, 100) - - TWEEN.update(3500) - test.equal(obj2.x, 150) - - TWEEN.update(4000) - test.equal(obj2.x, 0) - - TWEEN.update(4500) - test.equal(obj2.x, 50) - - test.done() - }, - - 'Test TWEEN.Tween.onStart': function (test) { - var obj = {}, - t = new TWEEN.Tween(obj), - counter = 0 - - t.to({x: 2}, 1000) - t.onStart(function () { - test.ok(true, 'onStart callback is called') - counter++ - }) - - test.deepEqual(counter, 0) - - t.start(0) - TWEEN.update(0) - - test.deepEqual(counter, 1) - - TWEEN.update(500) - - test.deepEqual(counter, 1, 'onStart callback is not called again') - test.done() - }, - - 'Test TWEEN.Tween.onStop': function (test) { - var obj = {}, - t = new TWEEN.Tween(obj), - counter = 0 - - t.to({x: 2}, 1000) - t.onStop(function () { - test.ok(true, 'onStop callback is called') - counter++ - }) - - test.deepEqual(counter, 0) - - t.stop() - TWEEN.update(0) - - test.deepEqual(counter, 0, "onStop callback not called when the tween hasn't started yet") - - t.start(0) - TWEEN.update(0) - t.stop() - - test.deepEqual( - counter, - 1, - 'onStop callback is called if the tween has been started already and stop is invoked', - ) - - TWEEN.update(500) - t.stop() - - test.deepEqual(counter, 1, 'onStop callback is not called again once the tween is stopped') - test.done() - }, - - 'Test TWEEN.Tween.onUpdate': function (test) { - var obj = {}, - t = new TWEEN.Tween(obj), - counter = 0 - - t.to({x: 2}, 1000) - t.onUpdate(function () { - counter++ - }) - - test.deepEqual(counter, 0) - - t.start(0) - - TWEEN.update(0) - test.deepEqual(counter, 1) - - TWEEN.update(500) - test.deepEqual(counter, 2) - - TWEEN.update(600) - test.deepEqual(counter, 3) - - TWEEN.update(1000) - test.deepEqual(counter, 4) - - TWEEN.update(1500) - test.deepEqual(counter, 4, 'onUpdate callback should not be called after the tween has finished') - - test.done() - }, - - 'Test TWEEN.Tween.onComplete': function (test) { - var obj = {}, - t = new TWEEN.Tween(obj), - counter = 0 - - t.to({x: 2}, 1000) - t.onComplete(function () { - counter++ - }) - - test.deepEqual(counter, 0) - - t.start(0) - - TWEEN.update(0) - test.deepEqual(counter, 0) - - TWEEN.update(500) - test.deepEqual(counter, 0) - - TWEEN.update(600) - test.deepEqual(counter, 0) - - TWEEN.update(1000) - test.deepEqual(counter, 1) - - TWEEN.update(1500) - test.deepEqual(counter, 1, 'onComplete callback must be called only once') - test.done() - }, - - 'TWEEN.Tween does not repeat by default': function (test) { - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj).to({x: 100}, 100) - - t.start(0) - - TWEEN.update(0) - test.equal(obj.x, 0) - - TWEEN.update(50) - test.equal(obj.x, 50) - - TWEEN.update(100) - test.equal(obj.x, 100) - - TWEEN.update(150) - test.equal(obj.x, 100) - test.done() - }, - - 'Test single repeat happens only once': function (test) { - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1) - - t.start(0) - - TWEEN.update(0) - test.equal(obj.x, 0) - - TWEEN.update(50) - test.equal(obj.x, 50) - - TWEEN.update(100) - test.equal(obj.x, 100) - - TWEEN.update(150) - test.equal(obj.x, 50) - - TWEEN.update(200) - test.equal(obj.x, 100) - test.done() - }, - - 'Test Infinity repeat happens forever': function (test) { - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(Infinity) - - t.start(0) - - TWEEN.update(0) - test.equal(obj.x, 0) - - TWEEN.update(50) - test.equal(obj.x, 50) - - TWEEN.update(100) - test.equal(obj.x, 100) - - TWEEN.update(150) - test.equal(obj.x, 50) - - TWEEN.update(200) - test.equal(obj.x, 100) - - TWEEN.update(250) - test.equal(obj.x, 50) - test.done() - }, - - 'Test tweening relatively with repeat': function (test) { - TWEEN.removeAll() - - var obj = {x: 0, y: 0}, - t = new TWEEN.Tween(obj).to({x: '+100', y: '-100'}, 100).repeat(1) - - t.start(0) - - TWEEN.update(0) - test.equal(obj.x, 0) - test.equal(obj.y, 0) - - TWEEN.update(50) - test.equal(obj.x, 50) - test.equal(obj.y, -50) - - TWEEN.update(100) - test.equal(obj.x, 100) - test.equal(obj.y, -100) - - TWEEN.update(150) - test.equal(obj.x, 150) - test.equal(obj.y, -150) - - TWEEN.update(200) - test.equal(obj.x, 200) - test.equal(obj.y, -200) - test.done() - }, - - 'Test yoyo with repeat Infinity happens forever': function (test) { - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(Infinity).yoyo(true) - - t.start(0) - - TWEEN.update(0) - test.equal(obj.x, 0) - - TWEEN.update(25) - test.equal(obj.x, 25) - - TWEEN.update(100) - test.equal(obj.x, 100) - - TWEEN.update(125) - test.equal(obj.x, 75) - - TWEEN.update(200) - test.equal(obj.x, 0) - - TWEEN.update(225) - test.equal(obj.x, 25) - test.done() - }, - - 'Test yoyo with repeat 1 happens once': function (test) { - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1).yoyo(true) - - t.start(0) - - TWEEN.update(0) - test.equal(obj.x, 0) - - TWEEN.update(25) - test.equal(obj.x, 25) - - TWEEN.update(100) - test.equal(obj.x, 100) - - TWEEN.update(125) - test.equal(obj.x, 75) - - TWEEN.update(200) - test.equal(obj.x, 0) - - TWEEN.update(225) - test.equal(obj.x, 0) - test.done() - }, - - 'Test yoyo works with arrays': function (test) { - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj) - .to({x: [100, 200]}, 100) - .repeat(1) - .yoyo(true) - - t.start(0) - - TWEEN.update(50) - test.equal(obj.x, 100) - - TWEEN.update(100) - test.equal(obj.x, 200) - - TWEEN.update(150) - test.equal(obj.x, 100) - - TWEEN.update(200) - test.equal(obj.x, 0) - - test.done() - }, - - 'Test yoyo can be stopped and restarted properly': function (test) { - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1).yoyo(true) - - t.start(0) - - TWEEN.update(0) - test.equal(obj.x, 0) - - TWEEN.update(25) - test.equal(obj.x, 25) - - TWEEN.update(100) - test.equal(obj.x, 100) - - TWEEN.update(125) - test.equal(obj.x, 75) - - t.stop() - t.start(0) - - TWEEN.update(0) - test.equal(obj.x, 0) - - TWEEN.update(25) - test.equal(obj.x, 25) - - TWEEN.update(100) - test.equal(obj.x, 100) - - TWEEN.update(125) - test.equal(obj.x, 75) - - TWEEN.update(200) - test.equal(obj.x, 0) - - TWEEN.update(225) - test.equal(obj.x, 0) - - test.done() - }, - - 'Test TWEEN.Tween.stopChainedTweens()': function (test) { - var t = new TWEEN.Tween({}), - tStarted = false, - tCompleted = false, - t2 = new TWEEN.Tween({}), - t2Started = false - - TWEEN.removeAll() - - t.to({}, 1000) - t2.delay(500).to({}, 1000) - - t.chain(t2) - t2.chain(t) - - t.onStart(function () { - tStarted = true - }) - - t.onComplete(function () { - tCompleted = true - }) - - t2.onStart(function () { - test.equal(tStarted, true) - test.equal(tCompleted, true) - test.equal(t2Started, false) - t2Started = true - }) - - test.equal(tStarted, false) - test.equal(t2Started, false) - - t.start(0) - TWEEN.update(1001) - t.stop() - - test.equal(tStarted, true) - test.equal(t2Started, false) - test.equal(TWEEN.getAll().length, 0) - - test.done() - }, - - 'Test TWEEN.Tween.chain progressess into chained tweens': function (test) { - var obj = {t: 1000} - - // 1000 of nothing - var blank = new TWEEN.Tween({}).to({}, 1000) - - // tween obj.t from 1000 -> 2000 (in time with update time) - var next = new TWEEN.Tween(obj).to({t: 2000}, 1000) - - blank.chain(next).start(0) - - TWEEN.update(1500) - test.equal(obj.t, 1500) - - TWEEN.update(2000) - test.equal(obj.t, 2000) - - test.done() - }, - - 'Test that TWEEN.Tween.end sets the final values.': function (test) { - var object1 = {x: 0, y: -50, z: 1000} - var target1 = {x: 50, y: 123, z: '+234'} - - var tween1 = new TWEEN.Tween(object1).to(target1, 1000) - - tween1.start() - tween1.end() - - test.equal(object1.x, 50) - test.equal(object1.y, 123) - test.equal(object1.z, 1234) - - var object2 = {x: 0, y: -50, z: 1000} - var target2 = {x: 50, y: 123, z: '+234'} - - var tween2 = new TWEEN.Tween(object2).to(target2, 1000) - - tween2.start(300) - tween2.update(500) - tween2.end() - - test.equal(object2.x, 50) - test.equal(object2.y, 123) - test.equal(object2.z, 1234) - - test.done() - }, - - 'Test that TWEEN.Tween.end calls the onComplete callback of the tween.': function (test) { - test.expect(1) - - var tween1 = new TWEEN.Tween({}).to({}, 1000).onComplete(function () { - test.ok(true) - }) - - tween1.start() - tween1.end() - - test.done() - }, - - 'Ensure Tween.end() works after stopping a tween.': function (test) { - var object = {x: 0, y: -50, z: 1000} - var target = {x: 50, y: 123, z: '+234'} - - var tween = new TWEEN.Tween(object).to(target, 1000) - - tween.start(300) - tween.update(500) - tween.stop() - tween.end() - - test.equal(object.x, 50) - test.equal(object.y, 123) - test.equal(object.z, 1234) - - test.done() - }, - - 'Test delay adds delay before each repeat': function (test) { - // If repeatDelay isn't specified then delay is used since - // that's the way it worked before repeatDelay was added. - - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1).delay(100) - - t.start(0) - - TWEEN.update(100) - test.equal(obj.x, 0) - - TWEEN.update(150) - test.equal(obj.x, 50) - - TWEEN.update(200) - test.equal(obj.x, 100) - - TWEEN.update(250) - test.equal(obj.x, 100) - - TWEEN.update(300) - test.equal(obj.x, 0) - - TWEEN.update(350) - test.equal(obj.x, 50) - - TWEEN.update(400) - test.equal(obj.x, 100) - - test.done() - }, - - 'Test repeatDelay adds delay before each repeat': function (test) { - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1).repeatDelay(200) - - t.start(0) - - TWEEN.update(0) - test.equal(obj.x, 0) - - TWEEN.update(50) - test.equal(obj.x, 50) - - TWEEN.update(100) - test.equal(obj.x, 100) - - TWEEN.update(200) - test.equal(obj.x, 100) - - TWEEN.update(300) - test.equal(obj.x, 0) - - TWEEN.update(350) - test.equal(obj.x, 50) - - TWEEN.update(400) - test.equal(obj.x, 100) - - test.done() - }, - - 'Test repeatDelay and delay can be used together': function (test) { - TWEEN.removeAll() - - var obj = {x: 0}, - t = new TWEEN.Tween(obj).to({x: 100}, 100).delay(100).repeat(1).repeatDelay(200) - - t.start(0) - - TWEEN.update(100) - test.equal(obj.x, 0) - - TWEEN.update(150) - test.equal(obj.x, 50) - - TWEEN.update(200) - test.equal(obj.x, 100) - - TWEEN.update(300) - test.equal(obj.x, 100) - - TWEEN.update(400) - test.equal(obj.x, 0) - - TWEEN.update(450) - test.equal(obj.x, 50) - - TWEEN.update(500) - test.equal(obj.x, 100) - - test.done() - }, - - 'Tween.js compatible with Object.defineProperty getter / setters': function (test) { - var obj = {_x: 0} - - Object.defineProperty(obj, 'x', { - get: function () { - return this._x - }, - set: function (x) { - this._x = x - }, - }) - - test.equal(obj.x, 0) - - var t = new TWEEN.Tween(obj).to({x: 100}, 100) - - t.start(0) - - test.equal(obj.x, 0) - - TWEEN.update(37) - test.equal(obj.x, 37) - - TWEEN.update(100) - test.equal(obj.x, 100) - - TWEEN.update(115) - test.equal(obj.x, 100) - - test.done() - }, - - 'tween.isPlaying() is false before the tween starts': function (test) { - TWEEN.removeAll() - - var t = new TWEEN.Tween({x: 0}).to({x: 1}, 100) - - test.equal(t.isPlaying(), false) - - test.done() - }, - - 'tween.isPlaying() is true when a tween is started and before it ends': function (test) { - TWEEN.removeAll() - - var t = new TWEEN.Tween({x: 0}).to({x: 1}, 100) - t.start(0) - test.equal(t.isPlaying(), true) - - test.done() - }, - - 'tween.isPlaying() is false after a tween ends': function (test) { - TWEEN.removeAll() - - var t = new TWEEN.Tween({x: 0}).to({x: 1}, 100) - t.start(0) - TWEEN.update(150) - test.equal(t.isPlaying(), false) - - test.done() - }, - - 'A zero-duration tween finishes at its starting time without an error.': function (test) { - TWEEN.removeAll() - - let object = {x: 0} - var t = new TWEEN.Tween(object).to({x: 1}, 0) - t.start(0) - TWEEN.update(0) - - test.equal(t.isPlaying(), false) - test.equal(object.x, 1) - - test.done() - }, - - // Custom TWEEN.Group tests - - 'Custom group.getAll()': function (test) { - var group = new TWEEN.Group() - test.ok(group.getAll() instanceof Array) - test.done() - }, - - 'Custom group stores tweens instead of global TWEEN group': function (test) { - var group = new TWEEN.Group() - - var numGlobalTweensBefore = TWEEN.getAll().length - var numGroupTweensBefore = group.getAll().length - - var globalTween = new TWEEN.Tween({}) - var groupTweenA = new TWEEN.Tween({}, group) - var groupTweenB = new TWEEN.Tween({}, group) - - globalTween.start() - groupTweenA.start() - groupTweenB.start() - - test.equal(TWEEN.getAll().length, numGlobalTweensBefore + 1) - test.equal(group.getAll().length, numGroupTweensBefore + 2) - test.done() - }, - - "Custom group.removeAll() doesn't conflict with global TWEEN group": function (test) { - var group = new TWEEN.Group() - - TWEEN.removeAll() - group.removeAll() - - test.equal(TWEEN.getAll().length, 0, 'No global tweens left') - test.equal(group.getAll().length, 0, 'No group tweens left') - - var globalTween = new TWEEN.Tween({}) - var groupTweenA = new TWEEN.Tween({}, group) - var groupTweenB = new TWEEN.Tween({}, group) - - globalTween.start() - groupTweenA.start() - groupTweenB.start() - - test.equal(TWEEN.getAll().length, 1, 'One global tween has been added') - test.equal(group.getAll().length, 2, 'Two group tweens have been added') - - group.removeAll() - - test.equal(TWEEN.getAll().length, 1, 'One global tween left') - test.equal(group.getAll().length, 0, 'No group tweens left') - - TWEEN.removeAll() - - test.equal(TWEEN.getAll().length, 0, 'No global tweens left') - - test.done() - }, - - "Global TWEEN.removeAll() doesn't conflict with custom group": function (test) { - var group = new TWEEN.Group() - - TWEEN.removeAll() - group.removeAll() - - test.equal(TWEEN.getAll().length, 0, 'No global tweens left') - test.equal(group.getAll().length, 0, 'No group tweens left') - - var globalTween = new TWEEN.Tween({}) - var groupTweenA = new TWEEN.Tween({}, group) - var groupTweenB = new TWEEN.Tween({}, group) - - globalTween.start() - groupTweenA.start() - groupTweenB.start() - - test.equal(TWEEN.getAll().length, 1, 'One global tween has been added') - test.equal(group.getAll().length, 2, 'Two group tweens have been added') - - TWEEN.removeAll() - - test.equal(TWEEN.getAll().length, 0, 'No global tweens left') - test.equal(group.getAll().length, 2, 'Two group tweens left') - - group.removeAll() - - test.equal(group.getAll().length, 0, 'No group tweens left') - - test.done() - }, - - "Custom group.add() doesn't conflict with global TWEEN group, or vice versa": function (test) { - var group = new TWEEN.Group() - - var globalTween = new TWEEN.Tween({}) - var groupTweenA = new TWEEN.Tween({}, group) - var groupTweenB = new TWEEN.Tween({}, group) - - var numGlobalTweens = TWEEN.getAll().length - var numGroupTweens = group.getAll().length - - TWEEN.add(globalTween) - group.add(groupTweenA) - group.add(groupTweenB) - - test.equal(numGlobalTweens + 1, TWEEN.getAll().length) - test.equal(numGroupTweens + 2, group.getAll().length) - - test.done() - }, - - "Custom group.update() doesn't conflict with global TWEEN group": function (test) { - var group = new TWEEN.Group() - - var startObj = {x: 1} - var endObj = {x: 2} - var duration = 1000 - - var globalObj = {x: 1} - var globalTween = new TWEEN.Tween(globalObj).to(endObj, duration).start(0) - - var groupObj = {x: 1} - var groupTween = new TWEEN.Tween(groupObj, group).to(endObj, duration).start(0) - - group.update(duration) - - test.deepEqual(globalObj, startObj) - test.deepEqual(groupObj, endObj) - test.done() - }, - - "Global TWEEN.update() doesn't conflict with custom group": function (test) { - var group = new TWEEN.Group() - - var startObj = {x: 1} - var endObj = {x: 2} - var duration = 1000 - - var globalObj = {x: 1} - var globalTween = new TWEEN.Tween(globalObj).to(endObj, duration).start(0) - - var groupObj = {x: 1} - var groupTween = new TWEEN.Tween(groupObj, group).to(endObj, duration).start(0) - - TWEEN.update(duration) - - test.deepEqual(globalObj, endObj) - test.deepEqual(groupObj, startObj) - test.done() - }, - - 'Ensure tweens work without any group': function (test) { - var obj = {x: 0}, - t = new TWEEN.Tween(obj, false) - - t.to({x: 1000}, 1000) - - t.start(0) - test.equal(obj.x, 0) - t.update(500) - test.equal(obj.x, 500) - t.pause(600) - test.equal(obj.x, 500) - t.update(750) - test.equal(obj.x, 500) - t.resume(800) - test.equal(obj.x, 500) - t.update(1000) - test.equal(obj.x, 800) - t.update(1001) - test.equal(obj.x, 801) - t.stop().end() - test.equal(obj.x, 1000) - - test.done() - }, - - 'Stopping a tween within an update callback will not cause an error.': function (test) { - TWEEN.removeAll() - - var tweenA = new TWEEN.Tween({x: 1, y: 2}) - .to({x: 3, y: 4}, 1000) - .onUpdate(function (values) { - tweenB.stop() - }) - .start(0) - var tweenB = new TWEEN.Tween({x: 5, y: 6}) - .to({x: 7, y: 8}) - .onUpdate(function (values) { - tweenA.stop() - }) - .start(0) - - let success = true - - try { - TWEEN.update(500) - } catch (exception) { - success = false - } finally { - test.ok(success) - test.done() - } - }, - - 'Set the duration with .duration': function (test) { - var obj = {x: 1} - var t = new TWEEN.Tween(obj).to({x: 2}).duration(1000).start(0) - - t.update(1000) - - test.deepEqual(obj.x, 2) - test.done() - }, - - "Tween.group sets the tween's group.": function (test) { - var group = new TWEEN.Group() - - var groupTweenA = new TWEEN.Tween({}).group(group) - - groupTweenA.start() - - test.equal(group.getAll().length, 1) - test.done() - }, - - 'Test TWEEN.Tween.pause() and TWEEN.Tween.resume()': function (test) { - var obj = {x: 0.0}, - t = new TWEEN.Tween(obj) - - t.to({x: 1.0}, 1000) - - TWEEN.removeAll() - test.equal(TWEEN.getAll().length, 0) - - t.start(0) - test.equal(TWEEN.getAll().length, 1) - test.equal(t.isPaused(), false) - - TWEEN.update(400) - test.equal(obj.x, 0.4) - - t.pause(450) - test.equal(t.isPaused(), true) - test.equal(TWEEN.getAll().length, 0) - test.equal(obj.x, 0.4) - - TWEEN.update(900) - test.equal(obj.x, 0.4) - - TWEEN.update(3000) - test.equal(obj.x, 0.4) - - t.resume(3200) - // values do not change until an update - test.equal(obj.x, 0.4) - test.equal(TWEEN.getAll().length, 1) - test.equal(t.isPaused(), false) - - TWEEN.update(3500) - test.equal(obj.x, 0.75) - - TWEEN.update(5000) - test.equal(obj.x, 1.0) - test.done() - }, - - 'Test TWEEN.Tween.pause() and TWEEN.Tween.resume(), without groups': function (test) { - var obj = {x: 0.0}, - t = new TWEEN.Tween(obj, false) - - t.to({x: 1.0}, 1000) - - t.start(0) - test.equal(t.isPaused(), false) - - t.update(400) - test.equal(obj.x, 0.4) - - t.pause(450) - test.equal(t.isPaused(), true) - test.equal(obj.x, 0.4) - - t.update(900) - test.equal(obj.x, 0.4) - - t.update(3000) - test.equal(obj.x, 0.4) - - t.resume(3200) - // values do not change until an update - test.equal(obj.x, 0.4) - test.equal(t.isPaused(), false) - - t.update(3500) - test.equal(obj.x, 0.75) - - t.update(5000) - test.equal(obj.x, 1.0) - test.done() - }, - - 'Arrays in the object passed to to() are not modified by start().': function (test) { - var start = {x: 10, y: 20} - var end = {x: 100, y: 200, values: ['a', 'b']} - var valuesArray = end.values - new TWEEN.Tween(start).to(end).start() - test.equal(valuesArray, end.values) - test.equal(end.values.length, 2) - test.equal(end.values[0], 'a') - test.equal(end.values[1], 'b') - test.done() - }, - - 'Tween.js animate nested object': function (test) { - var obj = {scale: {x: 0}, alpha: 0} - - var t = new TWEEN.Tween(obj).to({scale: {x: 100}, alpha: 100}, 100) - t.start(0) - - test.equal(obj.scale.x, 0) - - TWEEN.update(37) - test.equal(obj.scale.x, 37) - test.equal(obj.alpha, 37) - - TWEEN.update(100) - test.equal(obj.scale.x, 100) - test.equal(obj.alpha, 100) - - TWEEN.update(115) - test.equal(obj.scale.x, 100) - test.equal(obj.alpha, 100) - - test.done() - }, - - 'Tween.js animate nested object including relative value': function (test) { - var obj = {world: {hero: {scale: {x: 0}, x: 100}}, time: 0} - - var t = new TWEEN.Tween(obj).to({world: {hero: {scale: {x: 100}, x: '+100'}}, time: 100}, 100) - t.start(0) - - test.equal(obj.world.hero.scale.x, 0) - - TWEEN.update(37) - test.equal(obj.world.hero.scale.x, 37) - test.equal(obj.world.hero.x, 137) - test.equal(obj.time, 37) - - TWEEN.update(100) - test.equal(obj.world.hero.scale.x, 100) - test.equal(obj.world.hero.x, 200) - test.equal(obj.time, 100) - - TWEEN.update(115) - test.equal(obj.world.hero.scale.x, 100) - test.equal(obj.world.hero.x, 200) - test.equal(obj.time, 100) - - test.done() - }, - - 'Test TWEEN.Tween with nested objects': function (test) { - var obj = {x: 0.0, y: 100, some: {value: 0.0, style: {opacity: 1.0}}}, - t = new TWEEN.Tween(obj) - - t.to({x: 1.0, y: 200, some: {value: 1.0, style: {opacity: 0.5}}}, 1000) - - TWEEN.removeAll() - - test.equal(TWEEN.getAll().length, 0) - - t.start(0) - - test.equal(TWEEN.getAll().length, 1) - test.equal(t.isPaused(), false) - - TWEEN.update(400) - - test.equal(obj.x, 0.4) - test.equal(obj.y, 140) - test.equal(obj.some.style.opacity, 0.8) - test.equal(obj.some.value, 0.4) - - TWEEN.update(750) - - test.equal(obj.x, 0.75) - test.equal(obj.y, 175) - test.equal(obj.some.style.opacity, 0.625) - test.equal(obj.some.value, 0.75) - - TWEEN.update(1000) - - test.equal(obj.x, 1.0) - test.equal(obj.y, 200) - test.equal(obj.some.style.opacity, 0.5) - test.equal(obj.some.value, 1.0) - - test.done() - }, - - 'Test TWEEN.Tween.pause() and .resume() with nested objects': function (test) { - var obj = {x: 0.0, y: 100, some: {value: 0.0}}, - t = new TWEEN.Tween(obj) - - t.to({x: 1.0, y: 200, some: {value: 1.0}}, 1000) - - TWEEN.removeAll() - - test.equal(TWEEN.getAll().length, 0) - - t.start(0) - - test.equal(TWEEN.getAll().length, 1) - test.equal(t.isPaused(), false) - - TWEEN.update(400) - - test.equal(obj.x, 0.4) - test.equal(obj.y, 140) - test.equal(obj.some.value, 0.4) - - t.pause(450) - - test.equal(t.isPaused(), true) - test.equal(TWEEN.getAll().length, 0) - test.equal(obj.x, 0.4) - test.equal(obj.y, 140) - test.equal(obj.some.value, 0.4) - - TWEEN.update(900) - - test.equal(obj.x, 0.4) - test.equal(obj.y, 140) - test.equal(obj.some.value, 0.4) - - TWEEN.update(3000) - - test.equal(obj.x, 0.4) - test.equal(obj.y, 140) - test.equal(obj.some.value, 0.4) - - t.resume(3200) - - // values do not change until an update - test.equal(obj.x, 0.4) - test.equal(obj.y, 140) - test.equal(obj.some.value, 0.4) - - test.equal(TWEEN.getAll().length, 1) - test.equal(t.isPaused(), false) - - TWEEN.update(3500) - - test.equal(obj.x, 0.75) - test.equal(obj.y, 175) - test.equal(obj.some.value, 0.75) - - TWEEN.update(5000) - - test.equal(obj.x, 1.0) - test.equal(obj.y, 200) - test.equal(obj.some.value, 1.0) - - test.done() - }, - } - - return tests - } - - if (typeof module !== 'undefined' && module.exports) { - module.exports = getTests - } else { - this.getTests = getTests - } -}.call(this) From c6db2aba0f64c587f2e6986e0748a1a88686bc60 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Fri, 23 Oct 2020 16:22:17 -0700 Subject: [PATCH 022/107] chore: mention the test file in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9307b9c6..91a8ffda 100644 --- a/README.md +++ b/README.md @@ -245,7 +245,7 @@ To run the tests run: npm test ``` -If you want to add any feature or change existing features, you _must_ run the tests to make sure you didn't break anything else. Any pull request (PR) needs to have updated passing tests for feature changes (or new passing tests for new features), otherwise the PR won't be accepted. See [contributing](CONTRIBUTING.md) for more information. +If you want to add any feature or change existing features, you _must_ run the tests to make sure you didn't break anything else. Any pull request (PR) needs to have updated passing tests for feature changes (or new passing tests for new features) in `src/tests.ts`, otherwise the PR won't be accepted. See [contributing](CONTRIBUTING.md) for more information. ## People From 1e0c8aeca5b19a81ad549605e2a6a6e3798572fc Mon Sep 17 00:00:00 2001 From: Lukasz Guminski Date: Mon, 6 Jul 2020 02:22:40 +0200 Subject: [PATCH 023/107] unit tests and examples for #555 --- .../07b_dynamic_to_an_array_of_values.html | 174 ++++++++++++++++ ...to_an_variable_length_array_of_values.html | 194 ++++++++++++++++++ src/tests.ts | 85 ++++++++ 3 files changed, 453 insertions(+) create mode 100644 examples/07b_dynamic_to_an_array_of_values.html create mode 100644 examples/07c_dynamic_to_an_variable_length_array_of_values.html diff --git a/examples/07b_dynamic_to_an_array_of_values.html b/examples/07b_dynamic_to_an_array_of_values.html new file mode 100644 index 00000000..aab0b818 --- /dev/null +++ b/examples/07b_dynamic_to_an_array_of_values.html @@ -0,0 +1,174 @@ + + + + Tween.js / dynamic to + + + + + +
+

tween.js

+

07b _ dynamic to an array of values

+

tweening towards moving targets

+
+ +
+ + + + + + diff --git a/examples/07c_dynamic_to_an_variable_length_array_of_values.html b/examples/07c_dynamic_to_an_variable_length_array_of_values.html new file mode 100644 index 00000000..c1ce2c05 --- /dev/null +++ b/examples/07c_dynamic_to_an_variable_length_array_of_values.html @@ -0,0 +1,194 @@ + + + + Tween.js / dynamic to + + + + + +
+

tween.js

+

07c _ dynamic to a variable length array of values

+

tweening towards moving targets

+
+ +
+ + + + + + diff --git a/src/tests.ts b/src/tests.ts index d0d94c28..0f86a59b 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1917,12 +1917,97 @@ export const tests = { test.done() }, + + 'Test TWEEN.Tween.to() with a dynamic target provided as object'(test: Test): void { + TWEEN.removeAll() + + const dynamicTargetValue = {x: 5} + const chasingValue = {x: 0} + const duration = 1000 // must be even + const t1 = new TWEEN.Tween(dynamicTargetValue).to({x: 10}, duration), + t2 = new TWEEN.Tween(chasingValue).to(dynamicTargetValue, duration) + + test.equal(TWEEN.getAll().length, 0) + + t1.start(0) + t2.start(0) + test.notDeepEqual(chasingValue, dynamicTargetValue) + + TWEEN.update(duration / 2, true) + test.notDeepEqual(chasingValue, dynamicTargetValue) + + TWEEN.update(duration, true) + test.deepEqual(chasingValue, dynamicTargetValue) + + test.done() + }, + + 'Test TWEEN.Tween.to() with a dynamic target provided as array': function (test: Test): void { + TWEEN.removeAll() + + const dynamicTargetValue = [5] + const chasingValue = [0] + const duration = 1000 // must be even + const t1 = new TWEEN.Tween(dynamicTargetValue).to([10], duration), + t2 = new TWEEN.Tween(chasingValue).to(dynamicTargetValue, duration) + + test.equal(TWEEN.getAll().length, 0) + + t1.start(0) + t2.start(0) + test.notDeepEqual(chasingValue, dynamicTargetValue) + + TWEEN.update(duration / 2, true) + test.notDeepEqual(chasingValue, dynamicTargetValue) + + TWEEN.update(duration, true) + test.deepEqual(chasingValue, dynamicTargetValue) + + test.done() + }, + + 'Test TWEEN.Tween.to() with multiple dynamic targets provided as array': function (test: Test): void { + TWEEN.removeAll() + + const dynamicTargetValues = {x: [5, 10, 15, 20]} + const chasingValue = {x: 0} + const duration = 1000 // must be even + const tweens = [] + + const observedValues = [] + for (let i = 0; i < dynamicTargetValues.x.length; i++) { + const initialValue = {x: 2} + observedValues.push(initialValue) + tweens.push( + new TWEEN.Tween(initialValue).to({x: dynamicTargetValues.x[i]}, duration).onUpdate(function (object) { + dynamicTargetValues.x[i] = object.x + }), + ) + } + const t = new TWEEN.Tween(chasingValue).to(dynamicTargetValues, duration) + + test.equal(TWEEN.getAll().length, 0) + + tweens.forEach(tween => tween.start(0)) + t.start(0) + + test.equal(TWEEN.getAll().length, tweens.length + 1) + + for (let intermediateStop = 0; intermediateStop < dynamicTargetValues.x.length; intermediateStop++) { + const progress = ((intermediateStop + 1) * duration) / dynamicTargetValues.x.length + TWEEN.update(progress, true) + test.deepEqual(chasingValue, observedValues[intermediateStop]) + } + + test.done() + }, } type Test = { ok(a: unknown, failMessage?: string): void equal(a: unknown, b: unknown, failMessage?: string): void deepEqual(a: unknown, b: unknown, failMessage?: string): void + notDeepEqual(a: unknown, b: unknown, failMessage?: string): void expect(n: number): void done(): void } From 98c8064a338b36185e3b89a6e32d977dbfef6680 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 24 Oct 2020 17:23:40 -0700 Subject: [PATCH 024/107] breaking: add a dynamic option controls whether objects and arrays passed to `Tween.to()` can be dynamically modified during animation. Adds a new `dynamic` option to the `to()` method. If set to true, objects are passed in an used directly by Tween. This allows outside code to modify values dynamically during animation (including interpolated array values). Tween will modify the initial interpolation arrays. If `dynamic` is set to false, the object passed in will be copied and will never be modified, but in this case it is not possible to modify the object values dynamically during animation. The breaking change is that, when dynamic is false, Tween makes a non-inheriting hard copy of the object passed into `to()` instead of making an prototypal "copy" that inherits values from the original object. The reason for this breaking change is that now things are consistent: when `dynamic` is set to `false` (the default) no object passed into `Tween.to()` will ever be modified AND those objects can never be used for dynamic updates (whereas before, objects could be dynamic, but arrays were not). Likewise, when `dynamic` is `true`, then both objects and arrays can be modified on the outside and Tween will animate based on those changes. --- docs/user_guide.md | 31 ++- docs/user_guide_zh-CN.md | 2 + examples/07_dynamic_to.html | 158 +++++------- examples/07a_dynamic_to_two_array_values.html | 122 +++++++++ .../07b_dynamic_to_an_array_of_values.html | 241 +++++++++--------- ...to_an_variable_length_array_of_values.html | 194 -------------- examples/js/drawings.js | 51 ++++ src/Tween.ts | 92 ++++--- src/tests.ts | 84 ++++-- 9 files changed, 514 insertions(+), 461 deletions(-) create mode 100644 examples/07a_dynamic_to_two_array_values.html delete mode 100644 examples/07c_dynamic_to_an_variable_length_array_of_values.html create mode 100644 examples/js/drawings.js diff --git a/docs/user_guide.md b/docs/user_guide.md index 722b6e1b..b7cb4b61 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -135,7 +135,22 @@ The `start` method also accepts a `time` parameter. If you use it, the tween won ### `update` -Individual tweens also have an `update` method---this is in fact called by `TWEEN.update`. You generally don't need to call this directly, but might be useful if you're doing _crazy hacks_. +Individual tweens have an `update` method. This is in fact called by `TWEEN.update` for tweens that have been constructed with only one argument. + +In the following example, the second argument tells the new Tween not to add itself to the default group (`TWEEN` is an instance of `TWEEN.Group`). If the tween is not associated with a group (note that a group can be associated by passing it in as the second arg to the constructor), then the tween needs to be updated manually using its `updated` method like so: + +```js +const tween = new TWEEN.Tween(someObject, false).to(/*...*/).start() + +function animate(time) { + tween.update(time) + requestAnimationFrame(animate) +} +``` + +_IMPORTANT!_ You don't need to call `tween.update()` directly if you're using `TWEEN.update()` as a way to control all tweens by default, however we recommend that you either [make your own groups of tweens](#controlling-groups-of-tweens) or manually update your tweens directly as in the last example. The concept of using groups or individually-controlled tweens is much like the practice of avoiding use of global variables in your JavaScript code: it prevents one component from accidentally ruining the behavior of some other unrelated component. + +Using `TWEEN` to control your tweens is like using globals: and it is only good for simple cases (f.e. small demos, prototypes, etc) but it may not scale well for big apps that may have different parts that need to animate tweens on differing schedules. ### `chain` @@ -203,9 +218,19 @@ tween.start() The first iteration of the tween will happen after one second, the second iteration will happen a half second after the first iteration ends, the third iteration will happen a half second after the second iteration ends, etc. If you want to delay the initial iteration but you don't want any delay between iterations, then make sure to call `tween.repeatDelay(0)`. +### `dynamic` + +If `dynamic` is set to `true` (it defaults to `false`) objects passed to `tween.to()` can be modified on the outside of a tween while the tween is animating. This can be used to dynamically modify the outcome of a tween while it is running. + +See the [Dynamic to](http://tweenjs.github.io/tween.js/examples/07_dynamic_to.html) example. In that example, in both scenes, the position of the rabbit is updated during the animation. The rabbit position happens to be the object passed into the fox's `tween.to()` method. As the rabbit position is updated, in the first scene with `.dynamic(false)` the fox moves towards the initial position of the rabbit and does not chase the rabbit, and in the second scene with `.dynamic(true)` the final destination of the fox is hence also updated which makes the fox chase the rabbit. + +See the other `dynamic to` examples for more ideas. + +_IMPORTANT!_ When `dynamic` is set to `false`, Tween makes a copy of the object passed into `tween.to()` and will never modify it (hence updating the original object from the outside is not dynamic. When `dynamic` is `true`, Tween uses the original object as the source of values during animation (every update reads the values, hence they can be modified dynamicall) but note that in this mode, Tween will modify any interpolation arrays of the object passed into `tween.to()` which may cause side-effects on any external code that may also rely on the same object. + ## Controlling _all_ the tweens -The following methods are found in the TWEEN global object, and you generally won't need to use most of them, except for `update`. +The following methods are found in the TWEEN global object, and you generally won't need to use most of them, except for `update`. `TWEEN` is effectively an instance of `TWEEN.Group`, and by default all new Tweens are associated to this global `Group` unless otherwise specified (see the next section on grouping tweens with your own Groups). ### `TWEEN.update(time)` @@ -471,7 +496,7 @@ var tween = new TWEEN.Tween({top: 0, left: 0}).to({top: 100, left: 100}, 1000).o If you want to read more about this, have a look at [this article](http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/). -However, if your animation needs are _that_ simple, it might be better to just use CSS animations or transitions, where applicable, so that the browser can optimise as much as possible. Tween.js is most useful when your animation needs involve complex arrangements, i.e. you need to sync several tweens together, have some start after one has finished, loop them a number of times, etc. +However, if your animation needs are _that_ simple, it might be better to just use CSS animations or transitions, where applicable, so that the browser can optimise as much as possible. Tween.js is most useful when your animation needs involve complex arrangements, i.e. you need to sync several tweens together, have some start after one has finished, loop them a number of times, have graphics that are not rendered with CSS but with Canvas or WebGL, etc. ### Be good to the Garbage collector (alias the GC) diff --git a/docs/user_guide_zh-CN.md b/docs/user_guide_zh-CN.md index 21d10606..fb7b2b05 100644 --- a/docs/user_guide_zh-CN.md +++ b/docs/user_guide_zh-CN.md @@ -1,5 +1,7 @@ ## tween 是什么?如何使用?你为什么想用它? +中文用户指南最近更新为 Tween.js v18.5.0 + 补间(动画)(来自 [in-between](https://en.wikipedia.org/wiki/Inbetweening))是一个概念,允许你以平滑的方式更改对象的属性。你只需告诉它哪些属性要更改,当补间结束运行时它们应该具有哪些最终值,以及这需要多长时间,补间引擎将负责计算从起始点到结束点的值。 例如,`position`对象拥有`x`和`y`两个坐标: diff --git a/examples/07_dynamic_to.html b/examples/07_dynamic_to.html index dcda6ab0..537f923f 100644 --- a/examples/07_dynamic_to.html +++ b/examples/07_dynamic_to.html @@ -8,9 +8,11 @@ margin: 0px; } - #target { + #scene1, + #scene2 { + display: inline-block; font-size: 13px; - padding: 0px 32px; + padding-right: 32px; } @@ -20,102 +22,76 @@

tween.js

07 _ dynamic to

tweening towards a moving target

- -
+
+

.dynamic(false)

+
+
+

.dynamic(true)

+
+ - diff --git a/examples/07a_dynamic_to_two_array_values.html b/examples/07a_dynamic_to_two_array_values.html new file mode 100644 index 00000000..dfdb395d --- /dev/null +++ b/examples/07a_dynamic_to_two_array_values.html @@ -0,0 +1,122 @@ + + + + Tween.js / dynamic to, two objects + + + + + +
+

tween.js

+

07a _ dynamic to, two rabbits

+

tweening towards two moving targets

+ +
+

.dynamic(false)

+
+
+

.dynamic(true)

+
+
+ + + + + + diff --git a/examples/07b_dynamic_to_an_array_of_values.html b/examples/07b_dynamic_to_an_array_of_values.html index aab0b818..92f7f4da 100644 --- a/examples/07b_dynamic_to_an_array_of_values.html +++ b/examples/07b_dynamic_to_an_array_of_values.html @@ -8,9 +8,11 @@ margin: 0px; } - #target { + #scene1, + #scene2 { + display: inline-block; font-size: 13px; - padding: 0px 32px; + padding-right: 32px; } @@ -19,156 +21,143 @@

tween.js

07b _ dynamic to an array of values

-

tweening towards moving targets

+

tweening towards many random moving targets

+ +
+

.dynamic(false)

+
+
+

.dynamic(true)

+
-
- - diff --git a/examples/07c_dynamic_to_an_variable_length_array_of_values.html b/examples/07c_dynamic_to_an_variable_length_array_of_values.html deleted file mode 100644 index c1ce2c05..00000000 --- a/examples/07c_dynamic_to_an_variable_length_array_of_values.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - Tween.js / dynamic to - - - - - -
-

tween.js

-

07c _ dynamic to a variable length array of values

-

tweening towards moving targets

-
- -
- - - - - - diff --git a/examples/js/drawings.js b/examples/js/drawings.js new file mode 100644 index 00000000..e2d78b47 --- /dev/null +++ b/examples/js/drawings.js @@ -0,0 +1,51 @@ +export function drawRabbit(context, x, y, color, opacity = 1) { + context.save() + + context.fillStyle = color + context.globalAlpha = opacity + + context.translate(x, y) + + context.beginPath() + context.moveTo(0, 0) + context.bezierCurveTo(15, 0, 15, -40, 5, -30) + context.lineTo(0, 0) + context.bezierCurveTo(-15, 0, -15, -40, -5, -30) + context.lineTo(0, 0) + context.closePath() + context.fill() + + context.beginPath() + context.arc(0, 0, 15, 0, Math.PI * 2, true) + context.closePath() + context.fill() + + context.restore() +} + +export function drawFox(context, x, y, color) { + context.save() + + context.fillStyle = color + + context.translate(x, y - 13) + context.scale(1.2, 1.2) + + context.beginPath() + context.moveTo(4, 24) + context.lineTo(8, 16) + context.lineTo(14, 10) + context.lineTo(15, 0) + context.lineTo(9, -10) + context.lineTo(2, 0) + context.lineTo(-2, 0) + context.lineTo(-9, -10) + context.lineTo(-15, 0) + context.lineTo(-14, 10) + context.lineTo(-8, 16) + context.lineTo(-4, 24) + context.closePath() + context.fill() + + context.restore() +} diff --git a/src/Tween.ts b/src/Tween.ts index a7e85763..b01ea71a 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -24,6 +24,7 @@ export class Tween { private _valuesEnd: Record = {} private _valuesStartRepeat: UnknownProps = {} private _duration = 1000 + private _isDynamic = false private _initialRepeat = 0 private _repeat = 0 private _repeatDelayTime?: number @@ -44,6 +45,7 @@ export class Tween { private _onStopCallback?: (object: T) => void private _id = Sequence.nextId() private _isChainStopped = false + private _propertiesAreSetUp = false constructor(private _object: T, private _group: Group | false = mainGroup) {} @@ -59,22 +61,24 @@ export class Tween { return this._isPaused } - to(properties: UnknownProps, duration?: number): this { - // TODO? restore this, then update the 07_dynamic_to example to set fox - // tween's to on each update. That way the behavior is opt-in (there's - // currently no opt-out). - // for (const prop in properties) this._valuesEnd[prop] = properties[prop] - this._valuesEnd = Object.create(properties) + to(target: UnknownProps, duration = 1000): this { + if (this._isPlaying) + throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.') - if (duration !== undefined) { - this._duration = duration - } + this._valuesEnd = target + this._propertiesAreSetUp = false + this._duration = duration + + return this + } + duration(duration = 1000): this { + this._duration = duration return this } - duration(d = 1000): this { - this._duration = d + dynamic(dynamic = false): this { + this._isDynamic = dynamic return this } @@ -111,7 +115,17 @@ export class Tween { this._startTime = time !== undefined ? (typeof time === 'string' ? now() + parseFloat(time) : time) : now() this._startTime += this._delayTime - this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat) + if (!this._propertiesAreSetUp) { + this._propertiesAreSetUp = true + + if (!this._isDynamic) { + const tmp: Record = {} + for (const prop in this._valuesEnd) tmp[prop] = this._valuesEnd[prop] + this._valuesEnd = tmp + } + + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat) + } return this } @@ -123,10 +137,10 @@ export class Tween { _valuesStartRepeat: UnknownProps, ): void { for (const property in _valuesEnd) { - const startValue = _object[property] + const startValue = _object[property] as number | Record const startValueIsArray = Array.isArray(startValue) const propType = startValueIsArray ? 'array' : typeof startValue - const isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]) + let isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]) // If `to()` specifies a property that doesn't exist in the source object, // we should not set that property in the object @@ -136,35 +150,53 @@ export class Tween { // Check if an Array was provided as property value if (isInterpolationList) { - let endValues = _valuesEnd[property] as Array + const endValues = _valuesEnd[property] as Array if (endValues.length === 0) { continue } - // handle an array of relative values - endValues = endValues.map(this._handleRelativeValue.bind(this, startValue as number)) + // Handle an array of relative values. + // Creates a local copy of the Array with the start value at the front + // endValues = endValues.map(this._handleRelativeValue.bind(this, startValue)) + const temp = [startValue as number] + for (let i = 0, l = endValues.length; i < l; i += 1) { + const value = this._handleRelativeValue(startValue as number, endValues[i]) + if (isNaN(value)) { + isInterpolationList = false + console.warn('Found invalid interpolation list. Skipping.') + break + } + temp.push(value) + } - // Create a local copy of the Array with the start value at the front - _valuesEnd[property] = [startValue].concat(endValues) + if (isInterpolationList) { + // _valuesEnd[property] = [startValue].concat(endValues) + _valuesEnd[property] = temp + } } // handle the deepness of the values if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) { _valuesStart[property] = startValueIsArray ? [] : {} + const nestedObject = startValue as Record - // eslint-disable-next-line - for (const prop in startValue as object) { - // eslint-disable-next-line - // @ts-ignore FIXME? - _valuesStart[property][prop] = startValue[prop] + for (const prop in nestedObject) { + _valuesStart[property][prop] = nestedObject[prop] } - _valuesStartRepeat[property] = startValueIsArray ? [] : {} // TODO? repeat nested values? And yoyo? And array values? + // TODO? repeat nested values? And yoyo? And array values? + _valuesStartRepeat[property] = startValueIsArray ? [] : {} - // eslint-disable-next-line - // @ts-ignore FIXME? - this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property]) + let endValues = _valuesEnd[property] + + if (!this._isDynamic) { + const tmp: Record = {} + for (const prop in endValues) tmp[prop] = endValues[prop] + _valuesEnd[property] = endValues = tmp + } + + this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property]) } else { // Save the starting value, but only once. if (typeof _valuesStart[property] === 'undefined') { @@ -472,9 +504,9 @@ export class Tween { if (end.charAt(0) === '+' || end.charAt(0) === '-') { return start + parseFloat(end) - } else { - return parseFloat(end) } + + return parseFloat(end) } private _swapEndStartRepeatValues(property: string): void { diff --git a/src/tests.ts b/src/tests.ts index 0f86a59b..fedaa372 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -548,6 +548,7 @@ export const tests = { const fox = {x: 0, y: 0} const tf = new TWEEN.Tween(fox) tf.to(rabbit, 1000) // fox chase rabbit! + tf.dynamic(true) tf.start(0) tr.update(200) @@ -1752,15 +1753,51 @@ export const tests = { test.done() }, - 'Arrays in the object passed to to() are not modified by start().'(test: Test): void { - const start = {x: 10, y: 20} - const end = {x: 100, y: 200, values: ['a', 'b']} - const valuesArray = end.values + 'Arrays in the object passed to to() are not modified by start() if dynamic is false.'(test: Test): void { + const start = {x: 10, y: 20, z: 30} + const end = {x: 100, y: 200, z: ['+10', '-10']} + const valuesArray = end.z new TWEEN.Tween(start).to(end).start() - test.equal(valuesArray, end.values) - test.equal(end.values.length, 2) - test.equal(end.values[0], 'a') - test.equal(end.values[1], 'b') + test.equal(valuesArray, end.z) + test.equal(end.z.length, 2) + test.equal(end.z[0], '+10') + test.equal(end.z[1], '-10') + test.done() + }, + + 'Arrays in the object passed to to() are modified by start() if dynamic is true.'(test: Test): void { + const start = {x: 10, y: 20, z: 30} + const end = {x: 100, y: 200, z: ['+10', '-10']} + const valuesArray = end.z + test.equal(end.z.length, 2) + new TWEEN.Tween(start).to(end).dynamic(true).start() + test.notEqual(valuesArray, end.z) + test.equal(end.z.length, 3) + test.equal(end.z[0], 30) + test.equal(end.z[1], 40) + test.equal(end.z[2], 20) + test.done() + }, + + 'Arrays in the object passed to to() are not modified by start() if they are not interpolation arrays, regardless of dynamic.'( + test: Test, + ): void { + // eslint-disable-next-line + function testWithDynamic(start: any, end: any, dynamic: boolean): void { + // const start = {x: 10, y: 20, z: [1, 2]} + // const end = {x: 100, y: 200, z: ['a', 'b']} + const valuesArray = end.z + new TWEEN.Tween(start).to(end).dynamic(dynamic).start() + test.equal(valuesArray, end.z) + test.equal(end.z.length, 2) + test.equal(end.z[0], 'a') + test.equal(end.z[1], 'b') + } + + testWithDynamic({x: 10, y: 20, z: [1, 2]}, {x: 100, y: 200, z: ['a', 'b']}, true) + testWithDynamic({x: 10, y: 20, z: [1, 2]}, {x: 100, y: 200, z: ['a', 'b']}, false) + testWithDynamic({x: 10, y: 20, z: 30}, {x: 100, y: 200, z: ['a', 'b']}, true) + testWithDynamic({x: 10, y: 20, z: 30}, {x: 100, y: 200, z: ['a', 'b']}, false) test.done() }, @@ -1925,7 +1962,7 @@ export const tests = { const chasingValue = {x: 0} const duration = 1000 // must be even const t1 = new TWEEN.Tween(dynamicTargetValue).to({x: 10}, duration), - t2 = new TWEEN.Tween(chasingValue).to(dynamicTargetValue, duration) + t2 = new TWEEN.Tween(chasingValue).to(dynamicTargetValue, duration).dynamic(true) test.equal(TWEEN.getAll().length, 0) @@ -1949,7 +1986,7 @@ export const tests = { const chasingValue = [0] const duration = 1000 // must be even const t1 = new TWEEN.Tween(dynamicTargetValue).to([10], duration), - t2 = new TWEEN.Tween(chasingValue).to(dynamicTargetValue, duration) + t2 = new TWEEN.Tween(chasingValue).to(dynamicTargetValue, duration).dynamic(true) test.equal(TWEEN.getAll().length, 0) @@ -1969,22 +2006,27 @@ export const tests = { 'Test TWEEN.Tween.to() with multiple dynamic targets provided as array': function (test: Test): void { TWEEN.removeAll() - const dynamicTargetValues = {x: [5, 10, 15, 20]} + const dynamicTargetValues = {x: [4, 10, 12, 20]} const chasingValue = {x: 0} const duration = 1000 // must be even const tweens = [] const observedValues = [] for (let i = 0; i < dynamicTargetValues.x.length; i++) { - const initialValue = {x: 2} + const initialValue = {x: 0} observedValues.push(initialValue) tweens.push( new TWEEN.Tween(initialValue).to({x: dynamicTargetValues.x[i]}, duration).onUpdate(function (object) { - dynamicTargetValues.x[i] = object.x + // TODO the fact that we need `index + 1` instead of just + // `index` here is confusing. It is because Tween adds an + // axtra start value at the beginning of the array. Update + // Tween so it does not add the start value to the array, + // and instead reads it from _valuesStart. + dynamicTargetValues.x[i + 1] = object.x }), ) } - const t = new TWEEN.Tween(chasingValue).to(dynamicTargetValues, duration) + const t = new TWEEN.Tween(chasingValue).to(dynamicTargetValues, duration).dynamic(true) test.equal(TWEEN.getAll().length, 0) @@ -1993,10 +2035,10 @@ export const tests = { test.equal(TWEEN.getAll().length, tweens.length + 1) - for (let intermediateStop = 0; intermediateStop < dynamicTargetValues.x.length; intermediateStop++) { - const progress = ((intermediateStop + 1) * duration) / dynamicTargetValues.x.length + for (let i = 0; i < tweens.length; i++) { + const progress = ((i + 1) * duration) / tweens.length TWEEN.update(progress, true) - test.deepEqual(chasingValue, observedValues[intermediateStop]) + test.equal(chasingValue.x, observedValues[i].x) } test.done() @@ -2006,8 +2048,16 @@ export const tests = { type Test = { ok(a: unknown, failMessage?: string): void equal(a: unknown, b: unknown, failMessage?: string): void + notEqual(a: unknown, b: unknown, failMessage?: string): void deepEqual(a: unknown, b: unknown, failMessage?: string): void notDeepEqual(a: unknown, b: unknown, failMessage?: string): void expect(n: number): void done(): void } + +// TODO test that starting and stopping a tween multiple times doesn't cause +// interpolation arrays to modified yet again (and similar with other +// initialization items). Initialization should happen only once, on first +// start. + +// TODO test onRepeat From 9cd8c4116ddc0fdf8a98243dc2de37334c9d8fad Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 24 Oct 2020 17:23:57 -0700 Subject: [PATCH 025/107] fix: the video example wasn't working sometimes --- examples/05_video_and_time.html | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/examples/05_video_and_time.html b/examples/05_video_and_time.html index 707f6479..e6ff63b3 100644 --- a/examples/05_video_and_time.html +++ b/examples/05_video_and_time.html @@ -9,19 +9,29 @@

tween.js

05 _ video and time

-

Playing a video, synchronizing a tween to it

+

Playing a video, synchronizing a tween to it.

-
+
- From c1c950140ab6f5d107d61bfbeea975e211c8dd1f Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 24 Oct 2020 20:54:28 -0700 Subject: [PATCH 026/107] chore: re-order list of examples --- README.md | 98 +++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 91a8ffda..4c730e48 100644 --- a/README.md +++ b/README.md @@ -100,62 +100,62 @@ const TWEEN = require('@tweenjs/tween.js') - + @@ -169,64 +169,64 @@ const TWEEN = require('@tweenjs/tween.js') (source)
- - Custom functions + + hello world - Custom functions
- (source) + hello world
+ (source)
- - Stop all chained tweens + + Bars - Stop all chained tweens
- (source) + Bars
+ (source)
- - Yoyo + + Black and red - Yoyo
- (source) + Black and red
+ (source)
- - Relative values + + Graphs - Relative values
- (source) + Graphs
+ (source)
- - Repeat + + Simplest possible example - Repeat
- (source) + Simplest possible example
+ (source)
- - Dynamic to + + Video and time - Dynamic to
- (source) + Video and time
+ (source)
- - Video and time + + Dynamic to - Video and time
- (source) + Dynamic to
+ (source)
- - Simplest possible example + + Repeat - Simplest possible example
- (source) + Repeat
+ (source)
- - Graphs + + Relative values - Graphs
- (source) + Relative values
+ (source)
- - Black and red + + Yoyo - Black and red
- (source) + Yoyo
+ (source)
- - Bars + + Stop all chained tweens - Bars
- (source) + Stop all chained tweens
+ (source)
- - hello world + + Custom functions - hello world
- (source) + Custom functions
+ (source)
From 1a81837269e9b256763002add00212b4b5cc1fd1 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 24 Oct 2020 21:02:45 -0700 Subject: [PATCH 027/107] chore: update examples list --- README.md | 88 +++++++++++++++--- assets/examples/07a_dynamic_to.png | Bin 0 -> 2602 bytes assets/examples/07b_dynamic_to.png | Bin 0 -> 9750 bytes assets/examples/13_relative_start_time.png | Bin 0 -> 12891 bytes assets/examples/14_pause_tween.png | Bin 0 -> 10611 bytes assets/examples/15_complex_properties.png | Bin 0 -> 15855 bytes .../16_animate_an_array_of_values.png | Bin 0 -> 14505 bytes examples/07_dynamic_to.html | 4 +- examples/07a_dynamic_to_two_array_values.html | 4 +- .../07b_dynamic_to_an_array_of_values.html | 4 +- 10 files changed, 80 insertions(+), 20 deletions(-) create mode 100644 assets/examples/07a_dynamic_to.png create mode 100644 assets/examples/07b_dynamic_to.png create mode 100644 assets/examples/13_relative_start_time.png create mode 100644 assets/examples/14_pause_tween.png create mode 100644 assets/examples/15_complex_properties.png create mode 100644 assets/examples/16_animate_an_array_of_values.png diff --git a/README.md b/README.md index 4c730e48..978b1d11 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ const TWEEN = require('@tweenjs/tween.js') - hello world + hello world @@ -110,7 +110,7 @@ const TWEEN = require('@tweenjs/tween.js') - Bars + Bars @@ -121,7 +121,7 @@ const TWEEN = require('@tweenjs/tween.js') - Black and red + Black and red @@ -130,7 +130,7 @@ const TWEEN = require('@tweenjs/tween.js') - Graphs + Graphs @@ -141,7 +141,7 @@ const TWEEN = require('@tweenjs/tween.js') - Simplest possible example + Simplest possible example @@ -150,7 +150,7 @@ const TWEEN = require('@tweenjs/tween.js') - Video and time + Video and time @@ -161,7 +161,7 @@ const TWEEN = require('@tweenjs/tween.js') - Array interpolation + Array interpolation @@ -170,18 +170,38 @@ const TWEEN = require('@tweenjs/tween.js') - Dynamic to + Dynamic to, object - Dynamic to
+ Dynamic to, object
(source) + + + + Dynamic to, interpolation array + + + + Dynamic to, interpolation array
+ (source) + + + + Dynamic to, large interpolation array + + + + Dynamic to, large interpolation array
+ (source) + + - Repeat + Repeat @@ -190,7 +210,7 @@ const TWEEN = require('@tweenjs/tween.js') - Relative values + Relative values @@ -201,7 +221,7 @@ const TWEEN = require('@tweenjs/tween.js') - Yoyo + Yoyo @@ -210,7 +230,7 @@ const TWEEN = require('@tweenjs/tween.js') - Stop all chained tweens + Stop all chained tweens @@ -221,13 +241,53 @@ const TWEEN = require('@tweenjs/tween.js') - Custom functions + Custom functions Custom functions
(source) + + + Relative start time + + + + Relative start time
+ (source) + + + + + + Pause tween + + + + Pause tween
+ (source) + + + + Complex properties + + + + Complex properties
+ (source) + + + + + + Animate an array of values + + + + Animate an array of values
+ (source) + diff --git a/assets/examples/07a_dynamic_to.png b/assets/examples/07a_dynamic_to.png new file mode 100644 index 0000000000000000000000000000000000000000..d47629b966cb986725dea71c6140573178d7d235 GIT binary patch literal 2602 zcmaKucTf{r7REz>&_h*(w`uxR4F1Ybm>N_fFOtwcQoH~FKmcos zv1OeDtnlClvG%^?cs>AtEzt*!w#K5-P+V}Jmye$(0HBy1n{8m)hlEgEey^}q1|PQx z8n7m+rly6yR~9QpJw0|M4BoNJN6>^Rsb${refctrQj?J0OahbcKf`$-i<$1FN}J<{F*?F?1=<7O4W&1H2WC8Ak{p@xelBo&J|+BKZxe1V$= zk)Qw;O-};b>pePVaqkvEr|hQQGGBpwZBe_9@3OM*%!3#3+|kQ<9hM;+JgV+IA{fP| zWr^y37@sk0O+qFz7xus=nSR^LCH_{NnR^rRd&eFr4l&P`PdvM?fJ2yGq`k z_rx=szx%xu6zKa)GxK(5`jJk87v4Hdog-<}~UVaezeUU=m7vJc%_Hko!dw z41oD-J?^f0z#=?2Q^ybhfKT*SumK1~5-i9SinTD}TH=*tmzOnid6C6JlA%Tpq3A$= zf6stW06N&yE!5Kk8sQUq18Rb`u)d53ivs}MKrF`a(yhsjnXBek57?+XbGnE&wyB9} zRG*wIheeHb6xL)CQ=Ql1t5EOMs`mSn8bM;yCJ9j|IMsJ$qx8={d4EFqnwnF2*x01J zjk;F$J25#&b|3767Jjo1*fdarcH;HrnDr1wG+fJ#qd{rUj~@F(ADWpRJCx5nEMe+q zidnM*F`*aLBiMx5W!#|{{=`(g&^e*gAXGmxRf3xZ|Ks|1{qL#&)SJqvUZp12{|tn2 zELw^~>B58j9sN$-J{H9?HCe4~mMh#Z`l_n0x^@CN@6M&L9*J2{bGUj1&Jl+5 z*m1jjjq*PIY@cg0>a(8a-0mXRnx1<%yO7HyA2x@qAvvH2$vGo;KW#{8fg&2fYPaW= zOs=gBh$kZ<#bGThMVXg>|J@jqqI{P9hbwd~?};K@XT3J2fumxGZF@TnUpIx!s1?Mh z55OJF)JwKt`Nc!Ng!yYF_@xzY_l|POoR7JC*Y92Z;zpXyecQ%797!nApGt0v&oUfe zxo9dM*5V>TwTh1s&i_qbCe;2FHmX=@s+lj!?|9F6reXhB#;NN!{g8hN7AGquAQzjZ z7~iV`x}qkM7D|P}Tl|tKIZ-O**|4~y^nfB?qVXKnuq$d;#-ZN0M+sv1brt?+YFf&E z>Ehi$56zqy5tFxh&oknBrcP3#H>yYb&l}UWBUjF*W*Ccp-bx1mp6m5VoCJRraDyJ6 zz#cNFfXG#ByKOg*)*RFRbr1lln%BGS3IV`%vyo7EA)`3tG_YMIEKOJJ{rtBe&tm*i z5X>`rE2WwgepdiCAw8RK2Vtr}KEM&j&Ehu*{OD2JZ{Rlw2~&pE*Y)rT>A3m4s(^=LTapyrM$AruHHo1i$}tWujGd zpLn1O!Q_r@Fy7gUwrM?_pJ{t9SyN1si2E?sd84!bo?OFkL%OlV?2kIAw~958aEYZP zF2&}WG*?)fS<1;^JmklYkcxNom1GZ1HG2Cb4@xHo2`j576K^BoPd}~8)!cf}gywe7zotp9?Q)Ps2NlyY~>-w6CqSFGOd501oj^Oi| z>S+vw3#iFjvR8# z;KM?69huj{>YhD&fM8kkH@-*X3PnO8c2-HJQz#u-sO$&*>wL!j1u$sdGPiNm!@`{PKsRm94aI`BM{+~;BpioDAhI@^0i1lHVzWCytk`25Nx@> zPutV*&VJw0H8*aH6xeRV1COQ4?bzgt6Q#-U5$QW4oKl5#WM31l&8}!s)x7DMn?H=# zbYr$E;-8G`*}t>C*;klSOwHrpdbt84HrZdRd%Qe5g|oV-l@n5eD^nEl&}|n7^2*@$ zXp9UR;C3U9V>}>3L+Fo}K~1VJJ-#!YPM)xW%@YSVXCs`rhd9th2_xUV?+d`aBUgJk zkmrt=*EwM!(+ic@DO61)*t{7+K+gri`?& z>VCDgNv-4tL^8|lg24ZF#s9Lx|KXbd(*M7!A}W}`RKE2KvyIovSYHMJ*2oe=Lb=}g E2fZi1vj6}9 literal 0 HcmV?d00001 diff --git a/assets/examples/07b_dynamic_to.png b/assets/examples/07b_dynamic_to.png new file mode 100644 index 0000000000000000000000000000000000000000..0b3004921884b78a75b0d1c7155fe28365ecad67 GIT binary patch literal 9750 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 bIJmz6adI|ibQyg4iKU^Ut6ZgM^XPv8r8Q12 literal 0 HcmV?d00001 diff --git a/assets/examples/16_animate_an_array_of_values.png b/assets/examples/16_animate_an_array_of_values.png new file mode 100644 index 0000000000000000000000000000000000000000..a2956168731b3130076249f22b648163701ba6ea GIT binary patch literal 14505 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 literal 0 HcmV?d00001 diff --git a/examples/07_dynamic_to.html b/examples/07_dynamic_to.html index 537f923f..ad9159ff 100644 --- a/examples/07_dynamic_to.html +++ b/examples/07_dynamic_to.html @@ -1,7 +1,7 @@ - Tween.js / dynamic to + Tween.js / dynamic to object + + + +
+

tween.js

+

17 _ Easing with Pow

+

TWEEN.Easing.generatePow() provides easing with a power of number.

+
+ +
+ + + + + + + From f59624d542cad2d3c935915e2bc4f08e89e1aeab Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Mon, 26 Apr 2021 15:01:50 +0900 Subject: [PATCH 034/107] add : @sinonjs/fake-timers related : #563 --- package-lock.json | 3929 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 + 2 files changed, 3911 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea959c9e..307f7c8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,3867 @@ { "name": "@tweenjs/tween.js", "version": "18.6.4", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "@tweenjs/tween.js", + "version": "18.6.4", + "license": "MIT", + "devDependencies": { + "@sinonjs/fake-timers": "^6.0.1", + "@types/sinonjs__fake-timers": "^6.0.2", + "@typescript-eslint/eslint-plugin": "^3.1.0", + "@typescript-eslint/parser": "^3.1.0", + "eslint": "^7.1.0", + "eslint-config-prettier": "^6.7.0", + "eslint-plugin-prettier": "^3.1.1", + "nodeunit": "^0.11.3", + "prettier": "^2.0.0", + "rimraf": "^3.0.0", + "rollup": "^2.0.0", + "rollup-plugin-dts": "1.4.10", + "tslib": "^1.10.0", + "typescript": "^4.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true, + "optional": true + }, + "node_modules/@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "dependencies": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", + "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz", + "integrity": "sha512-D52KwdgkjYc+fmTZKW7CZpH5ZBJREJKZXRrveMiRCmlzZ+Rw9wRVJ1JAmHQ9b/+Ehy1ZeaylofDB9wwXUt83wg==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "3.1.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.1.0.tgz", + "integrity": "sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "3.1.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.1.0.tgz", + "integrity": "sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q==", + "dev": true, + "dependencies": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.1.0", + "@typescript-eslint/typescript-estree": "3.1.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.1.0.tgz", + "integrity": "sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "node_modules/ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "dependencies": { + "default-require-extensions": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/arg": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz", + "integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bind-obj-methods": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", + "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "dependencies": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/coveralls": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.9.tgz", + "integrity": "sha512-nNBg3B1+4iDox5A5zqHKzUTiwl2ey4k2o0NEcVZYvl+GOSJdKBj4AJGKLv6h3SvWch7tABHePAQOSZWM9E2hMg==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.0", + "request": "^2.88.0" + }, + "bin": { + "coveralls": "bin/coveralls.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/coveralls/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node_modules/cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "dependencies": { + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.1.0.tgz", + "integrity": "sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^7.0.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz", + "integrity": "sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ==", + "dev": true, + "dependencies": { + "get-stdin": "^6.0.0" + }, + "bin": { + "eslint-config-prettier-check": "bin/cli.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", + "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", + "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "dependencies": { + "estraverse": "^4.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "dependencies": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "node_modules/foreground-child/node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-exists-cached": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", + "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-loop": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", + "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "dependencies": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "dev": true, + "dependencies": { + "is-stream": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "dependencies": { + "append-transform": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "dependencies": { + "handlebars": "^4.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", + "dev": true, + "bin": { + "lcov-parse": "bin/cli.js" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true, + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "dev": true, + "dependencies": { + "mime-db": "1.42.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "node_modules/nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, + "node_modules/nodeunit": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/nodeunit/-/nodeunit-0.11.3.tgz", + "integrity": "sha512-gDNxrDWpx07BxYNO/jn1UrGI1vNhDQZrIFphbHMcTCDc5mrrqQBWfQMXPHJ5WSgbFwD1D6bv4HOsqtTrPG03AA==", + "dev": true, + "dependencies": { + "ejs": "^2.5.2", + "tap": "^12.0.1" + }, + "bin": { + "nodeunit": "bin/nodeunit" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-or": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", + "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", + "dev": true + }, + "node_modules/own-or-env": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", + "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", + "dev": true, + "dependencies": { + "own-or": "^1.0.0" + } + }, + "node_modules/p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "optional": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/psl": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", + "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "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" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.0.tgz", + "integrity": "sha512-0FIG1jY88uhCP2yP4CfvtKEqPDRmsUwfY1kEOOM+DH/KOGATgaIFd/is1+fQOxsvh62ELzcFfKonwKWnHhrqmw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/rollup-plugin-dts": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-1.4.10.tgz", + "integrity": "sha512-bL6MBXc8lK7D5b/tYbHaglxs4ZxMQTQilGA6Xm9KQBEj4h9ZwIDlAsvDooGjJ/cOw23r3POTRtSCEyTHxtzHJg==", + "dev": true, + "optionalDependencies": { + "@babel/code-frame": "^7.10.4" + } + }, + "node_modules/rollup-plugin-dts/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "optional": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/rollup-plugin-dts/node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "optional": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", + "dev": true, + "dependencies": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tap": { + "version": "12.7.0", + "resolved": "https://registry.npmjs.org/tap/-/tap-12.7.0.tgz", + "integrity": "sha512-SjglJmRv0pqrQQ7d5ZBEY8ZOqv3nYDBXEX51oyycOH7piuhn82JKT/yDNewwmOsodTD/RZL9MccA96EjDgK+Eg==", + "dev": true, + "dependencies": { + "bind-obj-methods": "^2.0.0", + "browser-process-hrtime": "^1.0.0", + "capture-stack-trace": "^1.0.0", + "clean-yaml-object": "^0.1.0", + "color-support": "^1.1.0", + "coveralls": "^3.0.2", + "domain-browser": "^1.2.0", + "esm": "^3.2.5", + "foreground-child": "^1.3.3", + "fs-exists-cached": "^1.0.0", + "function-loop": "^1.0.1", + "glob": "^7.1.3", + "isexe": "^2.0.0", + "js-yaml": "^3.13.1", + "minipass": "^2.3.5", + "mkdirp": "^0.5.1", + "nyc": "^14.0.0", + "opener": "^1.5.1", + "os-homedir": "^1.0.2", + "own-or": "^1.0.0", + "own-or-env": "^1.0.1", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.0", + "source-map-support": "^0.5.10", + "stack-utils": "^1.0.2", + "tap-mocha-reporter": "^3.0.9", + "tap-parser": "^7.0.0", + "tmatch": "^4.0.0", + "trivial-deferred": "^1.0.1", + "ts-node": "^8.0.2", + "tsame": "^2.0.1", + "typescript": "^3.3.3", + "write-file-atomic": "^2.4.2", + "yapool": "^1.0.0" + }, + "bin": { + "tap": "bin/run.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap-mocha-reporter": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.9.tgz", + "integrity": "sha512-VO07vhC9EG27EZdOe7bWBj1ldbK+DL9TnRadOgdQmiQOVZjFpUEQuuqO7+rNSO2kfmkq5hWeluYXDWNG/ytXTQ==", + "dev": true, + "dependencies": { + "color-support": "^1.1.0", + "debug": "^2.1.3", + "diff": "^1.3.2", + "escape-string-regexp": "^1.0.3", + "glob": "^7.0.5", + "js-yaml": "^3.3.1", + "tap-parser": "^5.1.0", + "unicode-length": "^1.0.0" + }, + "bin": { + "tap-mocha-reporter": "index.js" + }, + "optionalDependencies": { + "readable-stream": "^2.1.5" + } + }, + "node_modules/tap-mocha-reporter/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/tap-mocha-reporter/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/tap-mocha-reporter/node_modules/tap-parser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", + "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", + "dev": true, + "dependencies": { + "events-to-array": "^1.0.1", + "js-yaml": "^3.2.7" + }, + "bin": { + "tap-parser": "bin/cmd.js" + }, + "optionalDependencies": { + "readable-stream": "^2" + } + }, + "node_modules/tap-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", + "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", + "dev": true, + "dependencies": { + "events-to-array": "^1.0.1", + "js-yaml": "^3.2.7", + "minipass": "^2.2.0" + }, + "bin": { + "tap-parser": "bin/cmd.js" + } + }, + "node_modules/tap/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tap/node_modules/typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "dependencies": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/tmatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", + "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "dependencies": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/trivial-deferred": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", + "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", + "dev": true + }, + "node_modules/ts-node": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.5.4.tgz", + "integrity": "sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-script": "dist/script.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsame": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", + "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", + "dev": true + }, + "node_modules/tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.2.tgz", + "integrity": "sha512-uhRwZcANNWVLrxLfNFEdltoPNhECUR3lc+UdJoG9CBpMcSnKyWA94tc3eAujB1GcMY5Uwq8ZMp4qWpxWYDQmaA==", + "dev": true, + "optional": true, + "dependencies": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unicode-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", + "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", + "dev": true, + "dependencies": { + "punycode": "^1.3.2", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/unicode-length/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unicode-length/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/unicode-length/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "node_modules/uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/yapool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", + "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.5.5", @@ -125,6 +3984,24 @@ "to-fast-properties": "^2.0.0" } }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -143,6 +4020,12 @@ "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, + "@types/sinonjs__fake-timers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", + "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz", @@ -2509,6 +6392,25 @@ "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + } + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -2531,25 +6433,6 @@ } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - } - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -2875,6 +6758,12 @@ "prelude-ls": "^1.2.1" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", diff --git a/package.json b/package.json index 335b80ca..6122470c 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,8 @@ }, "author": "tween.js contributors (https://github.com/tweenjs/tween.js/graphs/contributors)", "devDependencies": { + "@sinonjs/fake-timers": "^6.0.1", + "@types/sinonjs__fake-timers": "^6.0.2", "@typescript-eslint/eslint-plugin": "^3.1.0", "@typescript-eslint/parser": "^3.1.0", "eslint": "^7.1.0", From d9f31323c4df57993fb3c83935a5dda018e789b4 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Mon, 26 Apr 2021 15:02:59 +0900 Subject: [PATCH 035/107] add : Test TWEEN.Tween.update() with no arguments related : #563 --- src/tests.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/tests.ts b/src/tests.ts index d0d94c28..cf143c37 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,4 +1,5 @@ import * as TWEEN from './Index' +import * as FakeTimers from '@sinonjs/fake-timers' export const tests = { hello(test: Test): void { @@ -1917,6 +1918,33 @@ export const tests = { test.done() }, + + 'Test TWEEN.Tween.update() with no arguments'(test: Test): void { + const clock = FakeTimers.install() + const targetNow = {x: 0.0} + const targetTime = {x: 0.0} + + const tweenNow = new TWEEN.Tween(targetNow).to({x: 1.0}).start() + const tweenTime = new TWEEN.Tween(targetTime).to({x: 1.0}).start(0) + + let currentTime = 0 + const tick = (time: number) => { + currentTime += time + clock.tick(time) + tweenNow.update() + tweenTime.update(currentTime) + test.equal(targetNow.x, targetTime.x) + } + + tick(0) + tick(16) + tick(16.66) + tick(100) + tick(20000) + + clock.uninstall() + test.done() + }, } type Test = { From 2822b8fdb029f4b90f0489c6414d15a2a03207e4 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Mon, 26 Apr 2021 20:42:39 -0700 Subject: [PATCH 036/107] fix missing piece from merge --- src/tests.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tests.ts b/src/tests.ts index b36becda..32481472 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1968,6 +1968,9 @@ export const tests = { checkEdgeValue(TWEEN.Easing.generatePow(6)) checkEdgeValue(TWEEN.Easing.generatePow(Number.POSITIVE_INFINITY)) + test.done() + }, + 'Test TWEEN.Tween.update() with no arguments'(test: Test): void { const clock = FakeTimers.install() const targetNow = {x: 0.0} From 2733e6451b3dca3c27f993a5fad25d7531f2e705 Mon Sep 17 00:00:00 2001 From: mikebolt Date: Sat, 20 Jun 2020 23:29:27 -0700 Subject: [PATCH 037/107] remove support for string arguments to start and mark the argument as optional --- src/Tween.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Tween.ts b/src/Tween.ts index a7e85763..3b0abd12 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -78,7 +78,7 @@ export class Tween { return this } - start(time?: number): this { + start(time: number = now()): this { if (this._isPlaying) { return this } @@ -108,7 +108,7 @@ export class Tween { this._isChainStopped = false - this._startTime = time !== undefined ? (typeof time === 'string' ? now() + parseFloat(time) : time) : now() + this._startTime = time this._startTime += this._delayTime this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat) From 1fb80ecada8c0139b7e1eed49ec308b420183127 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Mon, 26 Apr 2021 21:07:29 -0700 Subject: [PATCH 038/107] fix lint error from merge --- src/Tween.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tween.ts b/src/Tween.ts index 376b543b..8548d6ae 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -78,7 +78,7 @@ export class Tween { return this } - start(time: number = now(), overrideStartingValues: boolean = false): this { + start(time: number = now(), overrideStartingValues = false): this { if (this._isPlaying) { return this } From 6a7dff370d7923fd1322dcef5a900fcb9603a560 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Thu, 29 Apr 2021 22:00:57 +0900 Subject: [PATCH 039/107] add : unit test "TWEEN.Easing should starts at 0.0, ends at 1.0. TWEEN.Easing.InOut() should be 0.5 at midpoint" --- src/tests.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/tests.ts b/src/tests.ts index cf143c37..23c75cb3 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -630,6 +630,34 @@ export const tests = { test.done() }, + 'Test TWEEN.Easing should starts at 0.0, ends at 1.0. TWEEN.Easing.InOut() should be 0.5 at midpoint'( + test: Test, + ): void { + const checkEdgeValue = (ease: EasingFunctionGroup) => { + test.equal(ease.In(0.0), 0.0) + test.equal(ease.Out(0.0), 0.0) + test.equal(ease.InOut(0.0), 0.0) + + test.equal(ease.In(1.0), 1.0) + test.equal(ease.Out(1.0), 1.0) + test.equal(ease.InOut(1.0), 1.0) + + test.equal(ease.InOut(0.5), 0.5) + } + + checkEdgeValue(TWEEN.Easing.Quadratic) + checkEdgeValue(TWEEN.Easing.Cubic) + checkEdgeValue(TWEEN.Easing.Quartic) + checkEdgeValue(TWEEN.Easing.Quintic) + checkEdgeValue(TWEEN.Easing.Sinusoidal) + checkEdgeValue(TWEEN.Easing.Exponential) + checkEdgeValue(TWEEN.Easing.Circular) + checkEdgeValue(TWEEN.Easing.Elastic) + checkEdgeValue(TWEEN.Easing.Back) + checkEdgeValue(TWEEN.Easing.Bounce) + test.done() + }, + // TODO test interpolation() 'Test TWEEN.Tween.chain --with one tween'(test: Test): void { From 2c52499592f94c744e7004fe1407d4d5491e666f Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Thu, 29 Apr 2021 22:01:58 +0900 Subject: [PATCH 040/107] add : unit test "TWEEN.Easing should pass a specific value" --- src/tests.ts | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/src/tests.ts b/src/tests.ts index 23c75cb3..7162e471 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -658,6 +658,78 @@ export const tests = { test.done() }, + 'Test TWEEN.Easing should pass a specific value'(test: Test): void { + const checkEasingGroupPassPoints = ( + easingGroup: EasingFunctionGroup, + expects: {In: number; Out: number; InOut: number}, + ) => { + checkPassPoint(easingGroup.In, expects.In) + checkPassPoint(easingGroup.Out, expects.Out) + checkPassPoint(easingGroup.InOut, expects.InOut) + } + const checkPassPoint = ( + easeFunc: (amount: number) => number, + expect: number, + numDigits = 14, + amount = Math.LOG10E, + ) => { + toBeCloseTo(test, easeFunc(amount), expect, numDigits) + } + + checkEasingGroupPassPoints(TWEEN.Easing.Quadratic, { + In: 0.18861169701161393, + Out: 0.6799772667948897, + InOut: 0.37722339402322785, + }) + checkEasingGroupPassPoints(TWEEN.Easing.Cubic, { + In: 0.08191301923455198, + Out: 0.8189613739094657, + InOut: 0.3276520769382079, + }) + checkEasingGroupPassPoints(TWEEN.Easing.Quartic, { + In: 0.035574372249600854, + Out: 0.8975854502319308, + InOut: 0.28459497799680683, + }) + checkEasingGroupPassPoints(TWEEN.Easing.Quintic, { + In: 0.015449753565173821, + Out: 0.9420635240628092, + InOut: 0.24719605704278114, + }) + checkEasingGroupPassPoints(TWEEN.Easing.Sinusoidal, { + In: 0.22380505208857682, + Out: 0.630492983971101, + InOut: 0.397521402836783, + }) + checkEasingGroupPassPoints(TWEEN.Easing.Exponential, { + In: 0.01981785759600918, + Out: 0.9507231043886069, + InOut: 0.2010867096041978, + }) + checkEasingGroupPassPoints(TWEEN.Easing.Circular, { + In: 0.09922905076352173, + Out: 0.8246073409780499, + InOut: 0.2522333699054974, + }) + checkEasingGroupPassPoints(TWEEN.Easing.Elastic, { + In: -0.01701121590548648, + Out: 0.9577017895937282, + InOut: -0.09523991217687242, + }) + checkEasingGroupPassPoints(TWEEN.Easing.Back, { + In: -0.09964331689734113, + Out: 1.055453950893486, + InOut: 0.19901899530677744, + }) + + checkEasingGroupPassPoints(TWEEN.Easing.Bounce, { + In: 0.24689860443452594, + Out: 0.8434464829485027, + InOut: 0.43470212148602316, + }) + test.done() + }, + // TODO test interpolation() 'Test TWEEN.Tween.chain --with one tween'(test: Test): void { @@ -1982,3 +2054,20 @@ type Test = { expect(n: number): void done(): void } + +type EasingFunctionGroup = { + In(amount: number): number + Out(amount: number): number + InOut(amount: number): number +} + +function toBeCloseTo(test: Test, numberA: number, numberB: number, numDigits = 2): void { + const diff = Math.abs(numberA - numberB) + test.ok( + diff < 10 ** -numDigits / 2, + ` +actual : ${numberA} +expect : ${numberB} +diff : ${diff}`, + ) +} From 273520dc4fd6113e56c2c306da0b507ca515a8e8 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Thu, 29 Apr 2021 22:15:02 +0900 Subject: [PATCH 041/107] fix : easing functions it not pass 0.0, 1.0 and 0.5 Back.in() and Back.Out() now have limits. Sinusoidal.In() and .InOut() are replaced with Math.sin from Math.cos. Because 1 - Math.cos(Math.PI / 2) = 0.99999999999 and it does not snap to 1. --- src/Easing.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Easing.ts b/src/Easing.ts index 073837fa..b2edbf58 100644 --- a/src/Easing.ts +++ b/src/Easing.ts @@ -70,13 +70,13 @@ const Easing = { }, Sinusoidal: { In: function (amount: number): number { - return 1 - Math.cos((amount * Math.PI) / 2) + return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2) }, Out: function (amount: number): number { return Math.sin((amount * Math.PI) / 2) }, InOut: function (amount: number): number { - return 0.5 * (1 - Math.cos(Math.PI * amount)) + return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount))) }, }, Exponential: { @@ -159,11 +159,11 @@ const Easing = { Back: { In: function (amount: number): number { const s = 1.70158 - return amount * amount * ((s + 1) * amount - s) + return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s) }, Out: function (amount: number): number { const s = 1.70158 - return --amount * amount * ((s + 1) * amount + s) + 1 + return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1 }, InOut: function (amount: number): number { const s = 1.70158 * 1.525 From 61624bea788c325507634a22ce3e0420f3cf64c7 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Sun, 2 May 2021 17:40:13 +0900 Subject: [PATCH 042/107] Add : tests for onRepeat callback related : Add a test for onRepeat #456 , Implement onBeforeRepeat #290 --- src/tests.ts | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) diff --git a/src/tests.ts b/src/tests.ts index 7162e471..a1e23ead 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1474,6 +1474,211 @@ export const tests = { test.done() }, + 'TWEEN.Tween.onRepeat should not be called if repeat = 0 or default'(test: Test): void { + const obj = {x: 0} + let callbackCounter = 0 + + const t = new TWEEN.Tween(obj).to({x: 100}, 100).start(0) + t.onRepeat(() => { + callbackCounter++ + }) + + TWEEN.update(0) + test.equal(callbackCounter, 0) + TWEEN.update(50) + test.equal(callbackCounter, 0) + TWEEN.update(100) + test.equal(callbackCounter, 0) + TWEEN.update(150) + test.equal(callbackCounter, 0) + test.ok(!t.isPlaying()) + + test.done() + }, + + 'TWEEN.Tween.onRepeat should be called once if repeat = 1'(test: Test): void { + const obj = {x: 0} + let callbackCounter = 0 + + const t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(1).start(0) + t.onRepeat(() => { + callbackCounter++ + }) + + TWEEN.update(0) + test.equal(callbackCounter, 0) + TWEEN.update(50) + test.equal(callbackCounter, 0) + TWEEN.update(99.99999999) + test.equal(callbackCounter, 0) + TWEEN.update(100) + test.equal(callbackCounter, 1) + test.ok(t.isPlaying()) + + TWEEN.update(150) + test.equal(callbackCounter, 1) + TWEEN.update(200) + test.equal(callbackCounter, 1) + test.ok(!t.isPlaying()) + + test.done() + }, + + 'TWEEN.Tween.onRepeat should be called every time if repeat = Infinity'(test: Test): void { + const obj = {x: 0} + let callbackCounter = 0 + + const t = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(Infinity).start(0) + t.onRepeat(() => { + callbackCounter++ + }) + + const repeatTween = (repeatCount: number): void => { + TWEEN.update(repeatCount * 100) + test.equal(callbackCounter, repeatCount) + TWEEN.update(50 + repeatCount * 100) + test.equal(callbackCounter, repeatCount) + TWEEN.update(99.99999999 + repeatCount * 100) + test.equal(callbackCounter, repeatCount) + TWEEN.update(100 + repeatCount * 100) + test.equal(callbackCounter, repeatCount + 1) + test.ok(t.isPlaying()) + } + + for (let i = 0; i < 10; i++) { + repeatTween(i) + } + + test.done() + }, + + 'TWEEN.Tween.onRepeat should not be called if Tween.pause() or Tween.stop(), and should be called after Tween.resume() or restart'( + test: Test, + ): void { + const generateTween = () => { + const obj = {x: 0} + const counter = {count: 0} + const tween = new TWEEN.Tween(obj).to({x: 100}, 100).repeat(Infinity).start(0) + tween.onRepeat(() => { + counter.count++ + }) + return { + tween, + counter, + } + } + + const tweenPause = generateTween() + const tweenStop = generateTween() + + TWEEN.update(100) + test.equal(tweenPause.counter.count, 1) + test.equal(tweenStop.counter.count, 1) + + TWEEN.update(200) + test.equal(tweenPause.counter.count, 2) + test.equal(tweenStop.counter.count, 2) + tweenPause.tween.pause(200) + + TWEEN.update(300) + test.equal(tweenPause.counter.count, 2) + test.equal(tweenStop.counter.count, 3) + tweenPause.tween.resume(300) + tweenStop.tween.stop() + + TWEEN.update(400) + test.equal(tweenPause.counter.count, 3) + test.equal(tweenStop.counter.count, 3) + tweenStop.tween.start(400) + + TWEEN.update(500) + test.equal(tweenPause.counter.count, 4) + test.equal(tweenStop.counter.count, 4) + + test.done() + }, + + 'If Tween.delay is set, TWEEN.Tween.onRepeat should be called when repeat section finished'(test: Test): void { + const obj = {x: 0} + let callbackCounter = 0 + + const t = new TWEEN.Tween(obj).to({x: 100}, 100).delay(50).repeat(1).start(0) + t.onRepeat(() => { + callbackCounter++ + }) + + TWEEN.update(0) + test.equal(callbackCounter, 0) + + TWEEN.update(50) //start first section + test.equal(obj.x, 0) + test.equal(callbackCounter, 0) + + TWEEN.update(100) + test.equal(obj.x, 50) + test.equal(callbackCounter, 0) + + TWEEN.update(150) //first section is finished + test.equal(obj.x, 100) + test.equal(callbackCounter, 1) + + TWEEN.update(200) //restart + test.equal(obj.x, 0) + test.equal(callbackCounter, 1) + + TWEEN.update(250) + test.equal(obj.x, 50) + test.equal(callbackCounter, 1) + + TWEEN.update(300) //second section is finished + test.equal(obj.x, 100) + test.equal(callbackCounter, 1) + test.ok(!t.isPlaying()) + + TWEEN.update(400) + test.equal(obj.x, 100) + test.equal(callbackCounter, 1) + + test.done() + }, + + 'If Tween.repeatDelay is set, TWEEN.Tween.onRepeat should be called when repeat section finished'(test: Test): void { + const obj = {x: 0} + let callbackCounter = 0 + + const t = new TWEEN.Tween(obj).to({x: 100}, 100).repeatDelay(100).repeat(1).start(0) + t.onRepeat(() => { + callbackCounter++ + }) + + TWEEN.update(0) + test.equal(callbackCounter, 0) + + TWEEN.update(50) + test.equal(callbackCounter, 0) + + TWEEN.update(99.99999999) + test.equal(callbackCounter, 0) + + TWEEN.update(100) //first section is finished + test.equal(callbackCounter, 1) + + TWEEN.update(150) //delay + test.equal(callbackCounter, 1) + + TWEEN.update(200) //restart + test.equal(callbackCounter, 1) + + TWEEN.update(300) //second section is finished + test.equal(callbackCounter, 1) + test.ok(!t.isPlaying()) + + TWEEN.update(400) + test.equal(callbackCounter, 1) + + test.done() + }, + 'Tween.js compatible with Object.defineProperty getter / setters'(test: Test): void { const obj = {_x: 0, x: 0} From e45bbf83af86bba3da59f6c656d09269c978cd2e Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Tue, 4 May 2021 16:13:04 +0900 Subject: [PATCH 043/107] fix : lower limit of power to 2^-52 --- src/Easing.ts | 2 +- src/tests.ts | 10 +--------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/Easing.ts b/src/Easing.ts index b5020343..9639783d 100644 --- a/src/Easing.ts +++ b/src/Easing.ts @@ -202,7 +202,7 @@ const Easing = { Out(amount: number): number InOut(amount: number): number } { - power = power < 1.0 ? 1.0 : power + power = power < Number.EPSILON ? Number.EPSILON : power power = power > 10000 ? 10000 : power return { In: function (amount: number): number { diff --git a/src/tests.ts b/src/tests.ts index e7360236..74258b0e 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2021,7 +2021,6 @@ export const tests = { 'Test TWEEN.Easing.generatePow(1) equals Linear'(test: Test): void { const ease1 = TWEEN.Easing.generatePow(1) - const easeMinus = TWEEN.Easing.generatePow(-1) const compareWithLinear = (ease: EasingFunctionGroup, amount: number) => { const linearResult = TWEEN.Easing.Linear.None(amount) @@ -2030,20 +2029,12 @@ export const tests = { test.equal(linearResult, ease.InOut(amount)) } compareWithLinear(ease1, 0) - compareWithLinear(easeMinus, 0) compareWithLinear(ease1, 0.25) - compareWithLinear(easeMinus, 0.25) compareWithLinear(ease1, 0.5) - compareWithLinear(easeMinus, 0.5) compareWithLinear(ease1, 0.75) - compareWithLinear(easeMinus, 0.75) compareWithLinear(ease1, 1) - compareWithLinear(easeMinus, 1) - compareWithLinear(ease1, -1) - compareWithLinear(easeMinus, -1) compareWithLinear(ease1, Infinity) - compareWithLinear(easeMinus, Infinity) test.done() }, @@ -2061,6 +2052,7 @@ export const tests = { test.equal(ease.Out(1.0), 1.0) } checkEdgeValue(TWEEN.Easing.generatePow(Number.NEGATIVE_INFINITY)) + checkEdgeValue(TWEEN.Easing.generatePow(-1.0)) checkEdgeValue(TWEEN.Easing.generatePow(1)) checkEdgeValue(TWEEN.Easing.generatePow(Math.LOG2E)) checkEdgeValue(TWEEN.Easing.generatePow(Math.PI)) From efd849e286aec39957d42eabd7338c01c61da457 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Tue, 4 May 2021 22:25:10 +0900 Subject: [PATCH 044/107] add : documentation for TWEEN.Easing.generatePow() --- docs/user_guide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/user_guide.md b/docs/user_guide.md index 11adfb1b..3424cdd8 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -277,6 +277,8 @@ There are a few existing easing functions provided with tween.js. They are group Probably the names won't be saying anything to you unless you're familiar with these concepts already, so it is probably the time to check the [Graphs](../examples/03_graphs.html) example, which graphs all the curves in one page so you can compare how they look at a glance. +TWEEN.Easing also has a function called generatePow(). This function generates easing functions for different curves depending on arguments. You can check the relevance of the arguments to curves in the [example of pow easing](../examples/17_generate_pow.html) page. + _Credit where credit is due:_ these functions are derived from the original set of equations that Robert Penner graciously made available as free software a few years ago, but have been optimised to play nicely with JavaScript. ### Using a custom easing function From aa2cb879ec4497cca1db650ecbed791c595f75e4 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Thu, 6 May 2021 12:56:06 +0900 Subject: [PATCH 045/107] fix : file path of unit tests in documents related : #583 --- docs/contributor_guide.md | 2 +- docs/contributor_guide_zh-CN.md | 2 +- docs/user_guide.md | 2 +- docs/user_guide_zh-CN.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/contributor_guide.md b/docs/contributor_guide.md index 5d94112f..23a6a2d5 100644 --- a/docs/contributor_guide.md +++ b/docs/contributor_guide.md @@ -80,7 +80,7 @@ The one that happens more frequently is the first one, but the second one has ha ### Unit tests -Tests are in the `test/unit/tests.js` file. +Tests are in the `src/tests.ts` file. The tests are executed using [nodeunit](https://www.npmjs.com/package/nodeunit). diff --git a/docs/contributor_guide_zh-CN.md b/docs/contributor_guide_zh-CN.md index ac0ab10e..7ab61049 100644 --- a/docs/contributor_guide_zh-CN.md +++ b/docs/contributor_guide_zh-CN.md @@ -76,7 +76,7 @@ npm test ### 单元测试 -测试用例在`test/unit/tests.js`文件中. +测试用例在`src/tests.ts`文件中. 测试使用[nodeunit](https://www.npmjs.com/package/nodeunit)执行. diff --git a/docs/user_guide.md b/docs/user_guide.md index 11adfb1b..9d372240 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -117,7 +117,7 @@ var currentTime = player.currentTime TWEEN.update(currentTime) ``` -We use explicit time values for the unit tests. You can have a look at [tests.js](../test/unit/tests.js) to see how we call TWEEN.update() with different values in order to simulate time passing. +We use explicit time values for the unit tests. You can have a look at [tests.ts](../src/tests.ts) to see how we call TWEEN.update() with different values in order to simulate time passing. ## Controlling a tween diff --git a/docs/user_guide_zh-CN.md b/docs/user_guide_zh-CN.md index 21d10606..b57ce51f 100644 --- a/docs/user_guide_zh-CN.md +++ b/docs/user_guide_zh-CN.md @@ -117,7 +117,7 @@ var currentTime = player.currentTime TWEEN.update(currentTime) ``` -我们使用明确的时间值进行单元测试。你可以看下 [tests.js](https://github.com/tweenjs/tween.js/blob/master/test/unit/tests.js) 这个例子,看看我们如何用不同的值调用`TWEEN.update()` 来模拟时间传递。 +我们使用明确的时间值进行单元测试。你可以看下 [tests.ts](../src/tests.ts) 这个例子,看看我们如何用不同的值调用`TWEEN.update()` 来模拟时间传递。 ## 控制一个补间 From 674921a002c2ff3e91cc095c3da2c593754f5b62 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Sun, 9 May 2021 14:06:31 +0900 Subject: [PATCH 046/107] add : unit tests for interpolations related : #245 --- src/tests.ts | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/tests.ts b/src/tests.ts index 74258b0e..54c90bfb 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -730,7 +730,57 @@ export const tests = { test.done() }, - // TODO test interpolation() + 'Test TWEEN.interpolation should starts at values[0], ends at values[values.length-1].'(test: Test): void { + const generateArray = (): number[] => { + return [0, Math.PI, Math.SQRT2, Math.E] + } + + const checkStartAndEnd = (interpolation: (v: number[], k: number) => number, values: number[]) => { + const originalValue = values.concat() + test.equal(interpolation(values, 0.0), originalValue[0]) + test.equal(interpolation(values, 1.0), originalValue[originalValue.length - 1]) + test.deepEqual(originalValue, values) + } + + const Interpolations = [TWEEN.Interpolation.Linear, TWEEN.Interpolation.Bezier, TWEEN.Interpolation.CatmullRom] + Interpolations.forEach(func => { + checkStartAndEnd(func, generateArray()) + }) + test.done() + }, + + 'Test TWEEN.interpolation.Bezier should return a value equal to Linear if there are two values.'(test: Test): void { + const compareToLinear = (k: number) => { + const Interpolation = TWEEN.Interpolation + const values = [0, Math.E] + test.equal(Interpolation.Bezier(values, k), Interpolation.Linear(values, k)) + } + + compareToLinear(0.0) + compareToLinear(0.5) + compareToLinear(1.0) + compareToLinear(Math.LOG10E) + compareToLinear(Math.LN2) + test.done() + }, + + 'Test TWEEN.interpolation should pass a specific value.'(test: Test): void { + const generateArray = (): number[] => { + return [0, Math.PI, Math.SQRT2, Math.E] + } + + const testInterpolationPath = ( + interpolation: (v: number[], k: number) => number, + values: number[], + result: number, + ) => { + toBeCloseTo(test, interpolation(values, Math.LOG10E), result, 14) + } + testInterpolationPath(TWEEN.Interpolation.Linear, generateArray(), 2.618398122395094) + testInterpolationPath(TWEEN.Interpolation.Bezier, generateArray(), 1.985241172928958) + testInterpolationPath(TWEEN.Interpolation.CatmullRom, generateArray(), 2.879802635590904) + test.done() + }, 'Test TWEEN.Tween.chain --with one tween'(test: Test): void { const t = new TWEEN.Tween({}), From 4c1e20d04f722a3031de90cb4db0512f5cb67aae Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Thu, 27 May 2021 14:34:39 +0900 Subject: [PATCH 047/107] fix : freeze Easing Objects related : #610 --- src/Easing.ts | 382 ++++++++++++++++++++++++++------------------------ 1 file changed, 195 insertions(+), 187 deletions(-) diff --git a/src/Easing.ts b/src/Easing.ts index 9639783d..f50c54f9 100644 --- a/src/Easing.ts +++ b/src/Easing.ts @@ -1,224 +1,232 @@ export type EasingFunction = (amount: number) => number +export type EasingFunctionGroup = { + In: EasingFunction + Out: EasingFunction + InOut: EasingFunction +} + /** * The Ease class provides a collection of easing functions for use with tween.js. */ -const Easing = { - Linear: { - None: function (amount: number): number { - return amount - }, + +export const Linear = Object.freeze({ + None: function (amount: number): number { + return amount }, - Quadratic: { - In: function (amount: number): number { - return amount * amount - }, - Out: function (amount: number): number { - return amount * (2 - amount) - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return 0.5 * amount * amount - } +}) - return -0.5 * (--amount * (amount - 2) - 1) - }, +export const Quadratic = Object.freeze({ + In: function (amount: number): number { + return amount * amount }, - Cubic: { - In: function (amount: number): number { - return amount * amount * amount - }, - Out: function (amount: number): number { - return --amount * amount * amount + 1 - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return 0.5 * amount * amount * amount - } - return 0.5 * ((amount -= 2) * amount * amount + 2) - }, + Out: function (amount: number): number { + return amount * (2 - amount) }, - Quartic: { - In: function (amount: number): number { - return amount * amount * amount * amount - }, - Out: function (amount: number): number { - return 1 - --amount * amount * amount * amount - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return 0.5 * amount * amount * amount * amount - } + InOut: function (amount: number): number { + if ((amount *= 2) < 1) { + return 0.5 * amount * amount + } - return -0.5 * ((amount -= 2) * amount * amount * amount - 2) - }, + return -0.5 * (--amount * (amount - 2) - 1) }, - Quintic: { - In: function (amount: number): number { - return amount * amount * amount * amount * amount - }, - Out: function (amount: number): number { - return --amount * amount * amount * amount * amount + 1 - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return 0.5 * amount * amount * amount * amount * amount - } +}) - return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2) - }, +export const Cubic = Object.freeze({ + In: function (amount: number): number { + return amount * amount * amount }, - Sinusoidal: { - In: function (amount: number): number { - return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2) - }, - Out: function (amount: number): number { - return Math.sin((amount * Math.PI) / 2) - }, - InOut: function (amount: number): number { - return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount))) - }, + Out: function (amount: number): number { + return --amount * amount * amount + 1 }, - Exponential: { - In: function (amount: number): number { - return amount === 0 ? 0 : Math.pow(1024, amount - 1) - }, - Out: function (amount: number): number { - return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount) - }, - InOut: function (amount: number): number { - if (amount === 0) { - return 0 - } + InOut: function (amount: number): number { + if ((amount *= 2) < 1) { + return 0.5 * amount * amount * amount + } + return 0.5 * ((amount -= 2) * amount * amount + 2) + }, +}) - if (amount === 1) { - return 1 - } +export const Quartic = Object.freeze({ + In: function (amount: number): number { + return amount * amount * amount * amount + }, + Out: function (amount: number): number { + return 1 - --amount * amount * amount * amount + }, + InOut: function (amount: number): number { + if ((amount *= 2) < 1) { + return 0.5 * amount * amount * amount * amount + } - if ((amount *= 2) < 1) { - return 0.5 * Math.pow(1024, amount - 1) - } + return -0.5 * ((amount -= 2) * amount * amount * amount - 2) + }, +}) - return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2) - }, +export const Quintic = Object.freeze({ + In: function (amount: number): number { + return amount * amount * amount * amount * amount }, - Circular: { - In: function (amount: number): number { - return 1 - Math.sqrt(1 - amount * amount) - }, - Out: function (amount: number): number { - return Math.sqrt(1 - --amount * amount) - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return -0.5 * (Math.sqrt(1 - amount * amount) - 1) - } - return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1) - }, + Out: function (amount: number): number { + return --amount * amount * amount * amount * amount + 1 }, - Elastic: { - In: function (amount: number): number { - if (amount === 0) { - return 0 - } + InOut: function (amount: number): number { + if ((amount *= 2) < 1) { + return 0.5 * amount * amount * amount * amount * amount + } - if (amount === 1) { - return 1 - } + return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2) + }, +}) - return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) - }, - Out: function (amount: number): number { - if (amount === 0) { - return 0 - } +export const Sinusoidal = Object.freeze({ + In: function (amount: number): number { + return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2) + }, + Out: function (amount: number): number { + return Math.sin((amount * Math.PI) / 2) + }, + InOut: function (amount: number): number { + return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount))) + }, +}) - if (amount === 1) { - return 1 - } - return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1 - }, - InOut: function (amount: number): number { - if (amount === 0) { - return 0 - } +export const Exponential = Object.freeze({ + In: function (amount: number): number { + return amount === 0 ? 0 : Math.pow(1024, amount - 1) + }, + Out: function (amount: number): number { + return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount) + }, + InOut: function (amount: number): number { + if (amount === 0) { + return 0 + } - if (amount === 1) { - return 1 - } + if (amount === 1) { + return 1 + } - amount *= 2 + if ((amount *= 2) < 1) { + return 0.5 * Math.pow(1024, amount - 1) + } - if (amount < 1) { - return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) - } + return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2) + }, +}) - return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1 - }, +export const Circular = Object.freeze({ + In: function (amount: number): number { + return 1 - Math.sqrt(1 - amount * amount) }, - Back: { - In: function (amount: number): number { - const s = 1.70158 - return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s) - }, - Out: function (amount: number): number { - const s = 1.70158 - return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1 - }, - InOut: function (amount: number): number { - const s = 1.70158 * 1.525 - if ((amount *= 2) < 1) { - return 0.5 * (amount * amount * ((s + 1) * amount - s)) - } - return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2) - }, + Out: function (amount: number): number { + return Math.sqrt(1 - --amount * amount) + }, + InOut: function (amount: number): number { + if ((amount *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - amount * amount) - 1) + } + return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1) + }, +}) + +export const Elastic = Object.freeze({ + In: function (amount: number): number { + if (amount === 0) { + return 0 + } + + if (amount === 1) { + return 1 + } + + return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + }, + Out: function (amount: number): number { + if (amount === 0) { + return 0 + } + + if (amount === 1) { + return 1 + } + return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1 + }, + InOut: function (amount: number): number { + if (amount === 0) { + return 0 + } + + if (amount === 1) { + return 1 + } + + amount *= 2 + + if (amount < 1) { + return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + } + + return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1 + }, +}) + +export const Back = Object.freeze({ + In: function (amount: number): number { + const s = 1.70158 + return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s) + }, + Out: function (amount: number): number { + const s = 1.70158 + return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1 + }, + InOut: function (amount: number): number { + const s = 1.70158 * 1.525 + if ((amount *= 2) < 1) { + return 0.5 * (amount * amount * ((s + 1) * amount - s)) + } + return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2) + }, +}) + +export const Bounce = Object.freeze({ + In: function (amount: number): number { + return 1 - Bounce.Out(1 - amount) + }, + Out: function (amount: number): number { + if (amount < 1 / 2.75) { + return 7.5625 * amount * amount + } else if (amount < 2 / 2.75) { + return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75 + } else if (amount < 2.5 / 2.75) { + return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375 + } else { + return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375 + } }, - Bounce: { + InOut: function (amount: number): number { + if (amount < 0.5) { + return Bounce.In(amount * 2) * 0.5 + } + return Bounce.Out(amount * 2 - 1) * 0.5 + 0.5 + }, +}) + +export const generatePow = function (power = 4): EasingFunctionGroup { + power = power < Number.EPSILON ? Number.EPSILON : power + power = power > 10000 ? 10000 : power + return { In: function (amount: number): number { - return 1 - Easing.Bounce.Out(1 - amount) + return amount ** power }, Out: function (amount: number): number { - if (amount < 1 / 2.75) { - return 7.5625 * amount * amount - } else if (amount < 2 / 2.75) { - return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75 - } else if (amount < 2.5 / 2.75) { - return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375 - } else { - return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375 - } + return 1 - (1 - amount) ** power }, InOut: function (amount: number): number { if (amount < 0.5) { - return Easing.Bounce.In(amount * 2) * 0.5 + return (amount * 2) ** power / 2 } - return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5 + return (1 - (2 - amount * 2) ** power) / 2 + 0.5 }, - }, - generatePow: function ( - power = 4, - ): { - In(amount: number): number - Out(amount: number): number - InOut(amount: number): number - } { - power = power < Number.EPSILON ? Number.EPSILON : power - power = power > 10000 ? 10000 : power - return { - In: function (amount: number): number { - return amount ** power - }, - Out: function (amount: number): number { - return 1 - (1 - amount) ** power - }, - InOut: function (amount: number): number { - if (amount < 0.5) { - return (amount * 2) ** power / 2 - } - return (1 - (2 - amount * 2) ** power) / 2 + 0.5 - }, - } - }, + } } - -export default Easing From c70588888c835284a987df4a372b88d7ae200a78 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Thu, 27 May 2021 14:35:41 +0900 Subject: [PATCH 048/107] fix : import of Easing.ts related : #610 --- src/Index.ts | 2 +- src/Tween.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Index.ts b/src/Index.ts index 0fc403c5..1800e1dd 100644 --- a/src/Index.ts +++ b/src/Index.ts @@ -7,7 +7,7 @@ * Thank you all, you're awesome! */ -import Easing from './Easing' +import * as Easing from './Easing' import Group from './Group' import Interpolation from './Interpolation' import now from './Now' diff --git a/src/Tween.ts b/src/Tween.ts index 3b0abd12..89e088ad 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -7,7 +7,7 @@ * Thank you all, you're awesome! */ -import Easing from './Easing' +import * as Easing from './Easing' import Interpolation from './Interpolation' import {mainGroup} from './mainGroup' import Sequence from './Sequence' From 76e79108ca03178d74727d4e85097ec027b21813 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Thu, 27 May 2021 14:41:50 +0900 Subject: [PATCH 049/107] add : tests if easing object is frozen. related : #610 --- src/tests.ts | 53 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index 74258b0e..a27cc3be 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -630,10 +630,48 @@ export const tests = { test.done() }, + 'Test TWEEN.Tween.EasingFunctionGroup should be frozen'(test: Test): void { + const replaceEasingFunction = (easingGroup: TWEEN.Easing.EasingFunctionGroup) => { + const throwsWithReassigned = () => { + easingGroup.In = (amount: number) => { + return 1.0 + amount + } + easingGroup.Out = (amount: number) => { + return 1.0 + amount + } + easingGroup.InOut = (amount: number) => { + return 1.0 + amount + } + } + test.throws(throwsWithReassigned) + test.equal(easingGroup.In(0.0), 0.0) + test.equal(easingGroup.Out(0.0), 0.0) + test.equal(easingGroup.InOut(0.0), 0.0) + test.equal(easingGroup.In(1.0), 1.0) + test.equal(easingGroup.Out(1.0), 1.0) + test.equal(easingGroup.InOut(1.0), 1.0) + } + + // eslint-disable-next-line + const implementsEasingFunctionGroup = (arg: any): arg is TWEEN.Easing.EasingFunctionGroup => { + return ( + arg !== null && + typeof arg === 'object' && + typeof arg.In === 'function' && + typeof arg.Out === 'function' && + typeof arg.InOut === 'function' + ) + } + const easingGroups = Object.values(TWEEN.Easing).filter(implementsEasingFunctionGroup) + easingGroups.forEach(replaceEasingFunction) + + test.done() + }, + 'Test TWEEN.Easing should starts at 0.0, ends at 1.0. TWEEN.Easing.InOut() should be 0.5 at midpoint'( test: Test, ): void { - const checkEdgeValue = (ease: EasingFunctionGroup) => { + const checkEdgeValue = (ease: TWEEN.Easing.EasingFunctionGroup) => { test.equal(ease.In(0.0), 0.0) test.equal(ease.Out(0.0), 0.0) test.equal(ease.InOut(0.0), 0.0) @@ -660,7 +698,7 @@ export const tests = { 'Test TWEEN.Easing should pass a specific value'(test: Test): void { const checkEasingGroupPassPoints = ( - easingGroup: EasingFunctionGroup, + easingGroup: TWEEN.Easing.EasingFunctionGroup, expects: {In: number; Out: number; InOut: number}, ) => { checkPassPoint(easingGroup.In, expects.In) @@ -2022,7 +2060,7 @@ export const tests = { 'Test TWEEN.Easing.generatePow(1) equals Linear'(test: Test): void { const ease1 = TWEEN.Easing.generatePow(1) - const compareWithLinear = (ease: EasingFunctionGroup, amount: number) => { + const compareWithLinear = (ease: TWEEN.Easing.EasingFunctionGroup, amount: number) => { const linearResult = TWEEN.Easing.Linear.None(amount) test.equal(linearResult, ease.In(amount)) test.equal(linearResult, ease.Out(amount)) @@ -2040,7 +2078,7 @@ export const tests = { }, 'Test TWEEN.Easing.generatePow(n) should pass 0.0, 0.5, 1.0'(test: Test): void { - const checkEdgeValue = (ease: EasingFunctionGroup) => { + const checkEdgeValue = (ease: TWEEN.Easing.EasingFunctionGroup) => { test.equal(ease.InOut(0.0), 0.0) test.equal(ease.In(0.0), 0.0) test.equal(ease.Out(0.0), 0.0) @@ -2096,15 +2134,10 @@ type Test = { equal(a: unknown, b: unknown, failMessage?: string): void deepEqual(a: unknown, b: unknown, failMessage?: string): void expect(n: number): void + throws(block: unknown, error?: unknown, message?: string): void done(): void } -type EasingFunctionGroup = { - In(amount: number): number - Out(amount: number): number - InOut(amount: number): number -} - function toBeCloseTo(test: Test, numberA: number, numberB: number, numDigits = 2): void { const diff = Math.abs(numberA - numberB) test.ok( From ec7d3acf2c202c67e3b8cbbfe6dc6d8b85eb4613 Mon Sep 17 00:00:00 2001 From: MasatoMakino Date: Thu, 27 May 2021 15:09:03 +0900 Subject: [PATCH 050/107] fix : unit test related : #617 --- src/tests.ts | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index a27cc3be..76477ef2 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -652,17 +652,19 @@ export const tests = { test.equal(easingGroup.InOut(1.0), 1.0) } - // eslint-disable-next-line - const implementsEasingFunctionGroup = (arg: any): arg is TWEEN.Easing.EasingFunctionGroup => { - return ( - arg !== null && - typeof arg === 'object' && - typeof arg.In === 'function' && - typeof arg.Out === 'function' && - typeof arg.InOut === 'function' - ) - } - const easingGroups = Object.values(TWEEN.Easing).filter(implementsEasingFunctionGroup) + const Easing = TWEEN.Easing + const easingGroups = [ + Easing.Quadratic, + Easing.Cubic, + Easing.Quartic, + Easing.Quintic, + Easing.Sinusoidal, + Easing.Exponential, + Easing.Circular, + Easing.Elastic, + Easing.Back, + Easing.Bounce, + ] easingGroups.forEach(replaceEasingFunction) test.done() From cfde568d5d14901f8169c29a8c978b4fb9af970e Mon Sep 17 00:00:00 2001 From: Xiao Tan Date: Thu, 12 Aug 2021 21:26:40 +0800 Subject: [PATCH 051/107] fix: endless concat --- src/Tween.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Tween.ts b/src/Tween.ts index 3b0abd12..90ece874 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -146,7 +146,9 @@ export class Tween { endValues = endValues.map(this._handleRelativeValue.bind(this, startValue as number)) // Create a local copy of the Array with the start value at the front - _valuesEnd[property] = [startValue].concat(endValues) + if(_valuesStart[property] === undefined) { + _valuesEnd[property] = [startValue].concat(endValues) + } } // handle the deepness of the values From 19bcb9d267378e109921dd416de70472d951e7cb Mon Sep 17 00:00:00 2001 From: Toby Harris Date: Sat, 2 Oct 2021 15:32:36 +0100 Subject: [PATCH 052/107] `onStartEvery`, as `onStart` but called on every repeat This is similar but not equivalent to `onRepeat`. The behaviour is as `onStart`, but it will trigger on every repeat. Unlike `onRepeat`, this means it will trigger at the start of the animation cycle, not the end of the previous. This is a critical difference if delays are in use. It also may give more expected results depending where in the draw cycle the TWEEN.update is called. --- src/Tween.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/Tween.ts b/src/Tween.ts index 3b0abd12..11bcc72a 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -38,6 +38,8 @@ export class Tween { private _chainedTweens: Array> = [] private _onStartCallback?: (object: T) => void private _onStartCallbackFired = false + private _onStartEveryCallback?: (object: T) => void + private _onStartEveryCallbackFired = false private _onUpdateCallback?: (object: T, elapsed: number) => void private _onRepeatCallback?: (object: T) => void private _onCompleteCallback?: (object: T) => void @@ -105,6 +107,7 @@ export class Tween { this._isPaused = false this._onStartCallbackFired = false + this._onStartEveryCallbackFired = false this._isChainStopped = false @@ -304,6 +307,11 @@ export class Tween { return this } + onStartEvery(callback?: (object: T) => void): this { + this._onStartEveryCallback = callback + return this + } + onUpdate(callback?: (object: T, elapsed: number) => void): this { this._onUpdateCallback = callback return this @@ -358,6 +366,14 @@ export class Tween { this._onStartCallbackFired = true } + if (this._onStartEveryCallbackFired === false) { + if (this._onStartEveryCallback) { + this._onStartEveryCallback(this._object) + } + + this._onStartEveryCallbackFired = true + } + elapsed = (time - this._startTime) / this._duration elapsed = this._duration === 0 || elapsed > 1 ? 1 : elapsed @@ -406,6 +422,8 @@ export class Tween { this._onRepeatCallback(this._object) } + this._onStartEveryCallbackFired = false + return true } else { if (this._onCompleteCallback) { From 3ee5eedf4f7e2c955ed8117e8b952a8a5d397cb1 Mon Sep 17 00:00:00 2001 From: Toby Harris Date: Mon, 4 Oct 2021 23:12:18 +0100 Subject: [PATCH 053/107] `onStartEvery` documented in user guide --- docs/user_guide.md | 115 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/docs/user_guide.md b/docs/user_guide.md index 95be95a5..1e533c8e 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -351,6 +351,12 @@ It is great for synchronising to other events or triggering actions you want to The tweened object is passed in as the first parameter. +### onStartEvery + +As per `onStart`, except that it _will_ be run on every repeat of the tween. + +The tweened object is passed in as the first parameter. + ### onStop Executed when a tween is explicitly stopped via `stop()`, but not when it is completed normally, and before stopping any possible chained tween. @@ -375,6 +381,115 @@ Executed whenever a tween has just finished one repetition and will begin anothe The tweened object is passed in as the first parameter. +To clarify when `onStart`, `onStartEvery` and `onRepeat` are called, consider: + +```javascript +const obj = {x: 0} + +const t = new TWEEN.Tween(obj) + .to({x: 5}, 5) + .repeat(Infinity) + .onStart(() => { + console.log('onStart') + }) + .onRepeat(() => { + console.log('onRepeat') + }) + .onStartEvery(() => { + console.log('onStartEvery') + }) + .start(0) + +for (let ticks = 0; ticks < 22; ticks += 1) { + console.log('Tick', ticks) + TWEEN.update(ticks) + + console.log(obj) + console.log() +} +``` + +The output would look like this, on the left as above, and on the right with `.delay(5)`: + +``` +Tick 0 Tick 0 +onStart { x: 0 } +onStartEvery +{ x: 0 } + +Tick 1 Tick 1 +{ x: 1 } { x: 0 } + +Tick 2 Tick 2 +{ x: 2 } { x: 0 } + +Tick 3 Tick 3 +{ x: 3 } { x: 0 } + +Tick 4 Tick 4 +{ x: 4 } { x: 0 } + +Tick 5 Tick 5 +onRepeat onStart +{ x: 5 } onStartEvery + { x: 0 } + +Tick 6 Tick 6 +onStartEvery { x: 1 } +{ x: 1 } + +Tick 7 Tick 7 +{ x: 2 } { x: 2 } + +Tick 8 Tick 8 +{ x: 3 } { x: 3 } + +Tick 9 Tick 9 +{ x: 4 } { x: 4 } + +Tick 10 Tick 10 +onRepeat onRepeat +{ x: 5 } { x: 5 } + +Tick 11 Tick 11 +onStartEvery { x: 5 } +{ x: 1 } + +Tick 12 Tick 12 +{ x: 2 } { x: 5 } + +Tick 13 Tick 13 +{ x: 3 } { x: 5 } + +Tick 14 Tick 14 +{ x: 4 } { x: 5 } + +Tick 15 Tick 15 +onRepeat onStartEvery +{ x: 5 } { x: 0 } + +Tick 16 Tick 16 +onStartEvery { x: 1 } +{ x: 1 } + +Tick 17 Tick 17 +{ x: 2 } { x: 2 } + +Tick 18 Tick 18 +{ x: 3 } { x: 3 } + +Tick 19 Tick 19 +{ x: 4 } { x: 4 } + +Tick 20 Tick 20 +onRepeat onRepeat +{ x: 5 } { x: 5 } + +Tick 21 Tick 21 +onStartEvery { x: 5 } +{ x: 1 } +``` + ## Advanced tweening ### Relative values From ef84eeb53e5205e3f3c500881b9776f33e8fa20f Mon Sep 17 00:00:00 2001 From: Toby Harris Date: Mon, 4 Oct 2021 23:44:15 +0100 Subject: [PATCH 054/107] `onStartEvery` tests --- src/tests.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/tests.ts b/src/tests.ts index 54c90bfb..b85123c5 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -203,6 +203,9 @@ export const tests = { test.ok(t.onStart() instanceof TWEEN.Tween) test.equal(t.onStart(), t) + test.ok(t.onStartEvery() instanceof TWEEN.Tween) + test.equal(t.onStartEvery(), t) + test.ok(t.onStop() instanceof TWEEN.Tween) test.equal(t.onStop(), t) @@ -976,6 +979,36 @@ export const tests = { test.done() }, + 'Test TWEEN.Tween.onStartEvery'(test: Test): void { + const obj = {}, + t = new TWEEN.Tween(obj) + let counter = 0 + + t.to({x: 2}, 500) + t.delay(500) + t.repeat(Infinity) + t.onStartEvery(function (): void { + counter++ + }) + + test.deepEqual(counter, 0) + + t.start(0) + TWEEN.update(0) + test.deepEqual(counter, 0, 'onStartEvery callback not called before delayed start') + + TWEEN.update(500) + test.deepEqual(counter, 1, 'onStartEvery callback called at delayed start') + + TWEEN.update(1000) + test.deepEqual(counter, 1, 'onStartEvery callback not called before delayed repeat start') + + TWEEN.update(1500) + test.deepEqual(counter, 2, 'onStartEvery callback called at delayed repeat start') + + test.done() + }, + 'Test TWEEN.Tween.onStop'(test: Test): void { const obj = {}, t = new TWEEN.Tween(obj) From 8bebe997caf7b6a2b0b7ea8b036d053cb30805be Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 24 Oct 2021 17:30:52 +0300 Subject: [PATCH 055/107] rename `onStartEvery()` to `onEveryStart()` --- docs/user_guide.md | 22 +++++++++++----------- src/Tween.ts | 20 ++++++++++---------- src/tests.ts | 16 ++++++++-------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/docs/user_guide.md b/docs/user_guide.md index 1e533c8e..5c39ef51 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -351,7 +351,7 @@ It is great for synchronising to other events or triggering actions you want to The tweened object is passed in as the first parameter. -### onStartEvery +### onEveryStart As per `onStart`, except that it _will_ be run on every repeat of the tween. @@ -381,7 +381,7 @@ Executed whenever a tween has just finished one repetition and will begin anothe The tweened object is passed in as the first parameter. -To clarify when `onStart`, `onStartEvery` and `onRepeat` are called, consider: +To clarify when `onStart`, `onEveryStart` and `onRepeat` are called, consider: ```javascript const obj = {x: 0} @@ -395,8 +395,8 @@ const t = new TWEEN.Tween(obj) .onRepeat(() => { console.log('onRepeat') }) - .onStartEvery(() => { - console.log('onStartEvery') + .onEveryStart(() => { + console.log('onEveryStart') }) .start(0) @@ -414,7 +414,7 @@ The output would look like this, on the left as above, and on the right with `.d ``` Tick 0 Tick 0 onStart { x: 0 } -onStartEvery +onEveryStart { x: 0 } Tick 1 Tick 1 @@ -431,11 +431,11 @@ Tick 4 Tick 4 Tick 5 Tick 5 onRepeat onStart -{ x: 5 } onStartEvery +{ x: 5 } onEveryStart { x: 0 } Tick 6 Tick 6 -onStartEvery { x: 1 } +onEveryStart { x: 1 } { x: 1 } Tick 7 Tick 7 @@ -452,7 +452,7 @@ onRepeat onRepeat { x: 5 } { x: 5 } Tick 11 Tick 11 -onStartEvery { x: 5 } +onEveryStart { x: 5 } { x: 1 } Tick 12 Tick 12 @@ -465,11 +465,11 @@ Tick 14 Tick 14 { x: 4 } { x: 5 } Tick 15 Tick 15 -onRepeat onStartEvery +onRepeat onEveryStart { x: 5 } { x: 0 } Tick 16 Tick 16 -onStartEvery { x: 1 } +onEveryStart { x: 1 } { x: 1 } Tick 17 Tick 17 @@ -486,7 +486,7 @@ onRepeat onRepeat { x: 5 } { x: 5 } Tick 21 Tick 21 -onStartEvery { x: 5 } +onEveryStart { x: 5 } { x: 1 } ``` diff --git a/src/Tween.ts b/src/Tween.ts index 11bcc72a..7ad8ab9d 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -38,8 +38,8 @@ export class Tween { private _chainedTweens: Array> = [] private _onStartCallback?: (object: T) => void private _onStartCallbackFired = false - private _onStartEveryCallback?: (object: T) => void - private _onStartEveryCallbackFired = false + private _onEveryStartCallback?: (object: T) => void + private _onEveryStartCallbackFired = false private _onUpdateCallback?: (object: T, elapsed: number) => void private _onRepeatCallback?: (object: T) => void private _onCompleteCallback?: (object: T) => void @@ -107,7 +107,7 @@ export class Tween { this._isPaused = false this._onStartCallbackFired = false - this._onStartEveryCallbackFired = false + this._onEveryStartCallbackFired = false this._isChainStopped = false @@ -307,8 +307,8 @@ export class Tween { return this } - onStartEvery(callback?: (object: T) => void): this { - this._onStartEveryCallback = callback + onEveryStart(callback?: (object: T) => void): this { + this._onEveryStartCallback = callback return this } @@ -366,12 +366,12 @@ export class Tween { this._onStartCallbackFired = true } - if (this._onStartEveryCallbackFired === false) { - if (this._onStartEveryCallback) { - this._onStartEveryCallback(this._object) + if (this._onEveryStartCallbackFired === false) { + if (this._onEveryStartCallback) { + this._onEveryStartCallback(this._object) } - this._onStartEveryCallbackFired = true + this._onEveryStartCallbackFired = true } elapsed = (time - this._startTime) / this._duration @@ -422,7 +422,7 @@ export class Tween { this._onRepeatCallback(this._object) } - this._onStartEveryCallbackFired = false + this._onEveryStartCallbackFired = false return true } else { diff --git a/src/tests.ts b/src/tests.ts index b85123c5..e87c0702 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -203,8 +203,8 @@ export const tests = { test.ok(t.onStart() instanceof TWEEN.Tween) test.equal(t.onStart(), t) - test.ok(t.onStartEvery() instanceof TWEEN.Tween) - test.equal(t.onStartEvery(), t) + test.ok(t.onEveryStart() instanceof TWEEN.Tween) + test.equal(t.onEveryStart(), t) test.ok(t.onStop() instanceof TWEEN.Tween) test.equal(t.onStop(), t) @@ -979,7 +979,7 @@ export const tests = { test.done() }, - 'Test TWEEN.Tween.onStartEvery'(test: Test): void { + 'Test TWEEN.Tween.onEveryStart'(test: Test): void { const obj = {}, t = new TWEEN.Tween(obj) let counter = 0 @@ -987,7 +987,7 @@ export const tests = { t.to({x: 2}, 500) t.delay(500) t.repeat(Infinity) - t.onStartEvery(function (): void { + t.onEveryStart(function (): void { counter++ }) @@ -995,16 +995,16 @@ export const tests = { t.start(0) TWEEN.update(0) - test.deepEqual(counter, 0, 'onStartEvery callback not called before delayed start') + test.deepEqual(counter, 0, 'onEveryStart callback not called before delayed start') TWEEN.update(500) - test.deepEqual(counter, 1, 'onStartEvery callback called at delayed start') + test.deepEqual(counter, 1, 'onEveryStart callback called at delayed start') TWEEN.update(1000) - test.deepEqual(counter, 1, 'onStartEvery callback not called before delayed repeat start') + test.deepEqual(counter, 1, 'onEveryStart callback not called before delayed repeat start') TWEEN.update(1500) - test.deepEqual(counter, 2, 'onStartEvery callback called at delayed repeat start') + test.deepEqual(counter, 2, 'onEveryStart callback called at delayed repeat start') test.done() }, From 8e584ed0af2caa93bc2230617b5557c1ed6c8069 Mon Sep 17 00:00:00 2001 From: Xiao Tan Date: Mon, 27 Dec 2021 12:41:09 +0800 Subject: [PATCH 056/107] fix: lint & add tests --- src/Tween.ts | 2 +- src/tests.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Tween.ts b/src/Tween.ts index dac10a67..d167b2bf 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -149,7 +149,7 @@ export class Tween { endValues = endValues.map(this._handleRelativeValue.bind(this, startValue as number)) // Create a local copy of the Array with the start value at the front - if(_valuesStart[property] === undefined) { + if (_valuesStart[property] === undefined) { _valuesEnd[property] = [startValue].concat(endValues) } } diff --git a/src/tests.ts b/src/tests.ts index e87c0702..6a3b8a6d 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2146,6 +2146,20 @@ export const tests = { test.done() }, + "Test TWEEN.to(ends) shouldn't grow endless on ends value"(test: Test): void { + const target = {y: 0} + const ends = {y: [100, 200]} + const tween = new TWEEN.Tween(target).to(ends, 1000) + + tween.stop().start(0) + tween.stop().start(0) + + TWEEN.update(250) + test.equal(target.y, 50) + + test.done() + }, + 'Test TWEEN.Tween.update() with no arguments'(test: Test): void { const clock = FakeTimers.install() const targetNow = {x: 0.0} From 429edef64eec6b44d80153a99e623168d2b7d2f2 Mon Sep 17 00:00:00 2001 From: chris-bingham Date: Mon, 28 Feb 2022 14:34:34 +0000 Subject: [PATCH 057/107] docs: :memo: Add startFromCurrentValues example (example no 18) --- examples/18_start_from_current_values.html | 110 +++++++++++++++++++++ examples/css/style.css | 17 ++++ 2 files changed, 127 insertions(+) create mode 100644 examples/18_start_from_current_values.html diff --git a/examples/18_start_from_current_values.html b/examples/18_start_from_current_values.html new file mode 100644 index 00000000..9aafed55 --- /dev/null +++ b/examples/18_start_from_current_values.html @@ -0,0 +1,110 @@ + + + + Tween.js / hello world! + + + + +
+

tween.js

+

18 _ start from current values

+

Example for illustrating the startFromCurrentValues() functionality.

+ + + + + +
+
+ + + + + + diff --git a/examples/css/style.css b/examples/css/style.css index 9bb92516..c0de9676 100644 --- a/examples/css/style.css +++ b/examples/css/style.css @@ -11,6 +11,23 @@ h2 { font-weight: normal; } +button { + cursor: pointer; + color: #333; + background: #fff; + border: 2px solid #333; + padding: 10px; + border-radius: 10px; + font-weight: bold; + font-size: 20px; + transition: all 150ms ease-out; +} + +button:hover { + background: #333; + color: #fff; +} + #info { position: absolute; top: 0; From 1a723360c2442c2339d68197bd2c0ed6ac42f246 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 2 Apr 2023 15:45:37 -0700 Subject: [PATCH 058/107] restore the original Easing format to avoid a breaking change --- src/Easing.ts | 397 ++++++++++++++++++++++++++------------------------ src/Index.ts | 2 +- src/Tween.ts | 2 +- src/tests.ts | 11 +- 4 files changed, 213 insertions(+), 199 deletions(-) diff --git a/src/Easing.ts b/src/Easing.ts index f50c54f9..0627389b 100644 --- a/src/Easing.ts +++ b/src/Easing.ts @@ -10,223 +10,236 @@ export type EasingFunctionGroup = { * The Ease class provides a collection of easing functions for use with tween.js. */ -export const Linear = Object.freeze({ - None: function (amount: number): number { - return amount - }, -}) - -export const Quadratic = Object.freeze({ - In: function (amount: number): number { - return amount * amount - }, - Out: function (amount: number): number { - return amount * (2 - amount) - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return 0.5 * amount * amount - } +export const Easing = Object.freeze({ + Linear: Object.freeze({ + None(amount: number): number { + return amount + }, + In(amount: number): number { + return this.None(amount) + }, + Out(amount: number): number { + return this.None(amount) + }, + InOut(amount: number): number { + return this.None(amount) + }, + }), - return -0.5 * (--amount * (amount - 2) - 1) - }, -}) + Quadratic: Object.freeze({ + In(amount: number): number { + return amount * amount + }, + Out(amount: number): number { + return amount * (2 - amount) + }, + InOut(amount: number): number { + if ((amount *= 2) < 1) { + return 0.5 * amount * amount + } -export const Cubic = Object.freeze({ - In: function (amount: number): number { - return amount * amount * amount - }, - Out: function (amount: number): number { - return --amount * amount * amount + 1 - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return 0.5 * amount * amount * amount - } - return 0.5 * ((amount -= 2) * amount * amount + 2) - }, -}) + return -0.5 * (--amount * (amount - 2) - 1) + }, + }), -export const Quartic = Object.freeze({ - In: function (amount: number): number { - return amount * amount * amount * amount - }, - Out: function (amount: number): number { - return 1 - --amount * amount * amount * amount - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return 0.5 * amount * amount * amount * amount - } + Cubic: Object.freeze({ + In(amount: number): number { + return amount * amount * amount + }, + Out(amount: number): number { + return --amount * amount * amount + 1 + }, + InOut(amount: number): number { + if ((amount *= 2) < 1) { + return 0.5 * amount * amount * amount + } + return 0.5 * ((amount -= 2) * amount * amount + 2) + }, + }), - return -0.5 * ((amount -= 2) * amount * amount * amount - 2) - }, -}) + Quartic: Object.freeze({ + In(amount: number): number { + return amount * amount * amount * amount + }, + Out(amount: number): number { + return 1 - --amount * amount * amount * amount + }, + InOut(amount: number): number { + if ((amount *= 2) < 1) { + return 0.5 * amount * amount * amount * amount + } -export const Quintic = Object.freeze({ - In: function (amount: number): number { - return amount * amount * amount * amount * amount - }, - Out: function (amount: number): number { - return --amount * amount * amount * amount * amount + 1 - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return 0.5 * amount * amount * amount * amount * amount - } + return -0.5 * ((amount -= 2) * amount * amount * amount - 2) + }, + }), - return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2) - }, -}) + Quintic: Object.freeze({ + In(amount: number): number { + return amount * amount * amount * amount * amount + }, + Out(amount: number): number { + return --amount * amount * amount * amount * amount + 1 + }, + InOut(amount: number): number { + if ((amount *= 2) < 1) { + return 0.5 * amount * amount * amount * amount * amount + } -export const Sinusoidal = Object.freeze({ - In: function (amount: number): number { - return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2) - }, - Out: function (amount: number): number { - return Math.sin((amount * Math.PI) / 2) - }, - InOut: function (amount: number): number { - return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount))) - }, -}) + return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2) + }, + }), -export const Exponential = Object.freeze({ - In: function (amount: number): number { - return amount === 0 ? 0 : Math.pow(1024, amount - 1) - }, - Out: function (amount: number): number { - return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount) - }, - InOut: function (amount: number): number { - if (amount === 0) { - return 0 - } + Sinusoidal: Object.freeze({ + In(amount: number): number { + return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2) + }, + Out(amount: number): number { + return Math.sin((amount * Math.PI) / 2) + }, + InOut(amount: number): number { + return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount))) + }, + }), - if (amount === 1) { - return 1 - } + Exponential: Object.freeze({ + In(amount: number): number { + return amount === 0 ? 0 : Math.pow(1024, amount - 1) + }, + Out(amount: number): number { + return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount) + }, + InOut(amount: number): number { + if (amount === 0) { + return 0 + } - if ((amount *= 2) < 1) { - return 0.5 * Math.pow(1024, amount - 1) - } + if (amount === 1) { + return 1 + } - return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2) - }, -}) + if ((amount *= 2) < 1) { + return 0.5 * Math.pow(1024, amount - 1) + } -export const Circular = Object.freeze({ - In: function (amount: number): number { - return 1 - Math.sqrt(1 - amount * amount) - }, - Out: function (amount: number): number { - return Math.sqrt(1 - --amount * amount) - }, - InOut: function (amount: number): number { - if ((amount *= 2) < 1) { - return -0.5 * (Math.sqrt(1 - amount * amount) - 1) - } - return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1) - }, -}) + return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2) + }, + }), -export const Elastic = Object.freeze({ - In: function (amount: number): number { - if (amount === 0) { - return 0 - } + Circular: Object.freeze({ + In(amount: number): number { + return 1 - Math.sqrt(1 - amount * amount) + }, + Out(amount: number): number { + return Math.sqrt(1 - --amount * amount) + }, + InOut(amount: number): number { + if ((amount *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - amount * amount) - 1) + } + return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1) + }, + }), - if (amount === 1) { - return 1 - } + Elastic: Object.freeze({ + In(amount: number): number { + if (amount === 0) { + return 0 + } - return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) - }, - Out: function (amount: number): number { - if (amount === 0) { - return 0 - } + if (amount === 1) { + return 1 + } - if (amount === 1) { - return 1 - } - return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1 - }, - InOut: function (amount: number): number { - if (amount === 0) { - return 0 - } + return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + }, + Out(amount: number): number { + if (amount === 0) { + return 0 + } - if (amount === 1) { - return 1 - } + if (amount === 1) { + return 1 + } + return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1 + }, + InOut(amount: number): number { + if (amount === 0) { + return 0 + } - amount *= 2 + if (amount === 1) { + return 1 + } - if (amount < 1) { - return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) - } + amount *= 2 - return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1 - }, -}) + if (amount < 1) { + return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + } -export const Back = Object.freeze({ - In: function (amount: number): number { - const s = 1.70158 - return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s) - }, - Out: function (amount: number): number { - const s = 1.70158 - return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1 - }, - InOut: function (amount: number): number { - const s = 1.70158 * 1.525 - if ((amount *= 2) < 1) { - return 0.5 * (amount * amount * ((s + 1) * amount - s)) - } - return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2) - }, -}) + return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1 + }, + }), -export const Bounce = Object.freeze({ - In: function (amount: number): number { - return 1 - Bounce.Out(1 - amount) - }, - Out: function (amount: number): number { - if (amount < 1 / 2.75) { - return 7.5625 * amount * amount - } else if (amount < 2 / 2.75) { - return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75 - } else if (amount < 2.5 / 2.75) { - return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375 - } else { - return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375 - } - }, - InOut: function (amount: number): number { - if (amount < 0.5) { - return Bounce.In(amount * 2) * 0.5 - } - return Bounce.Out(amount * 2 - 1) * 0.5 + 0.5 - }, -}) + Back: Object.freeze({ + In(amount: number): number { + const s = 1.70158 + return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s) + }, + Out(amount: number): number { + const s = 1.70158 + return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1 + }, + InOut(amount: number): number { + const s = 1.70158 * 1.525 + if ((amount *= 2) < 1) { + return 0.5 * (amount * amount * ((s + 1) * amount - s)) + } + return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2) + }, + }), -export const generatePow = function (power = 4): EasingFunctionGroup { - power = power < Number.EPSILON ? Number.EPSILON : power - power = power > 10000 ? 10000 : power - return { - In: function (amount: number): number { - return amount ** power + Bounce: Object.freeze({ + In(amount: number): number { + return 1 - Easing.Bounce.Out(1 - amount) }, - Out: function (amount: number): number { - return 1 - (1 - amount) ** power + Out(amount: number): number { + if (amount < 1 / 2.75) { + return 7.5625 * amount * amount + } else if (amount < 2 / 2.75) { + return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75 + } else if (amount < 2.5 / 2.75) { + return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375 + } else { + return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375 + } }, - InOut: function (amount: number): number { + InOut(amount: number): number { if (amount < 0.5) { - return (amount * 2) ** power / 2 + return Easing.Bounce.In(amount * 2) * 0.5 } - return (1 - (2 - amount * 2) ** power) / 2 + 0.5 + return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5 }, - } -} + }), + + generatePow(power = 4): EasingFunctionGroup { + power = power < Number.EPSILON ? Number.EPSILON : power + power = power > 10000 ? 10000 : power + return { + In(amount: number): number { + return amount ** power + }, + Out(amount: number): number { + return 1 - (1 - amount) ** power + }, + InOut(amount: number): number { + if (amount < 0.5) { + return (amount * 2) ** power / 2 + } + return (1 - (2 - amount * 2) ** power) / 2 + 0.5 + }, + } + }, +}) + +export default Easing diff --git a/src/Index.ts b/src/Index.ts index 1800e1dd..0fc403c5 100644 --- a/src/Index.ts +++ b/src/Index.ts @@ -7,7 +7,7 @@ * Thank you all, you're awesome! */ -import * as Easing from './Easing' +import Easing from './Easing' import Group from './Group' import Interpolation from './Interpolation' import now from './Now' diff --git a/src/Tween.ts b/src/Tween.ts index 8d89f940..d167b2bf 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -7,7 +7,7 @@ * Thank you all, you're awesome! */ -import * as Easing from './Easing' +import Easing from './Easing' import Interpolation from './Interpolation' import {mainGroup} from './mainGroup' import Sequence from './Sequence' diff --git a/src/tests.ts b/src/tests.ts index 41b1371d..95d2d29b 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,5 +1,6 @@ import * as TWEEN from './Index' import * as FakeTimers from '@sinonjs/fake-timers' +import type {EasingFunctionGroup} from './Easing' export const tests = { hello(test: Test): void { @@ -634,7 +635,7 @@ export const tests = { }, 'Test TWEEN.Tween.EasingFunctionGroup should be frozen'(test: Test): void { - const replaceEasingFunction = (easingGroup: TWEEN.Easing.EasingFunctionGroup) => { + const replaceEasingFunction = (easingGroup: EasingFunctionGroup) => { const throwsWithReassigned = () => { easingGroup.In = (amount: number) => { return 1.0 + amount @@ -676,7 +677,7 @@ export const tests = { 'Test TWEEN.Easing should starts at 0.0, ends at 1.0. TWEEN.Easing.InOut() should be 0.5 at midpoint'( test: Test, ): void { - const checkEdgeValue = (ease: TWEEN.Easing.EasingFunctionGroup) => { + const checkEdgeValue = (ease: EasingFunctionGroup) => { test.equal(ease.In(0.0), 0.0) test.equal(ease.Out(0.0), 0.0) test.equal(ease.InOut(0.0), 0.0) @@ -703,7 +704,7 @@ export const tests = { 'Test TWEEN.Easing should pass a specific value'(test: Test): void { const checkEasingGroupPassPoints = ( - easingGroup: TWEEN.Easing.EasingFunctionGroup, + easingGroup: EasingFunctionGroup, expects: {In: number; Out: number; InOut: number}, ) => { checkPassPoint(easingGroup.In, expects.In) @@ -2145,7 +2146,7 @@ export const tests = { 'Test TWEEN.Easing.generatePow(1) equals Linear'(test: Test): void { const ease1 = TWEEN.Easing.generatePow(1) - const compareWithLinear = (ease: TWEEN.Easing.EasingFunctionGroup, amount: number) => { + const compareWithLinear = (ease: EasingFunctionGroup, amount: number) => { const linearResult = TWEEN.Easing.Linear.None(amount) test.equal(linearResult, ease.In(amount)) test.equal(linearResult, ease.Out(amount)) @@ -2163,7 +2164,7 @@ export const tests = { }, 'Test TWEEN.Easing.generatePow(n) should pass 0.0, 0.5, 1.0'(test: Test): void { - const checkEdgeValue = (ease: TWEEN.Easing.EasingFunctionGroup) => { + const checkEdgeValue = (ease: EasingFunctionGroup) => { test.equal(ease.InOut(0.0), 0.0) test.equal(ease.In(0.0), 0.0) test.equal(ease.Out(0.0), 0.0) From d88fefc26b4964534a8cac67462a9e87e1a179ad Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 2 Apr 2023 15:51:43 -0700 Subject: [PATCH 059/107] update GitHub actions to run tests for PRs against main instead of master --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 17dce164..c855dbaa 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,9 +5,9 @@ name: build and tests on: push: - branches: [master] + branches: [main] pull_request: - branches: [master] + branches: [main] jobs: build: From dde3612fca64ff9d1c61167bd9c8779b7819efc2 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 2 Apr 2023 16:28:21 -0700 Subject: [PATCH 060/107] update release scripts so that they build and test prior to publishing on npm --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6122470c..42e0eab8 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,9 @@ "prettier": "prettier './**/*.{js,ts,md,json,html,css}'", "prepare": "npm run build", "version": "npm test && git add .", - "release:patch": "npm version patch --message 'v%s' && npm publish && npm run _release:push-branch", - "release:minor": "npm version minor --message 'v%s' && npm publish && npm run _release:push-branch", - "release:major": "npm version major --message 'v%s' && npm publish && npm run _release:push-branch", + "release:patch": "npm run build && npm test && npm version patch --message 'v%s' && npm publish && npm run _release:push-branch", + "release:minor": "npm run build && npm test && npm version minor --message 'v%s' && npm publish && npm run _release:push-branch", + "release:major": "npm run build && npm test && npm version major --message 'v%s' && npm publish && npm run _release:push-branch", "_release:push-branch": "git push --follow-tags --set-upstream origin `git rev-parse --abbrev-ref HEAD`" }, "author": "tween.js contributors (https://github.com/tweenjs/tween.js/graphs/contributors)", From fee407c6809a454cba5259bb68d7f536a305dd85 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 2 Apr 2023 16:42:36 -0700 Subject: [PATCH 061/107] undo release script update, test and build already happens --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 42e0eab8..6122470c 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,9 @@ "prettier": "prettier './**/*.{js,ts,md,json,html,css}'", "prepare": "npm run build", "version": "npm test && git add .", - "release:patch": "npm run build && npm test && npm version patch --message 'v%s' && npm publish && npm run _release:push-branch", - "release:minor": "npm run build && npm test && npm version minor --message 'v%s' && npm publish && npm run _release:push-branch", - "release:major": "npm run build && npm test && npm version major --message 'v%s' && npm publish && npm run _release:push-branch", + "release:patch": "npm version patch --message 'v%s' && npm publish && npm run _release:push-branch", + "release:minor": "npm version minor --message 'v%s' && npm publish && npm run _release:push-branch", + "release:major": "npm version major --message 'v%s' && npm publish && npm run _release:push-branch", "_release:push-branch": "git push --follow-tags --set-upstream origin `git rev-parse --abbrev-ref HEAD`" }, "author": "tween.js contributors (https://github.com/tweenjs/tween.js/graphs/contributors)", From 351810c1b1a4e2701a274229ae5ea9694a34c696 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 2 Apr 2023 16:42:46 -0700 Subject: [PATCH 062/107] v19.0.0 --- dist/tween.amd.js | 133 +++++++++++++++++++++++---------- dist/tween.cjs.js | 133 +++++++++++++++++++++++---------- dist/tween.d.ts | 183 +++++++++++++++------------------------------- dist/tween.esm.js | 133 +++++++++++++++++++++++---------- dist/tween.umd.js | 133 +++++++++++++++++++++++---------- package-lock.json | 4 +- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 441 insertions(+), 282 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index 256dd33a..b9a7e542 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -3,13 +3,22 @@ define(['exports'], function (exports) { 'use strict'; /** * The Ease class provides a collection of easing functions for use with tween.js. */ - var Easing = { - Linear: { + var Easing = Object.freeze({ + Linear: Object.freeze({ None: function (amount) { return amount; }, - }, - Quadratic: { + In: function (amount) { + return this.None(amount); + }, + Out: function (amount) { + return this.None(amount); + }, + InOut: function (amount) { + return this.None(amount); + }, + }), + Quadratic: Object.freeze({ In: function (amount) { return amount * amount; }, @@ -22,8 +31,8 @@ define(['exports'], function (exports) { 'use strict'; } return -0.5 * (--amount * (amount - 2) - 1); }, - }, - Cubic: { + }), + Cubic: Object.freeze({ In: function (amount) { return amount * amount * amount; }, @@ -36,8 +45,8 @@ define(['exports'], function (exports) { 'use strict'; } return 0.5 * ((amount -= 2) * amount * amount + 2); }, - }, - Quartic: { + }), + Quartic: Object.freeze({ In: function (amount) { return amount * amount * amount * amount; }, @@ -50,8 +59,8 @@ define(['exports'], function (exports) { 'use strict'; } return -0.5 * ((amount -= 2) * amount * amount * amount - 2); }, - }, - Quintic: { + }), + Quintic: Object.freeze({ In: function (amount) { return amount * amount * amount * amount * amount; }, @@ -64,19 +73,19 @@ define(['exports'], function (exports) { 'use strict'; } return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2); }, - }, - Sinusoidal: { + }), + Sinusoidal: Object.freeze({ In: function (amount) { - return 1 - Math.cos((amount * Math.PI) / 2); + return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2); }, Out: function (amount) { return Math.sin((amount * Math.PI) / 2); }, InOut: function (amount) { - return 0.5 * (1 - Math.cos(Math.PI * amount)); + return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount))); }, - }, - Exponential: { + }), + Exponential: Object.freeze({ In: function (amount) { return amount === 0 ? 0 : Math.pow(1024, amount - 1); }, @@ -95,8 +104,8 @@ define(['exports'], function (exports) { 'use strict'; } return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2); }, - }, - Circular: { + }), + Circular: Object.freeze({ In: function (amount) { return 1 - Math.sqrt(1 - amount * amount); }, @@ -109,8 +118,8 @@ define(['exports'], function (exports) { 'use strict'; } return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1); }, - }, - Elastic: { + }), + Elastic: Object.freeze({ In: function (amount) { if (amount === 0) { return 0; @@ -142,15 +151,15 @@ define(['exports'], function (exports) { 'use strict'; } return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1; }, - }, - Back: { + }), + Back: Object.freeze({ In: function (amount) { var s = 1.70158; - return amount * amount * ((s + 1) * amount - s); + return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s); }, Out: function (amount) { var s = 1.70158; - return --amount * amount * ((s + 1) * amount + s) + 1; + return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1; }, InOut: function (amount) { var s = 1.70158 * 1.525; @@ -159,8 +168,8 @@ define(['exports'], function (exports) { 'use strict'; } return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2); }, - }, - Bounce: { + }), + Bounce: Object.freeze({ In: function (amount) { return 1 - Easing.Bounce.Out(1 - amount); }, @@ -184,8 +193,27 @@ define(['exports'], function (exports) { 'use strict'; } return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5; }, + }), + generatePow: function (power) { + if (power === void 0) { power = 4; } + power = power < Number.EPSILON ? Number.EPSILON : power; + power = power > 10000 ? 10000 : power; + return { + In: function (amount) { + return Math.pow(amount, power); + }, + Out: function (amount) { + return 1 - Math.pow((1 - amount), power); + }, + InOut: function (amount) { + if (amount < 0.5) { + return Math.pow((amount * 2), power) / 2; + } + return (1 - Math.pow((2 - amount * 2), power)) / 2 + 0.5; + }, + }; }, - }; + }); var now; // Include a performance.now polyfill. @@ -398,8 +426,10 @@ define(['exports'], function (exports) { 'use strict'; this._startTime = 0; this._easingFunction = Easing.Linear.None; this._interpolationFunction = Interpolation.Linear; + // eslint-disable-next-line this._chainedTweens = []; this._onStartCallbackFired = false; + this._onEveryStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; this._goToEnd = false; @@ -425,10 +455,13 @@ define(['exports'], function (exports) { 'use strict'; return this; }; Tween.prototype.duration = function (d) { + if (d === void 0) { d = 1000; } this._duration = d; return this; }; - Tween.prototype.start = function (time) { + Tween.prototype.start = function (time, overrideStartingValues) { + if (time === void 0) { time = now$1(); } + if (overrideStartingValues === void 0) { overrideStartingValues = false; } if (this._isPlaying) { return this; } @@ -447,13 +480,17 @@ define(['exports'], function (exports) { 'use strict'; this._isPlaying = true; this._isPaused = false; this._onStartCallbackFired = false; + this._onEveryStartCallbackFired = false; this._isChainStopped = false; - this._startTime = time !== undefined ? (typeof time === 'string' ? now$1() + parseFloat(time) : time) : now$1(); + this._startTime = time; this._startTime += this._delayTime; - this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat); + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); return this; }; - Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat) { + Tween.prototype.startFromCurrentValues = function (time) { + return this.start(time, true); + }; + Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) { for (var property in _valuesEnd) { var startValue = _object[property]; var startValueIsArray = Array.isArray(startValue); @@ -473,7 +510,9 @@ define(['exports'], function (exports) { 'use strict'; // handle an array of relative values endValues = endValues.map(this._handleRelativeValue.bind(this, startValue)); // Create a local copy of the Array with the start value at the front - _valuesEnd[property] = [startValue].concat(endValues); + if (_valuesStart[property] === undefined) { + _valuesEnd[property] = [startValue].concat(endValues); + } } // handle the deepness of the values if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) { @@ -487,11 +526,11 @@ define(['exports'], function (exports) { 'use strict'; _valuesStartRepeat[property] = startValueIsArray ? [] : {}; // TODO? repeat nested values? And yoyo? And array values? // eslint-disable-next-line // @ts-ignore FIXME? - this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property]); + this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property], overrideStartingValues); } else { - // Save the starting value, but only once. - if (typeof _valuesStart[property] === 'undefined') { + // Save the starting value, but only once unless override is requested. + if (typeof _valuesStart[property] === 'undefined' || overrideStartingValues) { _valuesStart[property] = startValue; } if (!startValueIsArray) { @@ -562,14 +601,17 @@ define(['exports'], function (exports) { 'use strict'; return this; }; Tween.prototype.group = function (group) { + if (group === void 0) { group = mainGroup; } this._group = group; return this; }; Tween.prototype.delay = function (amount) { + if (amount === void 0) { amount = 0; } this._delayTime = amount; return this; }; Tween.prototype.repeat = function (times) { + if (times === void 0) { times = 0; } this._initialRepeat = times; this._repeat = times; return this; @@ -579,17 +621,21 @@ define(['exports'], function (exports) { 'use strict'; return this; }; Tween.prototype.yoyo = function (yoyo) { + if (yoyo === void 0) { yoyo = false; } this._yoyo = yoyo; return this; }; Tween.prototype.easing = function (easingFunction) { + if (easingFunction === void 0) { easingFunction = Easing.Linear.None; } this._easingFunction = easingFunction; return this; }; Tween.prototype.interpolation = function (interpolationFunction) { + if (interpolationFunction === void 0) { interpolationFunction = Interpolation.Linear; } this._interpolationFunction = interpolationFunction; return this; }; + // eslint-disable-next-line Tween.prototype.chain = function () { var tweens = []; for (var _i = 0; _i < arguments.length; _i++) { @@ -602,6 +648,10 @@ define(['exports'], function (exports) { 'use strict'; this._onStartCallback = callback; return this; }; + Tween.prototype.onEveryStart = function (callback) { + this._onEveryStartCallback = callback; + return this; + }; Tween.prototype.onUpdate = function (callback) { this._onUpdateCallback = callback; return this; @@ -635,7 +685,7 @@ define(['exports'], function (exports) { 'use strict'; if (time > endTime) return false; if (autoStart) - this.start(time); + this.start(time, true); } this._goToEnd = false; if (time < this._startTime) { @@ -647,6 +697,12 @@ define(['exports'], function (exports) { 'use strict'; } this._onStartCallbackFired = true; } + if (this._onEveryStartCallbackFired === false) { + if (this._onEveryStartCallback) { + this._onEveryStartCallback(this._object); + } + this._onEveryStartCallbackFired = true; + } elapsed = (time - this._startTime) / this._duration; elapsed = this._duration === 0 || elapsed > 1 ? 1 : elapsed; var value = this._easingFunction(elapsed); @@ -685,6 +741,7 @@ define(['exports'], function (exports) { 'use strict'; if (this._onRepeatCallback) { this._onRepeatCallback(this._object); } + this._onEveryStartCallbackFired = false; return true; } else { @@ -694,7 +751,7 @@ define(['exports'], function (exports) { 'use strict'; for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) { // Make the chained tweens start exactly at the time they should, // even if the `update()` method was called way past the duration of the tween - this._chainedTweens[i].start(this._startTime + this._duration); + this._chainedTweens[i].start(this._startTime + this._duration, false); } this._isPlaying = false; return false; @@ -758,7 +815,7 @@ define(['exports'], function (exports) { 'use strict'; return Tween; }()); - var VERSION = '18.6.4'; + var VERSION = '19.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index 6b4d73d1..6d8a61cf 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -5,13 +5,22 @@ Object.defineProperty(exports, '__esModule', { value: true }); /** * The Ease class provides a collection of easing functions for use with tween.js. */ -var Easing = { - Linear: { +var Easing = Object.freeze({ + Linear: Object.freeze({ None: function (amount) { return amount; }, - }, - Quadratic: { + In: function (amount) { + return this.None(amount); + }, + Out: function (amount) { + return this.None(amount); + }, + InOut: function (amount) { + return this.None(amount); + }, + }), + Quadratic: Object.freeze({ In: function (amount) { return amount * amount; }, @@ -24,8 +33,8 @@ var Easing = { } return -0.5 * (--amount * (amount - 2) - 1); }, - }, - Cubic: { + }), + Cubic: Object.freeze({ In: function (amount) { return amount * amount * amount; }, @@ -38,8 +47,8 @@ var Easing = { } return 0.5 * ((amount -= 2) * amount * amount + 2); }, - }, - Quartic: { + }), + Quartic: Object.freeze({ In: function (amount) { return amount * amount * amount * amount; }, @@ -52,8 +61,8 @@ var Easing = { } return -0.5 * ((amount -= 2) * amount * amount * amount - 2); }, - }, - Quintic: { + }), + Quintic: Object.freeze({ In: function (amount) { return amount * amount * amount * amount * amount; }, @@ -66,19 +75,19 @@ var Easing = { } return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2); }, - }, - Sinusoidal: { + }), + Sinusoidal: Object.freeze({ In: function (amount) { - return 1 - Math.cos((amount * Math.PI) / 2); + return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2); }, Out: function (amount) { return Math.sin((amount * Math.PI) / 2); }, InOut: function (amount) { - return 0.5 * (1 - Math.cos(Math.PI * amount)); + return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount))); }, - }, - Exponential: { + }), + Exponential: Object.freeze({ In: function (amount) { return amount === 0 ? 0 : Math.pow(1024, amount - 1); }, @@ -97,8 +106,8 @@ var Easing = { } return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2); }, - }, - Circular: { + }), + Circular: Object.freeze({ In: function (amount) { return 1 - Math.sqrt(1 - amount * amount); }, @@ -111,8 +120,8 @@ var Easing = { } return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1); }, - }, - Elastic: { + }), + Elastic: Object.freeze({ In: function (amount) { if (amount === 0) { return 0; @@ -144,15 +153,15 @@ var Easing = { } return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1; }, - }, - Back: { + }), + Back: Object.freeze({ In: function (amount) { var s = 1.70158; - return amount * amount * ((s + 1) * amount - s); + return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s); }, Out: function (amount) { var s = 1.70158; - return --amount * amount * ((s + 1) * amount + s) + 1; + return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1; }, InOut: function (amount) { var s = 1.70158 * 1.525; @@ -161,8 +170,8 @@ var Easing = { } return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2); }, - }, - Bounce: { + }), + Bounce: Object.freeze({ In: function (amount) { return 1 - Easing.Bounce.Out(1 - amount); }, @@ -186,8 +195,27 @@ var Easing = { } return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5; }, + }), + generatePow: function (power) { + if (power === void 0) { power = 4; } + power = power < Number.EPSILON ? Number.EPSILON : power; + power = power > 10000 ? 10000 : power; + return { + In: function (amount) { + return Math.pow(amount, power); + }, + Out: function (amount) { + return 1 - Math.pow((1 - amount), power); + }, + InOut: function (amount) { + if (amount < 0.5) { + return Math.pow((amount * 2), power) / 2; + } + return (1 - Math.pow((2 - amount * 2), power)) / 2 + 0.5; + }, + }; }, -}; +}); var now; // Include a performance.now polyfill. @@ -400,8 +428,10 @@ var Tween = /** @class */ (function () { this._startTime = 0; this._easingFunction = Easing.Linear.None; this._interpolationFunction = Interpolation.Linear; + // eslint-disable-next-line this._chainedTweens = []; this._onStartCallbackFired = false; + this._onEveryStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; this._goToEnd = false; @@ -427,10 +457,13 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.duration = function (d) { + if (d === void 0) { d = 1000; } this._duration = d; return this; }; - Tween.prototype.start = function (time) { + Tween.prototype.start = function (time, overrideStartingValues) { + if (time === void 0) { time = now$1(); } + if (overrideStartingValues === void 0) { overrideStartingValues = false; } if (this._isPlaying) { return this; } @@ -449,13 +482,17 @@ var Tween = /** @class */ (function () { this._isPlaying = true; this._isPaused = false; this._onStartCallbackFired = false; + this._onEveryStartCallbackFired = false; this._isChainStopped = false; - this._startTime = time !== undefined ? (typeof time === 'string' ? now$1() + parseFloat(time) : time) : now$1(); + this._startTime = time; this._startTime += this._delayTime; - this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat); + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); return this; }; - Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat) { + Tween.prototype.startFromCurrentValues = function (time) { + return this.start(time, true); + }; + Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) { for (var property in _valuesEnd) { var startValue = _object[property]; var startValueIsArray = Array.isArray(startValue); @@ -475,7 +512,9 @@ var Tween = /** @class */ (function () { // handle an array of relative values endValues = endValues.map(this._handleRelativeValue.bind(this, startValue)); // Create a local copy of the Array with the start value at the front - _valuesEnd[property] = [startValue].concat(endValues); + if (_valuesStart[property] === undefined) { + _valuesEnd[property] = [startValue].concat(endValues); + } } // handle the deepness of the values if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) { @@ -489,11 +528,11 @@ var Tween = /** @class */ (function () { _valuesStartRepeat[property] = startValueIsArray ? [] : {}; // TODO? repeat nested values? And yoyo? And array values? // eslint-disable-next-line // @ts-ignore FIXME? - this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property]); + this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property], overrideStartingValues); } else { - // Save the starting value, but only once. - if (typeof _valuesStart[property] === 'undefined') { + // Save the starting value, but only once unless override is requested. + if (typeof _valuesStart[property] === 'undefined' || overrideStartingValues) { _valuesStart[property] = startValue; } if (!startValueIsArray) { @@ -564,14 +603,17 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.group = function (group) { + if (group === void 0) { group = mainGroup; } this._group = group; return this; }; Tween.prototype.delay = function (amount) { + if (amount === void 0) { amount = 0; } this._delayTime = amount; return this; }; Tween.prototype.repeat = function (times) { + if (times === void 0) { times = 0; } this._initialRepeat = times; this._repeat = times; return this; @@ -581,17 +623,21 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.yoyo = function (yoyo) { + if (yoyo === void 0) { yoyo = false; } this._yoyo = yoyo; return this; }; Tween.prototype.easing = function (easingFunction) { + if (easingFunction === void 0) { easingFunction = Easing.Linear.None; } this._easingFunction = easingFunction; return this; }; Tween.prototype.interpolation = function (interpolationFunction) { + if (interpolationFunction === void 0) { interpolationFunction = Interpolation.Linear; } this._interpolationFunction = interpolationFunction; return this; }; + // eslint-disable-next-line Tween.prototype.chain = function () { var tweens = []; for (var _i = 0; _i < arguments.length; _i++) { @@ -604,6 +650,10 @@ var Tween = /** @class */ (function () { this._onStartCallback = callback; return this; }; + Tween.prototype.onEveryStart = function (callback) { + this._onEveryStartCallback = callback; + return this; + }; Tween.prototype.onUpdate = function (callback) { this._onUpdateCallback = callback; return this; @@ -637,7 +687,7 @@ var Tween = /** @class */ (function () { if (time > endTime) return false; if (autoStart) - this.start(time); + this.start(time, true); } this._goToEnd = false; if (time < this._startTime) { @@ -649,6 +699,12 @@ var Tween = /** @class */ (function () { } this._onStartCallbackFired = true; } + if (this._onEveryStartCallbackFired === false) { + if (this._onEveryStartCallback) { + this._onEveryStartCallback(this._object); + } + this._onEveryStartCallbackFired = true; + } elapsed = (time - this._startTime) / this._duration; elapsed = this._duration === 0 || elapsed > 1 ? 1 : elapsed; var value = this._easingFunction(elapsed); @@ -687,6 +743,7 @@ var Tween = /** @class */ (function () { if (this._onRepeatCallback) { this._onRepeatCallback(this._object); } + this._onEveryStartCallbackFired = false; return true; } else { @@ -696,7 +753,7 @@ var Tween = /** @class */ (function () { for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) { // Make the chained tweens start exactly at the time they should, // even if the `update()` method was called way past the duration of the tween - this._chainedTweens[i].start(this._startTime + this._duration); + this._chainedTweens[i].start(this._startTime + this._duration, false); } this._isPlaying = false; return false; @@ -760,7 +817,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.6.4'; +var VERSION = '19.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index ea216027..f2b3dae3 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -1,62 +1,28 @@ declare type EasingFunction = (amount: number) => number; +declare type EasingFunctionGroup = { + In: EasingFunction; + Out: EasingFunction; + InOut: EasingFunction; +}; /** * The Ease class provides a collection of easing functions for use with tween.js. */ -declare const Easing: { - Linear: { - None: (amount: number) => number; - }; - Quadratic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Cubic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Quartic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Quintic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Sinusoidal: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Exponential: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Circular: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Elastic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Back: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Bounce: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; -}; +declare const Easing: Readonly<{ + Linear: Readonly; + Quadratic: Readonly; + Cubic: Readonly; + Quartic: Readonly; + Quintic: Readonly; + Sinusoidal: Readonly; + Exponential: Readonly; + Circular: Readonly; + Elastic: Readonly; + Back: Readonly; + Bounce: Readonly; + generatePow(power?: number): EasingFunctionGroup; +}>; /** * @@ -99,6 +65,8 @@ declare class Tween { private _chainedTweens; private _onStartCallback?; private _onStartCallbackFired; + private _onEveryStartCallback?; + private _onEveryStartCallbackFired; private _onUpdateCallback?; private _onRepeatCallback?; private _onCompleteCallback?; @@ -110,27 +78,29 @@ declare class Tween { isPlaying(): boolean; isPaused(): boolean; to(properties: UnknownProps, duration?: number): this; - duration(d: number): this; - start(time?: number): this; + duration(d?: number): this; + start(time?: number, overrideStartingValues?: boolean): this; + startFromCurrentValues(time?: number): this; private _setupProperties; stop(): this; end(): this; pause(time?: number): this; resume(time?: number): this; stopChainedTweens(): this; - group(group: Group): this; - delay(amount: number): this; - repeat(times: number): this; - repeatDelay(amount: number): this; - yoyo(yoyo: boolean): this; - easing(easingFunction: EasingFunction): this; - interpolation(interpolationFunction: InterpolationFunction): this; - chain(...tweens: Array>): this; - onStart(callback: (object: T) => void): this; - onUpdate(callback: (object: T, elapsed: number) => void): this; - onRepeat(callback: (object: T) => void): this; - onComplete(callback: (object: T) => void): this; - onStop(callback: (object: T) => void): this; + group(group?: Group): this; + delay(amount?: number): this; + repeat(times?: number): this; + repeatDelay(amount?: number): this; + yoyo(yoyo?: boolean): this; + easing(easingFunction?: EasingFunction): this; + interpolation(interpolationFunction?: InterpolationFunction): this; + chain(...tweens: Array>): this; + onStart(callback?: (object: T) => void): this; + onEveryStart(callback?: (object: T) => void): this; + onUpdate(callback?: (object: T, elapsed: number) => void): this; + onRepeat(callback?: (object: T) => void): this; + onComplete(callback?: (object: T) => void): this; + onStop(callback?: (object: T) => void): this; private _goToEnd; /** * @returns true if the tween is still playing after the update, false @@ -170,7 +140,7 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "18.6.4"; +declare const VERSION = "19.0.0"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween>[]; @@ -179,61 +149,22 @@ declare const add: (tween: Tween>) => void; declare const remove: (tween: Tween>) => void; declare const update: (time?: number, preserve?: boolean) => boolean; declare const exports: { - Easing: { - Linear: { - None: (amount: number) => number; - }; - Quadratic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Cubic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Quartic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Quintic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Sinusoidal: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Exponential: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Circular: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Elastic: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Back: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - Bounce: { - In: (amount: number) => number; - Out: (amount: number) => number; - InOut: (amount: number) => number; - }; - }; + Easing: Readonly<{ + Linear: Readonly; + Quadratic: Readonly; + Cubic: Readonly; + Quartic: Readonly; + Quintic: Readonly; + Sinusoidal: Readonly; + Exponential: Readonly; + Circular: Readonly; + Elastic: Readonly; + Back: Readonly; + Bounce: Readonly; + generatePow(power?: number): EasingFunctionGroup; + }>; Group: typeof Group; Interpolation: { Linear: (v: number[], k: number) => number; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 610a1cdb..31c416c8 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -1,13 +1,22 @@ /** * The Ease class provides a collection of easing functions for use with tween.js. */ -var Easing = { - Linear: { +var Easing = Object.freeze({ + Linear: Object.freeze({ None: function (amount) { return amount; }, - }, - Quadratic: { + In: function (amount) { + return this.None(amount); + }, + Out: function (amount) { + return this.None(amount); + }, + InOut: function (amount) { + return this.None(amount); + }, + }), + Quadratic: Object.freeze({ In: function (amount) { return amount * amount; }, @@ -20,8 +29,8 @@ var Easing = { } return -0.5 * (--amount * (amount - 2) - 1); }, - }, - Cubic: { + }), + Cubic: Object.freeze({ In: function (amount) { return amount * amount * amount; }, @@ -34,8 +43,8 @@ var Easing = { } return 0.5 * ((amount -= 2) * amount * amount + 2); }, - }, - Quartic: { + }), + Quartic: Object.freeze({ In: function (amount) { return amount * amount * amount * amount; }, @@ -48,8 +57,8 @@ var Easing = { } return -0.5 * ((amount -= 2) * amount * amount * amount - 2); }, - }, - Quintic: { + }), + Quintic: Object.freeze({ In: function (amount) { return amount * amount * amount * amount * amount; }, @@ -62,19 +71,19 @@ var Easing = { } return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2); }, - }, - Sinusoidal: { + }), + Sinusoidal: Object.freeze({ In: function (amount) { - return 1 - Math.cos((amount * Math.PI) / 2); + return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2); }, Out: function (amount) { return Math.sin((amount * Math.PI) / 2); }, InOut: function (amount) { - return 0.5 * (1 - Math.cos(Math.PI * amount)); + return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount))); }, - }, - Exponential: { + }), + Exponential: Object.freeze({ In: function (amount) { return amount === 0 ? 0 : Math.pow(1024, amount - 1); }, @@ -93,8 +102,8 @@ var Easing = { } return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2); }, - }, - Circular: { + }), + Circular: Object.freeze({ In: function (amount) { return 1 - Math.sqrt(1 - amount * amount); }, @@ -107,8 +116,8 @@ var Easing = { } return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1); }, - }, - Elastic: { + }), + Elastic: Object.freeze({ In: function (amount) { if (amount === 0) { return 0; @@ -140,15 +149,15 @@ var Easing = { } return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1; }, - }, - Back: { + }), + Back: Object.freeze({ In: function (amount) { var s = 1.70158; - return amount * amount * ((s + 1) * amount - s); + return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s); }, Out: function (amount) { var s = 1.70158; - return --amount * amount * ((s + 1) * amount + s) + 1; + return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1; }, InOut: function (amount) { var s = 1.70158 * 1.525; @@ -157,8 +166,8 @@ var Easing = { } return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2); }, - }, - Bounce: { + }), + Bounce: Object.freeze({ In: function (amount) { return 1 - Easing.Bounce.Out(1 - amount); }, @@ -182,8 +191,27 @@ var Easing = { } return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5; }, + }), + generatePow: function (power) { + if (power === void 0) { power = 4; } + power = power < Number.EPSILON ? Number.EPSILON : power; + power = power > 10000 ? 10000 : power; + return { + In: function (amount) { + return Math.pow(amount, power); + }, + Out: function (amount) { + return 1 - Math.pow((1 - amount), power); + }, + InOut: function (amount) { + if (amount < 0.5) { + return Math.pow((amount * 2), power) / 2; + } + return (1 - Math.pow((2 - amount * 2), power)) / 2 + 0.5; + }, + }; }, -}; +}); var now; // Include a performance.now polyfill. @@ -396,8 +424,10 @@ var Tween = /** @class */ (function () { this._startTime = 0; this._easingFunction = Easing.Linear.None; this._interpolationFunction = Interpolation.Linear; + // eslint-disable-next-line this._chainedTweens = []; this._onStartCallbackFired = false; + this._onEveryStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; this._goToEnd = false; @@ -423,10 +453,13 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.duration = function (d) { + if (d === void 0) { d = 1000; } this._duration = d; return this; }; - Tween.prototype.start = function (time) { + Tween.prototype.start = function (time, overrideStartingValues) { + if (time === void 0) { time = now$1(); } + if (overrideStartingValues === void 0) { overrideStartingValues = false; } if (this._isPlaying) { return this; } @@ -445,13 +478,17 @@ var Tween = /** @class */ (function () { this._isPlaying = true; this._isPaused = false; this._onStartCallbackFired = false; + this._onEveryStartCallbackFired = false; this._isChainStopped = false; - this._startTime = time !== undefined ? (typeof time === 'string' ? now$1() + parseFloat(time) : time) : now$1(); + this._startTime = time; this._startTime += this._delayTime; - this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat); + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); return this; }; - Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat) { + Tween.prototype.startFromCurrentValues = function (time) { + return this.start(time, true); + }; + Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) { for (var property in _valuesEnd) { var startValue = _object[property]; var startValueIsArray = Array.isArray(startValue); @@ -471,7 +508,9 @@ var Tween = /** @class */ (function () { // handle an array of relative values endValues = endValues.map(this._handleRelativeValue.bind(this, startValue)); // Create a local copy of the Array with the start value at the front - _valuesEnd[property] = [startValue].concat(endValues); + if (_valuesStart[property] === undefined) { + _valuesEnd[property] = [startValue].concat(endValues); + } } // handle the deepness of the values if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) { @@ -485,11 +524,11 @@ var Tween = /** @class */ (function () { _valuesStartRepeat[property] = startValueIsArray ? [] : {}; // TODO? repeat nested values? And yoyo? And array values? // eslint-disable-next-line // @ts-ignore FIXME? - this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property]); + this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property], overrideStartingValues); } else { - // Save the starting value, but only once. - if (typeof _valuesStart[property] === 'undefined') { + // Save the starting value, but only once unless override is requested. + if (typeof _valuesStart[property] === 'undefined' || overrideStartingValues) { _valuesStart[property] = startValue; } if (!startValueIsArray) { @@ -560,14 +599,17 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.group = function (group) { + if (group === void 0) { group = mainGroup; } this._group = group; return this; }; Tween.prototype.delay = function (amount) { + if (amount === void 0) { amount = 0; } this._delayTime = amount; return this; }; Tween.prototype.repeat = function (times) { + if (times === void 0) { times = 0; } this._initialRepeat = times; this._repeat = times; return this; @@ -577,17 +619,21 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.yoyo = function (yoyo) { + if (yoyo === void 0) { yoyo = false; } this._yoyo = yoyo; return this; }; Tween.prototype.easing = function (easingFunction) { + if (easingFunction === void 0) { easingFunction = Easing.Linear.None; } this._easingFunction = easingFunction; return this; }; Tween.prototype.interpolation = function (interpolationFunction) { + if (interpolationFunction === void 0) { interpolationFunction = Interpolation.Linear; } this._interpolationFunction = interpolationFunction; return this; }; + // eslint-disable-next-line Tween.prototype.chain = function () { var tweens = []; for (var _i = 0; _i < arguments.length; _i++) { @@ -600,6 +646,10 @@ var Tween = /** @class */ (function () { this._onStartCallback = callback; return this; }; + Tween.prototype.onEveryStart = function (callback) { + this._onEveryStartCallback = callback; + return this; + }; Tween.prototype.onUpdate = function (callback) { this._onUpdateCallback = callback; return this; @@ -633,7 +683,7 @@ var Tween = /** @class */ (function () { if (time > endTime) return false; if (autoStart) - this.start(time); + this.start(time, true); } this._goToEnd = false; if (time < this._startTime) { @@ -645,6 +695,12 @@ var Tween = /** @class */ (function () { } this._onStartCallbackFired = true; } + if (this._onEveryStartCallbackFired === false) { + if (this._onEveryStartCallback) { + this._onEveryStartCallback(this._object); + } + this._onEveryStartCallbackFired = true; + } elapsed = (time - this._startTime) / this._duration; elapsed = this._duration === 0 || elapsed > 1 ? 1 : elapsed; var value = this._easingFunction(elapsed); @@ -683,6 +739,7 @@ var Tween = /** @class */ (function () { if (this._onRepeatCallback) { this._onRepeatCallback(this._object); } + this._onEveryStartCallbackFired = false; return true; } else { @@ -692,7 +749,7 @@ var Tween = /** @class */ (function () { for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) { // Make the chained tweens start exactly at the time they should, // even if the `update()` method was called way past the duration of the tween - this._chainedTweens[i].start(this._startTime + this._duration); + this._chainedTweens[i].start(this._startTime + this._duration, false); } this._isPlaying = false; return false; @@ -756,7 +813,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '18.6.4'; +var VERSION = '19.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index 0d2f36eb..a75c60dc 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -7,13 +7,22 @@ /** * The Ease class provides a collection of easing functions for use with tween.js. */ - var Easing = { - Linear: { + var Easing = Object.freeze({ + Linear: Object.freeze({ None: function (amount) { return amount; }, - }, - Quadratic: { + In: function (amount) { + return this.None(amount); + }, + Out: function (amount) { + return this.None(amount); + }, + InOut: function (amount) { + return this.None(amount); + }, + }), + Quadratic: Object.freeze({ In: function (amount) { return amount * amount; }, @@ -26,8 +35,8 @@ } return -0.5 * (--amount * (amount - 2) - 1); }, - }, - Cubic: { + }), + Cubic: Object.freeze({ In: function (amount) { return amount * amount * amount; }, @@ -40,8 +49,8 @@ } return 0.5 * ((amount -= 2) * amount * amount + 2); }, - }, - Quartic: { + }), + Quartic: Object.freeze({ In: function (amount) { return amount * amount * amount * amount; }, @@ -54,8 +63,8 @@ } return -0.5 * ((amount -= 2) * amount * amount * amount - 2); }, - }, - Quintic: { + }), + Quintic: Object.freeze({ In: function (amount) { return amount * amount * amount * amount * amount; }, @@ -68,19 +77,19 @@ } return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2); }, - }, - Sinusoidal: { + }), + Sinusoidal: Object.freeze({ In: function (amount) { - return 1 - Math.cos((amount * Math.PI) / 2); + return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2); }, Out: function (amount) { return Math.sin((amount * Math.PI) / 2); }, InOut: function (amount) { - return 0.5 * (1 - Math.cos(Math.PI * amount)); + return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount))); }, - }, - Exponential: { + }), + Exponential: Object.freeze({ In: function (amount) { return amount === 0 ? 0 : Math.pow(1024, amount - 1); }, @@ -99,8 +108,8 @@ } return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2); }, - }, - Circular: { + }), + Circular: Object.freeze({ In: function (amount) { return 1 - Math.sqrt(1 - amount * amount); }, @@ -113,8 +122,8 @@ } return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1); }, - }, - Elastic: { + }), + Elastic: Object.freeze({ In: function (amount) { if (amount === 0) { return 0; @@ -146,15 +155,15 @@ } return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1; }, - }, - Back: { + }), + Back: Object.freeze({ In: function (amount) { var s = 1.70158; - return amount * amount * ((s + 1) * amount - s); + return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s); }, Out: function (amount) { var s = 1.70158; - return --amount * amount * ((s + 1) * amount + s) + 1; + return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1; }, InOut: function (amount) { var s = 1.70158 * 1.525; @@ -163,8 +172,8 @@ } return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2); }, - }, - Bounce: { + }), + Bounce: Object.freeze({ In: function (amount) { return 1 - Easing.Bounce.Out(1 - amount); }, @@ -188,8 +197,27 @@ } return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5; }, + }), + generatePow: function (power) { + if (power === void 0) { power = 4; } + power = power < Number.EPSILON ? Number.EPSILON : power; + power = power > 10000 ? 10000 : power; + return { + In: function (amount) { + return Math.pow(amount, power); + }, + Out: function (amount) { + return 1 - Math.pow((1 - amount), power); + }, + InOut: function (amount) { + if (amount < 0.5) { + return Math.pow((amount * 2), power) / 2; + } + return (1 - Math.pow((2 - amount * 2), power)) / 2 + 0.5; + }, + }; }, - }; + }); var now; // Include a performance.now polyfill. @@ -402,8 +430,10 @@ this._startTime = 0; this._easingFunction = Easing.Linear.None; this._interpolationFunction = Interpolation.Linear; + // eslint-disable-next-line this._chainedTweens = []; this._onStartCallbackFired = false; + this._onEveryStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; this._goToEnd = false; @@ -429,10 +459,13 @@ return this; }; Tween.prototype.duration = function (d) { + if (d === void 0) { d = 1000; } this._duration = d; return this; }; - Tween.prototype.start = function (time) { + Tween.prototype.start = function (time, overrideStartingValues) { + if (time === void 0) { time = now$1(); } + if (overrideStartingValues === void 0) { overrideStartingValues = false; } if (this._isPlaying) { return this; } @@ -451,13 +484,17 @@ this._isPlaying = true; this._isPaused = false; this._onStartCallbackFired = false; + this._onEveryStartCallbackFired = false; this._isChainStopped = false; - this._startTime = time !== undefined ? (typeof time === 'string' ? now$1() + parseFloat(time) : time) : now$1(); + this._startTime = time; this._startTime += this._delayTime; - this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat); + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); return this; }; - Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat) { + Tween.prototype.startFromCurrentValues = function (time) { + return this.start(time, true); + }; + Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) { for (var property in _valuesEnd) { var startValue = _object[property]; var startValueIsArray = Array.isArray(startValue); @@ -477,7 +514,9 @@ // handle an array of relative values endValues = endValues.map(this._handleRelativeValue.bind(this, startValue)); // Create a local copy of the Array with the start value at the front - _valuesEnd[property] = [startValue].concat(endValues); + if (_valuesStart[property] === undefined) { + _valuesEnd[property] = [startValue].concat(endValues); + } } // handle the deepness of the values if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) { @@ -491,11 +530,11 @@ _valuesStartRepeat[property] = startValueIsArray ? [] : {}; // TODO? repeat nested values? And yoyo? And array values? // eslint-disable-next-line // @ts-ignore FIXME? - this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property]); + this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property], overrideStartingValues); } else { - // Save the starting value, but only once. - if (typeof _valuesStart[property] === 'undefined') { + // Save the starting value, but only once unless override is requested. + if (typeof _valuesStart[property] === 'undefined' || overrideStartingValues) { _valuesStart[property] = startValue; } if (!startValueIsArray) { @@ -566,14 +605,17 @@ return this; }; Tween.prototype.group = function (group) { + if (group === void 0) { group = mainGroup; } this._group = group; return this; }; Tween.prototype.delay = function (amount) { + if (amount === void 0) { amount = 0; } this._delayTime = amount; return this; }; Tween.prototype.repeat = function (times) { + if (times === void 0) { times = 0; } this._initialRepeat = times; this._repeat = times; return this; @@ -583,17 +625,21 @@ return this; }; Tween.prototype.yoyo = function (yoyo) { + if (yoyo === void 0) { yoyo = false; } this._yoyo = yoyo; return this; }; Tween.prototype.easing = function (easingFunction) { + if (easingFunction === void 0) { easingFunction = Easing.Linear.None; } this._easingFunction = easingFunction; return this; }; Tween.prototype.interpolation = function (interpolationFunction) { + if (interpolationFunction === void 0) { interpolationFunction = Interpolation.Linear; } this._interpolationFunction = interpolationFunction; return this; }; + // eslint-disable-next-line Tween.prototype.chain = function () { var tweens = []; for (var _i = 0; _i < arguments.length; _i++) { @@ -606,6 +652,10 @@ this._onStartCallback = callback; return this; }; + Tween.prototype.onEveryStart = function (callback) { + this._onEveryStartCallback = callback; + return this; + }; Tween.prototype.onUpdate = function (callback) { this._onUpdateCallback = callback; return this; @@ -639,7 +689,7 @@ if (time > endTime) return false; if (autoStart) - this.start(time); + this.start(time, true); } this._goToEnd = false; if (time < this._startTime) { @@ -651,6 +701,12 @@ } this._onStartCallbackFired = true; } + if (this._onEveryStartCallbackFired === false) { + if (this._onEveryStartCallback) { + this._onEveryStartCallback(this._object); + } + this._onEveryStartCallbackFired = true; + } elapsed = (time - this._startTime) / this._duration; elapsed = this._duration === 0 || elapsed > 1 ? 1 : elapsed; var value = this._easingFunction(elapsed); @@ -689,6 +745,7 @@ if (this._onRepeatCallback) { this._onRepeatCallback(this._object); } + this._onEveryStartCallbackFired = false; return true; } else { @@ -698,7 +755,7 @@ for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) { // Make the chained tweens start exactly at the time they should, // even if the `update()` method was called way past the duration of the tween - this._chainedTweens[i].start(this._startTime + this._duration); + this._chainedTweens[i].start(this._startTime + this._duration, false); } this._isPlaying = false; return false; @@ -762,7 +819,7 @@ return Tween; }()); - var VERSION = '18.6.4'; + var VERSION = '19.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index 307f7c8e..d18dcee7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tweenjs/tween.js", - "version": "18.6.4", + "version": "19.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tweenjs/tween.js", - "version": "18.6.4", + "version": "19.0.0", "license": "MIT", "devDependencies": { "@sinonjs/fake-timers": "^6.0.1", diff --git a/package.json b/package.json index 6122470c..1297939c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", - "version": "18.6.4", + "version": "19.0.0", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", diff --git a/src/Version.ts b/src/Version.ts index 09758d00..bf02c788 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '18.6.4' +const VERSION = '19.0.0' export default VERSION From eef09f63919405a277b63926ca1b4281fd2033e6 Mon Sep 17 00:00:00 2001 From: Ian Gilman Date: Fri, 21 Apr 2023 11:06:02 -0700 Subject: [PATCH 063/107] Cherry-pick from gh-pages to give @iangilman credit for pointing out the issue with the docs: Improved yoyo documentation It wasn't clear from the documentation that I had to pass anything into the `yoyo` function. I had to go look at the yoyo example page to figure that out. Hopefully this change will make it clear to the next person. --- docs/user_guide.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/user_guide.md b/docs/user_guide.md index 5c39ef51..14c15d08 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -176,11 +176,10 @@ Check the [Repeat](../examples/08_repeat.html) example. ### `yoyo` -This function only has effect if used along with `repeat`. When active, the behaviour of the tween will be _like a yoyo_, i.e. it will bounce to and from the start and end values, instead of just repeating the same sequence from the beginning: +This function only has effect if used along with `repeat`. When active, the behaviour of the tween will be _like a yoyo_, i.e. it will bounce to and from the start and end values, instead of just repeating the same sequence from the beginning. To turn it on, pass `true`: -``` -tween.yoyo(false) // default value, animation will only go from start to end value -tween.yoyo(true) // tween will 'yoyo' between start and end values +```javascript +tween.yoyo(true) ``` ### `delay` From 67526623f4a625770a90055c92482ad5301e86a9 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Fri, 21 Apr 2023 18:36:19 -0700 Subject: [PATCH 064/107] Revert "Cherry-pick from gh-pages to give @iangilman credit for pointing out the issue with the docs:" so that we will have the latest docs, then we will sync gh-pages and keep it in sync. Thanks @iangilman! This reverts commit eef09f63919405a277b63926ca1b4281fd2033e6. --- docs/user_guide.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/user_guide.md b/docs/user_guide.md index 14c15d08..5c39ef51 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -176,10 +176,11 @@ Check the [Repeat](../examples/08_repeat.html) example. ### `yoyo` -This function only has effect if used along with `repeat`. When active, the behaviour of the tween will be _like a yoyo_, i.e. it will bounce to and from the start and end values, instead of just repeating the same sequence from the beginning. To turn it on, pass `true`: +This function only has effect if used along with `repeat`. When active, the behaviour of the tween will be _like a yoyo_, i.e. it will bounce to and from the start and end values, instead of just repeating the same sequence from the beginning: -```javascript -tween.yoyo(true) +``` +tween.yoyo(false) // default value, animation will only go from start to end value +tween.yoyo(true) // tween will 'yoyo' between start and end values ``` ### `delay` From a00426904e91ade6d778649d3a40da8ec728ac10 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Fri, 21 Apr 2023 18:37:23 -0700 Subject: [PATCH 065/107] add language to code fence --- docs/user_guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user_guide.md b/docs/user_guide.md index 5c39ef51..681df304 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -178,7 +178,7 @@ Check the [Repeat](../examples/08_repeat.html) example. This function only has effect if used along with `repeat`. When active, the behaviour of the tween will be _like a yoyo_, i.e. it will bounce to and from the start and end values, instead of just repeating the same sequence from the beginning: -``` +```js tween.yoyo(false) // default value, animation will only go from start to end value tween.yoyo(true) // tween will 'yoyo' between start and end values ``` From f125db1580c15caafe790d363759e7457d5e739e Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 24 Oct 2020 17:23:57 -0700 Subject: [PATCH 066/107] fix: the video example wasn't working sometimes --- examples/05_video_and_time.html | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/examples/05_video_and_time.html b/examples/05_video_and_time.html index 707f6479..e6ff63b3 100644 --- a/examples/05_video_and_time.html +++ b/examples/05_video_and_time.html @@ -9,19 +9,29 @@

tween.js

05 _ video and time

-

Playing a video, synchronizing a tween to it

+

Playing a video, synchronizing a tween to it.

-
+
- From 58250f5ebdab9724d1f95dcf3d7d7fba565e4b8e Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 10:53:12 -0700 Subject: [PATCH 067/107] chore: fix the relative_start_time example --- examples/13_relative_start_time.html | 4 ++-- src/Tween.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/13_relative_start_time.html b/examples/13_relative_start_time.html index 012a5fc2..5da1845a 100644 --- a/examples/13_relative_start_time.html +++ b/examples/13_relative_start_time.html @@ -65,8 +65,8 @@

13 _ relative start time

tween2 = new TWEEN.Tween(position2).to({x: 500, y: 300, rotation: -90}, 2000).onUpdate(update2) - tween1.start('+4000') - tween2.start('-500') + tween1.delay(4000).start() + tween2.delay(-500).start() } function animate(time) { diff --git a/src/Tween.ts b/src/Tween.ts index 08a4bae5..aa631d35 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -560,7 +560,6 @@ export class Tween { } } -// eslint-disable-next-line export type UnknownProps = Record export default Tween From dec679d4ed042f75e079f840c0dc7289df93e47d Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 10:57:35 -0700 Subject: [PATCH 068/107] =?UTF-8?q?chore:=20convert=20the=20project=20to?= =?UTF-8?q?=20type:module=20(ES=20Module=20mode);=20update=20prettier,=20t?= =?UTF-8?q?ypescript,=20and=20rollup;=20remove=20sinonjs=20because=20of=20?= =?UTF-8?q?too=20much=20complexity=20getting=20it=20to=20work=20in=20ESM?= =?UTF-8?q?=20mode=20and=20instead=20mock=20performance.now=20ourselves=20?= =?UTF-8?q?for=20our=20tests,=20which=20ends=20up=20being=20simpler=20anyw?= =?UTF-8?q?ay!;=20get=20browser=20tests=20in=20nodeunit.html=20working;=20?= =?UTF-8?q?party=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js => .eslintrc.cjs | 0 .prettierrc.js => .prettierrc.cjs | 0 package-lock.json | 406 ++++++++++++++++-------------- package.json | 13 +- rollup.config.js | 5 +- scripts/write-version.js | 6 +- src/Now.ts | 33 +-- src/test-performance-now-fake.ts | 26 ++ src/tests.ts | 14 +- test/unit/nodeunit.html | 7 +- test/unit/nodeunitheadless.cjs | 4 + test/unit/nodeunitheadless.js | 2 - tsconfig.json | 7 +- 13 files changed, 278 insertions(+), 245 deletions(-) rename .eslintrc.js => .eslintrc.cjs (100%) rename .prettierrc.js => .prettierrc.cjs (100%) create mode 100644 src/test-performance-now-fake.ts create mode 100644 test/unit/nodeunitheadless.cjs delete mode 100644 test/unit/nodeunitheadless.js diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 100% rename from .eslintrc.js rename to .eslintrc.cjs diff --git a/.prettierrc.js b/.prettierrc.cjs similarity index 100% rename from .prettierrc.js rename to .prettierrc.cjs diff --git a/package-lock.json b/package-lock.json index d18dcee7..8dd979e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,29 +9,30 @@ "version": "19.0.0", "license": "MIT", "devDependencies": { - "@sinonjs/fake-timers": "^6.0.1", - "@types/sinonjs__fake-timers": "^6.0.2", "@typescript-eslint/eslint-plugin": "^3.1.0", "@typescript-eslint/parser": "^3.1.0", "eslint": "^7.1.0", "eslint-config-prettier": "^6.7.0", "eslint-plugin-prettier": "^3.1.1", "nodeunit": "^0.11.3", - "prettier": "^2.0.0", + "prettier": "2.8.7", "rimraf": "^3.0.0", - "rollup": "^2.0.0", - "rollup-plugin-dts": "1.4.10", + "rollup": "3.20.7", + "rollup-plugin-dts": "5.3.0", "tslib": "^1.10.0", - "typescript": "^4.0.0" + "typescript": "5.0.4" } }, "node_modules/@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/generator": { @@ -76,21 +77,26 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, - "optional": true + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/parser": { @@ -153,23 +159,11 @@ "to-fast-properties": "^2.0.0" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@types/color-name": { "version": "1.1.1", @@ -189,12 +183,6 @@ "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", - "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==", - "dev": true - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz", @@ -1378,10 +1366,11 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -1390,6 +1379,12 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "node_modules/function-loop": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", @@ -1527,6 +1522,18 @@ "node": ">=6" } }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -1735,6 +1742,18 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2085,6 +2104,18 @@ "yallist": "^2.1.2" } }, + "node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -2522,9 +2553,9 @@ } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/path-type": { @@ -2585,15 +2616,18 @@ } }, "node_modules/prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { @@ -2772,12 +2806,20 @@ "dev": true }, "node_modules/resolve": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", - "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "path-parse": "^1.0.6" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-from": { @@ -2815,49 +2857,41 @@ } }, "node_modules/rollup": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.0.tgz", - "integrity": "sha512-0FIG1jY88uhCP2yP4CfvtKEqPDRmsUwfY1kEOOM+DH/KOGATgaIFd/is1+fQOxsvh62ELzcFfKonwKWnHhrqmw==", + "version": "3.20.7", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.7.tgz", + "integrity": "sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.18.0", + "npm": ">=8.0.0" }, "optionalDependencies": { - "fsevents": "~2.1.2" + "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-dts": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-1.4.10.tgz", - "integrity": "sha512-bL6MBXc8lK7D5b/tYbHaglxs4ZxMQTQilGA6Xm9KQBEj4h9ZwIDlAsvDooGjJ/cOw23r3POTRtSCEyTHxtzHJg==", - "dev": true, - "optionalDependencies": { - "@babel/code-frame": "^7.10.4" - } - }, - "node_modules/rollup-plugin-dts/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-5.3.0.tgz", + "integrity": "sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==", "dev": true, - "optional": true, "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/rollup-plugin-dts/node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "magic-string": "^0.30.0" + }, + "engines": { + "node": ">=v14" + }, + "funding": { + "url": "https://github.com/sponsors/Swatinem" + }, + "optionalDependencies": { + "@babel/code-frame": "^7.18.6" + }, + "peerDependencies": { + "rollup": "^3.0.0", + "typescript": "^4.1 || ^5.0" } }, "node_modules/run-async": { @@ -3173,6 +3207,18 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -3519,15 +3565,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -3538,16 +3575,16 @@ } }, "node_modules/typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/uglify-js": { @@ -3864,12 +3901,12 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.18.6" } }, "@babel/generator": { @@ -3914,20 +3951,19 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true, - "optional": true + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true }, "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, @@ -3984,23 +4020,11 @@ "to-fast-properties": "^2.0.0" } }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "@types/color-name": { "version": "1.1.1", @@ -4020,12 +4044,6 @@ "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, - "@types/sinonjs__fake-timers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", - "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==", - "dev": true - }, "@typescript-eslint/eslint-plugin": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz", @@ -4995,12 +5013,18 @@ "dev": true }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "function-loop": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", @@ -5108,6 +5132,15 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -5275,6 +5308,15 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5562,6 +5604,15 @@ "yallist": "^2.1.2" } }, + "magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -5925,9 +5976,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { @@ -5975,9 +6026,9 @@ "dev": true }, "prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true }, "prettier-linter-helpers": { @@ -6128,12 +6179,14 @@ "dev": true }, "resolve": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", - "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { @@ -6162,45 +6215,22 @@ } }, "rollup": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.0.tgz", - "integrity": "sha512-0FIG1jY88uhCP2yP4CfvtKEqPDRmsUwfY1kEOOM+DH/KOGATgaIFd/is1+fQOxsvh62ELzcFfKonwKWnHhrqmw==", + "version": "3.20.7", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.7.tgz", + "integrity": "sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==", "dev": true, "requires": { - "fsevents": "~2.1.2" + "fsevents": "~2.3.2" } }, "rollup-plugin-dts": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-1.4.10.tgz", - "integrity": "sha512-bL6MBXc8lK7D5b/tYbHaglxs4ZxMQTQilGA6Xm9KQBEj4h9ZwIDlAsvDooGjJ/cOw23r3POTRtSCEyTHxtzHJg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-5.3.0.tgz", + "integrity": "sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "optional": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "optional": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } + "@babel/code-frame": "^7.18.6", + "magic-string": "^0.30.0" } }, "run-async": { @@ -6471,6 +6501,12 @@ "has-flag": "^3.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -6758,12 +6794,6 @@ "prelude-ls": "^1.2.1" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -6771,9 +6801,9 @@ "dev": true }, "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index 1297939c..d49769d1 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", "version": "19.0.0", + "type": "module", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", @@ -32,7 +33,7 @@ "tsc-watch": "tsc --watch", "examples": "npx serve .", "test": "npm run build && npm run test-lint && npm run test-unit", - "test-unit": "nodeunit test/unit/nodeunitheadless.js", + "test-unit": "nodeunit test/unit/nodeunitheadless.cjs", "test-lint": "npm run prettier -- --check && eslint 'src/**/*.ts'", "lint": "npm run prettier -- --write && eslint 'src/**/*.ts' --fix", "prettier": "prettier './**/*.{js,ts,md,json,html,css}'", @@ -45,19 +46,17 @@ }, "author": "tween.js contributors (https://github.com/tweenjs/tween.js/graphs/contributors)", "devDependencies": { - "@sinonjs/fake-timers": "^6.0.1", - "@types/sinonjs__fake-timers": "^6.0.2", "@typescript-eslint/eslint-plugin": "^3.1.0", "@typescript-eslint/parser": "^3.1.0", "eslint": "^7.1.0", "eslint-config-prettier": "^6.7.0", "eslint-plugin-prettier": "^3.1.1", "nodeunit": "^0.11.3", - "prettier": "^2.0.0", + "prettier": "2.8.7", "rimraf": "^3.0.0", - "rollup": "^2.0.0", - "rollup-plugin-dts": "1.4.10", + "rollup": "3.20.7", + "rollup-plugin-dts": "5.3.0", "tslib": "^1.10.0", - "typescript": "^4.0.0" + "typescript": "5.0.4" } } diff --git a/rollup.config.js b/rollup.config.js index 045c6332..9d8ac758 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -34,7 +34,10 @@ export default [ input: '.tmp/tests.js', context: 'this', watch: {clearScreen: false}, - output: [{file: '.tmp/tests.cjs.js', format: 'cjs', exports: 'named'}], + output: [ + {file: '.tmp/tests.cjs', format: 'cjs', exports: 'named'}, // For tests running in Node.js + {file: '.tmp/tests.umd.js', format: 'umd', exports: 'named', name: 'TWEEN'}, // For the nodeunit.html tests in browser + ], }, { input: './.tmp/Index.d.ts', diff --git a/scripts/write-version.js b/scripts/write-version.js index 8bab95c6..6048e673 100644 --- a/scripts/write-version.js +++ b/scripts/write-version.js @@ -1,5 +1,7 @@ -const fs = require('fs') -const {version} = require('../package.json') +import fs from 'fs' +import pkg from '../package.json' assert {type: 'json'} + +const {version} = pkg function handleError(error) { if (error) { diff --git a/src/Now.ts b/src/Now.ts index 663631ad..9b51feeb 100644 --- a/src/Now.ts +++ b/src/Now.ts @@ -1,34 +1,3 @@ -let now: () => number - -// Include a performance.now polyfill. -// In node.js, use process.hrtime. -// eslint-disable-next-line -// @ts-ignore -if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - now = function (): number { - // eslint-disable-next-line - // @ts-ignore - const time = process.hrtime() - - // Convert [seconds, nanoseconds] to milliseconds. - return time[0] * 1000 + time[1] / 1000000 - } -} -// In a browser, use self.performance.now if it is available. -else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { - // This must be bound, because directly assigning this function - // leads to an invocation exception in Chrome. - now = self.performance.now.bind(self.performance) -} -// Use Date.now if it is available. -else if (Date.now !== undefined) { - now = Date.now -} -// Otherwise, use 'new Date().getTime()'. -else { - now = function (): number { - return new Date().getTime() - } -} +const now = (): number => performance.now() export default now diff --git a/src/test-performance-now-fake.ts b/src/test-performance-now-fake.ts new file mode 100644 index 00000000..014fd699 --- /dev/null +++ b/src/test-performance-now-fake.ts @@ -0,0 +1,26 @@ +/** + * @fileoverview Tool for patching performance.now so we can fake it in the + * tests. + */ + +let time = 0 + +export function tickTime(t: number): void { + time = t +} + +export function patchPerformanceNow(): void { + Object.defineProperties(performance, { + now: { + value: () => { + return time + }, + configurable: true, + }, + }) +} + +export function restorePerformanceNow(): void { + // The original is on the prototype, simply delete ours to expose that one again. + delete (performance as any).now +} diff --git a/src/tests.ts b/src/tests.ts index c7fbb143..17fd79e4 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,5 +1,5 @@ +import {tickTime, patchPerformanceNow, restorePerformanceNow} from './test-performance-now-fake' import * as TWEEN from './Index' -import * as FakeTimers from '@sinonjs/fake-timers' import type {EasingFunctionGroup} from './Easing' export const tests = { @@ -2362,19 +2362,18 @@ export const tests = { }, 'Test TWEEN.Tween.update() with no arguments'(test: Test): void { - const clock = FakeTimers.install() + patchPerformanceNow() + const targetNow = {x: 0.0} const targetTime = {x: 0.0} const tweenNow = new TWEEN.Tween(targetNow).to({x: 1.0}).start() const tweenTime = new TWEEN.Tween(targetTime).to({x: 1.0}).start(0) - let currentTime = 0 const tick = (time: number) => { - currentTime += time - clock.tick(time) + tickTime(time) tweenNow.update() - tweenTime.update(currentTime) + tweenTime.update(time) test.equal(targetNow.x, targetTime.x) } @@ -2384,7 +2383,8 @@ export const tests = { tick(100) tick(20000) - clock.uninstall() + restorePerformanceNow() + test.done() }, } diff --git a/test/unit/nodeunit.html b/test/unit/nodeunit.html index 37703cb9..69c7595b 100644 --- a/test/unit/nodeunit.html +++ b/test/unit/nodeunit.html @@ -3,13 +3,12 @@ nodeunit based tests - + + diff --git a/test/unit/nodeunitheadless.cjs b/test/unit/nodeunitheadless.cjs new file mode 100644 index 00000000..d5dff2a8 --- /dev/null +++ b/test/unit/nodeunitheadless.cjs @@ -0,0 +1,4 @@ +const {tests} = require('../../.tmp/tests.cjs') +module.exports = {tween: tests} + +// CONTINUE: got html tests running, had to convert to CJS files, ammend the infrastructure update commit with these changes diff --git a/test/unit/nodeunitheadless.js b/test/unit/nodeunitheadless.js deleted file mode 100644 index e991d175..00000000 --- a/test/unit/nodeunitheadless.js +++ /dev/null @@ -1,2 +0,0 @@ -const {tests} = require('../../.tmp/tests.cjs.js') -module.exports = {tween: tests} diff --git a/tsconfig.json b/tsconfig.json index 2fbb75ea..83ec154f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,12 +4,15 @@ "outDir": "./.tmp", "declaration": true, "strict": true, - "importsNotUsedAsValues": "error", "sourceMap": true, "module": "es2015", "target": "es5", "moduleResolution": "node", - "lib": ["dom", "es2015"] + "lib": ["dom", "es2015"], + + // TODO will be removed in TS 5.5 + "ignoreDeprecations": "5.0", + "importsNotUsedAsValues": "error" }, "exclude": ["node_modules"] } From 06e35299e0f69abcbc0d93e3624af0202d0a4ab6 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 11:05:33 -0700 Subject: [PATCH 069/107] chore: update user guide --- docs/user_guide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/user_guide.md b/docs/user_guide.md index ba9dd64f..474ce656 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -148,7 +148,7 @@ function animate(time) { } ``` -_IMPORTANT!_ You don't need to call `tween.update()` directly if you're using `TWEEN.update()` as a way to control all tweens by default, however we recommend that you either [make your own groups of tweens](#controlling-groups-of-tweens) or manually update your tweens directly as in the last example. The concept of using groups or individually-controlled tweens is much like the practice of avoiding use of global variables in your JavaScript code: it prevents one component from accidentally ruining the behavior of some other unrelated component. +> **Note** You don't need to call `tween.update()` directly if you're using `TWEEN.update()` as a way to control all tweens by default, however we recommend that you either [make your own groups of tweens](#controlling-groups-of-tweens) or manually update your tweens directly as in the last example. The concept of using groups or individually-controlled tweens is much like the practice of avoiding use of global variables in your JavaScript code: it prevents one component from accidentally ruining the behavior of some other unrelated component. Using `TWEEN` to control your tweens is like using globals: and it is only good for simple cases (f.e. small demos, prototypes, etc) but it may not scale well for big apps that may have different parts that need to animate tweens on differing schedules. @@ -175,7 +175,7 @@ In other cases, you may want to chain multiple tweens to another tween in a way tweenA.chain(tweenB, tweenC) ``` -> WARNING: Calling `tweenA.chain(tweenB)` actually modifies tweenA so that tweenB is always started when tweenA finishes. The return value of `chain` is just tweenA, not a new tween. +> **Warning** Calling `tweenA.chain(tweenB)` actually modifies tweenA so that tweenB is always started when tweenA finishes. The return value of `chain` is just tweenA, not a new tween. ### `repeat` @@ -231,7 +231,7 @@ See the [Dynamic to](http://tweenjs.github.io/tween.js/examples/07_dynamic_to.ht See the other `dynamic to` examples for more ideas. -_IMPORTANT!_ When `dynamic` is set to `false`, Tween makes a copy of the object passed into `tween.to()` and will never modify it (hence updating the original object from the outside is not dynamic. When `dynamic` is `true`, Tween uses the original object as the source of values during animation (every update reads the values, hence they can be modified dynamicall) but note that in this mode, Tween will modify any interpolation arrays of the object passed into `tween.to()` which may cause side-effects on any external code that may also rely on the same object. +> **Warning** When `dynamic` is set to `false`, Tween makes a copy of the object passed into `tween.to()` and will never modify it (hence updating the original object from the outside is not dynamic). When `dynamic` is `true`, Tween uses the original object as the source of values during animation (every update reads the values, hence they can be modified dynamically) but note that **in dynamic mode, Tween will modify any interpolation arrays of the object passed into `tween.to()` which may cause side-effects on any external code that may also rely on the same object**. ## Controlling _all_ the tweens From fbdd788bf8508c635fa178e31d8cfd9c7bb2d3b2 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 11:15:21 -0700 Subject: [PATCH 070/107] chore: format code to updated prettier standard --- examples/03_graphs.html | 2 +- examples/06_array_interpolation.html | 2 +- examples/07_dynamic_to.html | 2 +- examples/07a_dynamic_to_two_array_values.html | 2 +- .../07b_dynamic_to_an_array_of_values.html | 2 +- examples/08_repeat.html | 14 ++++--------- examples/09_relative_values.html | 4 ++-- examples/10_yoyo.html | 12 +++++------ examples/11_stop_all_chained_tweens.html | 10 +++------- examples/12_graphs_custom_functions.html | 2 +- examples/14_pause_tween.html | 8 ++------ examples/16_animate_an_array_of_values.html | 4 +--- examples/17_generate_pow.html | 2 +- examples/18_start_from_current_values.html | 20 +++++-------------- test/unit/nodeunit.js | 14 ++++++++----- 15 files changed, 38 insertions(+), 62 deletions(-) diff --git a/examples/03_graphs.html b/examples/03_graphs.html index 96d7201d..4eca4918 100644 --- a/examples/03_graphs.html +++ b/examples/03_graphs.html @@ -16,7 +16,7 @@ -
+

tween.js

03 _ graphs

The curves, visualised.

diff --git a/examples/06_array_interpolation.html b/examples/06_array_interpolation.html index 2e51fe32..a99be966 100644 --- a/examples/06_array_interpolation.html +++ b/examples/06_array_interpolation.html @@ -16,7 +16,7 @@ -
+

tween.js

06 _ array interpolation

The different interpolations if arrays are used as values.

diff --git a/examples/07_dynamic_to.html b/examples/07_dynamic_to.html index ad9159ff..b28afd2e 100644 --- a/examples/07_dynamic_to.html +++ b/examples/07_dynamic_to.html @@ -18,7 +18,7 @@ -
+

tween.js

07 _ dynamic to object

tweening towards a moving target

diff --git a/examples/07a_dynamic_to_two_array_values.html b/examples/07a_dynamic_to_two_array_values.html index 96eeb60b..c90123ef 100644 --- a/examples/07a_dynamic_to_two_array_values.html +++ b/examples/07a_dynamic_to_two_array_values.html @@ -18,7 +18,7 @@ -
+

tween.js

07a _ dynamic to interpolation array

tweening towards two moving targets

diff --git a/examples/07b_dynamic_to_an_array_of_values.html b/examples/07b_dynamic_to_an_array_of_values.html index c0dec57f..df68085b 100644 --- a/examples/07b_dynamic_to_an_array_of_values.html +++ b/examples/07b_dynamic_to_an_array_of_values.html @@ -18,7 +18,7 @@ -
+

tween.js

07b _ dynamic to large interpolation array

tweening towards many random moving targets

diff --git a/examples/08_repeat.html b/examples/08_repeat.html index efb56591..0a262748 100644 --- a/examples/08_repeat.html +++ b/examples/08_repeat.html @@ -11,16 +11,10 @@

tween.js

08 _ repeat

Demonstrating the repeat() feature.

-
-
- repeat once -
-
- repeat five times -
-
- repeat forever -
+
+
repeat once
+
repeat five times
+
repeat forever
diff --git a/examples/09_relative_values.html b/examples/09_relative_values.html index 6a7c2fe9..127c07bb 100644 --- a/examples/09_relative_values.html +++ b/examples/09_relative_values.html @@ -60,8 +60,8 @@

tween.js

09 _ relative values

Tweening to relative values, with repeat.

-
-
+
+
diff --git a/examples/10_yoyo.html b/examples/10_yoyo.html index 81b7b63a..9af8bd12 100644 --- a/examples/10_yoyo.html +++ b/examples/10_yoyo.html @@ -16,17 +16,15 @@

10 _ yoyo

-
-
- yoyo with repeat once -
-
+
+
yoyo with repeat once
+
yoyo with repeat forever
-
+
yoyo with repeat once, relative values
-
+
yoyo with repeat forever, relative values
diff --git a/examples/11_stop_all_chained_tweens.html b/examples/11_stop_all_chained_tweens.html index 2a8d2b64..f232f335 100644 --- a/examples/11_stop_all_chained_tweens.html +++ b/examples/11_stop_all_chained_tweens.html @@ -11,15 +11,11 @@

tween.js

11 _ stop all chained tweens.

Tween#stopChainedTweens

-
+
-
- Box One -
-
- Box Two -
+
Box One
+
Box Two
diff --git a/examples/12_graphs_custom_functions.html b/examples/12_graphs_custom_functions.html index b5093d62..9c5dc55d 100644 --- a/examples/12_graphs_custom_functions.html +++ b/examples/12_graphs_custom_functions.html @@ -16,7 +16,7 @@ -
+

tween.js

12 _ graphs for custom easing functions

diff --git a/examples/14_pause_tween.html b/examples/14_pause_tween.html index 8f098402..c8b90e91 100644 --- a/examples/14_pause_tween.html +++ b/examples/14_pause_tween.html @@ -11,13 +11,9 @@

tween.js

14 _ pause tween


- + , then - . + .

tween.js

16 _ animate an array of values

-

- Animate multiple objects with a single tween using an array of values. -

+

Animate multiple objects with a single tween using an array of values.

one
diff --git a/examples/17_generate_pow.html b/examples/17_generate_pow.html index 42bd01ae..5dbba937 100644 --- a/examples/17_generate_pow.html +++ b/examples/17_generate_pow.html @@ -16,7 +16,7 @@ -
+

tween.js

17 _ Easing with Pow

TWEEN.Easing.generatePow() provides easing with a power of number.

diff --git a/examples/18_start_from_current_values.html b/examples/18_start_from_current_values.html index 9aafed55..4b115f43 100644 --- a/examples/18_start_from_current_values.html +++ b/examples/18_start_from_current_values.html @@ -10,21 +10,11 @@

tween.js

18 _ start from current values

Example for illustrating the startFromCurrentValues() functionality.

- - - - - + + + + +
Date: Sat, 22 Apr 2023 21:09:26 -0700 Subject: [PATCH 071/107] v20.0.0 --- dist/tween.amd.js | 141 +++++++++++++++++++++++----------------------- dist/tween.cjs.js | 137 ++++++++++++++++++++++---------------------- dist/tween.d.ts | 76 ++++++++++++++----------- dist/tween.esm.js | 138 ++++++++++++++++++++++----------------------- dist/tween.umd.js | 141 +++++++++++++++++++++++----------------------- package-lock.json | 4 +- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 324 insertions(+), 317 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index b9a7e542..19b64922 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -1,4 +1,4 @@ -define(['exports'], function (exports) { 'use strict'; +define(['exports'], (function (exports) { 'use strict'; /** * The Ease class provides a collection of easing functions for use with tween.js. @@ -215,37 +215,7 @@ define(['exports'], function (exports) { 'use strict'; }, }); - var now; - // Include a performance.now polyfill. - // In node.js, use process.hrtime. - // eslint-disable-next-line - // @ts-ignore - if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - now = function () { - // eslint-disable-next-line - // @ts-ignore - var time = process.hrtime(); - // Convert [seconds, nanoseconds] to milliseconds. - return time[0] * 1000 + time[1] / 1000000; - }; - } - // In a browser, use self.performance.now if it is available. - else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { - // This must be bound, because directly assigning this function - // leads to an invocation exception in Chrome. - now = self.performance.now.bind(self.performance); - } - // Use Date.now if it is available. - else if (Date.now !== undefined) { - now = Date.now; - } - // Otherwise, use 'new Date().getTime()'. - else { - now = function () { - return new Date().getTime(); - }; - } - var now$1 = now; + var now = function () { return performance.now(); }; /** * Controlling groups of tweens @@ -276,7 +246,7 @@ define(['exports'], function (exports) { 'use strict'; delete this._tweensAddedDuringUpdate[tween.getId()]; }; Group.prototype.update = function (time, preserve) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (preserve === void 0) { preserve = false; } var tweenIds = Object.keys(this._tweens); if (tweenIds.length === 0) { @@ -417,6 +387,7 @@ define(['exports'], function (exports) { 'use strict'; this._valuesEnd = {}; this._valuesStartRepeat = {}; this._duration = 1000; + this._isDynamic = false; this._initialRepeat = 0; this._repeat = 0; this._yoyo = false; @@ -432,6 +403,7 @@ define(['exports'], function (exports) { 'use strict'; this._onEveryStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; + this._propertiesAreSetUp = false; this._goToEnd = false; } Tween.prototype.getId = function () { @@ -443,24 +415,27 @@ define(['exports'], function (exports) { 'use strict'; Tween.prototype.isPaused = function () { return this._isPaused; }; - Tween.prototype.to = function (properties, duration) { - // TODO? restore this, then update the 07_dynamic_to example to set fox - // tween's to on each update. That way the behavior is opt-in (there's - // currently no opt-out). - // for (const prop in properties) this._valuesEnd[prop] = properties[prop] - this._valuesEnd = Object.create(properties); - if (duration !== undefined) { - this._duration = duration; - } + Tween.prototype.to = function (target, duration) { + if (duration === void 0) { duration = 1000; } + if (this._isPlaying) + throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.'); + this._valuesEnd = target; + this._propertiesAreSetUp = false; + this._duration = duration; return this; }; - Tween.prototype.duration = function (d) { - if (d === void 0) { d = 1000; } - this._duration = d; + Tween.prototype.duration = function (duration) { + if (duration === void 0) { duration = 1000; } + this._duration = duration; + return this; + }; + Tween.prototype.dynamic = function (dynamic) { + if (dynamic === void 0) { dynamic = false; } + this._isDynamic = dynamic; return this; }; Tween.prototype.start = function (time, overrideStartingValues) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (overrideStartingValues === void 0) { overrideStartingValues = false; } if (this._isPlaying) { return this; @@ -484,7 +459,17 @@ define(['exports'], function (exports) { 'use strict'; this._isChainStopped = false; this._startTime = time; this._startTime += this._delayTime; - this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); + if (!this._propertiesAreSetUp || overrideStartingValues) { + this._propertiesAreSetUp = true; + // If dynamic is not enabled, clone the end values instead of using the passed-in end values. + if (!this._isDynamic) { + var tmp = {}; + for (var prop in this._valuesEnd) + tmp[prop] = this._valuesEnd[prop]; + this._valuesEnd = tmp; + } + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); + } return this; }; Tween.prototype.startFromCurrentValues = function (time) { @@ -507,26 +492,42 @@ define(['exports'], function (exports) { 'use strict'; if (endValues.length === 0) { continue; } - // handle an array of relative values - endValues = endValues.map(this._handleRelativeValue.bind(this, startValue)); - // Create a local copy of the Array with the start value at the front - if (_valuesStart[property] === undefined) { - _valuesEnd[property] = [startValue].concat(endValues); + // Handle an array of relative values. + // Creates a local copy of the Array with the start value at the front + var temp = [startValue]; + for (var i = 0, l = endValues.length; i < l; i += 1) { + var value = this._handleRelativeValue(startValue, endValues[i]); + if (isNaN(value)) { + isInterpolationList = false; + console.warn('Found invalid interpolation list. Skipping.'); + break; + } + temp.push(value); + } + if (isInterpolationList) { + // if (_valuesStart[property] === undefined) { // handle end values only the first time. NOT NEEDED? setupProperties is now guarded by _propertiesAreSetUp. + _valuesEnd[property] = temp; + // } } } // handle the deepness of the values if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) { _valuesStart[property] = startValueIsArray ? [] : {}; - // eslint-disable-next-line - for (var prop in startValue) { - // eslint-disable-next-line - // @ts-ignore FIXME? - _valuesStart[property][prop] = startValue[prop]; + var nestedObject = startValue; + for (var prop in nestedObject) { + _valuesStart[property][prop] = nestedObject[prop]; } - _valuesStartRepeat[property] = startValueIsArray ? [] : {}; // TODO? repeat nested values? And yoyo? And array values? - // eslint-disable-next-line - // @ts-ignore FIXME? - this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property], overrideStartingValues); + // TODO? repeat nested values? And yoyo? And array values? + _valuesStartRepeat[property] = startValueIsArray ? [] : {}; + var endValues = _valuesEnd[property]; + // If dynamic is not enabled, clone the end values instead of using the passed-in end values. + if (!this._isDynamic) { + var tmp = {}; + for (var prop in endValues) + tmp[prop] = endValues[prop]; + _valuesEnd[property] = endValues = tmp; + } + this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues); } else { // Save the starting value, but only once unless override is requested. @@ -572,7 +573,7 @@ define(['exports'], function (exports) { 'use strict'; return this; }; Tween.prototype.pause = function (time) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (this._isPaused || !this._isPlaying) { return this; } @@ -583,7 +584,7 @@ define(['exports'], function (exports) { 'use strict'; return this; }; Tween.prototype.resume = function (time) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (!this._isPaused || !this._isPlaying) { return this; } @@ -674,7 +675,7 @@ define(['exports'], function (exports) { 'use strict'; * it is still playing, just paused). */ Tween.prototype.update = function (time, autoStart) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (autoStart === void 0) { autoStart = true; } if (this._isPaused) return true; @@ -797,9 +798,7 @@ define(['exports'], function (exports) { 'use strict'; if (end.charAt(0) === '+' || end.charAt(0) === '-') { return start + parseFloat(end); } - else { - return parseFloat(end); - } + return parseFloat(end); }; Tween.prototype._swapEndStartRepeatValues = function (property) { var tmp = this._valuesStartRepeat[property]; @@ -815,7 +814,7 @@ define(['exports'], function (exports) { 'use strict'; return Tween; }()); - var VERSION = '19.0.0'; + var VERSION = '20.0.0'; /** * Tween.js - Licensed under the MIT license @@ -846,7 +845,7 @@ define(['exports'], function (exports) { 'use strict'; Easing: Easing, Group: Group, Interpolation: Interpolation, - now: now$1, + now: now, Sequence: Sequence, nextId: nextId, Tween: Tween, @@ -868,11 +867,11 @@ define(['exports'], function (exports) { 'use strict'; exports.default = exports$1; exports.getAll = getAll; exports.nextId = nextId; - exports.now = now$1; + exports.now = now; exports.remove = remove; exports.removeAll = removeAll; exports.update = update; Object.defineProperty(exports, '__esModule', { value: true }); -}); +})); diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index 6d8a61cf..b2b0f633 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -217,37 +217,7 @@ var Easing = Object.freeze({ }, }); -var now; -// Include a performance.now polyfill. -// In node.js, use process.hrtime. -// eslint-disable-next-line -// @ts-ignore -if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - now = function () { - // eslint-disable-next-line - // @ts-ignore - var time = process.hrtime(); - // Convert [seconds, nanoseconds] to milliseconds. - return time[0] * 1000 + time[1] / 1000000; - }; -} -// In a browser, use self.performance.now if it is available. -else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { - // This must be bound, because directly assigning this function - // leads to an invocation exception in Chrome. - now = self.performance.now.bind(self.performance); -} -// Use Date.now if it is available. -else if (Date.now !== undefined) { - now = Date.now; -} -// Otherwise, use 'new Date().getTime()'. -else { - now = function () { - return new Date().getTime(); - }; -} -var now$1 = now; +var now = function () { return performance.now(); }; /** * Controlling groups of tweens @@ -278,7 +248,7 @@ var Group = /** @class */ (function () { delete this._tweensAddedDuringUpdate[tween.getId()]; }; Group.prototype.update = function (time, preserve) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (preserve === void 0) { preserve = false; } var tweenIds = Object.keys(this._tweens); if (tweenIds.length === 0) { @@ -419,6 +389,7 @@ var Tween = /** @class */ (function () { this._valuesEnd = {}; this._valuesStartRepeat = {}; this._duration = 1000; + this._isDynamic = false; this._initialRepeat = 0; this._repeat = 0; this._yoyo = false; @@ -434,6 +405,7 @@ var Tween = /** @class */ (function () { this._onEveryStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; + this._propertiesAreSetUp = false; this._goToEnd = false; } Tween.prototype.getId = function () { @@ -445,24 +417,27 @@ var Tween = /** @class */ (function () { Tween.prototype.isPaused = function () { return this._isPaused; }; - Tween.prototype.to = function (properties, duration) { - // TODO? restore this, then update the 07_dynamic_to example to set fox - // tween's to on each update. That way the behavior is opt-in (there's - // currently no opt-out). - // for (const prop in properties) this._valuesEnd[prop] = properties[prop] - this._valuesEnd = Object.create(properties); - if (duration !== undefined) { - this._duration = duration; - } + Tween.prototype.to = function (target, duration) { + if (duration === void 0) { duration = 1000; } + if (this._isPlaying) + throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.'); + this._valuesEnd = target; + this._propertiesAreSetUp = false; + this._duration = duration; return this; }; - Tween.prototype.duration = function (d) { - if (d === void 0) { d = 1000; } - this._duration = d; + Tween.prototype.duration = function (duration) { + if (duration === void 0) { duration = 1000; } + this._duration = duration; + return this; + }; + Tween.prototype.dynamic = function (dynamic) { + if (dynamic === void 0) { dynamic = false; } + this._isDynamic = dynamic; return this; }; Tween.prototype.start = function (time, overrideStartingValues) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (overrideStartingValues === void 0) { overrideStartingValues = false; } if (this._isPlaying) { return this; @@ -486,7 +461,17 @@ var Tween = /** @class */ (function () { this._isChainStopped = false; this._startTime = time; this._startTime += this._delayTime; - this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); + if (!this._propertiesAreSetUp || overrideStartingValues) { + this._propertiesAreSetUp = true; + // If dynamic is not enabled, clone the end values instead of using the passed-in end values. + if (!this._isDynamic) { + var tmp = {}; + for (var prop in this._valuesEnd) + tmp[prop] = this._valuesEnd[prop]; + this._valuesEnd = tmp; + } + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); + } return this; }; Tween.prototype.startFromCurrentValues = function (time) { @@ -509,26 +494,42 @@ var Tween = /** @class */ (function () { if (endValues.length === 0) { continue; } - // handle an array of relative values - endValues = endValues.map(this._handleRelativeValue.bind(this, startValue)); - // Create a local copy of the Array with the start value at the front - if (_valuesStart[property] === undefined) { - _valuesEnd[property] = [startValue].concat(endValues); + // Handle an array of relative values. + // Creates a local copy of the Array with the start value at the front + var temp = [startValue]; + for (var i = 0, l = endValues.length; i < l; i += 1) { + var value = this._handleRelativeValue(startValue, endValues[i]); + if (isNaN(value)) { + isInterpolationList = false; + console.warn('Found invalid interpolation list. Skipping.'); + break; + } + temp.push(value); + } + if (isInterpolationList) { + // if (_valuesStart[property] === undefined) { // handle end values only the first time. NOT NEEDED? setupProperties is now guarded by _propertiesAreSetUp. + _valuesEnd[property] = temp; + // } } } // handle the deepness of the values if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) { _valuesStart[property] = startValueIsArray ? [] : {}; - // eslint-disable-next-line - for (var prop in startValue) { - // eslint-disable-next-line - // @ts-ignore FIXME? - _valuesStart[property][prop] = startValue[prop]; + var nestedObject = startValue; + for (var prop in nestedObject) { + _valuesStart[property][prop] = nestedObject[prop]; } - _valuesStartRepeat[property] = startValueIsArray ? [] : {}; // TODO? repeat nested values? And yoyo? And array values? - // eslint-disable-next-line - // @ts-ignore FIXME? - this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property], overrideStartingValues); + // TODO? repeat nested values? And yoyo? And array values? + _valuesStartRepeat[property] = startValueIsArray ? [] : {}; + var endValues = _valuesEnd[property]; + // If dynamic is not enabled, clone the end values instead of using the passed-in end values. + if (!this._isDynamic) { + var tmp = {}; + for (var prop in endValues) + tmp[prop] = endValues[prop]; + _valuesEnd[property] = endValues = tmp; + } + this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues); } else { // Save the starting value, but only once unless override is requested. @@ -574,7 +575,7 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.pause = function (time) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (this._isPaused || !this._isPlaying) { return this; } @@ -585,7 +586,7 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.resume = function (time) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (!this._isPaused || !this._isPlaying) { return this; } @@ -676,7 +677,7 @@ var Tween = /** @class */ (function () { * it is still playing, just paused). */ Tween.prototype.update = function (time, autoStart) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (autoStart === void 0) { autoStart = true; } if (this._isPaused) return true; @@ -799,9 +800,7 @@ var Tween = /** @class */ (function () { if (end.charAt(0) === '+' || end.charAt(0) === '-') { return start + parseFloat(end); } - else { - return parseFloat(end); - } + return parseFloat(end); }; Tween.prototype._swapEndStartRepeatValues = function (property) { var tmp = this._valuesStartRepeat[property]; @@ -817,7 +816,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '19.0.0'; +var VERSION = '20.0.0'; /** * Tween.js - Licensed under the MIT license @@ -848,7 +847,7 @@ var exports$1 = { Easing: Easing, Group: Group, Interpolation: Interpolation, - now: now$1, + now: now, Sequence: Sequence, nextId: nextId, Tween: Tween, @@ -870,7 +869,7 @@ exports.add = add; exports.default = exports$1; exports.getAll = getAll; exports.nextId = nextId; -exports.now = now$1; +exports.now = now; exports.remove = remove; exports.removeAll = removeAll; exports.update = update; diff --git a/dist/tween.d.ts b/dist/tween.d.ts index f2b3dae3..028c248b 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -1,5 +1,5 @@ -declare type EasingFunction = (amount: number) => number; -declare type EasingFunctionGroup = { +type EasingFunction = (amount: number) => number; +type EasingFunctionGroup = { In: EasingFunction; Out: EasingFunction; InOut: EasingFunction; @@ -27,7 +27,7 @@ declare const Easing: Readonly<{ /** * */ -declare type InterpolationFunction = (v: number[], k: number) => number; +type InterpolationFunction = (v: number[], k: number) => number; /** * */ @@ -43,6 +43,31 @@ declare const Interpolation: { }; }; +/** + * Controlling groups of tweens + * + * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. + * In these cases, you may want to create your own smaller groups of tween + */ +declare class Group { + private _tweens; + private _tweensAddedDuringUpdate; + getAll(): Array>; + removeAll(): void; + add(tween: Tween): void; + remove(tween: Tween): void; + update(time?: number, preserve?: boolean): boolean; +} + +/** + * Tween.js - Licensed under the MIT license + * https://github.com/tweenjs/tween.js + * ---------------------------------------------- + * + * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors. + * Thank you all, you're awesome! + */ + declare class Tween { private _object; private _group; @@ -52,6 +77,7 @@ declare class Tween { private _valuesEnd; private _valuesStartRepeat; private _duration; + private _isDynamic; private _initialRepeat; private _repeat; private _repeatDelayTime?; @@ -73,12 +99,14 @@ declare class Tween { private _onStopCallback?; private _id; private _isChainStopped; + private _propertiesAreSetUp; constructor(_object: T, _group?: Group | false); getId(): number; isPlaying(): boolean; isPaused(): boolean; - to(properties: UnknownProps, duration?: number): this; - duration(d?: number): this; + to(target: UnknownProps, duration?: number): this; + duration(duration?: number): this; + dynamic(dynamic?: boolean): this; start(time?: number, overrideStartingValues?: boolean): this; startFromCurrentValues(time?: number): this; private _setupProperties; @@ -112,25 +140,9 @@ declare class Tween { private _handleRelativeValue; private _swapEndStartRepeatValues; } -declare type UnknownProps = Record; - -/** - * Controlling groups of tweens - * - * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components. - * In these cases, you may want to create your own smaller groups of tween - */ -declare class Group { - private _tweens; - private _tweensAddedDuringUpdate; - getAll(): Array>; - removeAll(): void; - add(tween: Tween): void; - remove(tween: Tween): void; - update(time?: number, preserve?: boolean): boolean; -} +type UnknownProps = Record; -declare let now: () => number; +declare const now: () => number; /** * Utils @@ -140,14 +152,15 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "19.0.0"; +declare const VERSION = "20.0.0"; declare const nextId: typeof Sequence.nextId; -declare const getAll: () => Tween>[]; +declare const getAll: () => Tween[]; declare const removeAll: () => void; -declare const add: (tween: Tween>) => void; -declare const remove: (tween: Tween>) => void; +declare const add: (tween: Tween) => void; +declare const remove: (tween: Tween) => void; declare const update: (time?: number, preserve?: boolean) => boolean; + declare const exports: { Easing: Readonly<{ Linear: Readonly Tween>[]; + getAll: () => Tween[]; removeAll: () => void; - add: (tween: Tween>) => void; - remove: (tween: Tween>) => void; + add: (tween: Tween) => void; + remove: (tween: Tween) => void; update: (time?: number, preserve?: boolean) => boolean; }; -export default exports; -export { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, getAll, nextId, now, remove, removeAll, update }; +export { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, exports as default, getAll, nextId, now, remove, removeAll, update }; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 31c416c8..77b79d0c 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -213,37 +213,7 @@ var Easing = Object.freeze({ }, }); -var now; -// Include a performance.now polyfill. -// In node.js, use process.hrtime. -// eslint-disable-next-line -// @ts-ignore -if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - now = function () { - // eslint-disable-next-line - // @ts-ignore - var time = process.hrtime(); - // Convert [seconds, nanoseconds] to milliseconds. - return time[0] * 1000 + time[1] / 1000000; - }; -} -// In a browser, use self.performance.now if it is available. -else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { - // This must be bound, because directly assigning this function - // leads to an invocation exception in Chrome. - now = self.performance.now.bind(self.performance); -} -// Use Date.now if it is available. -else if (Date.now !== undefined) { - now = Date.now; -} -// Otherwise, use 'new Date().getTime()'. -else { - now = function () { - return new Date().getTime(); - }; -} -var now$1 = now; +var now = function () { return performance.now(); }; /** * Controlling groups of tweens @@ -274,7 +244,7 @@ var Group = /** @class */ (function () { delete this._tweensAddedDuringUpdate[tween.getId()]; }; Group.prototype.update = function (time, preserve) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (preserve === void 0) { preserve = false; } var tweenIds = Object.keys(this._tweens); if (tweenIds.length === 0) { @@ -415,6 +385,7 @@ var Tween = /** @class */ (function () { this._valuesEnd = {}; this._valuesStartRepeat = {}; this._duration = 1000; + this._isDynamic = false; this._initialRepeat = 0; this._repeat = 0; this._yoyo = false; @@ -430,6 +401,7 @@ var Tween = /** @class */ (function () { this._onEveryStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; + this._propertiesAreSetUp = false; this._goToEnd = false; } Tween.prototype.getId = function () { @@ -441,24 +413,27 @@ var Tween = /** @class */ (function () { Tween.prototype.isPaused = function () { return this._isPaused; }; - Tween.prototype.to = function (properties, duration) { - // TODO? restore this, then update the 07_dynamic_to example to set fox - // tween's to on each update. That way the behavior is opt-in (there's - // currently no opt-out). - // for (const prop in properties) this._valuesEnd[prop] = properties[prop] - this._valuesEnd = Object.create(properties); - if (duration !== undefined) { - this._duration = duration; - } + Tween.prototype.to = function (target, duration) { + if (duration === void 0) { duration = 1000; } + if (this._isPlaying) + throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.'); + this._valuesEnd = target; + this._propertiesAreSetUp = false; + this._duration = duration; return this; }; - Tween.prototype.duration = function (d) { - if (d === void 0) { d = 1000; } - this._duration = d; + Tween.prototype.duration = function (duration) { + if (duration === void 0) { duration = 1000; } + this._duration = duration; + return this; + }; + Tween.prototype.dynamic = function (dynamic) { + if (dynamic === void 0) { dynamic = false; } + this._isDynamic = dynamic; return this; }; Tween.prototype.start = function (time, overrideStartingValues) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (overrideStartingValues === void 0) { overrideStartingValues = false; } if (this._isPlaying) { return this; @@ -482,7 +457,17 @@ var Tween = /** @class */ (function () { this._isChainStopped = false; this._startTime = time; this._startTime += this._delayTime; - this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); + if (!this._propertiesAreSetUp || overrideStartingValues) { + this._propertiesAreSetUp = true; + // If dynamic is not enabled, clone the end values instead of using the passed-in end values. + if (!this._isDynamic) { + var tmp = {}; + for (var prop in this._valuesEnd) + tmp[prop] = this._valuesEnd[prop]; + this._valuesEnd = tmp; + } + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); + } return this; }; Tween.prototype.startFromCurrentValues = function (time) { @@ -505,26 +490,42 @@ var Tween = /** @class */ (function () { if (endValues.length === 0) { continue; } - // handle an array of relative values - endValues = endValues.map(this._handleRelativeValue.bind(this, startValue)); - // Create a local copy of the Array with the start value at the front - if (_valuesStart[property] === undefined) { - _valuesEnd[property] = [startValue].concat(endValues); + // Handle an array of relative values. + // Creates a local copy of the Array with the start value at the front + var temp = [startValue]; + for (var i = 0, l = endValues.length; i < l; i += 1) { + var value = this._handleRelativeValue(startValue, endValues[i]); + if (isNaN(value)) { + isInterpolationList = false; + console.warn('Found invalid interpolation list. Skipping.'); + break; + } + temp.push(value); + } + if (isInterpolationList) { + // if (_valuesStart[property] === undefined) { // handle end values only the first time. NOT NEEDED? setupProperties is now guarded by _propertiesAreSetUp. + _valuesEnd[property] = temp; + // } } } // handle the deepness of the values if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) { _valuesStart[property] = startValueIsArray ? [] : {}; - // eslint-disable-next-line - for (var prop in startValue) { - // eslint-disable-next-line - // @ts-ignore FIXME? - _valuesStart[property][prop] = startValue[prop]; + var nestedObject = startValue; + for (var prop in nestedObject) { + _valuesStart[property][prop] = nestedObject[prop]; } - _valuesStartRepeat[property] = startValueIsArray ? [] : {}; // TODO? repeat nested values? And yoyo? And array values? - // eslint-disable-next-line - // @ts-ignore FIXME? - this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property], overrideStartingValues); + // TODO? repeat nested values? And yoyo? And array values? + _valuesStartRepeat[property] = startValueIsArray ? [] : {}; + var endValues = _valuesEnd[property]; + // If dynamic is not enabled, clone the end values instead of using the passed-in end values. + if (!this._isDynamic) { + var tmp = {}; + for (var prop in endValues) + tmp[prop] = endValues[prop]; + _valuesEnd[property] = endValues = tmp; + } + this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues); } else { // Save the starting value, but only once unless override is requested. @@ -570,7 +571,7 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.pause = function (time) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (this._isPaused || !this._isPlaying) { return this; } @@ -581,7 +582,7 @@ var Tween = /** @class */ (function () { return this; }; Tween.prototype.resume = function (time) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (!this._isPaused || !this._isPlaying) { return this; } @@ -672,7 +673,7 @@ var Tween = /** @class */ (function () { * it is still playing, just paused). */ Tween.prototype.update = function (time, autoStart) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (autoStart === void 0) { autoStart = true; } if (this._isPaused) return true; @@ -795,9 +796,7 @@ var Tween = /** @class */ (function () { if (end.charAt(0) === '+' || end.charAt(0) === '-') { return start + parseFloat(end); } - else { - return parseFloat(end); - } + return parseFloat(end); }; Tween.prototype._swapEndStartRepeatValues = function (property) { var tmp = this._valuesStartRepeat[property]; @@ -813,7 +812,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '19.0.0'; +var VERSION = '20.0.0'; /** * Tween.js - Licensed under the MIT license @@ -844,7 +843,7 @@ var exports = { Easing: Easing, Group: Group, Interpolation: Interpolation, - now: now$1, + now: now, Sequence: Sequence, nextId: nextId, Tween: Tween, @@ -856,5 +855,4 @@ var exports = { update: update, }; -export default exports; -export { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, getAll, nextId, now$1 as now, remove, removeAll, update }; +export { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, exports as default, getAll, nextId, now, remove, removeAll, update }; diff --git a/dist/tween.umd.js b/dist/tween.umd.js index a75c60dc..57120230 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -2,7 +2,7 @@ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.TWEEN = {})); -}(this, (function (exports) { 'use strict'; +})(this, (function (exports) { 'use strict'; /** * The Ease class provides a collection of easing functions for use with tween.js. @@ -219,37 +219,7 @@ }, }); - var now; - // Include a performance.now polyfill. - // In node.js, use process.hrtime. - // eslint-disable-next-line - // @ts-ignore - if (typeof self === 'undefined' && typeof process !== 'undefined' && process.hrtime) { - now = function () { - // eslint-disable-next-line - // @ts-ignore - var time = process.hrtime(); - // Convert [seconds, nanoseconds] to milliseconds. - return time[0] * 1000 + time[1] / 1000000; - }; - } - // In a browser, use self.performance.now if it is available. - else if (typeof self !== 'undefined' && self.performance !== undefined && self.performance.now !== undefined) { - // This must be bound, because directly assigning this function - // leads to an invocation exception in Chrome. - now = self.performance.now.bind(self.performance); - } - // Use Date.now if it is available. - else if (Date.now !== undefined) { - now = Date.now; - } - // Otherwise, use 'new Date().getTime()'. - else { - now = function () { - return new Date().getTime(); - }; - } - var now$1 = now; + var now = function () { return performance.now(); }; /** * Controlling groups of tweens @@ -280,7 +250,7 @@ delete this._tweensAddedDuringUpdate[tween.getId()]; }; Group.prototype.update = function (time, preserve) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (preserve === void 0) { preserve = false; } var tweenIds = Object.keys(this._tweens); if (tweenIds.length === 0) { @@ -421,6 +391,7 @@ this._valuesEnd = {}; this._valuesStartRepeat = {}; this._duration = 1000; + this._isDynamic = false; this._initialRepeat = 0; this._repeat = 0; this._yoyo = false; @@ -436,6 +407,7 @@ this._onEveryStartCallbackFired = false; this._id = Sequence.nextId(); this._isChainStopped = false; + this._propertiesAreSetUp = false; this._goToEnd = false; } Tween.prototype.getId = function () { @@ -447,24 +419,27 @@ Tween.prototype.isPaused = function () { return this._isPaused; }; - Tween.prototype.to = function (properties, duration) { - // TODO? restore this, then update the 07_dynamic_to example to set fox - // tween's to on each update. That way the behavior is opt-in (there's - // currently no opt-out). - // for (const prop in properties) this._valuesEnd[prop] = properties[prop] - this._valuesEnd = Object.create(properties); - if (duration !== undefined) { - this._duration = duration; - } + Tween.prototype.to = function (target, duration) { + if (duration === void 0) { duration = 1000; } + if (this._isPlaying) + throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.'); + this._valuesEnd = target; + this._propertiesAreSetUp = false; + this._duration = duration; return this; }; - Tween.prototype.duration = function (d) { - if (d === void 0) { d = 1000; } - this._duration = d; + Tween.prototype.duration = function (duration) { + if (duration === void 0) { duration = 1000; } + this._duration = duration; + return this; + }; + Tween.prototype.dynamic = function (dynamic) { + if (dynamic === void 0) { dynamic = false; } + this._isDynamic = dynamic; return this; }; Tween.prototype.start = function (time, overrideStartingValues) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (overrideStartingValues === void 0) { overrideStartingValues = false; } if (this._isPlaying) { return this; @@ -488,7 +463,17 @@ this._isChainStopped = false; this._startTime = time; this._startTime += this._delayTime; - this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); + if (!this._propertiesAreSetUp || overrideStartingValues) { + this._propertiesAreSetUp = true; + // If dynamic is not enabled, clone the end values instead of using the passed-in end values. + if (!this._isDynamic) { + var tmp = {}; + for (var prop in this._valuesEnd) + tmp[prop] = this._valuesEnd[prop]; + this._valuesEnd = tmp; + } + this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues); + } return this; }; Tween.prototype.startFromCurrentValues = function (time) { @@ -511,26 +496,42 @@ if (endValues.length === 0) { continue; } - // handle an array of relative values - endValues = endValues.map(this._handleRelativeValue.bind(this, startValue)); - // Create a local copy of the Array with the start value at the front - if (_valuesStart[property] === undefined) { - _valuesEnd[property] = [startValue].concat(endValues); + // Handle an array of relative values. + // Creates a local copy of the Array with the start value at the front + var temp = [startValue]; + for (var i = 0, l = endValues.length; i < l; i += 1) { + var value = this._handleRelativeValue(startValue, endValues[i]); + if (isNaN(value)) { + isInterpolationList = false; + console.warn('Found invalid interpolation list. Skipping.'); + break; + } + temp.push(value); + } + if (isInterpolationList) { + // if (_valuesStart[property] === undefined) { // handle end values only the first time. NOT NEEDED? setupProperties is now guarded by _propertiesAreSetUp. + _valuesEnd[property] = temp; + // } } } // handle the deepness of the values if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) { _valuesStart[property] = startValueIsArray ? [] : {}; - // eslint-disable-next-line - for (var prop in startValue) { - // eslint-disable-next-line - // @ts-ignore FIXME? - _valuesStart[property][prop] = startValue[prop]; + var nestedObject = startValue; + for (var prop in nestedObject) { + _valuesStart[property][prop] = nestedObject[prop]; } - _valuesStartRepeat[property] = startValueIsArray ? [] : {}; // TODO? repeat nested values? And yoyo? And array values? - // eslint-disable-next-line - // @ts-ignore FIXME? - this._setupProperties(startValue, _valuesStart[property], _valuesEnd[property], _valuesStartRepeat[property], overrideStartingValues); + // TODO? repeat nested values? And yoyo? And array values? + _valuesStartRepeat[property] = startValueIsArray ? [] : {}; + var endValues = _valuesEnd[property]; + // If dynamic is not enabled, clone the end values instead of using the passed-in end values. + if (!this._isDynamic) { + var tmp = {}; + for (var prop in endValues) + tmp[prop] = endValues[prop]; + _valuesEnd[property] = endValues = tmp; + } + this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues); } else { // Save the starting value, but only once unless override is requested. @@ -576,7 +577,7 @@ return this; }; Tween.prototype.pause = function (time) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (this._isPaused || !this._isPlaying) { return this; } @@ -587,7 +588,7 @@ return this; }; Tween.prototype.resume = function (time) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (!this._isPaused || !this._isPlaying) { return this; } @@ -678,7 +679,7 @@ * it is still playing, just paused). */ Tween.prototype.update = function (time, autoStart) { - if (time === void 0) { time = now$1(); } + if (time === void 0) { time = now(); } if (autoStart === void 0) { autoStart = true; } if (this._isPaused) return true; @@ -801,9 +802,7 @@ if (end.charAt(0) === '+' || end.charAt(0) === '-') { return start + parseFloat(end); } - else { - return parseFloat(end); - } + return parseFloat(end); }; Tween.prototype._swapEndStartRepeatValues = function (property) { var tmp = this._valuesStartRepeat[property]; @@ -819,7 +818,7 @@ return Tween; }()); - var VERSION = '19.0.0'; + var VERSION = '20.0.0'; /** * Tween.js - Licensed under the MIT license @@ -850,7 +849,7 @@ Easing: Easing, Group: Group, Interpolation: Interpolation, - now: now$1, + now: now, Sequence: Sequence, nextId: nextId, Tween: Tween, @@ -872,11 +871,11 @@ exports.default = exports$1; exports.getAll = getAll; exports.nextId = nextId; - exports.now = now$1; + exports.now = now; exports.remove = remove; exports.removeAll = removeAll; exports.update = update; Object.defineProperty(exports, '__esModule', { value: true }); -}))); +})); diff --git a/package-lock.json b/package-lock.json index 8dd979e7..0c28918a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tweenjs/tween.js", - "version": "19.0.0", + "version": "20.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tweenjs/tween.js", - "version": "19.0.0", + "version": "20.0.0", "license": "MIT", "devDependencies": { "@typescript-eslint/eslint-plugin": "^3.1.0", diff --git a/package.json b/package.json index d49769d1..748c1d4e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", - "version": "19.0.0", + "version": "20.0.0", "type": "module", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", diff --git a/src/Version.ts b/src/Version.ts index bf02c788..3d0c438b 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '19.0.0' +const VERSION = '20.0.0' export default VERSION From e0130f01c05621823d011e7e4eb1accdb3e5b524 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 22:19:38 -0700 Subject: [PATCH 072/107] chore: update README --- README.md | 159 ++++++++++++++++++++++++------------ assets/projects/11_lume.jpg | Bin 0 -> 179722 bytes 2 files changed, 109 insertions(+), 50 deletions(-) create mode 100644 assets/projects/11_lume.jpg diff --git a/README.md b/README.md index 978b1d11..10874f7c 100644 --- a/README.md +++ b/README.md @@ -1,101 +1,159 @@ # tween.js -JavaScript tweening engine for easy animations, incorporating optimised Robert Penner's equations. +JavaScript (TypeScript) tweening engine for easy animations, incorporating optimised Robert Penner's equations. [![NPM Version][npm-image]][npm-url] [![CDNJS][cdnjs-image]][cdnjs-url] [![NPM Downloads][downloads-image]][downloads-url] [![Build and Tests][ci-image]][ci-url] -**Update Note** In v18 the script you should include has moved from `src/Tween.js` to `dist/tween.umd.js`. See the [installation section](#Installation) below. - --- -```javascript -const box = document.createElement('div') -box.style.setProperty('background-color', '#008800') -box.style.setProperty('width', '100px') -box.style.setProperty('height', '100px') -document.body.appendChild(box) - -// Setup the animation loop. -function animate(time) { +```html + + +
+ + + + +``` + +[Try this example on CodePen](https://codepen.io/trusktr/pen/KKGaBVz?editors=1000) + +# Installation + +## From CDN + +Install from a content-delivery network (CDN) like in the above example. + +From cdnjs: + +```html + +``` + +Or from unpkg.com: + +```html + ``` -[Test it with CodePen](https://codepen.io/mikebolt/pen/zzzvZg) +Note that unpkg.com supports a semver version in the URL, where the `^` in the URL tells unpkg to give you the latest version 20.x.x. -## Installation +## Build and include in your project with script tag Currently npm is required to build the project. ```bash git clone https://github.com/tweenjs/tween.js cd tween.js -npm i . +npm install npm run build ``` -This will create some builds in the `dist` directory. There are currently four different builds of the library: +This will create some builds in the `dist` directory. There are currently two different builds of the library: -- UMD : tween.umd.js -- AMD : tween.amd.js -- CommonJS : tween.cjs.js -- ES6 Module : tween.es.js +- UMD : `tween.umd.js` +- ES6 Module : `tween.es.js` You are now able to copy tween.umd.js into your project, then include it with -a script tag. This will add TWEEN to the global scope. +a script tag, which will add TWEEN to the global scope, ```html - + ``` -### With `require('@tweenjs/tween.js')` +or import TWEEN as a JavaScript module, + +```html + +``` + +where `path/to` is replaced with the location where you placed the file. + +## With `npm install` and `import` from `node_modules` You can add tween.js as an npm dependency: ```bash -npm i @tweenjs/tween.js@^18 +npm install @tweenjs/tween.js +``` + +### With a build tool + +If you are using [Node.js](https://nodejs.org/), [Parcel](https://parceljs.org/), [Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/), [Vite](https://vitejs.dev/), or another build tool, then you can now use the following to include tween.js: + +```javascript +import * as TWEEN from '@tweenjs/tween.js' +``` + +### Without a build tool + +You can import from `node_modules` if you serve node_modules as part of your website, using an `importmap` script tag. First, assuming `node_modules` is at the root of your website, you can write an import map: + +```html + ``` -If you are using Node, Webpack, or Browserify, then you can now use the following to include tween.js: +Now in any of your module scripts you can import it by its package name: ```javascript -const TWEEN = require('@tweenjs/tween.js') +import * as TWEEN from '@tweenjs/tween.js' ``` -## Features +# Features - Does one thing and one thing only: tween properties - Doesn't take care of CSS units (e.g. appending `px`) -- Doesn't interpolate colours +- Doesn't interpolate colors - Easing functions are reusable outside of Tween - Can also use custom easing functions -## Documentation +# Documentation - [User guide](./docs/user_guide.md) - [Contributor guide](./docs/contributor_guide.md) - [Tutorial](http://learningthreejs.com/blog/2011/08/17/tweenjs-for-smooth-animation/) using tween.js with three.js - Also: [libtween](https://github.com/jsm174/libtween), a port of tween.js to C by [jsm174](https://github.com/jsm174) -- Also: [es6-tween](https://github.com/tweenjs/es6-tween), a port of tween.js to ES6/Harmony by [dalisoft](https://github.com/dalisoft) - [Understanding tween.js](https://mikebolt.me/article/understanding-tweenjs.html) -## Examples +# Examples @@ -291,9 +349,9 @@ const TWEEN = require('@tweenjs/tween.js')
-## Tests +# Tests -You need to install `npm` first--this comes with node.js, so install that one first. Then, cd to `tween.js`'s directory and run: +You need to install `npm` first--this comes with node.js, so install that one first. Then, cd to `tween.js`'s (or wherever you cloned the repo) directory and run: ```bash npm install @@ -305,16 +363,17 @@ To run the tests run: npm test ``` -If you want to add any feature or change existing features, you _must_ run the tests to make sure you didn't break anything else. Any pull request (PR) needs to have updated passing tests for feature changes (or new passing tests for new features) in `src/tests.ts`, otherwise the PR won't be accepted. See [contributing](CONTRIBUTING.md) for more information. +If you want to add any feature or change existing features, you _must_ run the tests to make sure you didn't break anything else. Any pull request (PR) needs to have updated passing tests for feature changes (or new passing tests for new features or fixes) in `src/tests.ts` a PR to be accepted. See [contributing](CONTRIBUTING.md) for more information. -## People +# People Maintainers: [mikebolt](https://github.com/mikebolt), [sole](https://github.com/sole), [Joe Pea (@trusktr)](https://github.com/trusktr). [All contributors](http://github.com/tweenjs/tween.js/contributors). -## Projects using tween.js +# Projects using tween.js +[![Lume](./assets/projects/11_lume.jpg)](https://lume.io) [![A-Frame VR](https://tweenjs.github.io/tween.js/assets/projects/10_aframe.png)](https://aframe.io) [![MOMA Inventing Abstraction 1910-1925](https://tweenjs.github.io/tween.js/assets/projects/09_moma.png)](http://www.moma.org/interactives/exhibitions/2012/inventingabstraction/) [![Web Lab](https://tweenjs.github.io/tween.js/assets/projects/08_web_lab.png)](http://www.chromeweblab.com/) diff --git a/assets/projects/11_lume.jpg b/assets/projects/11_lume.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4b6c4a61fde1d97d75c32b1a2bf7ce55e9cf43e GIT binary patch literal 179722 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

IE-XCUsV{cII1vRi)vgQS31|{ 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�vz|c>K5FTKN2)Gy||3Ro? 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 literal 0 HcmV?d00001 From d719527b58c1f19765d3c4f43d7a747d63bb5659 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 22:20:43 -0700 Subject: [PATCH 073/107] v20.0.1 --- dist/tween.amd.js | 2 +- dist/tween.cjs.js | 2 +- dist/tween.d.ts | 2 +- dist/tween.esm.js | 2 +- dist/tween.umd.js | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index 19b64922..fc62e7ff 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -814,7 +814,7 @@ define(['exports'], (function (exports) { 'use strict'; return Tween; }()); - var VERSION = '20.0.0'; + var VERSION = '20.0.1'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index b2b0f633..93385679 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -816,7 +816,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '20.0.0'; +var VERSION = '20.0.1'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index 028c248b..82b559ea 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -152,7 +152,7 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "20.0.0"; +declare const VERSION = "20.0.1"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween[]; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 77b79d0c..ef5d9c0e 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -812,7 +812,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '20.0.0'; +var VERSION = '20.0.1'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index 57120230..8104d1f5 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -818,7 +818,7 @@ return Tween; }()); - var VERSION = '20.0.0'; + var VERSION = '20.0.1'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index 0c28918a..56528313 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tweenjs/tween.js", - "version": "20.0.0", + "version": "20.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tweenjs/tween.js", - "version": "20.0.0", + "version": "20.0.1", "license": "MIT", "devDependencies": { "@typescript-eslint/eslint-plugin": "^3.1.0", diff --git a/package.json b/package.json index 748c1d4e..e5644330 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", - "version": "20.0.0", + "version": "20.0.1", "type": "module", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", diff --git a/src/Version.ts b/src/Version.ts index 3d0c438b..1e9b0521 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '20.0.0' +const VERSION = '20.0.1' export default VERSION From c9c002c08c1add6f5e87b3d533eb4960faa7a60f Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 22:33:53 -0700 Subject: [PATCH 074/107] remove unused sync-gh-pages.yml --- .github/workflows/sync-gh-pages.yml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .github/workflows/sync-gh-pages.yml diff --git a/.github/workflows/sync-gh-pages.yml b/.github/workflows/sync-gh-pages.yml deleted file mode 100644 index 470ace34..00000000 --- a/.github/workflows/sync-gh-pages.yml +++ /dev/null @@ -1,25 +0,0 @@ -# syncs master to gh-pages -# !!!!! TODO !!!!!!!!!!!!!! - -name: sync master to gh-pages - -on: - push: - branches: [master] - -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: git checkout gh-pages - - run: git merge master From a5f73f549f4667358f0c85c4c3eca4ac91a60296 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 22:37:33 -0700 Subject: [PATCH 075/107] chore: fix README image size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 10874f7c..79bac3a7 100644 --- a/README.md +++ b/README.md @@ -373,7 +373,7 @@ Maintainers: [mikebolt](https://github.com/mikebolt), [sole](https://github.com/ # Projects using tween.js -[![Lume](./assets/projects/11_lume.jpg)](https://lume.io) +[Lume](https://lume.io) [![A-Frame VR](https://tweenjs.github.io/tween.js/assets/projects/10_aframe.png)](https://aframe.io) [![MOMA Inventing Abstraction 1910-1925](https://tweenjs.github.io/tween.js/assets/projects/09_moma.png)](http://www.moma.org/interactives/exhibitions/2012/inventingabstraction/) [![Web Lab](https://tweenjs.github.io/tween.js/assets/projects/08_web_lab.png)](http://www.chromeweblab.com/) From f3b9f934297604210cb7dd768e524923b856bff9 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 22:37:48 -0700 Subject: [PATCH 076/107] v20.0.2 --- dist/tween.amd.js | 2 +- dist/tween.cjs.js | 2 +- dist/tween.d.ts | 2 +- dist/tween.esm.js | 2 +- dist/tween.umd.js | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index fc62e7ff..184a5035 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -814,7 +814,7 @@ define(['exports'], (function (exports) { 'use strict'; return Tween; }()); - var VERSION = '20.0.1'; + var VERSION = '20.0.2'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index 93385679..102ca787 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -816,7 +816,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '20.0.1'; +var VERSION = '20.0.2'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index 82b559ea..dc040478 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -152,7 +152,7 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "20.0.1"; +declare const VERSION = "20.0.2"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween[]; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index ef5d9c0e..7a6cf8f3 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -812,7 +812,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '20.0.1'; +var VERSION = '20.0.2'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index 8104d1f5..fe59b8ef 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -818,7 +818,7 @@ return Tween; }()); - var VERSION = '20.0.1'; + var VERSION = '20.0.2'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index 56528313..722184a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tweenjs/tween.js", - "version": "20.0.1", + "version": "20.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tweenjs/tween.js", - "version": "20.0.1", + "version": "20.0.2", "license": "MIT", "devDependencies": { "@typescript-eslint/eslint-plugin": "^3.1.0", diff --git a/package.json b/package.json index e5644330..83491034 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", - "version": "20.0.1", + "version": "20.0.2", "type": "module", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", diff --git a/src/Version.ts b/src/Version.ts index 1e9b0521..78f24082 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '20.0.1' +const VERSION = '20.0.2' export default VERSION From 9be51ba06bb28ffd4f1c79eb76e252a480b8ba54 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 22:41:38 -0700 Subject: [PATCH 077/107] update Node version for GitHub actions --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c855dbaa..2a7cd744 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x] + node-version: [16.x, 18.x, 20.x] steps: - uses: actions/checkout@v2 From 6abed8318a3fe602b616bb440f6037b061615e6a Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sat, 22 Apr 2023 22:43:48 -0700 Subject: [PATCH 078/107] v20.0.3 --- dist/tween.amd.js | 2 +- dist/tween.cjs.js | 2 +- dist/tween.d.ts | 2 +- dist/tween.esm.js | 2 +- dist/tween.umd.js | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index 184a5035..876c35b0 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -814,7 +814,7 @@ define(['exports'], (function (exports) { 'use strict'; return Tween; }()); - var VERSION = '20.0.2'; + var VERSION = '20.0.3'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index 102ca787..32ef3142 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -816,7 +816,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '20.0.2'; +var VERSION = '20.0.3'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index dc040478..13508302 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -152,7 +152,7 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "20.0.2"; +declare const VERSION = "20.0.3"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween[]; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 7a6cf8f3..5139d967 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -812,7 +812,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '20.0.2'; +var VERSION = '20.0.3'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index fe59b8ef..baf44f00 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -818,7 +818,7 @@ return Tween; }()); - var VERSION = '20.0.2'; + var VERSION = '20.0.3'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index 722184a7..c53cbad0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tweenjs/tween.js", - "version": "20.0.2", + "version": "20.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tweenjs/tween.js", - "version": "20.0.2", + "version": "20.0.3", "license": "MIT", "devDependencies": { "@typescript-eslint/eslint-plugin": "^3.1.0", diff --git a/package.json b/package.json index 83491034..e2896fa1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", - "version": "20.0.2", + "version": "20.0.3", "type": "module", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", diff --git a/src/Version.ts b/src/Version.ts index 78f24082..d8d8b168 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '20.0.2' +const VERSION = '20.0.3' export default VERSION From 4093972473dc8d3391cc28f1ed79a29b282478aa Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 23 Apr 2023 12:05:53 -0700 Subject: [PATCH 079/107] chore: update start() method docs, add startFromCurrentValues() doc --- docs/user_guide.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/user_guide.md b/docs/user_guide.md index 474ce656..44f8e4ec 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -131,7 +131,15 @@ tween.stop(); Stopping a tween that was never started or that has already been stopped has no effect. No errors are thrown either. -The `start` method also accepts a `time` parameter. If you use it, the tween won't start until that particular moment in time; otherwise it will start as soon as possible (i.e. on the next call to `TWEEN.update`). +The `start` method also accepts a `time` argument. If you use it, the tween won't start until that particular moment in time; otherwise it will start as soon as possible (i.e. on the next call to `TWEEN.update`). + +The `start` method accepts a second boolean argument: when `true`, a tween that we previously used will start from the values in the target object, instead of starting from the beginning. Useful for stopping a tween, then starting another one that will continue from the current location. + +### `startFromCurrentValues` + +This is an alias for `tween.start(undefined, true)`, to make a previously-used +tween start from the last values of the target object, instead of from the +beginning. ### `update` From c35ad456db42d0e1ffcf5c748aa9febc0b549f8e Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 23 Apr 2023 12:16:06 -0700 Subject: [PATCH 080/107] chore: update user_guide with `isPlaying` and `isPaused` --- docs/user_guide.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/user_guide.md b/docs/user_guide.md index 44f8e4ec..fa26f98e 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -523,6 +523,18 @@ onEveryStart { x: 5 } { x: 1 } ``` +## Tween State + +### `isPlaying` + +`true` when started (even if paused). + +When a tween is stopped, `isPlaying` and `isPaused` will both be `false`. + +### `isPaused` + +`true` when paused. `isPlaying` will also be `true`. If a tween is started, but not paused, `isPlaying` will be `true` and `isPaused` will be `false`. + ## Advanced tweening ### Relative values From 0e10e567af9bd1b2d9c3ceeb3b7f4cc674240fa0 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 23 Apr 2023 13:53:16 -0700 Subject: [PATCH 081/107] chore: update examples to use CSS transform instead of CSS top/left closes #219 --- examples/00_hello_world.html | 10 ++++------ examples/01_bars.html | 8 ++++---- examples/13_relative_start_time.html | 20 ++++++++------------ examples/15_complex_properties.html | 6 ++---- examples/18_start_from_current_values.html | 6 ++---- 5 files changed, 20 insertions(+), 30 deletions(-) diff --git a/examples/00_hello_world.html b/examples/00_hello_world.html index a57f5865..5143f804 100644 --- a/examples/00_hello_world.html +++ b/examples/00_hello_world.html @@ -15,8 +15,7 @@

00 _ hello world

id="target" style=" position: absolute; - top: 100px; - left: 100px; + transform: translate(100px, 100px); width: 100px; height: 100px; background: #a0dde9; @@ -67,10 +66,9 @@

00 _ hello world

} function update() { - target.style.left = position.x + 'px' - target.style.top = position.y + 'px' - target.style.webkitTransform = 'rotate(' + Math.floor(position.rotation) + 'deg)' - target.style.MozTransform = 'rotate(' + Math.floor(position.rotation) + 'deg)' + target.style.transform = `translate(${position.x}px, ${position.y}px) rotate(${Math.floor( + position.rotation, + )}deg)` } diff --git a/examples/01_bars.html b/examples/01_bars.html index b347590c..2cf3646b 100644 --- a/examples/01_bars.html +++ b/examples/01_bars.html @@ -39,16 +39,16 @@

01 _ Bars

var domElement = document.createElement('div') var bg = (Math.random() * 0xffffff) >> 0 domElement.style.position = 'absolute' - domElement.style.top = Math.random() * window.innerHeight + 'px' - domElement.style.left = startValue + 'px' + const y = Math.random() * window.innerHeight + domElement.style.translate = startValue + 'px ' + y + 'px' domElement.style.background = '#' + bg.toString(16) domElement.style.width = '100px' domElement.style.height = '2px' - var elem = {x: startValue, domElement: domElement} + var elem = {x: startValue, domElement: domElement, y} var updateCallback = function (object) { - object.domElement.style.left = object.x + 'px' + object.domElement.style.translate = object.x + 'px ' + object.y + 'px' } var tween = new TWEEN.Tween(elem) diff --git a/examples/13_relative_start_time.html b/examples/13_relative_start_time.html index 5da1845a..5ddb432a 100644 --- a/examples/13_relative_start_time.html +++ b/examples/13_relative_start_time.html @@ -16,8 +16,7 @@

13 _ relative start time

id="target1" style=" position: absolute; - top: 100px; - left: 100px; + transform: translate(100px, 100px); width: 100px; height: 100px; background: #a0dde9; @@ -31,8 +30,7 @@

13 _ relative start time

id="target2" style=" position: absolute; - top: 300px; - left: 100px; + transform: translate(100px, 300px); width: 100px; height: 100px; background: #a0dde9; @@ -76,17 +74,15 @@

13 _ relative start time

} function update1() { - target1.style.left = position1.x + 'px' - target1.style.top = position1.y + 'px' - target1.style.webkitTransform = 'rotate(' + Math.floor(position1.rotation) + 'deg)' - target1.style.MozTransform = 'rotate(' + Math.floor(position1.rotation) + 'deg)' + target1.style.transform = `translate(${position1.x}px, ${position1.y}px) rotate(${Math.floor( + position1.rotation, + )}deg)` } function update2() { - target2.style.left = position2.x + 'px' - target2.style.top = position2.y + 'px' - target2.style.webkitTransform = 'rotate(' + Math.floor(position2.rotation) + 'deg)' - target2.style.MozTransform = 'rotate(' + Math.floor(position2.rotation) + 'deg)' + target2.style.transform = `translate(${position2.x}px, ${position2.y}px) rotate(${Math.floor( + position2.rotation, + )}deg)` } diff --git a/examples/15_complex_properties.html b/examples/15_complex_properties.html index 1cd85cd9..e516432a 100644 --- a/examples/15_complex_properties.html +++ b/examples/15_complex_properties.html @@ -15,8 +15,7 @@

15 _ complex properties

id="target" style=" position: absolute; - top: 100px; - left: 100px; + transform: translate(100px, 100px); width: 100px; height: 100px; background: #a0dde9; @@ -67,8 +66,7 @@

15 _ complex properties

function update(values) { target.style.opacity = values.styles.opacity - target.style.left = values.x + 'px' - target.style.top = values.y + 'px' + target.style.transform = `translate(${values.x}px, ${values.y}px)` } diff --git a/examples/18_start_from_current_values.html b/examples/18_start_from_current_values.html index 4b115f43..72e1cbd0 100644 --- a/examples/18_start_from_current_values.html +++ b/examples/18_start_from_current_values.html @@ -20,8 +20,7 @@

18 _ start from current values

id="target" style=" position: absolute; - top: 200px; - left: 400px; + transform: translate(400px, 200px); width: 100px; height: 100px; background: #a0dde9; @@ -63,8 +62,7 @@

18 _ start from current values

} function update() { - target.style.left = position.x + 'px' - target.style.top = position.y + 'px' + target.style.transform = `translate(${position.x}px, ${position.y}px)` } //Add event listeners to each of the arrow buttons From bf50c1f529a96b646e3c5fffececb918c4ea7384 Mon Sep 17 00:00:00 2001 From: mk965 Date: Mon, 24 Apr 2023 13:51:08 +0800 Subject: [PATCH 082/107] docs(zh-CN): Update zh-CN documentation to v.20 --- README.md | 2 + README_zh-CN.md | 373 ++++++++++++++++++------------ docs/contributor_guide.md | 2 + docs/contributor_guide_zh-CN.md | 224 ++++-------------- docs/user_guide.md | 2 + docs/user_guide_zh-CN.md | 392 ++++++++++++++++++++++++-------- 6 files changed, 570 insertions(+), 425 deletions(-) diff --git a/README.md b/README.md index 79bac3a7..ca9fa407 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ JavaScript (TypeScript) tweening engine for easy animations, incorporating optim [![NPM Downloads][downloads-image]][downloads-url] [![Build and Tests][ci-image]][ci-url] +More languages: [English](./README.md), [简体中文](./README_zh-CN.md) + --- ```html diff --git a/README_zh-CN.md b/README_zh-CN.md index 1b322ebc..b0679ef0 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -1,164 +1,256 @@ # tween.js -tween.js 是用于简单动画的 JavaScript 补间引擎,结合了优化的 Robert Penner 方程。 +用于简单动画的 JavaScript (TypeScript) 补间引擎,结合优化的 Robert Penner 方程式。 [![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Travis tests][travis-image]][travis-url] -[![Flattr this][flattr-image]][flattr-url] [![CDNJS][cdnjs-image]][cdnjs-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build and Tests][ci-image]][ci-url] -```javascript -var box = document.createElement('div') -box.style.setProperty('background-color', '#008800') -box.style.setProperty('width', '100px') -box.style.setProperty('height', '100px') -document.body.appendChild(box) - -// 设置循环动画 -function animate(time) { +更多语言: [English](./README.md), [简体中文](./README_zh-CN.md) + +--- + +```html + + +
+ + + + ``` -[在线代码测试](https://codepen.io/mikebolt/pen/zzzvZg) +[在 CodePen 上试试这个例子](https://codepen.io/trusktr/pen/KKGaBVz?editors=1000) ## 安装 -下载 [library](https://raw.githubusercontent.com/tweenjs/tween.js/master/src/Tween.js) 并将它引入至你的代码中: +## 从 CDN 安装 -```html - -``` +从上例中的内容分发网络 (CDN) 安装。 -您也可以在代码中引用 CDN 托管的版本,这要感谢 cdnjs 。例如: +cdnjs: ```html - + ``` -See [tween.js](https://cdnjs.com/libraries/tween.js/) for more versions. +或者 unpkg.com: -查看更多 [tween.js](https://cdnjs.com/libraries/tween.js/) 版本. +```html + +``` +请注意,unpkg.com 支持 URL 中的 semver 版本,其中 URL 中的 `^` 告诉 unpkg 为你提供最新版本 20.x.x。 -### 更多高级用户想要的... +## 使用 script 标签构建并包含在你的项目中 -#### 使用 `npm` +目前需要 npm 来构建项目。 ```bash -npm install @tweenjs/tween.js +git clone https://github.com/tweenjs/tween.js +cd tween.js +npm install +npm run build ``` -然后用标准的 node.js `require` 包含 Tween.js 模块: +这将在 `dist` 目录中创建一些构建。 目前有两种不同的库版本: -```javascript -var TWEEN = require('@tweenjs/tween.js') +- UMD : `tween.umd.js` +- ES6 Module : `tween.es.js` + +你现在可以将 tween.umd.js 复制到你的项目中,然后将其包含在一个 script 标签,它将 TWEEN 添加到全局范围, + +```html + ``` -您可以像所有其他示例一样使用 Tween.js,例如: +或将 TWEEN 作为 JavaScript 模块导入, -```javascript -var t = new TWEEN.Tween(/* etc */) -t.start() +```html + ``` -你将需要使用诸如`browserify`之类的工具将使用此风格的代码转换为可以在浏览器中运行的代码(浏览器无法识别 `require`) +其中 `path/to` 替换为你放置文件的位置。 -#### Use `bower` +## 使用 `npm install` 和 `import` 从 `node_modules` 中添加 + +你可以将 tween.js 添加为 npm 依赖项: ```bash -bower install @tweenjs/tweenjs --save +npm install @tweenjs/tween.js ``` -或者安装特定的 tag.他们是 git tags,如果你已经在本地克隆仓库,你可以在命令行中运行`git tag`查看 tag 列表,或者你可以查看下 [tween.js tags page](https://github.com/tweenjs/tween.js/tags) 列表.例如,安装 `v16.3.0`: +### 使用构建工具 -```bash -bower install @tweenjs/tweenjs#v16.3.0 +如果你使用 [Node.js](https://nodejs.org/)、[Parcel](https://parceljs.org/)、[Webpack](https://webpack.js.org/), [Rollup](https://rollupjs.org/)、[Vite](https://vitejs.dev/) 或者其他的构建工具,那么你现在可以使用以下方式来导入 tween.js: + +```javascript +import * as TWEEN from '@tweenjs/tween.js' ``` -然后引入库源码: +### 没有构建工具 + +如果你将 `node_modules` 作为网站的一部分提供服务,则可以使用 `importmap` script 标签从 `node_modules` 导入。 首先,假设 `node_modules` 位于你网站的根目录,你可以编写一个导入映射: ```html - + ``` -## Features - -- 只做一件事且仅只做一件事: 补间特性 -- 不关注 CSS 单位 (e.g. appending `px`) -- 不插入颜色 -- 缓和功能可以在 Tween 之外重用 -- 也可以使用自定义缓动功能 +现在,在任何 module script 中,你都可以通过包名导入它: -## Documentation +```javascript +import * as TWEEN from '@tweenjs/tween.js' +``` -- [使用指南](./docs/user_guide_zh-CN.md) -- [贡献者指南](./docs/contributor_guide_zh-CN.md) -- [教程](http://learningthreejs.com/blog/2011/08/17/tweenjs-for-smooth-animation/) using tween.js with three.js -- 其他: [libtween](https://github.com/jsm174/libtween), [jsm174](https://github.com/jsm174) 写的一个 C 语言版本的 tween.js. -- 其他: [es6-tween](https://github.com/tweenjs/es6-tween), [dalisoft](https://github.com/dalisoft) 写的一个 ES6/Harmony 版本的 tween.js. -- [理解 tween.js](https://mikebolt.me/article/understanding-tweenjs.html) +# 特性 +- 做一件事并且只做一件事:补间属性 +- 不处理 CSS 单位(例如附加 `px`) +- 不插值颜色 +- 缓动函数可在 Tween 之外重复使用 +- 也可以使用自定义缓动函数 -## 示例 +# 文档 + + + + + + + + + + + + + + + + + +
- - Custom functions + + hello world - Custom functions
- (source) + hello world
+ (source)
- - Stop all chained tweens + + Bars - Stop all chained tweens
- (source) + Bars
+ (source) +
+ + Black and red + + + Black and red
+ (source) +
+ + Graphs + + + Graphs
+ (source)
- - Yoyo + + Simplest possible example - Yoyo
- (source) + Simplest possible example
+ (source)
- - Relative values + + Video and time - Relative values
- (source) + Video and time
+ (source) +
+ + Array interpolation + + + Array interpolation
+ (source) +
+ + Dynamic to, object + + + Dynamic to, object
+ (source) +
+ + Dynamic to, interpolation array + + + Dynamic to, interpolation array
+ (source) +
+ + Dynamic to, large interpolation array + + + Dynamic to, large interpolation array
+ (source)
- Repeat + Repeat @@ -166,132 +258,123 @@ bower install @tweenjs/tweenjs#v16.3.0 (source) - - Dynamic to + + Relative values - Dynamic to
- (source) + Relative values
+ (source)
- - Array interpolation + + Yoyo - Array interpolation
- (source) + Yoyo
+ (source)
- - Video and time + + Stop all chained tweens - Video and time
- (source) + Stop all chained tweens
+ (source)
- - Simplest possible example + + Custom functions - Simplest possible example
- (source) + Custom functions
+ (source)
- - Graphs + + Relative start time - Graphs
- (source) + Relative start time
+ (source)
- - Black and red + + Pause tween - Black and red
- (source) + Pause tween
+ (source)
- - Bars + + Complex properties - Bars
- (source) + Complex properties
+ (source)
- - hello world + + Animate an array of values - hello world
- (source) + Animate an array of values
+ (source)
-## Tests +# 测试 -你首先需要安装`npm`--基于 node.js,所以首先安装它.然后,进入到`tween.js`的目录下并运行: +你需要先安装 `npm`——它随 node.js 一起提供,因此请先安装它。 然后,cd 到 `tween.js` 的(或你克隆 repo 的任何地方)目录并运行: ```bash npm install ``` -如果是第一次运行测试,则为运行测试安装额外的依赖,然后运行 +运行测试: ```bash npm test ``` -每次你想运行测试. - -如果你想添加任何功能或改变现有的功能,你*必须*运行测试,以确保你没有影响别的东西.如果你发一个 pull request(PR)添加新的东西,它没有测试,或测试不通过,这个 PR 将不被接受.更详细的请看 [contributing](CONTRIBUTING.md). - -## People - -维护者: [mikebolt](https://github.com/mikebolt), [sole](https://github.com/sole). - -[所有贡献者](http://github.com/tweenjs/tween.js/contributors). +如果你想添加任何功能或更改现有功能,你 *必须* 运行测试以确保你没有破坏任何其他功能。任何拉取请求 (PR) 都需要在 `src/tests.ts` 中更新通过功能更改测试(或通过新功能或修复的新测试)才能接受 PR。 有关更多信息,请参阅 [贡献](CONTRIBUTING.md)。 -## 使用 tween.js 的项目 +# 使用 tween.js 的项目 -[![A-Frame VR](http://tweenjs.github.io/tween.js/assets/projects/10_aframe.png)](https://aframe.io) -[![MOMA Inventing Abstraction 1910-1925](http://tweenjs.github.io/tween.js/assets/projects/09_moma.png)](http://www.moma.org/interactives/exhibitions/2012/inventingabstraction/) -[![Web Lab](http://tweenjs.github.io/tween.js/assets/projects/08_web_lab.png)](http://www.chromeweblab.com/) -[![MACCHINA I](http://tweenjs.github.io/tween.js/assets/projects/07_macchina.png)](http://5013.es/toys/macchina) -[![Minesweeper 3D](http://tweenjs.github.io/tween.js/assets/projects/06_minesweeper3d.png)](http://egraether.com/mine3d/) -[![ROME](http://tweenjs.github.io/tween.js/assets/projects/05_rome.png)](http://ro.me) -[![WebGL Globe](http://tweenjs.github.io/tween.js/assets/projects/04_webgl_globe.png)](http://data-arts.appspot.com/globe) -[![Androidify](http://tweenjs.github.io/tween.js/assets/projects/03_androidify.png)](http://www.androidify.com/) -[![The Wilderness Downtown](http://tweenjs.github.io/tween.js/assets/projects/01_wilderness.png)](http://thewildernessdowntown.com/) -[![Linechart](http://tweenjs.github.io/tween.js/assets/projects/00_linechart.png)](http://dejavis.org/linechart) +[Lume](https://lume.io) +[![A-Frame VR](https://tweenjs.github.io/tween.js/assets/projects/10_aframe.png)](https://aframe.io) +[![MOMA Inventing Abstraction 1910-1925](https://tweenjs.github.io/tween.js/assets/projects/09_moma.png)](http://www.moma.org/interactives/exhibitions/2012/inventingabstraction/) +[![Web Lab](https://tweenjs.github.io/tween.js/assets/projects/08_web_lab.png)](http://www.chromeweblab.com/) +[![MACCHINA I](https://tweenjs.github.io/tween.js/assets/projects/07_macchina.png)](http://5013.es/toys/macchina) +[![Minesweeper 3D](https://tweenjs.github.io/tween.js/assets/projects/06_minesweeper3d.png)](http://egraether.com/mine3d/) +[![ROME](https://tweenjs.github.io/tween.js/assets/projects/05_rome.png)](http://ro.me) +[![WebGL Globe](https://tweenjs.github.io/tween.js/assets/projects/04_webgl_globe.png)](http://data-arts.appspot.com/globe) +[![Androidify](https://tweenjs.github.io/tween.js/assets/projects/03_androidify.png)](http://www.androidify.com/) +[![The Wilderness Downtown](https://tweenjs.github.io/tween.js/assets/projects/01_wilderness.png)](http://thewildernessdowntown.com/) +[![Linechart](https://tweenjs.github.io/tween.js/assets/projects/00_linechart.png)](http://dejavis.org/linechart) [npm-image]: https://img.shields.io/npm/v/@tweenjs/tween.js.svg [npm-url]: https://npmjs.org/package/@tweenjs/tween.js [downloads-image]: https://img.shields.io/npm/dm/@tweenjs/tween.js.svg [downloads-url]: https://npmjs.org/package/@tweenjs/tween.js -[travis-image]: https://travis-ci.org/tweenjs/tween.js.svg?branch=master -[travis-url]: https://travis-ci.org/tweenjs/tween.js -[flattr-image]: https://api.flattr.com/button/flattr-badge-large.png -[flattr-url]: https://flattr.com/thing/45014/tween-js +[ci-image]: https://github.com/tweenjs/tween.js/workflows/build%20and%20tests/badge.svg?branch=master +[ci-url]: https://github.com/tweenjs/tween.js/actions [cdnjs-image]: https://img.shields.io/cdnjs/v/tween.js.svg [cdnjs-url]: https://cdnjs.com/libraries/tween.js diff --git a/docs/contributor_guide.md b/docs/contributor_guide.md index 23a6a2d5..6eec4042 100644 --- a/docs/contributor_guide.md +++ b/docs/contributor_guide.md @@ -1,5 +1,7 @@ # tween.js contributor guide +More languages: [English](./contributor_guide.md), [简体中文](./contributor_guide_zh-CN.md) + This guide is for people who want to _contribute_ to the library or are curious to learn what's behind the scenes: how is it tested? what do we automate? how do we do releases? etc. If you are looking for documentation on _how to use_ the library, the [user guide](./user_guide.md) is for you. diff --git a/docs/contributor_guide_zh-CN.md b/docs/contributor_guide_zh-CN.md index 7ab61049..e4b4a807 100644 --- a/docs/contributor_guide_zh-CN.md +++ b/docs/contributor_guide_zh-CN.md @@ -1,43 +1,49 @@ # tween.js 贡献者指南 -本指南适用于想要向库贡献的人,或者想了解背后的内容:如何进行测试?我们自动化什么?我们如何做发布?等等. +更多语言: [English](./contributor_guide.md), [简体中文](./contributor_guide_zh-CN.md) -如果您正在查找*如何使用*库的文档,[用户指南](./ user_guide_zh-CN.md)是适合你的。 +本指南适用于想要向库贡献的人,或者想了解背后的内容:如何进行测试?我们自动化什么?我们如何做发布?等等。 -**这个文档是一个正在进行的工作.更多内容将分阶段添加.如果你有问题,你想看到回答,请在 [as comments on this issue](https://github.com/tweenjs/tween.js/issues/323) 中提出.谢谢!** +如果你正在查找*如何使用*库的文档,[用户指南](./user_guide_zh-CN.md) 是适合你的。 + +**NOTE: 这个文档是一个正在进行的工作。更多内容将分阶段添加。如果你有问题,你想看到回答,请在 [as comments on this issue](https://github.com/tweenjs/tween.js/issues/323) 中提出,谢谢!** 目录: -- [开发者要求](#developer-requirements) -- [测试](#testing) -- [持续集成](#continuous-integration) -- [发布过程](#release-process) +- [tween.js 贡献者指南](#tween.js-贡献者指南) +- [开发者要求](#开发者要求) +- [测试](#测试) + - [单元测试](#单元测试) + - [代码风格和 lint 测试](#代码风格和-lint-测试) + - [其他类型的测试](#其他类型的测试) +- [持续集成](#持续集成) +- [发布流程](#发布流程) ## 开发者要求 -虽然 tween.js*不*需要 nodejs 工作,我们用它来开发.所以我们需要 [安装 nodejs](https://nodejs.org/en/download/),然后才能在库中工作. +虽然 tween.js *不*需要依赖 node.js 运行,但我们使用 node.js 来进行开发。所以我们需要先 [安装 node.js](https://nodejs.org/en/download/),然后才能在库中工作。 -Node.js 包含了我们使用的`npm`工具来运行脚本,比如打包,运行测试等等.请确保它在你的系统中正常工作,然后再尝试运行下面详述的任何步骤。 +Node.js 包括我们用来运行脚本的 npm 工具,例如打包、运行测试等的脚本。在你尝试运行下面详述的任何步骤之前,请确保它在你的系统中正常工作。 -一旦安装了 node.js,请克隆 tween.js 仓库: +安装 node.js 后,克隆 tween.js 存储库: ```bash git clone https://github.com/tweenjs/tween.js.git ``` -进入该文件夹 +进入该文件夹: ```bash cd tween.js ``` -运行脚本安装依赖 +并运行脚本来安装开发依赖项: ```bash npm install ``` -或者三行: +或者分三行: ```bash git clone https://github.com/tweenjs/tween.js.git @@ -45,211 +51,71 @@ cd tween.js npm install ``` -一旦`npm install`成功,试着运行测试: +`npm install` 成功完成后,尝试运行测试: ```bash npm test ``` -如果您遇到上述任何问题,请尝试使用你的搜索引擎搜索错误文本.这通常是最快的路线,因为许多人可能已经遇到同样的问题。 +如果你在运行上述任何步骤时遇到问题,请尝试使用你选择的搜索引擎搜索错误文本。这通常是最快的解决方法,因为很多人可能已经遇到过同样的问题。 ## 测试 -`test`目录中有一套自动化测试. +`test` 目录中有一套自动化测试。 -这些可以快速找到代码上的回归,在添加新功能或更改代码以修复错误时非常有用;我们不想引入新的问题!他们还能发现代码风格问题,这有助于我们保持库 cohesive. +这些可以快速发现代码上的回归,在添加新功能或更改代码以修复 Bug 时很有用;我们不想引入新的 Bugs!自动化测试还会发现风格问题,这有助于我们保持库的凝聚力。 -运行测试用例,输入: +要运行测试,请输入: ```bash npm test ``` -在更改库中的代码后,你应该运行测试.如果你更改测试描述的行为,则测试将不会通过,你将得到指向失败测试的错误.这可能是因为... +你应该在更改库中的代码后运行测试。如果你更改测试描述的行为,测试将不会通过,你将得到指向失败测试的错误。 这可能是因为... -- 你忽略了一些东西,或者你的代码有错误,或者... +- 你忽略了一些东西,或者你的代码有错误,或者... - 库或测试本身是错误的 -经常发生的是第一次,但第二次发生了,有边缘情况 +以上两种情况,发生频率更高的是第一个,但第如果二个发生了,可能是边缘情况。 -**自动化测试通过之后,您应该执行的另一件事是运行`examples`文件夹中的示例**.这不常见,但是可能会发生这样的情况:您的更改引入了自动化测试未检查的外观差异,唯一注意到这一点的方法是运行示例,并在输出上产生差异.如果你不想捡出两个库的副本,你可以看看[在线例子](https://github.com/tweenjs/tween.js#examples). +**自动化测试通过之后,你应该做的另一件事是运行 `examples` 文件夹中的示例**。有种情况很少见,但可能会发生:你的更改引入了自动测试未检查的外观差异,注意到这一点的唯一方法是运行示例并让人工发现输出中的差异。如果你不想签出库的两个副本,可以查看[在线例子](https://github.com/tweenjs/tween.js#examples)。 ### 单元测试 -测试用例在`src/tests.ts`文件中. - -测试使用[nodeunit](https://www.npmjs.com/package/nodeunit)执行. - -**TODO:** 如果在浏览器中打开`test/unit/nodeunit.html`,测试也应该能够正常工作,但是现在已经被破坏了.有一个[打开的问题](https://github.com/tweenjs/tween.js/issues/307)使他们再次工作。 +测试用例在 `src/tests.ts` 文件中。 -### 修正和样式测试 +测试使用 [nodeunit](https://www.npmjs.com/package/nodeunit) 执行。 -我们使用[JSCS](http://jscs.info/)和[JSHint](http://jshint.com/)来确保代码风格是统一的。 +**TODO:** 如果在浏览器中打开 `test/unit/nodeunit.html`,测试也应该能够正常运行,但是现在已经被损坏。有一个 [打开的问题](https://github.com/tweenjs/tween.js/issues/307) 可以使他们再次工作。 -#### JSCS +### 代码风格和 lint 测试 -这个工具可以帮助我们发现大部分"修饰"代码风格问题.例如,空格与制表符,括号之间的空格等. +我们使用 [JSCS](http://jscs.info/) 和 [JSHint](http://jshint.com/) 来保证代码风格的统一。 -运行: +要自动格式化代码并报告不可被格式化的代码片段的任何错误,请运行: -```bash -npm run test-style +```base +npm run test-lint ``` -JSCS 规则在`test/jscs.json`中. - -#### JSHint - -这个工具帮助我们发现代码质量问题.例如,使用正确的相等运算符,未使用的变量等. - -运行: - -```bash -npm run test-correctness -``` - -JSHint 规则在`test/jshintrc`中. +Prettier 规则在 `.prettierrc.js` 中,ESLint 规则在 `.eslintrc.js` 中。 ### 其他类型的测试 -我们想测试性能回归,也就是说,如果变化使得事情变得更慢,或者说性能变差,那么我们可以比较不同浏览器之间相同代码的性能. +我们想回归测试性能,即如果更改使运行变得更慢,或者简单地测试性能,那么我们可以比较不同浏览器之间相同代码的性能。 -有一个[open issue](https://github.com/tweenjs/discuss/issues/3)来跟踪这方面的工作,但我们还没有取得进展.请求帮助!:-) +有一个[open issue](https://github.com/tweenjs/discuss/issues/3)来跟踪这方面的工作,但我们还没有取得进展。请求帮助! :-) ## 持续集成 -我们实施了一个持续集成系统,为我们自动完成任务.它在每次发出拉取请求时自动运行测试,并且在某些情况下还可以自动发布新版本. - -如果建议的拉取请求中的变更破坏了任何内容,则贡献者可以获得反馈,而无需等待人员查看代码.此外,请求不能合并,直到测试通过. - -我们正在使用 Travis CI 平台来运行测试.您会在拉请求页面的底部找到一个小信息区,让您了解测试的状态. - -所有检查通过的例子: - -![Automated checks OK](./imgs/pull-request-checks.png) - -当检查失败时: - -![Automated checks failing](./imgs/pull-request-checks-failing.png) - -如果一个 pull request 通过添加新的提交被更新,测试将再次运行. - -Travis 配置了`.travis.yml`文件(如果你没有在你的文件浏览器或 Finder 中看到它,那是因为文件名以一个点开头,因此它被*隐藏*了)-尝试用终端打开). - -## 发布过程 - -我们使用[semantic-release](https://github.com/semantic-release/semantic-release)工具结合 Travis 自动[在 GitHub 上创建版本](https://github.com/tweenjs/tween.js/releases)并将它们发布到[npm](https://npmjs.org). - -每次 pull request 合并时,Travis 都会运行测试.如果他们通过没有错误.Travis 将运行`after_success`步骤: - -```yaml -after_success: - - npm run semantic-release -``` - -这反过来会运行`package.json`中的`semantic-release`脚本: - -```json -"semantic-release": "semantic-release pre && npm publish && semantic-release post" -``` - -当新版本发布时: - -- `semantic-release`决定了下一个版本号 -- 一个新的条目被添加到 GitHub 发布列表,以及包含在更改中的所有提交列表,以及一个包含该版本的 ZIP 文件,供希望下载 ZIP 的用户使用 -- git commit 是用版本号(像[Bower](http://bower.io/)这样的工具使用标签) -- 它也被发布到 npm,在 package.json 里有新的版本号 - -**Note:** `semantic-release`的默认配置选项只在分支名称为`master`的情况下运行.否则,我们会产生大量的推送和发布,因为 Travis 在每个 pull request 中运行! - -请注意`package.json`中的版本号是故意为`0.0.0-development`,因为我们不想鼓励任何人手动修改这个,但是我们也不能从文件中删除`version`字段,或者直接使用 git 仓库安装模块将会失败. - -### 如何确定新的版本号 - -和 npm 一样,`semantic-release`遵循[semver](http://semver.org/)约定,所以每个版本都由唯一的`MAJOR.MINOR.PATCH`版本号来标识.例如,给定版本`1.2.3`:1 = 重要,2 = 轻微,3 = 补丁。 - -在这个系统中,重大更改(例如,API 被修改,更新到新版本可能需要更新使用库的代码)应该增加主编号.如果存在向后兼容的更改(例如,不修改现有 API 的新功能),次要号码将会增加.较小的更改(如文档更新)只会增加修补程序编号. - -`semantic-release`使用提交消息自动决定下一个版本号. - -这真是*太好了*,因为跟踪版本号或决定新版本是主要还是次要的改变是一件非常无聊的事情,最好留给机器自己去做. - -为了自动构建,提交消息需要遵循一定的语法: - -`: .` - -下表使用[默认行为](https://github.com/semantic-release/commit-analyzer/blob/master/src/index.js)列出了提交类型及其对版本号的影响. - -| Type of commit | Description | Version increase? | -| --------------- | ----------------------------------------------------------------------- | ----------------- | -| fix | fixes a bug but does not change the API | Increases PATCH | -| style | formatting changes | | -| docs | adding/removing/changing docs | | -| refactor | rewriting code but not breaking changes, adding features or fixing bugs | | -| test | changes in tests, e.g. adding a missing one) | | -| feat | adding new features which do not change the API | Increases MINOR | -| BREAKING CHANGE | changes the API | Increases MAJOR | - -### 如何安装和配置`semantic-release` - -这主要是为了信息的目的,因为`semantic-release`已经配置了 Travis,贡献者不需要担心这一点,但是记录所有内容是很好的. - -#### Option 1: 使用 CLI 工具 - -首先安装全局 cli 工具: - -```bash -npm install -g semantic-release-cli -``` - -然后在现有的基于 node.js 的项目中(即`package.json`已经存在): - -```bash -semantic-release-cli setup -``` - -在项目上设置`semantic-release`时它会问你一系列的问题.如果一切顺利,下一次你推到 GitHub,一个新版本将自动发生. - -您需要在您的帐户中启用 TravisCI。 - -#### Option 2: 手动 - -安装模块: - -```bash -npm install --save-dev semantic-release -``` - -编辑`package.json`来添加`semantic-release`脚本: - -```javascript -"scripts": { - //... - "semantic-release": "semantic-release pre && npm publish && semantic-release post" - //... -}, -``` - -如果不存在,创建一个`.travis.yml`文件(这里是[帮助创建`travis.yml`文件](https://docs.travis-ci.com/user/getting-started/))或[看看我们的](https://github.com/tweenjs/tween.js/blob/master/.travis.yml). - -在`.travis.yml`中添加`after_success`部分,以运行`语义释放` -Add an `after_success` section to `.travis.yml`, in order to run `semantic-release`: - -```yaml -after_success: - - npm run semantic-release -``` - -现在我们需要在 Travis CI 中启用这个项目,所以请确保你有一个帐户并登录. - -在 Travis 中启用项目(如果你是维护者)或者请求维护者启用它,在[Travis 设置页面](https://travis-ci.org/profile/)中. +我们使用 GitHub Actions 进行持续集成,以便为每个 pull request 运行构建和测试。 `.github/workflows/tests.yml` 文件告诉 GitHub 要运行什么;在我们的例子中,我们在该文件中指定的操作系统和 Node.js 版本中运行 `npm install`,然后运行 `npm test`。 -点击项目名称附近的齿轮来配置一些选项. +**TODO**:将 macOS 和 Windows 添加到运行测试的操作系统。 请求帮助! :) -向下滚动,直到看到*环境变量*. +## 发布流程 -添加`GH_TOKEN`和`NPM_TOKEN`的标记.确保这两个变量都是隐藏的:`构建日志中的显示值`应该是`Off`. +目前发布过程是手动的。 -你可以从[npm](https://www.npmjs.com/settings/tokens)和[GitHub](https://github.com/settings/tokens)获得令牌.这些允许像 Travis 这样的服务代表您,这就是为什么您需要确保它们不会显示在构建日志中. +当准备好在 `master` 分支上发布时,确保没有未提交的更改,然后运行 `npm run release:patch` 发布一个新版本,其补丁号已被修改,`npm run release:minor` ,修改 minor 版本号并发布一个新版本,或者 `npm run release:major` 修改 major 版本号并发布一个新版本。 -希望现在每次你提交并推送到 GitHub 时,`semantic-release`将运行(如果使用上述的`master`分支),并且可能会发布一个新版本. +Tip: 请参阅 [semver.org](https://semver.org/) 和 [npm-semver](https://docs.npmjs.com/misc/semver) 文档以了解语义版本控制。 diff --git a/docs/user_guide.md b/docs/user_guide.md index fa26f98e..4f2061c5 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -1,5 +1,7 @@ # tween.js user guide +More languages: [English](./user_guide.md), [简体中文](./user_guide_zh-CN.md) + _**NOTE** This is a work in progress. If you find that something is unclear or missing details, please [file an issue](https://github.com/tweenjs/tween.js/issues/new) and help make this guide better. Or feel free to submit clarifications or improvements of your own if you feel you can help too!_ ## What is a tween? How do they work? Why do you want to use them? diff --git a/docs/user_guide_zh-CN.md b/docs/user_guide_zh-CN.md index e1a78ed6..3e6e36e6 100644 --- a/docs/user_guide_zh-CN.md +++ b/docs/user_guide_zh-CN.md @@ -1,16 +1,22 @@ -## tween 是什么?如何使用?你为什么想用它? +## tween.js 用户指南 -中文用户指南最近更新为 Tween.js v18.5.0 +更多语言: [English](./user_guide.md), [简体中文](./user_guide_zh-CN.md) -补间(动画)(来自 [in-between](https://en.wikipedia.org/wiki/Inbetweening))是一个概念,允许你以平滑的方式更改对象的属性。你只需告诉它哪些属性要更改,当补间结束运行时它们应该具有哪些最终值,以及这需要多长时间,补间引擎将负责计算从起始点到结束点的值。 +中文用户指南最近更新为 Tween.js v20.0.3 -例如,`position`对象拥有`x`和`y`两个坐标: +_**NOTE** 这是一个正在进行的工作。 如果你发现某些内容不清楚或缺少详细信息,请 [提出 issue](https://github.com/tweenjs/tween.js/issues/new) 并帮助改进本指南。 或者,如果你觉得自己也能提供帮助,请随时提交你自己的说明或改进!_ + +## 什么是 tween ?tween 是如何工作的?为什么要使用 tween ? + +补间(动画)(来自 [in-between](https://en.wikipedia.org/wiki/Inbetweening))是一个概念,允许你以平滑的方式更改对象的属性。你只需告诉它哪些属性要更改,当补间结束运行时它们应该具有哪些最终值,以及这需要多长时间,补间引擎将负责计算从起始点到结束点的值。 + +例如,`position` 对象拥有 `x` 和 `y` 两个坐标: ```js var position = {x: 100, y: 0} ``` -如果你想将`x`坐标的值从`100`变成`200`,你应该这么做: +如果你想将 `x` 坐标的值从 `100` 变成 `200` ,你应该这么做: ```js // 首先为位置创建一个补间(tween) @@ -20,14 +26,14 @@ var tween = new TWEEN.Tween(position) tween.to({x: 200}, 1000) ``` -一般来说这样还不够,tween 已经被创建了,但是它还没被激活(使用),你需要这样启动: +通常来说这样还不够,tween 已经被创建了,但是它还没被激活(使用),你需要这样启动: ```js // 启动 tween.start() ``` -最后,想要成功的完成这种效果,你需要在主函数中调用`TWEEN.update`,如下使用: +最后,想要成功的完成这种效果,你需要在主函数中调用 `TWEEN.update` ,如下使用: ```js animate() @@ -40,7 +46,7 @@ function animate() { } ``` -这样在更新每帧的时候都会运行补间动画;经过 1 秒后 (1000 毫秒) `position.x`将会变成 `200`。 +这样在更新每帧的时候都会运行补间动画;经过 1 秒(1000 毫秒)后 `position.x` 将会变成 `200`。 除非你在控制台中打印出 `x` 的值,不然你看不到它的变化。你可能想要使用 `onUpdate` 回调: @@ -50,11 +56,9 @@ tween.onUpdate(function (object) { }) ``` -> tips:你可能在这里获取不到 `object.x` ,具体的见我提的这个 [issue](https://github.com/tweenjs/tween.js/issues/402) +每次更新补间时都会调用此函数; 这种情况发生的频率取决于许多因素——例如,你的计算机或设备的速度有多快(以及有多繁忙!)。 -这个函数将会在动画每次更新的时候被调用;这种情况发生的频率取决于很多因素 - 例如,计算机或设备的速度有多快(以及如何繁忙)。 - -到目前为止,我们只使用补间动画向控制台输出值,但是您可以将它与 three.js 对象结合: +到目前为止,我们只使用 tweens 将值打印到控制台,但你可以将它用于 three.js 对象的动画位置之类的事情: ```js var tween = new TWEEN.Tween(cube.position).to({x: 100, y: 100, z: 100}, 10000).start() @@ -69,9 +73,9 @@ function animate() { } ``` -在这种情况下,因为 three.js 渲染器将在渲染之前查看对象的位置,所以不需要使用明确的`onUpdate`回调。 +在这种情况下,因为 three.js 渲染器将在渲染之前查看对象的位置,所以不需要使用的 `onUpdate` 回调。 -你可能也注意到了一些不同的地方:tween.js 可以链式调用! 每个`tween`函数都会返回`tween`实例,所以你可以重写下面的代码: +你可能也注意到了一些不同的地方:tween.js 可以链式调用! 每个 tween 函数都会返回 tween 实例,所以你可以重写下面的代码: ```js var tween = new TWEEN.Tween(position) @@ -85,7 +89,7 @@ tween.start() var tween = new TWEEN.Tween(position).to({x: 200}, 1000).start() ``` -在将会看到很多例子,所以熟悉它是很好的!比如 [04-simplest](https://github.com/tweenjs/tween.js/blob/master/examples/04_simplest.html) 这个例子。 +在将会看到很多例子,所以熟悉它是很好的!比如 [04-simplest](../examples/04_simplest.html) 这个例子。 ## tween.js 的动画 @@ -104,15 +108,15 @@ function animate() { } ``` -如果调用的时候不传入参数,`update` 将会判断当前时间点以确定自上次运行以来已经有多久。 +如果不带参数调用,`update` 将会判断当前时间点,以便找出自上次运行以来已经过了多长时间。 -当然你也可以传递一个明确的时间参数给 `update` +当然你也可以传递一个明确的时间参数给 `update` 来更新。因此: ```js TWEEN.update(100) ``` -意思是"更新时间 = 100 毫秒"。你可以使用它来确保代码中的所有时间相关函数都使用相同的时间值。例如,假设你有一个播放器,并希望同步运行补间。 你的 `animate` 函数可能看起来像这样: +意思是“更新时间 = 100 毫秒”。你可以使用它来确保代码中的所有时间相关函数都使用相同的时间值。例如,假设你有一个播放器,并希望同步运行补间。 你的 `animate` 函数可能看起来像这样: ```js var currentTime = player.currentTime @@ -123,9 +127,9 @@ TWEEN.update(currentTime) ## 控制一个补间 -### start 和 stop +### `start` 和 `stop` -到目前为止,我们已经了解了`Tween.start`方法,但是还有更多的方法来控制单个补间。 也许最重要的一个是 `start` 对应的方法:`停止` 。 如果你想取消一个补间,只要调用这个方法通过一个单独的补间: +到目前为止,我们已经了解了 `Tween.start` 方法,但是还有更多的方法来控制单个补间。也许最重要的一个是 `start` 对应的方法:`stop` 。 如果你想取消一个补间,只要调用这个方法通过一个单独的补间: ```js tween.stop() @@ -133,93 +137,139 @@ tween.stop() 停止一个从未开始或已经停止的补间没有任何效果。 没有错误被抛出。 -`start` 方法接受一个参数 `time`。如果你使用它,那么补间不会立即开始,直到特定时刻,否则会尽快启动(i.e 即在下次调用 `TWEEN.update`)。 +`start` 方法还接受一个 `time` 参数。如果你使用它,补间直到那个特定的时刻才会开始;否则它将立即开始(即在下一次调用 `TWEEN.update` 时)。 + +`start` 方法接受第二个布尔参数:当为 `true` 时,我们之前使用的补间将从目标对象中的值开始,而不是从头开始。用于停止补间,然后启动另一个将从当前位置继续的补间。 + +### `startFromCurrentValues` + +这是 `tween.start(undefined, true)` 的别名,使以前使用的补间从目标对象的最后一个值开始,而不是从头开始。 + +### `update` + +个别补间有一个 `update` 方法。 这实际上是由 `TWEEN.update` 调用的,用于仅使用一个参数构建的补间。 + +在下面的示例中,第二个参数告诉新的 Tween 不要将自己添加到默认组(`TWEEN` 是 `TWEEN.Group` 的一个实例)。如果补间不与组关联(请注意,可以通过将组作为第二个参数传递给构造函数来关联组),则补间需要使用其 `update` 方法手动更新,如下所示: + +```js +const tween = new TWEEN.Tween(someObject, false).to(/*...*/).start() -### update +function animate(time) { + tween.update(time) + requestAnimationFrame(animate) +} +``` -补间也有一个更新的方法---这实际上是由 `TWEEN.update` 调用的。 你通常不需要直接调用它,除非你是个 疯狂的 hacker。 +> **Note** 如果你使用 `TWEEN.update()` 作为默认控制所有补间的方式,则无需直接调用 `tween.update()`,但是我们建议你直接如上例所示 [创建自己的补间组](#controlling-groups-of-tweens) 或手动更新补间。 使用组或单独控制的补间的概念很像避免在 JavaScript 代码中使用全局变量的做法:它可以防止一个组件意外破坏其他一些不相关组件的行为。 -### chain +### `chain` -当你顺序排列不同的补间时,事情会变得有趣,例如在上一个补间结束的时候立即启动另外一个补间。我们称这为链式补间,这使用 `chain` 方法去做。因此,为了使 `tweenB` 在 `tewwnA` 启动: +当你按顺序排列不同的补间时,事情会变得更有趣,例如在上一个补间结束的时候立即启动另外一个补间。我们称此为链接补间,它是通过 `chain` 方法完成的。因此,要使 `tweenB` 在 `tweenA` 完成后开始: ```js tweenA.chain(tweenB) ``` -或者,对于一个无限的链式,设置 tweenA 一旦 tweenB 完成就开始: +或者,可以创造一个无限的链式,`tweenA` 完成时开始 `tweenB`,`tweenB` 完成时开始 `tweenA`: ```js tweenA.chain(tweenB) tweenB.chain(tweenA) ``` -关于无限的链式查看 [Hello world](https://github.com/tweenjs/tween.js/blob/master/examples/00_hello_world.html) 。 +关于无限的链式查看案例 [Hello world](../examples/00_hello_world.html) 。 -在其他情况下,您可能需要将多个补间链接到另一个补间,以使它们(链接的补间)同时开始动画: +在其他情况下,你可能希望将多个补间链接到另一个补间,使它们(链接的补间)都同时开始动画: ```js tweenA.chain(tweenB, tweenC) ``` -> 警告:调用 `tweenA.chain(tweenB)` 实际上修改了 tweenA,所以 tweenA 总是在 tweenA 完成时启动。 `chain` 的返回值只是 tweenA,不是一个新的 tween。 +> **Warning** 调用 `tweenA.chain(tweenB)` 实际上修改了 tweenA,所以 tweenB 总是在 tweenA 完成时启动。 `chain` 的返回值只是 tweenA,不是一个新的 tween。 -### repeat +### `repeat` -如果你想让一个补间永远重复,你可以链接到自己,但更好的方法是使用 `repeat` 方法。 它接受一个参数,描述第一个补间完成后需要多少次重复 +如果你想让一个补间永远重复,你可以链接到自己,但更好的方法是使用 `repeat` 方法。它接受一个参数,描述第一个补间完成后需要多少次重复: ```js tween.repeat(10) // 循环10次 tween.repeat(Infinity) // 无限循环 ``` -补间的总次数将是重复参数加上一个初始补间。查看 [Repeat](https://github.com/tweenjs/tween.js/blob/master/examples/08_repeat.html)。 +补间的总次数将是重复参数加上一个初始补间。查看 [Repeat](../examples/08_repeat.html) 。 -### yoyo +### `yoyo` -这个功能只有在独自使用 `repeat` 时才有效果。 活跃时,补间的行为将像 yoyo 一样,i.e 它会从起始值和结束值之间跳出,而不是从头开始重复相同的顺序。 +此功能仅在与 `repeat` 一起使用时才有效。 激活时,补间的行为将 _像溜溜球一样_,即它会在开始值和结束值之间来回跳动,而不是仅仅从头开始重复相同的顺序: -### delay +```js +tween.yoyo(false) // 默认值,动画只会从开始到结束值 +tween.yoyo(true) // tween 将在起始值和结束值之间“yoyo” +``` -更复杂的安排可能需要在实际开始运行之前延迟补间。 你可以使用 `delay` 方法来做到这一点 +### `delay` + +更复杂的安排可能需要在实际开始运行之前延迟补间。 你可以使用 `delay` 方法来做到这一点: ```js tween.delay(1000) tween.start() ``` -将在调用启动方法后的 1 秒钟后开始执行。 +将在调用 `start` 方法后的 1 秒钟后开始执行。 -## 控制所有补间 +### `repeatDelay` -在 TWEEN 全局对象中可以找到以下方法,除了 `update` 之外,通常不需要使用其中的大部分对象。 +通常,`delay` 时间应用于补间的重复之间,但如果向 `repeatDelay` 函数提供了一个值,则该值将确定补间重复之间经过的总时间。 -### TWEEN.update(time) +参考这个例子: -我们已经讨论过这种方法。 它用于更新所有活动的补间。 +```js +tween.delay(1000) +tween.repeatDelay(500) +tween.start() +``` + +补间的第一次迭代将在一秒后发生,第二次迭代将在第一次迭代结束后半秒发生,第三次迭代将在第二次迭代结束后半秒发生,依此类推。如果你想延迟初始迭代但不希望迭代之间有任何延迟,请确保调用 `tween.repeatDelay(0)` 。 + +### `dynamic` + +如果 `dynamic` 设置为 `true`(默认为 `false`),则传递给 `tween.to()` 的对象可以在补间动画的外部进行修改。这可用于在运行时动态修改补间的结果。 + +请参阅 [dynamic 示例](http://tweenjs.github.io/tween.js/examples/07_dynamic_to.html)。在那个例子中,在这两个场景中,兔子的位置都在动画期间更新。 兔子的位置恰好是传递给狐狸的 `tween.to()` 方法的对象。 随着兔子位置的更新,在第一个带有 `.dynamic(false)` 的场景中,狐狸向兔子的初始位置移动并且不跟随兔子,而在第二个带有 `.dynamic(true)` 的场景中,狐狸移动到兔子的最终目的地 狐狸因此也被更新,这使得狐狸跟随兔子。 + +> **Warning** 当 `dynamic` 设置为 `false` 时,Tween 复制传递给 `tween.to()` 的对象并且永远不会修改它(因此从外部更新原始对象不是动态的)。当 `dynamic` 为 `true` 时,Tween 在动画期间使用原始对象作为值的来源(每次更新都读取值,因此可以动态修改它们) **但请注意,在 dynamic 模式下,Tween 将修改传递给 `tween.to()` 的对象的任何插值数组,这可能会对也可能依赖于同一对象的任何外部代码造成副作用。** + +## 控制*所有*补间 + +在 TWEEN 全局对象中可以找到以下方法,除了 `update` 之外,你通常不需要使用其中的大部分方法。 + +### `TWEEN.update(time)` + +我们已经讨论过这种方法。它用于更新所有活动的补间。 如果 `time` 不指定,它将使用当前时间。 -### TWEEN.getAll and TWEEN.removeAll +### `TWEEN.getAll` and `TWEEN.removeAll` -用于获取对活动 `tweens` 数组的引用,并分别仅从一个调用中将它们全部从数组中删除 +用于获取对活动 `tweens` 数组的引用,并分别通过一次调用将它们从数组中移除。 -### TWEEN.add(tween) and TWEEN.remove(tween) +### `TWEEN.add(tween)` and `TWEEN.remove(tween)` -用于将补间添加到活动补间的列表,或者分别从列表中删除特定的补间。 +分别用于将补间添加到活动补间列表,或从列表中删除特定补间。 -这些方法通常只在内部使用,但是如果您想要做一些有趣的事情,则会被暴露。 +这些方法通常只在内部使用,但如果你想做一些*有趣*的事情,我们会公开这些方法。 -## 控制补间组 +## 控制补间集 -使用 `TWEEN` 单例来管理补间可能会导致包含许多组件的大型应用程序出现问题。 在这些情况下,您可能希望创建自己的更小的补间组。 +使用 `TWEEN` 单例来管理补间可能会导致包含许多组件的大型应用程序出现问题。在这些情况下,你可能想要创建自己的更小的补间集。 ### 示例:交叉组件冲突 -如果使用 `TWEEN` 有多个组件,并且每个组件都想管理自己的一组补间,则可能发生冲突。 如果一个组件调用 `TWEEN.update()` 或 `TWEEN.removeAll()`,则其他组件的补间也将被更新或删除。 +如果你有多个组件使用 `TWEEN`,并且每个组件都想管理自己的补间集,则可能会发生冲突。 如果一个组件调用 `TWEEN.update()` 或 `TWEEN.removeAll()`,其他组件的补间也将被更新或删除。 -### 创建你自己的补间组 +### 创建你自己的补间集 -为了解决这个问题,每个组件都可以创建自己的 `TWEEN.Group` 实例(这是全局的 `TWEEN` 对象在内部使用的)。 实例化新的补间时,可以将这些组作为第二个可选参数传入: +为了解决这个问题,每个组件都可以创建自己的 `TWEEN.Group` 实例(这是全局 `TWEEN` 对象在内部使用的实例)。 在实例化新补间时,这些组可以作为第二个可选参数传入: ```js var groupA = new TWEEN.Group() @@ -240,35 +290,35 @@ groupB.removeAll() // 只移除tweenB TWEEN.removeAll() // 只移除tweenC ``` -通过这种方式,每个组件都可以处理创建,更新和销毁自己的一组补间。 +这样,每个组件都可以处理创建、更新和销毁自己的补间集。 -## 改变缓动功能 +## 改变缓动功能(别名:让它弹) -Tween.js 将以线性方式执行值之间的插值(即缓动),所以变化将与流逝的时间成正比。 这是可以预见的,但在视觉上也是相当无趣的。 不要担心 - 使用缓动方法可以轻松更改此行为。 例如: +Tween.js 将以线性方式执行值之间的插值(即缓动),因此变化将与经过的时间成正比。 这是可以预见的,但在视觉上也很无趣。 不用担心——可以使用缓动方法轻松更改此行为。 例如: ```js tween.easing(TWEEN.Easing.Quadratic.In) ``` -这将导致缓慢地开始向最终值变化,向中间加速,然后迅速达到其最终值,相反,`TWEEN.Easing.Quadratic.Out` 一开始会加速,但随着值的接近最终放缓。 +这将导致补间缓慢开始向最终值变化,向中间加速,然后快速达到其最终值。 相比之下,`TWEEN.Easing.Quadratic.Out` 将开始向该值快速变化,但在接近最终值时会减慢速度。 -### 可用的缓动函数:TWEEN.Easing +### 可用的缓动函数:`TWEEN.Easing` -tween.js 提供了一些现有的缓动功能。它们按照它们表示的方程式进行分组:线性,二次,三次,四次,五次,正弦,指数,圆形,弹性,背部和弹跳,然后是缓动型:In,Out 和 InOut。 +tween.js 提供了一些现成的缓动功能。它们按照它们表示的方程类型进行分组:线性、二次、三次、四次、五次、正弦、指数、圆形、弹性、后退和反弹,然后按缓动类型:In、Out 和 InOut。 -除非您已经熟悉这些概念,否则这些名称可能不会对您说什么,所以您可能需要查看 [Graphs](https://github.com/tweenjs/tween.js/blob/master/examples/03_graphs.html) 示例,该示例将一个页面中的所有曲线进行图形化,以便比较它们如何看待一瞥。 +除非你已经熟悉这些概念,否则这些名称可能对你没有任何意义,所以现在可能是查看 [图表示例](../examples/17_generate_pow.html) 的时候了,该示例在一页中绘制了所有曲线,以便你可以比较它们的动画。 -这些功能是从 Robert Penner 慷慨地提供几年前作为自由软件提供的原始方程派生而来的,但是已经被优化以便与 JavaScript 很好地发挥作用。 +这些函数源自 Robert Penner 几年前慷慨地作为免费软件提供的原始方程,但已经过优化后,可以很好地与 JavaScript 配合使用。 ### 使用自定义缓动功能 -您不仅可以使用任何现有的功能,还可以提供您自己的功能,只要遵循一些约定即可: +你不仅可以使用任何现有的缓动函数,还可以提供自己的函数,只要它遵循一些约定即可: - 它必须接受一个参数: - - `k`: 缓动过程,或我们的补间所处的时间有多长。允许的值在[0,1]的范围内。 + - `k`: 缓动过程,或我们的补间所处的时间有多长。允许的值在[0, 1]的范围内。 - 它必须根据输入参数返回一个值。 -不管要修改多少个属性,easing 函数在每次更新时只调用一次。 然后将结果与初始值以及这个值和最终值之间的差值(delta)一起使用,就像这个伪代码一样: +无论要更改多少属性,每次更新时每个补间只调用一次缓动函数。 然后将结果与初始值以及此值和最终值之间的差值(_deltas_)一起使用,如以下伪代码所示: ```js easedElapsed = easing(k); @@ -276,9 +326,9 @@ for each property: newPropertyValue = initialPropertyValue + propertyDelta * easedElapsed; ``` -对于更注重性能表现的人来说:只有在补间上调用 `start()` 时才会计算增量值。 +对于更注重性能表现的人来说:只有在补间上调用 `start()` 时才会计算 deltas。 -因此,让我们假设您想使用一个缓解值的自定义缓动函数,但是将 Math.floor 应用于输出,所以只返回整数部分,从而产生一种梯级输出: +因此,假设你想要使用自定义缓动函数来缓动值但将 `Math.floor` 应用于输出,因此只会返回整数部分,从而产生一种阶梯式输出: ```js function tenStepEasing(k) { @@ -286,19 +336,19 @@ function tenStepEasing(k) { } ``` -你可以通过简单地调用它的缓动方法来使用它,就像我们之前看到的那样: +你可以通过简单地调用它的缓动方法在补间中使用它,就像我们之前看到的那样: ```js tween.easing(tenStepEasing) ``` -查看 [graphs for custom easing functions](https://github.com/tweenjs/tween.js/blob/master/examples/12_graphs_custom_functions.html) 示例,以查看这个动作(还有一些用于生成步进函数的元编程)。 +查看 [graphs for custom easing functions](../examples/12_graphs_custom_functions.html) 示例,以查看这个动作(还有一些用于生成步进函数的 _metaprogramming_ )。 ## 回调函数 另一个强大的特性是能够在每个补间的生命周期的特定时间运行自己的功能。 当更改属性不够时,通常需要这样做。 -例如,假设你正在试图给一些不能直接访问属性的对象设置动画,但是需要你调用 setter。 您可以使用 `update` 回调来读取新的更新值,然后手动调用 setters。 所有的回调函数都将补间对象作为唯一的参数。 +例如,假设你正在试图给一些不能直接访问属性的对象设置动画,但是需要你调用 setter。 你可以使用 `update` 回调来读取新的更新值,然后手动调用 setters。 所有的回调函数都将补间对象作为唯一的参数。 ```js var trickyObjTween = new TWEEN.Tween({ @@ -312,7 +362,7 @@ var trickyObjTween = new TWEEN.Tween({ }) ``` -或者想象一下,当一个补间开始时,你想播放声音。你可以使用 `start` 回调: +或者假设你想在开始补间时播放声音。 你可以使用 `start` 回调: ```js var tween = new TWEEN.Tween(obj).to({x: 100}).onStart(function () { @@ -320,34 +370,167 @@ var tween = new TWEEN.Tween(obj).to({x: 100}).onStart(function () { }) ``` -每个回调的范围是补间对象--在这种情况下,是 `obj`。 +每个回调的范围是补间对象——在本例中为 `obj`。 ### onStart -在补间开始之前执行--i.e. 在计算之前。每个补间只能执行一次,i.e. 当通过 `repeat()` 重复补间时,它将不会运行。 +在补间开始动画之前执行,在 `delay` 方法指定的任何延迟时间之后。 每个补间只会执行一次,即当补间通过 `repeat()` 重复时不会运行。 -同步到其他事件或触发您要在补间启动时发生的操作是非常好的。 +`onStart` 非常适合与其他事件同步,或触发需要在补间开始时执行的操作。 + +补间对象作为第一个参数传入。 + +### onEveryStart + +和 `onStart` 类似,单 `onEveryStart` 在每次重复补间时也会运行。 补间对象作为第一个参数传入。 ### onStop -当通过 `stop()` 显式停止补间时执行,但在正常完成时并且在停止任何可能的链补间之前执行补间。 +当补间通过 `stop()` 显式停止时执行,但不会在它正常完成时执行,并且在停止任何可能的链接补间之前执行。 补间对象作为第一个参数传入。 ### onUpdate -每次补间更新时执行,实际更新后的值。 +每次更新补间时执行,在实际更新值之后。 补间对象作为第一个参数传入。 ### onComplete -当补间正常完成(即不停止)时执行。 +当补间正常完成(即未停止)时执行。 + +补间对象作为第一个参数传入。 + +### onRepeat + +每当补间刚刚完成一个重复并将开始另一个重复时执行。 补间对象作为第一个参数传入。 +要阐明何时调用 `onStart`、`onEveryStart` 和 `onRepeat`,请参考: + +```js +const obj = {x: 0} + +const t = new TWEEN.Tween(obj) + .to({x: 5}, 5) + .repeat(Infinity) + .onStart(() => { + console.log('onStart') + }) + .onRepeat(() => { + console.log('onRepeat') + }) + .onEveryStart(() => { + console.log('onEveryStart') + }) + .start(0) + +for (let ticks = 0; ticks < 22; ticks += 1) { + console.log('Tick', ticks) + TWEEN.update(ticks) + + console.log(obj) + console.log() +} +``` + +输出如下所示,左侧如上,右侧带有 `.delay(5)`: + +```txt +Tick 0 Tick 0 +onStart { x: 0 } +onEveryStart +{ x: 0 } + +Tick 1 Tick 1 +{ x: 1 } { x: 0 } + +Tick 2 Tick 2 +{ x: 2 } { x: 0 } + +Tick 3 Tick 3 +{ x: 3 } { x: 0 } + +Tick 4 Tick 4 +{ x: 4 } { x: 0 } + +Tick 5 Tick 5 +onRepeat onStart +{ x: 5 } onEveryStart + { x: 0 } + +Tick 6 Tick 6 +onEveryStart { x: 1 } +{ x: 1 } + +Tick 7 Tick 7 +{ x: 2 } { x: 2 } + +Tick 8 Tick 8 +{ x: 3 } { x: 3 } + +Tick 9 Tick 9 +{ x: 4 } { x: 4 } + +Tick 10 Tick 10 +onRepeat onRepeat +{ x: 5 } { x: 5 } + +Tick 11 Tick 11 +onEveryStart { x: 5 } +{ x: 1 } + +Tick 12 Tick 12 +{ x: 2 } { x: 5 } + +Tick 13 Tick 13 +{ x: 3 } { x: 5 } + +Tick 14 Tick 14 +{ x: 4 } { x: 5 } + +Tick 15 Tick 15 +onRepeat onEveryStart +{ x: 5 } { x: 0 } + +Tick 16 Tick 16 +onEveryStart { x: 1 } +{ x: 1 } + +Tick 17 Tick 17 +{ x: 2 } { x: 2 } + +Tick 18 Tick 18 +{ x: 3 } { x: 3 } + +Tick 19 Tick 19 +{ x: 4 } { x: 4 } + +Tick 20 Tick 20 +onRepeat onRepeat +{ x: 5 } { x: 5 } + +Tick 21 Tick 21 +onEveryStart { x: 5 } +{ x: 1 } +``` + +## 补间状态 + +### `isPlaying` + +开始时为 `true`(即使是暂停)。 + +当补间停止时,`isPlaying` 和 `isPaused` 都将为 `false`。 + +### `isPaused` + +暂停时为 `true`。 `isPlaying` 也将为 `true`。 如果补间已启动但未暂停,则 `isPlaying` 将为 `true` 而 `isPaused` 将为 `false`。 + ## 高级补间 ### 相对值 @@ -356,33 +539,41 @@ var tween = new TWEEN.Tween(obj).to({x: 100}).onStart(function () { **但是你需要使用引号**,否则这些值将被视为绝对的。 我们来看一个例子: ```js -// This will make the `x` property be 100, always +// 这将使 `x` 属性始终为 100 var absoluteTween = new TWEEN.Tween(absoluteObj).to({x: 100}) -// Suppose absoluteObj.x is 0 now -absoluteTween.start() // Makes x go to 100 +// 假设 absoluteObj.x 现在为 0 +absoluteTween.start() // 使 x 变为 100 -// Suppose absoluteObj.x is -100 now -absoluteTween.start() // Makes x go to 100 +// 假设 absoluteObj.x 现在是 -100 +absoluteTween.start() // 使 x 变为 100 -// In contrast... +// 相比之下... -// This will make the `x` property be 100 units more, -// relative to the actual value when it starts +// 这将使 `x` 属性相对于开始时的实际值多 100 个单位 var relativeTween = new TWEEN.Tween(relativeObj).to({x: '+100'}) -// Suppose relativeObj.x is 0 now -relativeTween.start() // Makes x go to 0 +100 = 100 +// 假设 relativeObj.x 现在是 0 +relativeTween.start() // 使 x 变为 0 +100 = 100 -// Suppose relativeObj.x is -100 now -relativeTween.start() // Makes x go to -100 +100 = 0 +// 假设 relativeObj.x 现在是 -100 +relativeTween.start() // 使 x 变为 -100 +100 = 0 ``` -查看 [09_relative_values](https://github.com/tweenjs/tween.js/blob/master/examples/09_relative_values.html) 示例。 +查看 [09_relative_values](../examples/09_relative_values.html) 示例。 + +### 补间嵌套对象 + +Tween.js 还可以跨嵌套对象更改属性。 例如: + +```js +var nestedObject = {scale: {x: 0, y: 0}, alpha: 0} +var tween = new TWEEN.Tween(nestedObject).to({scale: {x: 100, y: 100}, alpha: 1}) +``` ### 补间值的数组 -除了补间为绝对值或相对值之外,还可以让 Tween.js 跨一系列值更改属性。 要做到这一点,你只需要指定一个数组的值,而不是一个属性的单个值。 例如: +除了补间到绝对值或相对值之外,你还可以让 Tween.js 更改一系列值的属性。 为此,你只需为属性指定一个值数组而不是单个值。 例如: ```js var tween = new TWEEN.Tween(relativeObj).to({x: [0, -100, 100]}) @@ -398,7 +589,7 @@ var tween = new TWEEN.Tween(relativeObj).to({x: [0, -100, 100]}) 例如,当补间刚刚启动(进度为 0)时,插值函数将返回数组中的第一个值。 当补间到一半时,插值函数将返回一个大约在数组中间的值,当补间结束时,插值函数将返回最后一个值。 -您可以使用插值方法更改插值函数。 例如: +你可以使用插值方法更改插值函数。 例如: ```js tween.interpolation(TWEEN.Interpolation.Bezier) @@ -412,18 +603,18 @@ tween.interpolation(TWEEN.Interpolation.Bezier) 默认是 `Linear`。 -请注意,插值函数对于与同一补间中的数组进行补间的所有属性是全局的。 -您不能使用数组和线性函数进行属性 A 的更改,也不能使用相同的补间进行数组 B 的属性 B 和 Bezier 函数的更改; 您应该使用运行在同一对象上的两个补间对象,但修改不同的属性并使用不同的插值函数。 +请注意,插值函数对于在同一补间中与数组补间的所有属性都是全局的。 +你不能使用数组和线性函数更改属性 A,也不能使用数组和使用相同补间的贝塞尔函数更改属性 B; 你应该使用两个运行在同一对象上但修改不同属性并使用不同插值函数的补间对象。 -查看 [06_array_interpolation](https://github.com/tweenjs/tween.js/blob/master/examples/06_array_interpolation.html) 示例。 +查看 [06_array_interpolation](../examples/06_array_interpolation.html) 示例。 ## 获得最佳性能 -虽然 Tween.js 试图自己执行,但是没有什么能够阻止你以一种反作用的方式使用它。 这里有一些方法可以避免在使用 Tween.js 时(或者在网页中进行动画制作时)减慢项目速度。 +虽然 Tween.js 试图靠自己发挥性能,但没有什么能阻止你以反性能的方式使用它。 以下是一些在使用 Tween.js 时(或通常在 Web 中制作动画时)可以避免拖慢项目速度的方法。 ### 使用高性能的 CSS -当您尝试在页面中设置元素的位置时,最简单的解决方案是为 `top` 和 `left` 属性设置动画,如下所示: +当你尝试为页面中元素的位置设置动画时,最简单的解决方案是为 `top` 和 `left` 样式属性设置动画,如下所示: ```js var element = document.getElementById('myElement') @@ -433,7 +624,7 @@ var tween = new TWEEN.Tween({top: 0, left: 0}).to({top: 100, left: 100}, 1000).o }) ``` -但这实际上是效率低下的,因为改变这些属性会迫使浏览器在每次更新时重新计算布局,这是非常昂贵的操作。 相反的,您应该使用 `transform`,这不会使布局无效,并且在可能的情况下也将被硬件加速,比如: +但这确实效率低下,因为更改这些属性会强制浏览器在每次更新时重新计算布局,这是一项非常消耗性能的操作。你应该使用 `transform`,它不会使布局无效,并且在可能的情况下也会进行硬件加速,如下所示: ```js var element = document.getElementById('myElement') @@ -442,16 +633,15 @@ var tween = new TWEEN.Tween({top: 0, left: 0}).to({top: 100, left: 100}, 1000).o }) ``` -如果你想了解更多关于这个,看看[这篇文章](https://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/)。 +如果你想了解更多关于高性能的 CSS,看看[这篇文章](https://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/)。 -但是,如果您的动画需求非常简单,那么在适用的情况下使用 CSS 动画或转换可能会更好,以便浏览器尽可能优化。 -当您的动画需要涉及复杂的布局时,Tween.js 是非常有用的,也就是说,您需要将多个补间同步到一起,在完成一些动作之后,循环多次等等。 +但是,如果你的动画需求就这么简单,最好只使用 CSS 动画或过渡(在适用的情况下),这样浏览器就可以尽可能地进行优化。 +当你的动画需要涉及复杂的操作时,Tween.js 是非常有用,也就是说,你需要将多个补间同步在一起,在一个完成后开始,循环多次,具有不是使用 CSS 而是使用 Canvas 渲染的图形或 WebGL 等等。 ### 对垃圾收集器(别名 GC) -如果你使用 onUpdate 回调函数,你需要非常小心的使用它。 因为这个函数每秒钟会被调用很多次,所以如果每次更新都要花费很多的代价,那么你可能会阻塞主线程并导致可怕的结果,或者如果你的操作涉及到内存分配的话, 垃圾收集器运行太频繁,也导致结果。 所以只是不要做些事情中的其中一个。 保持你的 onUpdate 回调非常轻量级,并确保在开发时也使用内存分析器。 +如果你使用 `onUpdate` 回调,你需要非常小心你放在它上面的东西。 这个函数每秒会被调用很多次,所以如果你在每次更新时都做代价高昂的操作,你可能会阻塞主线程并导致可怕的卡顿,或者——如果你的操作涉及内存分配,你最终会得到 垃圾收集器运行过于频繁,也会导致卡顿。 所以不要做这两件事。 保持你的 `onUpdate` 回调非常轻量级,并确保在开发时也使用内存分析器。 ### 疯狂的补间 -这是你可能不经常使用的东西,但是你可以在 Tween.js 之外使用补间公式。 毕竟,它们只是功能。 所以你可以使用它们来计算平滑曲线作为输入数据。 -例如,他们用于在 [这个实验](http://5013.es/toys/tween.audio/) 中生成音频数据。 +这是你可能不经常使用的东西,但你可以在 Tween.js 之外使用补间方程式。 毕竟,它们只是函数。 因此,你可以使用它们来计算平滑曲线作为输入数据。 例如,它们用于在[此实验](<(http://5013.es/toys/tween.audio/)>)中生成音频数据。 From ea9c2bb30554cd40bed2176d925016a83f2a55bd Mon Sep 17 00:00:00 2001 From: Christopher Tannum Date: Fri, 5 May 2023 11:09:50 +0200 Subject: [PATCH 083/107] fix(package.json): add export map --- package.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/package.json b/package.json index e2896fa1..e855b01c 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,12 @@ "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", + "exports": { + ".": { + "import": "./dist/tween.esm.js", + "require": "./dist/tween.cjs.js" + } + }, "files": [ "dist", "README.md", From 020232da563fc3d6d6af23da15c71faecb47290e Mon Sep 17 00:00:00 2001 From: Christopher Tannum Date: Fri, 12 May 2023 10:35:04 +0200 Subject: [PATCH 084/107] fix: lint --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e855b01c..f773b67a 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,11 @@ "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", "exports": { - ".": { - "import": "./dist/tween.esm.js", - "require": "./dist/tween.cjs.js" - } - }, + ".": { + "import": "./dist/tween.esm.js", + "require": "./dist/tween.cjs.js" + } + }, "files": [ "dist", "README.md", From a0413f341c5f2c333dbbebbec3dcc387e30bc0c1 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Thu, 22 Jun 2023 23:25:53 -0700 Subject: [PATCH 085/107] chore: format source --- README_zh-CN.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README_zh-CN.md b/README_zh-CN.md index b0679ef0..5d1cd077 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -67,6 +67,7 @@ cdnjs: ```html ``` + 请注意,unpkg.com 支持 URL 中的 semver 版本,其中 URL 中的 `^` 告诉 unpkg 为你提供最新版本 20.x.x。 ## 使用 script 标签构建并包含在你的项目中 @@ -138,6 +139,7 @@ import * as TWEEN from '@tweenjs/tween.js' ``` # 特性 + - 做一件事并且只做一件事:补间属性 - 不处理 CSS 单位(例如附加 `px`) - 不插值颜色 @@ -354,7 +356,7 @@ npm install npm test ``` -如果你想添加任何功能或更改现有功能,你 *必须* 运行测试以确保你没有破坏任何其他功能。任何拉取请求 (PR) 都需要在 `src/tests.ts` 中更新通过功能更改测试(或通过新功能或修复的新测试)才能接受 PR。 有关更多信息,请参阅 [贡献](CONTRIBUTING.md)。 +如果你想添加任何功能或更改现有功能,你 _必须_ 运行测试以确保你没有破坏任何其他功能。任何拉取请求 (PR) 都需要在 `src/tests.ts` 中更新通过功能更改测试(或通过新功能或修复的新测试)才能接受 PR。 有关更多信息,请参阅 [贡献](CONTRIBUTING.md)。 # 使用 tween.js 的项目 From 2484a646c34dde7ad53717cb675a38aed51b47c7 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Thu, 22 Jun 2023 23:40:44 -0700 Subject: [PATCH 086/107] chore: run the automated build on any push instead of for specific branches --- .github/workflows/tests.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2a7cd744..ed126ad3 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -3,11 +3,7 @@ name: build and tests -on: - push: - branches: [main] - pull_request: - branches: [main] +on: [push] jobs: build: From 0508229c6a6965260c39034377c22cb9444411c5 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Thu, 22 Jun 2023 23:47:20 -0700 Subject: [PATCH 087/107] chore: package.json update description --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e2896fa1..3d49f804 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@tweenjs/tween.js", - "description": "Super simple, fast and easy to use tweening engine which incorporates optimised Robert Penner's equations.", + "description": "Simple and fast tweening engine with optimised Robert Penner's equations.", "version": "20.0.3", "type": "module", "main": "dist/tween.cjs.js", From 881ac559f1736b670e4bae8c70848f289c2bd59f Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Thu, 22 Jun 2023 23:55:07 -0700 Subject: [PATCH 088/107] v21.0.0 --- dist/tween.amd.js | 2 +- dist/tween.cjs.js | 2 +- dist/tween.d.ts | 2 +- dist/tween.esm.js | 2 +- dist/tween.umd.js | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index 876c35b0..3b15ffd5 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -814,7 +814,7 @@ define(['exports'], (function (exports) { 'use strict'; return Tween; }()); - var VERSION = '20.0.3'; + var VERSION = '21.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index 32ef3142..df37f775 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -816,7 +816,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '20.0.3'; +var VERSION = '21.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index 13508302..9f150087 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -152,7 +152,7 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "20.0.3"; +declare const VERSION = "21.0.0"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween[]; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 5139d967..094ec3a8 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -812,7 +812,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '20.0.3'; +var VERSION = '21.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index baf44f00..f6f619e2 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -818,7 +818,7 @@ return Tween; }()); - var VERSION = '20.0.3'; + var VERSION = '21.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index c53cbad0..751806d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tweenjs/tween.js", - "version": "20.0.3", + "version": "21.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tweenjs/tween.js", - "version": "20.0.3", + "version": "21.0.0", "license": "MIT", "devDependencies": { "@typescript-eslint/eslint-plugin": "^3.1.0", diff --git a/package.json b/package.json index a2737172..692ef637 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Simple and fast tweening engine with optimised Robert Penner's equations.", - "version": "20.0.3", + "version": "21.0.0", "type": "module", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", diff --git a/src/Version.ts b/src/Version.ts index d8d8b168..04985acf 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '20.0.3' +const VERSION = '21.0.0' export default VERSION From 5417f682553d93cec1a3eec3622f12dc778680cb Mon Sep 17 00:00:00 2001 From: Sylvester Keil Date: Fri, 23 Jun 2023 12:54:00 +0200 Subject: [PATCH 089/107] Fix CJS entry point --- dist/{tween.cjs.js => tween.cjs} | 0 package.json | 4 ++-- rollup.config.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename dist/{tween.cjs.js => tween.cjs} (100%) diff --git a/dist/tween.cjs.js b/dist/tween.cjs similarity index 100% rename from dist/tween.cjs.js rename to dist/tween.cjs diff --git a/package.json b/package.json index 692ef637..540751b4 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,13 @@ "description": "Simple and fast tweening engine with optimised Robert Penner's equations.", "version": "21.0.0", "type": "module", - "main": "dist/tween.cjs.js", + "main": "dist/tween.cjs", "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", "exports": { ".": { "import": "./dist/tween.esm.js", - "require": "./dist/tween.cjs.js" + "require": "./dist/tween.cjs" } }, "files": [ diff --git a/rollup.config.js b/rollup.config.js index 9d8ac758..927b6270 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -19,7 +19,7 @@ export default [ exports: 'named', }, { - file: 'dist/tween.cjs.js', + file: 'dist/tween.cjs', format: 'cjs', exports: 'named', }, From fcf294f3559bc29e166b1e72855100fd1ce2e86f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=95=AA=E8=96=AF=E6=9C=89=E6=89=8D?= Date: Wed, 28 Jun 2023 16:14:16 +0800 Subject: [PATCH 090/107] fix(package.json): fix export map types --- package.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 692ef637..e45ca1c0 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,14 @@ "module": "dist/tween.esm.js", "exports": { ".": { - "import": "./dist/tween.esm.js", - "require": "./dist/tween.cjs.js" + "import": { + "types": "./dist/tween.d.ts", + "default": "./dist/tween.esm.js" + }, + "require": { + "types": "./dist/tween.d.ts", + "default": "./dist/tween.cjs.js" + } } }, "files": [ From 3f1c175c660f093f46873f409a87e4bac52bc8a1 Mon Sep 17 00:00:00 2001 From: Victor B <39555268+victorbnl@users.noreply.github.com> Date: Sat, 1 Jul 2023 20:26:46 +0200 Subject: [PATCH 091/107] docs: update tutorial link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ca9fa407..34b8bc65 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ import * as TWEEN from '@tweenjs/tween.js' - [User guide](./docs/user_guide.md) - [Contributor guide](./docs/contributor_guide.md) -- [Tutorial](http://learningthreejs.com/blog/2011/08/17/tweenjs-for-smooth-animation/) using tween.js with three.js +- [Tutorial](https://web.archive.org/web/20220601192930/http://learningthreejs.com/blog/2011/08/17/tweenjs-for-smooth-animation/) using tween.js with three.js - Also: [libtween](https://github.com/jsm174/libtween), a port of tween.js to C by [jsm174](https://github.com/jsm174) - [Understanding tween.js](https://mikebolt.me/article/understanding-tweenjs.html) From df30edafe6ae3fd714c32afe39c6f5ceaf27b884 Mon Sep 17 00:00:00 2001 From: Janne Ramstedt Date: Wed, 6 Sep 2023 15:11:59 +0300 Subject: [PATCH 092/107] Add missing types file to package.json exports --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 692ef637..28177999 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "module": "dist/tween.esm.js", "exports": { ".": { + "types": "./dist/tween.d.ts", "import": "./dist/tween.esm.js", "require": "./dist/tween.cjs.js" } From b1398e8246164ed9976061fc493618b87264d5ec Mon Sep 17 00:00:00 2001 From: Michael Casebolt Date: Wed, 29 Nov 2023 11:22:41 -0800 Subject: [PATCH 093/107] change maintainers list and remove dead link --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 34b8bc65..48ef9633 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,6 @@ import * as TWEEN from '@tweenjs/tween.js' - [Contributor guide](./docs/contributor_guide.md) - [Tutorial](https://web.archive.org/web/20220601192930/http://learningthreejs.com/blog/2011/08/17/tweenjs-for-smooth-animation/) using tween.js with three.js - Also: [libtween](https://github.com/jsm174/libtween), a port of tween.js to C by [jsm174](https://github.com/jsm174) -- [Understanding tween.js](https://mikebolt.me/article/understanding-tweenjs.html) # Examples @@ -369,7 +368,7 @@ If you want to add any feature or change existing features, you _must_ run the t # People -Maintainers: [mikebolt](https://github.com/mikebolt), [sole](https://github.com/sole), [Joe Pea (@trusktr)](https://github.com/trusktr). +Maintainers: [Joe Pea (@trusktr)](https://github.com/trusktr). [All contributors](http://github.com/tweenjs/tween.js/contributors). From 33d57ed48723e2f12d2f7bde3bcb162dd9531a6b Mon Sep 17 00:00:00 2001 From: keiya sasaki Date: Sun, 17 Dec 2023 13:11:49 +0900 Subject: [PATCH 094/107] fix: Use type definition in ESM --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 692ef637..8103fa5d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "exports": { ".": { "import": "./dist/tween.esm.js", - "require": "./dist/tween.cjs.js" + "require": "./dist/tween.cjs.js", + "types": "./dist/tween.d.ts" } }, "files": [ From f6c02ac9fcedb8e638a893c691d9fa34c146dd59 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 14:15:21 -0800 Subject: [PATCH 095/107] Update package.json, remove duplicate entry so we can merge --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index adf39b40..8103fa5d 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,6 @@ "module": "dist/tween.esm.js", "exports": { ".": { - "types": "./dist/tween.d.ts", "import": "./dist/tween.esm.js", "require": "./dist/tween.cjs.js", "types": "./dist/tween.d.ts" From 0e084c8f3b2c4546129ed3b8931992fe6126c104 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 15:28:39 -0800 Subject: [PATCH 096/107] v21.1.0 --- dist/tween.amd.js | 2 +- dist/tween.cjs.js | 2 +- dist/tween.d.ts | 2 +- dist/tween.esm.js | 2 +- dist/tween.umd.js | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index 3b15ffd5..1762ff47 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -814,7 +814,7 @@ define(['exports'], (function (exports) { 'use strict'; return Tween; }()); - var VERSION = '21.0.0'; + var VERSION = '21.1.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index df37f775..6054084e 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -816,7 +816,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '21.0.0'; +var VERSION = '21.1.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index 9f150087..c77c2243 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -152,7 +152,7 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "21.0.0"; +declare const VERSION = "21.1.0"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween[]; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 094ec3a8..6f976bad 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -812,7 +812,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '21.0.0'; +var VERSION = '21.1.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index f6f619e2..840747a5 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -818,7 +818,7 @@ return Tween; }()); - var VERSION = '21.0.0'; + var VERSION = '21.1.0'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index 751806d2..aebfb8d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tweenjs/tween.js", - "version": "21.0.0", + "version": "21.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tweenjs/tween.js", - "version": "21.0.0", + "version": "21.1.0", "license": "MIT", "devDependencies": { "@typescript-eslint/eslint-plugin": "^3.1.0", diff --git a/package.json b/package.json index 8103fa5d..ca42f2d8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Simple and fast tweening engine with optimised Robert Penner's equations.", - "version": "21.0.0", + "version": "21.1.0", "type": "module", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", diff --git a/src/Version.ts b/src/Version.ts index 04985acf..60da72f1 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '21.0.0' +const VERSION = '21.1.0' export default VERSION From a00a8f562a5c555c1ad579906ae5579bdfd5eb9c Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 16:01:50 -0800 Subject: [PATCH 097/107] update prettier --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index aebfb8d4..085fd555 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "eslint-config-prettier": "^6.7.0", "eslint-plugin-prettier": "^3.1.1", "nodeunit": "^0.11.3", - "prettier": "2.8.7", + "prettier": "^3.0.0", "rimraf": "^3.0.0", "rollup": "3.20.7", "rollup-plugin-dts": "5.3.0", @@ -2616,15 +2616,15 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.2.tgz", + "integrity": "sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -6026,9 +6026,9 @@ "dev": true }, "prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.2.tgz", + "integrity": "sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==", "dev": true }, "prettier-linter-helpers": { diff --git a/package.json b/package.json index ca42f2d8..2916d58c 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "test-unit": "nodeunit test/unit/nodeunitheadless.cjs", "test-lint": "npm run prettier -- --check && eslint 'src/**/*.ts'", "lint": "npm run prettier -- --write && eslint 'src/**/*.ts' --fix", - "prettier": "prettier './**/*.{js,ts,md,json,html,css}'", + "prettier": "prettier .", "prepare": "npm run build", "version": "npm test && git add .", "release:patch": "npm version patch --message 'v%s' && npm publish && npm run _release:push-branch", @@ -59,7 +59,7 @@ "eslint-config-prettier": "^6.7.0", "eslint-plugin-prettier": "^3.1.1", "nodeunit": "^0.11.3", - "prettier": "2.8.7", + "prettier": "^3.0.0", "rimraf": "^3.0.0", "rollup": "3.20.7", "rollup-plugin-dts": "5.3.0", From b1010e3984dc67a3526000d58c911c66b761e9f6 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 16:02:56 -0800 Subject: [PATCH 098/107] update formatting --- examples/00_hello_world.html | 2 +- examples/01_bars.html | 2 +- examples/02_black_and_red.html | 2 +- examples/03_graphs.html | 2 +- examples/04_simplest.html | 2 +- examples/05_video_and_time.html | 2 +- examples/06_array_interpolation.html | 2 +- examples/07_dynamic_to.html | 2 +- examples/07a_dynamic_to_two_array_values.html | 2 +- examples/07b_dynamic_to_an_array_of_values.html | 2 +- examples/08_repeat.html | 2 +- examples/09_relative_values.html | 2 +- examples/10_yoyo.html | 2 +- examples/11_stop_all_chained_tweens.html | 2 +- examples/12_graphs_custom_functions.html | 2 +- examples/13_relative_start_time.html | 2 +- examples/14_pause_tween.html | 2 +- examples/15_complex_properties.html | 2 +- examples/16_animate_an_array_of_values.html | 2 +- examples/17_generate_pow.html | 2 +- examples/18_start_from_current_values.html | 2 +- src/Tween.ts | 5 ++++- test/unit/nodeunit.js | 8 ++++---- 23 files changed, 29 insertions(+), 26 deletions(-) diff --git a/examples/00_hello_world.html b/examples/00_hello_world.html index 5143f804..dddb2de9 100644 --- a/examples/00_hello_world.html +++ b/examples/00_hello_world.html @@ -1,4 +1,4 @@ - + Tween.js / hello world! diff --git a/examples/01_bars.html b/examples/01_bars.html index 2cf3646b..a65835c5 100644 --- a/examples/01_bars.html +++ b/examples/01_bars.html @@ -1,4 +1,4 @@ - + Tween.js / bars diff --git a/examples/02_black_and_red.html b/examples/02_black_and_red.html index e4d1f060..fdc0b876 100644 --- a/examples/02_black_and_red.html +++ b/examples/02_black_and_red.html @@ -1,4 +1,4 @@ - + Tween.js / Black and Red diff --git a/examples/03_graphs.html b/examples/03_graphs.html index 4eca4918..ae331572 100644 --- a/examples/03_graphs.html +++ b/examples/03_graphs.html @@ -1,4 +1,4 @@ - + Tween.js / graphs diff --git a/examples/04_simplest.html b/examples/04_simplest.html index af16f5a8..c7b0b247 100644 --- a/examples/04_simplest.html +++ b/examples/04_simplest.html @@ -1,4 +1,4 @@ - + Tween.js / simplest possible example! diff --git a/examples/05_video_and_time.html b/examples/05_video_and_time.html index e6ff63b3..96356d40 100644 --- a/examples/05_video_and_time.html +++ b/examples/05_video_and_time.html @@ -1,4 +1,4 @@ - + Tween.js / video and time diff --git a/examples/06_array_interpolation.html b/examples/06_array_interpolation.html index a99be966..806df5df 100644 --- a/examples/06_array_interpolation.html +++ b/examples/06_array_interpolation.html @@ -1,4 +1,4 @@ - + Tween.js / array interpolation diff --git a/examples/07_dynamic_to.html b/examples/07_dynamic_to.html index b28afd2e..06daecce 100644 --- a/examples/07_dynamic_to.html +++ b/examples/07_dynamic_to.html @@ -1,4 +1,4 @@ - + Tween.js / dynamic to object diff --git a/examples/07a_dynamic_to_two_array_values.html b/examples/07a_dynamic_to_two_array_values.html index c90123ef..2303a336 100644 --- a/examples/07a_dynamic_to_two_array_values.html +++ b/examples/07a_dynamic_to_two_array_values.html @@ -1,4 +1,4 @@ - + Tween.js / dynamic to interpolation array diff --git a/examples/07b_dynamic_to_an_array_of_values.html b/examples/07b_dynamic_to_an_array_of_values.html index df68085b..b48078ff 100644 --- a/examples/07b_dynamic_to_an_array_of_values.html +++ b/examples/07b_dynamic_to_an_array_of_values.html @@ -1,4 +1,4 @@ - + Tween.js / dynamic to large interpolation array diff --git a/examples/08_repeat.html b/examples/08_repeat.html index 0a262748..a265b4b8 100644 --- a/examples/08_repeat.html +++ b/examples/08_repeat.html @@ -1,4 +1,4 @@ - + Tween.js / repeat diff --git a/examples/09_relative_values.html b/examples/09_relative_values.html index 127c07bb..a9c4aa7b 100644 --- a/examples/09_relative_values.html +++ b/examples/09_relative_values.html @@ -1,4 +1,4 @@ - + Tween.js / relative values diff --git a/examples/10_yoyo.html b/examples/10_yoyo.html index 9af8bd12..9022035a 100644 --- a/examples/10_yoyo.html +++ b/examples/10_yoyo.html @@ -1,4 +1,4 @@ - + Tween.js / yoyo diff --git a/examples/11_stop_all_chained_tweens.html b/examples/11_stop_all_chained_tweens.html index f232f335..392beb71 100644 --- a/examples/11_stop_all_chained_tweens.html +++ b/examples/11_stop_all_chained_tweens.html @@ -1,4 +1,4 @@ - + Tween.js / stop chained diff --git a/examples/12_graphs_custom_functions.html b/examples/12_graphs_custom_functions.html index 9c5dc55d..29c3357f 100644 --- a/examples/12_graphs_custom_functions.html +++ b/examples/12_graphs_custom_functions.html @@ -1,4 +1,4 @@ - + Tween.js / graphs for custom easing functions diff --git a/examples/13_relative_start_time.html b/examples/13_relative_start_time.html index 5ddb432a..91718639 100644 --- a/examples/13_relative_start_time.html +++ b/examples/13_relative_start_time.html @@ -1,4 +1,4 @@ - + Tween.js / relative start time diff --git a/examples/14_pause_tween.html b/examples/14_pause_tween.html index c8b90e91..b5e61b59 100644 --- a/examples/14_pause_tween.html +++ b/examples/14_pause_tween.html @@ -1,4 +1,4 @@ - + Tween.js / pause tween diff --git a/examples/15_complex_properties.html b/examples/15_complex_properties.html index e516432a..59fee891 100644 --- a/examples/15_complex_properties.html +++ b/examples/15_complex_properties.html @@ -1,4 +1,4 @@ - + Tween.js / complex properties diff --git a/examples/16_animate_an_array_of_values.html b/examples/16_animate_an_array_of_values.html index a6270898..21461866 100644 --- a/examples/16_animate_an_array_of_values.html +++ b/examples/16_animate_an_array_of_values.html @@ -1,4 +1,4 @@ - + Tween.js / animate an array of values diff --git a/examples/17_generate_pow.html b/examples/17_generate_pow.html index 5dbba937..ae21e6f3 100644 --- a/examples/17_generate_pow.html +++ b/examples/17_generate_pow.html @@ -1,4 +1,4 @@ - + Tween.js / easing with a power of number diff --git a/examples/18_start_from_current_values.html b/examples/18_start_from_current_values.html index 72e1cbd0..05137661 100644 --- a/examples/18_start_from_current_values.html +++ b/examples/18_start_from_current_values.html @@ -1,4 +1,4 @@ - + Tween.js / hello world! diff --git a/src/Tween.ts b/src/Tween.ts index aa631d35..767e30b9 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -49,7 +49,10 @@ export class Tween { private _isChainStopped = false private _propertiesAreSetUp = false - constructor(private _object: T, private _group: Group | false = mainGroup) {} + constructor( + private _object: T, + private _group: Group | false = mainGroup, + ) {} getId(): number { return this._id diff --git a/test/unit/nodeunit.js b/test/unit/nodeunit.js index 12e6936e..6affd841 100644 --- a/test/unit/nodeunit.js +++ b/test/unit/nodeunit.js @@ -317,8 +317,8 @@ nodeunit = (function () { partial.length === 0 ? '[]' : gap - ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' - : '[' + partial.join(',') + ']' + ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' + : '[' + partial.join(',') + ']' gap = mind return v } @@ -356,8 +356,8 @@ nodeunit = (function () { partial.length === 0 ? '{}' : gap - ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' - : '{' + partial.join(',') + '}' + ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' + : '{' + partial.join(',') + '}' gap = mind return v } From 34d4961044c7fe235c5c36b6df0b803d324f80be Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 16:10:41 -0800 Subject: [PATCH 099/107] refactor: remove requestAnimationFrame polyfill, it has been out for a long time in all browsers --- examples/00_hello_world.html | 1 - examples/01_bars.html | 1 - examples/02_black_and_red.html | 1 - examples/03_graphs.html | 1 - examples/04_simplest.html | 1 - examples/05_video_and_time.html | 1 - examples/06_array_interpolation.html | 1 - examples/07_dynamic_to.html | 1 - examples/07a_dynamic_to_two_array_values.html | 1 - .../07b_dynamic_to_an_array_of_values.html | 1 - examples/08_repeat.html | 1 - examples/09_relative_values.html | 1 - examples/10_yoyo.html | 1 - examples/11_stop_all_chained_tweens.html | 1 - examples/12_graphs_custom_functions.html | 1 - examples/13_relative_start_time.html | 1 - examples/14_pause_tween.html | 1 - examples/15_complex_properties.html | 1 - examples/16_animate_an_array_of_values.html | 1 - examples/17_generate_pow.html | 1 - examples/18_start_from_current_values.html | 1 - examples/js/RequestAnimationFrame.js | 31 ------------------- 22 files changed, 52 deletions(-) delete mode 100644 examples/js/RequestAnimationFrame.js diff --git a/examples/00_hello_world.html b/examples/00_hello_world.html index dddb2de9..5794b5b4 100644 --- a/examples/00_hello_world.html +++ b/examples/00_hello_world.html @@ -26,7 +26,6 @@

00 _ hello world

- - - - - - - - - - - - - - - - - - - - - + + +
+

tween.js

+

00 _ hello world (using native JS modules)

+

Simple example for illustrating the creation and chaining of tweens.

+
+ +
hello world!
+ + + + diff --git a/examples/example-projects/plain-javascript-modules/index.js b/examples/example-projects/plain-javascript-modules/index.js new file mode 100644 index 00000000..28875333 --- /dev/null +++ b/examples/example-projects/plain-javascript-modules/index.js @@ -0,0 +1,28 @@ +import * as TWEEN from '@tweenjs/tween.js' + +// For sake of example, we put animate() in a separate file, and import it into index.js. +import {animate} from './animate.js' + +const position = {x: 100, y: 100, rotation: 10} +const target = document.getElementById('target') +const tween = new TWEEN.Tween(position) + .to({x: 700, y: 200, rotation: 359}, 2000) + .delay(1000) + .easing(TWEEN.Easing.Elastic.InOut) + .onUpdate(update) + +const tweenBack = new TWEEN.Tween(position) + .to({x: 100, y: 100, rotation: 10}, 3000) + .easing(TWEEN.Easing.Elastic.InOut) + .onUpdate(update) + +tween.chain(tweenBack) +tweenBack.chain(tween) + +tween.start() + +animate(performance.now()) + +function update() { + target.style.transform = `translate3d(${position.x}px, ${position.y}px, 0.0001px) rotateY(${Math.floor(position.rotation)}deg)` +} diff --git a/examples/example-projects/plain-javascript-modules/package-lock.json b/examples/example-projects/plain-javascript-modules/package-lock.json new file mode 100644 index 00000000..70a56f68 --- /dev/null +++ b/examples/example-projects/plain-javascript-modules/package-lock.json @@ -0,0 +1,2199 @@ +{ + "name": "plain-javascript-modules", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@tweenjs/tween.js": "file:../../../" + }, + "devDependencies": { + "five-server": "^0.3.2" + } + }, + "../../..": { + "name": "@tweenjs/tween.js", + "version": "21.1.0", + "license": "MIT", + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^3.1.0", + "@typescript-eslint/parser": "^3.1.0", + "eslint": "^7.1.0", + "eslint-config-prettier": "^6.7.0", + "eslint-plugin-prettier": "^3.1.1", + "nodeunit": "^0.11.3", + "prettier": "^3.0.0", + "rimraf": "^3.0.0", + "rollup": "3.20.7", + "rollup-plugin-dts": "5.3.0", + "tslib": "^1.10.0", + "typescript": "5.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@html-validate/stylish": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@html-validate/stylish/-/stylish-4.2.0.tgz", + "integrity": "sha512-Nl8HCv0hGRSLQ+n1OD4Hk3a+Urwk9HH0vQkAzzCarT4KlA7bRl+6xEiS5PZVwOmjtC7XiH/oNe3as9Fxcr2A1w==", + "dev": true, + "dependencies": { + "kleur": "^4.0.0" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sidvind/better-ajv-errors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-2.1.3.tgz", + "integrity": "sha512-lWuod/rh7Xz5uXiEGSfm2Sd5PG7K/6yJfoAZVqzsEswjPJhUz15R7Gn/o8RczA041QS15hBd/BCSeu9vwPArkA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 16.14" + }, + "peerDependencies": { + "ajv": "4.11.8 - 8" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@tweenjs/tween.js": { + "resolved": "../../..", + "link": true + }, + "node_modules/@types/node": { + "version": "20.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@yandeu/open-cjs": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@yandeu/open-cjs/-/open-cjs-0.0.0.tgz", + "integrity": "sha512-7wPRcB/L0ElxpKjnikF/9fa6FAzkTLFLVUXvuBiDXanifZbD9eWgJE7YW2qwWB1u+lSkUnfUc213cia6Uy9avA==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", + "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==", + "dev": true, + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express6": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/express6/-/express6-0.1.2.tgz", + "integrity": "sha512-YKVacWEoZdPT6Nx3NiDCqmJu8JlH2gQFx0ZNKxY+30jVg/RPuDDahyYWj7jjcBC+dHflqY4UZjnGuGwhOQ5uTg==", + "dev": true, + "dependencies": { + "accepts": "^1.3.7", + "array-flatten": "^3.0.0", + "content-disposition": "^0.5.3", + "content-type": "^1.0.4", + "cookie": "^0.4.0", + "cookie-signature": "^1.0.6", + "debug": "^4.3.2", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^1.1.2", + "fresh": "^0.5.2", + "merge-descriptors": "^1.0.1", + "methods": "^1.1.2", + "on-finished": "^2.3.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^0.1.7", + "proxy-addr": "^2.0.5", + "qs": "^6.7.0", + "range-parser": "^1.2.1", + "send": "^0.17.1", + "serve-static": "^1.14.1", + "statuses": "^2.0.1", + "type-is": "^1.6.18", + "utils-merge": "^1.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": "^14.15 || >=16" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/five-server": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/five-server/-/five-server-0.3.2.tgz", + "integrity": "sha512-rMG8X6F//r2Hpnv/Ud38LOYXkQpziRmqS+oxv/mYsNwiBTY2skkDNhvuF8833skco3rAtC6GS+4gcarbVGqgcA==", + "dev": true, + "dependencies": { + "@yandeu/open-cjs": "^0.0.0", + "chokidar": "^3.5.1", + "cors": "^2.8.5", + "debug": "^4.3.1", + "express6": "^0.1.2", + "html-validate": "^7.1.1", + "mime-types": "~2.1.24", + "node-html-parser": "~5.4.1", + "parseurl": "~1.3.3", + "selfsigned": "^2.0.0", + "ws": "^8.2.0" + }, + "bin": { + "five-server": "lib/bin.js", + "live-server": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/yandeu" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-validate": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/html-validate/-/html-validate-7.18.1.tgz", + "integrity": "sha512-K5jb0h/xAoeR8sJqyR0n/QaKL7rdT88sPCtN+Pvtyn5JUU+nidQe2gBB09WRzPTcQtPXBj4QxBUH5IA2tt8JQg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.0", + "@html-validate/stylish": "^4.0.1", + "@sidvind/better-ajv-errors": "^2.0.0", + "acorn-walk": "^8.0.0", + "ajv": "^8.0.0", + "deepmerge": "^4.2.0", + "espree": "^9.0.0", + "glob": "^10.0.0", + "ignore": "^5.0.0", + "kleur": "^4.1.0", + "minimist": "^1.2.0", + "prompts": "^2.0.0", + "semver": "^7.0.0" + }, + "bin": { + "html-validate": "bin/html-validate.js" + }, + "engines": { + "node": ">= 14.0" + }, + "peerDependencies": { + "jest": "^25.1 || ^26 || ^27.1 || ^28.1.3 || ^29.0.3", + "jest-diff": "^25.1 || ^26 || ^27.1 || ^28.1.3 || ^29.0.3", + "jest-snapshot": "^25.1 || ^26 || ^27.1 || ^28.1.3 || ^29.0.3" + }, + "peerDependenciesMeta": { + "jest": { + "optional": true + }, + "jest-diff": { + "optional": true + }, + "jest-snapshot": { + "optional": true + } + } + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-static/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/examples/example-projects/plain-javascript-modules/package.json b/examples/example-projects/plain-javascript-modules/package.json new file mode 100644 index 00000000..a4ea1add --- /dev/null +++ b/examples/example-projects/plain-javascript-modules/package.json @@ -0,0 +1,13 @@ +{ + "description": "Plain JS modules in a browser.", + "scripts": { + "start": "npm run serve", + "serve": "five-server ." + }, + "dependencies": { + "@tweenjs/tween.js": "file:../../../" + }, + "devDependencies": { + "five-server": "^0.3.2" + } +} diff --git a/examples/example-projects/plain-javascript-modules/style.css b/examples/example-projects/plain-javascript-modules/style.css new file mode 100644 index 00000000..5ea9e18b --- /dev/null +++ b/examples/example-projects/plain-javascript-modules/style.css @@ -0,0 +1,62 @@ +html { + transform-style: preserve-3d; + perspective: 800px; +} +body { + background: #fff; + font-family: Helvetica, Arial, sans; + transform-style: preserve-3d; +} + +a { + color: #333; +} + +h2 { + font-weight: normal; +} + +button { + cursor: pointer; + color: #333; + background: #fff; + border: 2px solid #333; + padding: 10px; + border-radius: 10px; + font-weight: bold; + font-size: 20px; + transition: all 150ms ease-out; +} + +button:hover { + background: #333; + color: #fff; +} + +#info { + position: absolute; + top: 0; + left: 0; + padding: 1.5em 2em; +} + +#info h1 { + font-size: 3em; + color: #333; + margin-top: 0; + letter-spacing: -0.05em; +} + +#info h2 { + font-size: 2.5em; + text-transform: uppercase; + color: #666; + margin-top: 0; +} + +#info p { + font-size: 2em; + line-height: 1em; + color: #aaa; + max-width: 10em; +} diff --git a/examples/example-projects/plain-typescript-modules/README.md b/examples/example-projects/plain-typescript-modules/README.md new file mode 100644 index 00000000..3af771bf --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/README.md @@ -0,0 +1,17 @@ +This example is written in TypeScript and requires running a build step, using +JavaScript module format to organize code into separate files and importing from +one file to the other using native `import` syntax. + +This example uses the `tsc` (TypeScript compiler) to compile `.ts` files into +`.js` files. The `tsconfig.json` file specifies the output format to be +`esnext`, which means the output `.js` files will have `import` statements just +as we've written them in the `.ts` files, and the output `.js` files will be +executed as native JS modules in the browser. + +To set up, run `npm install`. + +To build and run the project in a single command, run `npm start`. + +To compile only, run `npm run build` to generate `.js` files from `.ts` files. + +To continuously build `.ts` files into `.js` files any time the `.ts` files change, run `npm run dev`. diff --git a/examples/example-projects/plain-typescript-modules/animate.js b/examples/example-projects/plain-typescript-modules/animate.js new file mode 100644 index 00000000..ebb4dab8 --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/animate.js @@ -0,0 +1,10 @@ +// For sake of example, we put animate() in a separate file, and import it into index.ts. +import * as TWEEN from '@tweenjs/tween.js'; +//If we register the callback animate, but the TWEEN.update(time) returns false, +//cancel/unregister the handler +export function animate(time) { + var id = requestAnimationFrame(animate); + var result = TWEEN.update(time); + if (!result) + cancelAnimationFrame(id); +} diff --git a/examples/example-projects/plain-typescript-modules/animate.ts b/examples/example-projects/plain-typescript-modules/animate.ts new file mode 100644 index 00000000..d23ad2de --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/animate.ts @@ -0,0 +1,12 @@ +// For sake of example, we put animate() in a separate file, and import it into index.ts. +import * as TWEEN from '@tweenjs/tween.js' + +//If we register the callback animate, but the TWEEN.update(time) returns false, +//cancel/unregister the handler +export function animate(time) { + var id = requestAnimationFrame(animate) + + var result = TWEEN.update(time) + + if (!result) cancelAnimationFrame(id) +} diff --git a/examples/example-projects/plain-typescript-modules/index.html b/examples/example-projects/plain-typescript-modules/index.html new file mode 100644 index 00000000..9b9ed849 --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/index.html @@ -0,0 +1,42 @@ + + + + Tween.js / hello world (JS modules)! + + + + + + + + +
+

tween.js

+

00 _ hello world (using native JS modules)

+

Simple example for illustrating the creation and chaining of tweens.

+
+ +
hello world!
+ + + + + diff --git a/examples/example-projects/plain-typescript-modules/index.js b/examples/example-projects/plain-typescript-modules/index.js new file mode 100644 index 00000000..e94ee08d --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/index.js @@ -0,0 +1,26 @@ +import * as TWEEN from '@tweenjs/tween.js'; +// For sake of example, we put animate() in a separate file, and import it into +// index.ts. +// +// Use a `.js` extension here because TS does not transform import specifiers, +// and plain JS will need the extension by default. Find it ugly? Get used to it +// and move on! +import { animate } from './animate.js'; +var position = { x: 100, y: 100, rotation: 10 }; +var target = document.getElementById('target'); +var tween = new TWEEN.Tween(position) + .to({ x: 700, y: 200, rotation: 359 }, 2000) + .delay(1000) + .easing(TWEEN.Easing.Elastic.InOut) + .onUpdate(update); +var tweenBack = new TWEEN.Tween(position) + .to({ x: 100, y: 100, rotation: 10 }, 3000) + .easing(TWEEN.Easing.Elastic.InOut) + .onUpdate(update); +tween.chain(tweenBack); +tweenBack.chain(tween); +tween.start(); +animate(performance.now()); +function update() { + target.style.transform = "translate3d(".concat(position.x, "px, ").concat(position.y, "px, 0.0001px) rotateY(").concat(Math.floor(position.rotation), "deg)"); +} diff --git a/examples/example-projects/plain-typescript-modules/index.ts b/examples/example-projects/plain-typescript-modules/index.ts new file mode 100644 index 00000000..b75962fa --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/index.ts @@ -0,0 +1,32 @@ +import * as TWEEN from '@tweenjs/tween.js' + +// For sake of example, we put animate() in a separate file, and import it into index.ts. +// +// Use a `.js` extension here because TS does not transform import specifiers, +// and plain JS will need the extension by default. Find it ugly? Get used to it +// and move on! +import {animate} from './animate.js' + +const position = {x: 100, y: 100, rotation: 10} +const target = document.getElementById('target') +const tween = new TWEEN.Tween(position) + .to({x: 700, y: 200, rotation: 359}, 2000) + .delay(1000) + .easing(TWEEN.Easing.Elastic.InOut) + .onUpdate(update) + +const tweenBack = new TWEEN.Tween(position) + .to({x: 100, y: 100, rotation: 10}, 3000) + .easing(TWEEN.Easing.Elastic.InOut) + .onUpdate(update) + +tween.chain(tweenBack) +tweenBack.chain(tween) + +tween.start() + +animate(performance.now()) + +function update() { + target.style.transform = `translate3d(${position.x}px, ${position.y}px, 0.0001px) rotateY(${Math.floor(position.rotation)}deg)` +} diff --git a/examples/example-projects/plain-typescript-modules/package-lock.json b/examples/example-projects/plain-typescript-modules/package-lock.json new file mode 100644 index 00000000..549f5869 --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/package-lock.json @@ -0,0 +1,2213 @@ +{ + "name": "plain-typescript-modules", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@tweenjs/tween.js": "file:../../../" + }, + "devDependencies": { + "five-server": "^0.3.2", + "typescript": "^5.3.3" + } + }, + "../../..": { + "name": "@tweenjs/tween.js", + "version": "21.1.0", + "license": "MIT", + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^3.1.0", + "@typescript-eslint/parser": "^3.1.0", + "eslint": "^7.1.0", + "eslint-config-prettier": "^6.7.0", + "eslint-plugin-prettier": "^3.1.1", + "nodeunit": "^0.11.3", + "prettier": "^3.0.0", + "rimraf": "^3.0.0", + "rollup": "3.20.7", + "rollup-plugin-dts": "5.3.0", + "tslib": "^1.10.0", + "typescript": "5.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@html-validate/stylish": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@html-validate/stylish/-/stylish-4.2.0.tgz", + "integrity": "sha512-Nl8HCv0hGRSLQ+n1OD4Hk3a+Urwk9HH0vQkAzzCarT4KlA7bRl+6xEiS5PZVwOmjtC7XiH/oNe3as9Fxcr2A1w==", + "dev": true, + "dependencies": { + "kleur": "^4.0.0" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sidvind/better-ajv-errors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-2.1.3.tgz", + "integrity": "sha512-lWuod/rh7Xz5uXiEGSfm2Sd5PG7K/6yJfoAZVqzsEswjPJhUz15R7Gn/o8RczA041QS15hBd/BCSeu9vwPArkA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 16.14" + }, + "peerDependencies": { + "ajv": "4.11.8 - 8" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sidvind/better-ajv-errors/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@tweenjs/tween.js": { + "resolved": "../../..", + "link": true + }, + "node_modules/@types/node": { + "version": "20.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@yandeu/open-cjs": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@yandeu/open-cjs/-/open-cjs-0.0.0.tgz", + "integrity": "sha512-7wPRcB/L0ElxpKjnikF/9fa6FAzkTLFLVUXvuBiDXanifZbD9eWgJE7YW2qwWB1u+lSkUnfUc213cia6Uy9avA==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", + "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==", + "dev": true, + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express6": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/express6/-/express6-0.1.2.tgz", + "integrity": "sha512-YKVacWEoZdPT6Nx3NiDCqmJu8JlH2gQFx0ZNKxY+30jVg/RPuDDahyYWj7jjcBC+dHflqY4UZjnGuGwhOQ5uTg==", + "dev": true, + "dependencies": { + "accepts": "^1.3.7", + "array-flatten": "^3.0.0", + "content-disposition": "^0.5.3", + "content-type": "^1.0.4", + "cookie": "^0.4.0", + "cookie-signature": "^1.0.6", + "debug": "^4.3.2", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^1.1.2", + "fresh": "^0.5.2", + "merge-descriptors": "^1.0.1", + "methods": "^1.1.2", + "on-finished": "^2.3.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^0.1.7", + "proxy-addr": "^2.0.5", + "qs": "^6.7.0", + "range-parser": "^1.2.1", + "send": "^0.17.1", + "serve-static": "^1.14.1", + "statuses": "^2.0.1", + "type-is": "^1.6.18", + "utils-merge": "^1.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": "^14.15 || >=16" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/five-server": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/five-server/-/five-server-0.3.2.tgz", + "integrity": "sha512-rMG8X6F//r2Hpnv/Ud38LOYXkQpziRmqS+oxv/mYsNwiBTY2skkDNhvuF8833skco3rAtC6GS+4gcarbVGqgcA==", + "dev": true, + "dependencies": { + "@yandeu/open-cjs": "^0.0.0", + "chokidar": "^3.5.1", + "cors": "^2.8.5", + "debug": "^4.3.1", + "express6": "^0.1.2", + "html-validate": "^7.1.1", + "mime-types": "~2.1.24", + "node-html-parser": "~5.4.1", + "parseurl": "~1.3.3", + "selfsigned": "^2.0.0", + "ws": "^8.2.0" + }, + "bin": { + "five-server": "lib/bin.js", + "live-server": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/yandeu" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-validate": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/html-validate/-/html-validate-7.18.1.tgz", + "integrity": "sha512-K5jb0h/xAoeR8sJqyR0n/QaKL7rdT88sPCtN+Pvtyn5JUU+nidQe2gBB09WRzPTcQtPXBj4QxBUH5IA2tt8JQg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.0", + "@html-validate/stylish": "^4.0.1", + "@sidvind/better-ajv-errors": "^2.0.0", + "acorn-walk": "^8.0.0", + "ajv": "^8.0.0", + "deepmerge": "^4.2.0", + "espree": "^9.0.0", + "glob": "^10.0.0", + "ignore": "^5.0.0", + "kleur": "^4.1.0", + "minimist": "^1.2.0", + "prompts": "^2.0.0", + "semver": "^7.0.0" + }, + "bin": { + "html-validate": "bin/html-validate.js" + }, + "engines": { + "node": ">= 14.0" + }, + "peerDependencies": { + "jest": "^25.1 || ^26 || ^27.1 || ^28.1.3 || ^29.0.3", + "jest-diff": "^25.1 || ^26 || ^27.1 || ^28.1.3 || ^29.0.3", + "jest-snapshot": "^25.1 || ^26 || ^27.1 || ^28.1.3 || ^29.0.3" + }, + "peerDependenciesMeta": { + "jest": { + "optional": true + }, + "jest-diff": { + "optional": true + }, + "jest-snapshot": { + "optional": true + } + } + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-static/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/examples/example-projects/plain-typescript-modules/package.json b/examples/example-projects/plain-typescript-modules/package.json new file mode 100644 index 00000000..c199dc2d --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/package.json @@ -0,0 +1,16 @@ +{ + "description": "Plain JS modules in a browser.", + "scripts": { + "start": "npm run build && npm run serve", + "build": "tsc", + "dev": "tsc --watch", + "serve": "five-server ." + }, + "dependencies": { + "@tweenjs/tween.js": "file:../../../" + }, + "devDependencies": { + "five-server": "^0.3.2", + "typescript": "^5.3.3" + } +} diff --git a/examples/example-projects/plain-typescript-modules/style.css b/examples/example-projects/plain-typescript-modules/style.css new file mode 100644 index 00000000..5ea9e18b --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/style.css @@ -0,0 +1,62 @@ +html { + transform-style: preserve-3d; + perspective: 800px; +} +body { + background: #fff; + font-family: Helvetica, Arial, sans; + transform-style: preserve-3d; +} + +a { + color: #333; +} + +h2 { + font-weight: normal; +} + +button { + cursor: pointer; + color: #333; + background: #fff; + border: 2px solid #333; + padding: 10px; + border-radius: 10px; + font-weight: bold; + font-size: 20px; + transition: all 150ms ease-out; +} + +button:hover { + background: #333; + color: #fff; +} + +#info { + position: absolute; + top: 0; + left: 0; + padding: 1.5em 2em; +} + +#info h1 { + font-size: 3em; + color: #333; + margin-top: 0; + letter-spacing: -0.05em; +} + +#info h2 { + font-size: 2.5em; + text-transform: uppercase; + color: #666; + margin-top: 0; +} + +#info p { + font-size: 2em; + line-height: 1em; + color: #aaa; + max-width: 10em; +} diff --git a/examples/example-projects/plain-typescript-modules/tsconfig.json b/examples/example-projects/plain-typescript-modules/tsconfig.json new file mode 100644 index 00000000..8632d7b5 --- /dev/null +++ b/examples/example-projects/plain-typescript-modules/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "node" + }, + "include": ["./**/*.ts"] +} diff --git a/tsconfig.json b/tsconfig.json index 83ec154f..2285dc42 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,5 +14,5 @@ "ignoreDeprecations": "5.0", "importsNotUsedAsValues": "error" }, - "exclude": ["node_modules"] + "exclude": ["node_modules", "examples"] } From d0d1ca613ccb945968ee273fe5f00436cab685af Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 17:23:08 -0800 Subject: [PATCH 102/107] chore: ignore output .js files in typescript example --- .prettierignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.prettierignore b/.prettierignore index ea085c82..8d376269 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ dist/ .tmp/ .vscode/ examples/js/stats.min.js +examples/example-projects/plain-typescript-modules/**/*.js From ac4c4bec929a140405fb8d3613ec7661ae41177c Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 17:24:53 -0800 Subject: [PATCH 103/107] eslint started having an error with the latest environment, so delete it for now --- .eslintrc.cjs | 21 - package-lock.json | 2148 +-------------------------------------------- package.json | 9 +- 3 files changed, 32 insertions(+), 2146 deletions(-) delete mode 100644 .eslintrc.cjs diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index b906a676..00000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - parser: '@typescript-eslint/parser', - extends: [ - // Uses the recommended rules from the @typescript-eslint/eslint-plugin - 'plugin:@typescript-eslint/recommended', - // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier - 'prettier/@typescript-eslint', - // Enables eslint-plugin-prettier and displays prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. - 'plugin:prettier/recommended', - ], - env: { - browser: true, - node: true, - }, - globals: {}, - parserOptions: { - ecmaVersion: 2018, - sourceType: 'module', - }, - rules: {}, -} diff --git a/package-lock.json b/package-lock.json index 085fd555..6ba9fd58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,6 @@ "version": "21.1.0", "license": "MIT", "devDependencies": { - "@typescript-eslint/eslint-plugin": "^3.1.0", - "@typescript-eslint/parser": "^3.1.0", - "eslint": "^7.1.0", - "eslint-config-prettier": "^6.7.0", - "eslint-plugin-prettier": "^3.1.1", "nodeunit": "^0.11.3", "prettier": "^3.0.0", "rimraf": "^3.0.0", @@ -165,130 +160,6 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "node_modules/@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz", - "integrity": "sha512-D52KwdgkjYc+fmTZKW7CZpH5ZBJREJKZXRrveMiRCmlzZ+Rw9wRVJ1JAmHQ9b/+Ehy1ZeaylofDB9wwXUt83wg==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "3.1.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.1.0.tgz", - "integrity": "sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "3.1.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.1.0.tgz", - "integrity": "sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q==", - "dev": true, - "dependencies": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.1.0", - "@typescript-eslint/typescript-estree": "3.1.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.1.0.tgz", - "integrity": "sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/acorn": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", - "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true - }, "node_modules/ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", @@ -301,36 +172,6 @@ "uri-js": "^4.2.2" } }, - "node_modules/ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "dependencies": { - "type-fest": "^0.11.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -394,15 +235,6 @@ "node": ">=0.8" } }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -482,15 +314,6 @@ "node": ">=6" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -529,12 +352,6 @@ "node": ">=4" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "node_modules/clean-yaml-object": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", @@ -544,24 +361,6 @@ "node": ">=0.10.0" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, "node_modules/cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -719,35 +518,6 @@ "node": ">=6" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -778,12 +548,6 @@ "node": ">=0.10.0" } }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, "node_modules/default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", @@ -814,18 +578,6 @@ "node": ">=0.3.1" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -855,12 +607,6 @@ "node": ">=0.10.0" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -885,203 +631,6 @@ "node": ">=0.8.0" } }, - "node_modules/eslint": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.1.0.tgz", - "integrity": "sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0", - "eslint-visitor-keys": "^1.1.0", - "espree": "^7.0.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz", - "integrity": "sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ==", - "dev": true, - "dependencies": { - "get-stdin": "^6.0.0" - }, - "bin": { - "eslint-config-prettier-check": "bin/cli.js" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", - "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -1091,20 +640,6 @@ "node": ">=6" } }, - "node_modules/espree": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", - "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1118,48 +653,6 @@ "node": ">=4" } }, - "node_modules/esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "dependencies": { - "estraverse": "^4.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -1181,20 +674,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -1210,48 +689,12 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -1278,38 +721,6 @@ "node": ">=6" } }, - "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, "node_modules/foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -1391,12 +802,6 @@ "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", "dev": true }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1406,15 +811,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -1441,30 +837,6 @@ "node": "*" } }, - "node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -1567,47 +939,13 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": ">=6" + "node": ">=0.8", + "npm": ">=1.3.7" } }, "node_modules/imurmurhash": { @@ -1635,107 +973,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -1754,36 +991,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -1987,12 +1194,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -2023,19 +1224,6 @@ "lcov-parse": "bin/cli.js" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -2183,15 +1371,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2244,18 +1423,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, "node_modules/neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", @@ -2371,18 +1538,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/opener": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", @@ -2402,23 +1557,6 @@ "wordwrap": "~0.0.2" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -2428,15 +1566,6 @@ "node": ">=0.10.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/own-or": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", @@ -2500,18 +1629,6 @@ "node": ">=6" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -2543,15 +1660,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -2606,15 +1714,6 @@ "node": ">=6" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/prettier": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.2.tgz", @@ -2630,18 +1729,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2649,15 +1736,6 @@ "dev": true, "optional": true }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -2738,15 +1816,6 @@ "dev": true, "optional": true }, - "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -2831,19 +1900,6 @@ "node": ">=4" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", @@ -2894,27 +1950,6 @@ "typescript": "^4.1 || ^5.0" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", @@ -2942,56 +1977,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -3130,32 +2121,6 @@ "dev": true, "optional": true }, - "node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -3177,90 +2142,37 @@ "node": ">=6" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/tap": { @@ -3418,36 +2330,12 @@ "node": ">=6" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, "node_modules/tmatch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", "dev": true }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -3523,18 +2411,6 @@ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, - "node_modules/tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3553,27 +2429,6 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -3676,12 +2531,6 @@ "uuid": "bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -3724,15 +2573,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -3791,18 +2631,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", @@ -4026,104 +2854,6 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz", - "integrity": "sha512-D52KwdgkjYc+fmTZKW7CZpH5ZBJREJKZXRrveMiRCmlzZ+Rw9wRVJ1JAmHQ9b/+Ehy1ZeaylofDB9wwXUt83wg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "3.1.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.1.0.tgz", - "integrity": "sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "3.1.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.1.0.tgz", - "integrity": "sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.1.0", - "@typescript-eslint/typescript-estree": "3.1.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.1.0.tgz", - "integrity": "sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "acorn": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", - "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", - "dev": true - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true - }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", @@ -4136,29 +2866,6 @@ "uri-js": "^4.2.2" } }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -4213,12 +2920,6 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4292,12 +2993,6 @@ "write-file-atomic": "^2.4.2" } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -4327,33 +3022,12 @@ "supports-color": "^5.3.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "clean-yaml-object": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", "dev": true }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -4496,28 +3170,6 @@ "safe-buffer": "^5.0.1" } }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -4542,12 +3194,6 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", @@ -4569,15 +3215,6 @@ "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", "dev": true }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -4600,12 +3237,6 @@ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4627,215 +3258,18 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "eslint": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.1.0.tgz", - "integrity": "sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0", - "eslint-visitor-keys": "^1.1.0", - "espree": "^7.0.0", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "eslint-config-prettier": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz", - "integrity": "sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-plugin-prettier": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", - "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, "esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true }, - "espree": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", - "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -4850,20 +3284,9 @@ }, "extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extsprintf": { "version": "1.3.0", @@ -4877,42 +3300,12 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -4933,34 +3326,6 @@ "locate-path": "^3.0.0" } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -5031,24 +3396,12 @@ "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -5072,24 +3425,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -5173,31 +3508,6 @@ "sshpk": "^1.7.0" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5220,88 +3530,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -5317,27 +3545,6 @@ "has": "^1.0.3" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -5506,12 +3713,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -5536,16 +3737,6 @@ "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -5669,12 +3860,6 @@ "mime-db": "1.42.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -5723,18 +3908,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", @@ -5836,15 +4009,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "opener": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", @@ -5861,32 +4025,12 @@ "wordwrap": "~0.0.2" } }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "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" - } - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "own-or": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", @@ -5938,15 +4082,6 @@ "release-zalgo": "^1.0.0" } }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -5969,12 +4104,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -6019,27 +4148,12 @@ "find-up": "^3.0.0" } }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, "prettier": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.2.tgz", "integrity": "sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==", "dev": true }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -6047,12 +4161,6 @@ "dev": true, "optional": true }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -6123,12 +4231,6 @@ } } }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -6195,16 +4297,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", @@ -6233,21 +4325,6 @@ "magic-string": "^0.30.0" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", @@ -6272,46 +4349,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -6441,28 +4484,6 @@ } } }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -6486,12 +4507,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6507,43 +4522,6 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, "tap": { "version": "12.7.0", "resolved": "https://registry.npmjs.org/tap/-/tap-12.7.0.tgz", @@ -6671,33 +4649,12 @@ "require-main-filename": "^2.0.0" } }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, "tmatch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", "dev": true }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -6761,15 +4718,6 @@ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6785,21 +4733,6 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, "typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -6881,12 +4814,6 @@ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -6923,12 +4850,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -6977,15 +4898,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", diff --git a/package.json b/package.json index 2916d58c..ffb09091 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,8 @@ "examples": "npx serve .", "test": "npm run build && npm run test-lint && npm run test-unit", "test-unit": "nodeunit test/unit/nodeunitheadless.cjs", - "test-lint": "npm run prettier -- --check && eslint 'src/**/*.ts'", - "lint": "npm run prettier -- --write && eslint 'src/**/*.ts' --fix", + "test-lint": "npm run prettier -- --check", + "lint": "npm run prettier -- --write", "prettier": "prettier .", "prepare": "npm run build", "version": "npm test && git add .", @@ -53,11 +53,6 @@ }, "author": "tween.js contributors (https://github.com/tweenjs/tween.js/graphs/contributors)", "devDependencies": { - "@typescript-eslint/eslint-plugin": "^3.1.0", - "@typescript-eslint/parser": "^3.1.0", - "eslint": "^7.1.0", - "eslint-config-prettier": "^6.7.0", - "eslint-plugin-prettier": "^3.1.1", "nodeunit": "^0.11.3", "prettier": "^3.0.0", "rimraf": "^3.0.0", From b9cac5a67c91924bba8a4e013e398ffbeb2fe2ff Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 17:25:03 -0800 Subject: [PATCH 104/107] v21.1.1 --- dist/tween.amd.js | 2 +- dist/tween.cjs.js | 2 +- dist/tween.d.ts | 2 +- dist/tween.esm.js | 2 +- dist/tween.umd.js | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index 1762ff47..e6195ec2 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -814,7 +814,7 @@ define(['exports'], (function (exports) { 'use strict'; return Tween; }()); - var VERSION = '21.1.0'; + var VERSION = '21.1.1'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs.js b/dist/tween.cjs.js index 6054084e..0095c4ad 100644 --- a/dist/tween.cjs.js +++ b/dist/tween.cjs.js @@ -816,7 +816,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '21.1.0'; +var VERSION = '21.1.1'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index c77c2243..47ccbdcd 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -152,7 +152,7 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "21.1.0"; +declare const VERSION = "21.1.1"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween[]; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index 6f976bad..b9fac8b9 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -812,7 +812,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '21.1.0'; +var VERSION = '21.1.1'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index 840747a5..1823750e 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -818,7 +818,7 @@ return Tween; }()); - var VERSION = '21.1.0'; + var VERSION = '21.1.1'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index 6ba9fd58..009fbda0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tweenjs/tween.js", - "version": "21.1.0", + "version": "21.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tweenjs/tween.js", - "version": "21.1.0", + "version": "21.1.1", "license": "MIT", "devDependencies": { "nodeunit": "^0.11.3", diff --git a/package.json b/package.json index ffb09091..de63bef8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Simple and fast tweening engine with optimised Robert Penner's equations.", - "version": "21.1.0", + "version": "21.1.1", "type": "module", "main": "dist/tween.cjs.js", "types": "dist/tween.d.ts", diff --git a/src/Version.ts b/src/Version.ts index 60da72f1..305440ad 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '21.1.0' +const VERSION = '21.1.1' export default VERSION From 95bf899180e2f7cd123ba1da2a08a9f66b9b21f7 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 17:38:53 -0800 Subject: [PATCH 105/107] fix import for Node.js CommonJS projects --- dist/{tween.cjs.js => tween.cjs} | 0 .../nodejs-commonjs/README.md | 1 + .../example-projects/nodejs-commonjs/index.js | 9 ++++++ .../nodejs-commonjs/package-lock.json | 29 +++++++++++++++++++ .../nodejs-commonjs/package.json | 10 +++++++ .../plain-javascript-modules/package.json | 1 + .../plain-typescript-modules/package.json | 3 +- package.json | 4 +-- rollup.config.js | 2 +- 9 files changed, 55 insertions(+), 4 deletions(-) rename dist/{tween.cjs.js => tween.cjs} (100%) create mode 100644 examples/example-projects/nodejs-commonjs/README.md create mode 100644 examples/example-projects/nodejs-commonjs/index.js create mode 100644 examples/example-projects/nodejs-commonjs/package-lock.json create mode 100644 examples/example-projects/nodejs-commonjs/package.json diff --git a/dist/tween.cjs.js b/dist/tween.cjs similarity index 100% rename from dist/tween.cjs.js rename to dist/tween.cjs diff --git a/examples/example-projects/nodejs-commonjs/README.md b/examples/example-projects/nodejs-commonjs/README.md new file mode 100644 index 00000000..2dc923c0 --- /dev/null +++ b/examples/example-projects/nodejs-commonjs/README.md @@ -0,0 +1 @@ +This example shows that Tween.js can be imported into a Node.js project in CommonJS format. diff --git a/examples/example-projects/nodejs-commonjs/index.js b/examples/example-projects/nodejs-commonjs/index.js new file mode 100644 index 00000000..b26fa7df --- /dev/null +++ b/examples/example-projects/nodejs-commonjs/index.js @@ -0,0 +1,9 @@ +// Ensure we can import into Node CommonJS: + +const TWEEN = require('@tweenjs/tween.js') + +console.log(Object.keys(TWEEN)) + +const tween = new TWEEN.Tween() + +console.log(Object.keys(tween)) diff --git a/examples/example-projects/nodejs-commonjs/package-lock.json b/examples/example-projects/nodejs-commonjs/package-lock.json new file mode 100644 index 00000000..39f0aa06 --- /dev/null +++ b/examples/example-projects/nodejs-commonjs/package-lock.json @@ -0,0 +1,29 @@ +{ + "name": "nodejs-commonjs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@tweenjs/tween.js": "file:../../../" + } + }, + "../../..": { + "version": "21.1.1", + "license": "MIT", + "devDependencies": { + "nodeunit": "^0.11.3", + "prettier": "^3.0.0", + "rimraf": "^3.0.0", + "rollup": "3.20.7", + "rollup-plugin-dts": "5.3.0", + "tslib": "^1.10.0", + "typescript": "5.0.4" + } + }, + "node_modules/@tweenjs/tween.js": { + "resolved": "../../..", + "link": true + } + } +} diff --git a/examples/example-projects/nodejs-commonjs/package.json b/examples/example-projects/nodejs-commonjs/package.json new file mode 100644 index 00000000..a3eb84f7 --- /dev/null +++ b/examples/example-projects/nodejs-commonjs/package.json @@ -0,0 +1,10 @@ +{ + "description": "Node.js project in CommonJS format, importing Tween in CommonJS format.", + "type": "commonjs", + "scripts": { + "start": "node ./index.js" + }, + "dependencies": { + "@tweenjs/tween.js": "file:../../../" + } +} diff --git a/examples/example-projects/plain-javascript-modules/package.json b/examples/example-projects/plain-javascript-modules/package.json index a4ea1add..601d8ff8 100644 --- a/examples/example-projects/plain-javascript-modules/package.json +++ b/examples/example-projects/plain-javascript-modules/package.json @@ -1,5 +1,6 @@ { "description": "Plain JS modules in a browser.", + "type": "module", "scripts": { "start": "npm run serve", "serve": "five-server ." diff --git a/examples/example-projects/plain-typescript-modules/package.json b/examples/example-projects/plain-typescript-modules/package.json index c199dc2d..793976b1 100644 --- a/examples/example-projects/plain-typescript-modules/package.json +++ b/examples/example-projects/plain-typescript-modules/package.json @@ -1,5 +1,6 @@ { - "description": "Plain JS modules in a browser.", + "description": "TS compiled to plain JS modules for running in browser.", + "type": "module", "scripts": { "start": "npm run build && npm run serve", "build": "tsc", diff --git a/package.json b/package.json index de63bef8..51d4157d 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,13 @@ "description": "Simple and fast tweening engine with optimised Robert Penner's equations.", "version": "21.1.1", "type": "module", - "main": "dist/tween.cjs.js", + "main": "dist/tween.cjs", "types": "dist/tween.d.ts", "module": "dist/tween.esm.js", "exports": { ".": { "import": "./dist/tween.esm.js", - "require": "./dist/tween.cjs.js", + "require": "./dist/tween.cjs", "types": "./dist/tween.d.ts" } }, diff --git a/rollup.config.js b/rollup.config.js index 9d8ac758..927b6270 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -19,7 +19,7 @@ export default [ exports: 'named', }, { - file: 'dist/tween.cjs.js', + file: 'dist/tween.cjs', format: 'cjs', exports: 'named', }, From 94bf919d0f12f695c7df21f98f572ecfd6d53e90 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 17:44:42 -0800 Subject: [PATCH 106/107] examples: add an example showing we can import into Node.js projects in ESM format --- .../nodejs-esmodules/README.md | 1 + .../nodejs-esmodules/index.js | 9 ++++++ .../nodejs-esmodules/package-lock.json | 29 +++++++++++++++++++ .../nodejs-esmodules/package.json | 10 +++++++ 4 files changed, 49 insertions(+) create mode 100644 examples/example-projects/nodejs-esmodules/README.md create mode 100644 examples/example-projects/nodejs-esmodules/index.js create mode 100644 examples/example-projects/nodejs-esmodules/package-lock.json create mode 100644 examples/example-projects/nodejs-esmodules/package.json diff --git a/examples/example-projects/nodejs-esmodules/README.md b/examples/example-projects/nodejs-esmodules/README.md new file mode 100644 index 00000000..3f0790cd --- /dev/null +++ b/examples/example-projects/nodejs-esmodules/README.md @@ -0,0 +1 @@ +This example shows that Tween.js can be imported into a Node.js project in ES Module format. diff --git a/examples/example-projects/nodejs-esmodules/index.js b/examples/example-projects/nodejs-esmodules/index.js new file mode 100644 index 00000000..31620337 --- /dev/null +++ b/examples/example-projects/nodejs-esmodules/index.js @@ -0,0 +1,9 @@ +// Ensure we can import into Node ESM: + +import * as TWEEN from '@tweenjs/tween.js' + +console.log(Object.keys(TWEEN)) + +const tween = new TWEEN.Tween() + +console.log(Object.keys(tween)) diff --git a/examples/example-projects/nodejs-esmodules/package-lock.json b/examples/example-projects/nodejs-esmodules/package-lock.json new file mode 100644 index 00000000..39f0aa06 --- /dev/null +++ b/examples/example-projects/nodejs-esmodules/package-lock.json @@ -0,0 +1,29 @@ +{ + "name": "nodejs-commonjs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@tweenjs/tween.js": "file:../../../" + } + }, + "../../..": { + "version": "21.1.1", + "license": "MIT", + "devDependencies": { + "nodeunit": "^0.11.3", + "prettier": "^3.0.0", + "rimraf": "^3.0.0", + "rollup": "3.20.7", + "rollup-plugin-dts": "5.3.0", + "tslib": "^1.10.0", + "typescript": "5.0.4" + } + }, + "node_modules/@tweenjs/tween.js": { + "resolved": "../../..", + "link": true + } + } +} diff --git a/examples/example-projects/nodejs-esmodules/package.json b/examples/example-projects/nodejs-esmodules/package.json new file mode 100644 index 00000000..fa0a0517 --- /dev/null +++ b/examples/example-projects/nodejs-esmodules/package.json @@ -0,0 +1,10 @@ +{ + "description": "Node.js project in CommonJS format, importing Tween in CommonJS format.", + "type": "module", + "scripts": { + "start": "node ./index.js" + }, + "dependencies": { + "@tweenjs/tween.js": "file:../../../" + } +} From 5e13acbe643a3dd813ad335f1ffda07c09037f93 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Sun, 14 Jan 2024 17:45:23 -0800 Subject: [PATCH 107/107] v22.0.0 --- dist/tween.amd.js | 2 +- dist/tween.cjs | 2 +- dist/tween.d.ts | 2 +- dist/tween.esm.js | 2 +- dist/tween.umd.js | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/Version.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dist/tween.amd.js b/dist/tween.amd.js index e6195ec2..3c7b08b3 100644 --- a/dist/tween.amd.js +++ b/dist/tween.amd.js @@ -814,7 +814,7 @@ define(['exports'], (function (exports) { 'use strict'; return Tween; }()); - var VERSION = '21.1.1'; + var VERSION = '22.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.cjs b/dist/tween.cjs index 0095c4ad..d00bbd96 100644 --- a/dist/tween.cjs +++ b/dist/tween.cjs @@ -816,7 +816,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '21.1.1'; +var VERSION = '22.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.d.ts b/dist/tween.d.ts index 47ccbdcd..ab8101f0 100644 --- a/dist/tween.d.ts +++ b/dist/tween.d.ts @@ -152,7 +152,7 @@ declare class Sequence { static nextId(): number; } -declare const VERSION = "21.1.1"; +declare const VERSION = "22.0.0"; declare const nextId: typeof Sequence.nextId; declare const getAll: () => Tween[]; diff --git a/dist/tween.esm.js b/dist/tween.esm.js index b9fac8b9..1d3f9b02 100644 --- a/dist/tween.esm.js +++ b/dist/tween.esm.js @@ -812,7 +812,7 @@ var Tween = /** @class */ (function () { return Tween; }()); -var VERSION = '21.1.1'; +var VERSION = '22.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/dist/tween.umd.js b/dist/tween.umd.js index 1823750e..7cd9fefa 100644 --- a/dist/tween.umd.js +++ b/dist/tween.umd.js @@ -818,7 +818,7 @@ return Tween; }()); - var VERSION = '21.1.1'; + var VERSION = '22.0.0'; /** * Tween.js - Licensed under the MIT license diff --git a/package-lock.json b/package-lock.json index 009fbda0..00cda38d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tweenjs/tween.js", - "version": "21.1.1", + "version": "22.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tweenjs/tween.js", - "version": "21.1.1", + "version": "22.0.0", "license": "MIT", "devDependencies": { "nodeunit": "^0.11.3", diff --git a/package.json b/package.json index 51d4157d..8938aeb7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tweenjs/tween.js", "description": "Simple and fast tweening engine with optimised Robert Penner's equations.", - "version": "21.1.1", + "version": "22.0.0", "type": "module", "main": "dist/tween.cjs", "types": "dist/tween.d.ts", diff --git a/src/Version.ts b/src/Version.ts index 305440ad..e2a6de27 100644 --- a/src/Version.ts +++ b/src/Version.ts @@ -1,2 +1,2 @@ -const VERSION = '21.1.1' +const VERSION = '22.0.0' export default VERSION