From 5ce84c12c3fa77d8aa81c1ea293c3590b7d44d40 Mon Sep 17 00:00:00 2001 From: David Bismut Date: Mon, 27 May 2019 16:36:05 +0200 Subject: [PATCH] TS rewrite --- .babelrc | 7 +- .eslintrc | 8 - .prettierrc.js | 11 - .travis.yml | 1 - CHANGELOG.md | 10 +- package.json | 38 +- rollup.config.js | 47 +- src/__tests__/Drag.test.js | 12 +- src/__tests__/Hover.test.js | 8 +- src/__tests__/Move.test.js | 8 +- src/__tests__/MoveHover.test..js | 4 +- src/__tests__/Pinch.test.js | 8 +- src/__tests__/Scroll.test.js | 8 +- src/__tests__/Wheel.test.js | 6 +- src/__tests__/components/{Api.js => Api.tsx} | 0 src/__tests__/components/Common.js | 34 - src/__tests__/components/Common.tsx | 72 ++ src/__tests__/components/Interactive.js | 15 - src/__tests__/components/Interactive.tsx | 31 + src/__tests__/components/InteractiveDom.js | 18 - src/__tests__/components/InteractiveDom.tsx | 34 + src/controllers/GestureController.ts | 228 ++++ src/controllers/RecognizerController.js | 48 - src/default.js | 63 - src/defaults.ts | 80 ++ src/handler.js | 135 --- src/index.js | 18 - src/index.ts | 28 + src/recognizers/CoordinatesRecognizer.js | 30 - src/recognizers/CoordinatesRecognizer.ts | 33 + ...cognizer.js => DistanceAngleRecognizer.ts} | 21 +- .../{DragRecognizer.js => DragRecognizer.ts} | 47 +- src/recognizers/HoverRecognizer.js | 34 - src/recognizers/HoverRecognizer.ts | 35 + src/recognizers/MoveRecognizer.js | 38 - src/recognizers/MoveRecognizer.ts | 41 + ...{PinchRecognizer.js => PinchRecognizer.ts} | 31 +- .../PinchWebKitGestureRecognizer.js | 59 - .../PinchWebKitGestureRecognizer.ts | 62 + src/recognizers/PinchWheelRecognizer.js | 37 - src/recognizers/PinchWheelRecognizer.ts | 40 + src/recognizers/Recognizer.js | 71 -- src/recognizers/Recognizer.ts | 85 ++ src/recognizers/ScrollRecognizer.js | 35 - src/recognizers/ScrollRecognizer.ts | 38 + src/recognizers/WheelRecognizer.js | 36 - src/recognizers/WheelRecognizer.ts | 39 + src/utils.js | 102 -- src/utils.ts | 124 ++ tsconfig.json | 17 + types/common.d.ts | 7 + types/config.d.ts | 19 + types/events.d.ts | 75 ++ types/index.d.ts | 136 +-- types/states.d.ts | 63 + types/test.tsx | 26 - types/tsconfig.json | 16 - types/tslint.json | 6 - yarn.lock | 1052 ++++------------- 59 files changed, 1565 insertions(+), 1870 deletions(-) delete mode 100644 .eslintrc delete mode 100644 .prettierrc.js rename src/__tests__/components/{Api.js => Api.tsx} (100%) delete mode 100644 src/__tests__/components/Common.js create mode 100644 src/__tests__/components/Common.tsx delete mode 100644 src/__tests__/components/Interactive.js create mode 100644 src/__tests__/components/Interactive.tsx delete mode 100644 src/__tests__/components/InteractiveDom.js create mode 100644 src/__tests__/components/InteractiveDom.tsx create mode 100644 src/controllers/GestureController.ts delete mode 100644 src/controllers/RecognizerController.js delete mode 100644 src/default.js create mode 100644 src/defaults.ts delete mode 100644 src/handler.js delete mode 100644 src/index.js create mode 100644 src/index.ts delete mode 100644 src/recognizers/CoordinatesRecognizer.js create mode 100644 src/recognizers/CoordinatesRecognizer.ts rename src/recognizers/{DistanceAngleRecognizer.js => DistanceAngleRecognizer.ts} (54%) rename src/recognizers/{DragRecognizer.js => DragRecognizer.ts} (56%) delete mode 100644 src/recognizers/HoverRecognizer.js create mode 100644 src/recognizers/HoverRecognizer.ts delete mode 100644 src/recognizers/MoveRecognizer.js create mode 100644 src/recognizers/MoveRecognizer.ts rename src/recognizers/{PinchRecognizer.js => PinchRecognizer.ts} (55%) delete mode 100644 src/recognizers/PinchWebKitGestureRecognizer.js create mode 100644 src/recognizers/PinchWebKitGestureRecognizer.ts delete mode 100644 src/recognizers/PinchWheelRecognizer.js create mode 100644 src/recognizers/PinchWheelRecognizer.ts delete mode 100644 src/recognizers/Recognizer.js create mode 100644 src/recognizers/Recognizer.ts delete mode 100644 src/recognizers/ScrollRecognizer.js create mode 100644 src/recognizers/ScrollRecognizer.ts delete mode 100644 src/recognizers/WheelRecognizer.js create mode 100644 src/recognizers/WheelRecognizer.ts delete mode 100644 src/utils.js create mode 100644 src/utils.ts create mode 100644 tsconfig.json create mode 100644 types/common.d.ts create mode 100644 types/config.d.ts create mode 100644 types/events.d.ts create mode 100644 types/states.d.ts delete mode 100644 types/test.tsx delete mode 100644 types/tsconfig.json delete mode 100644 types/tslint.json diff --git a/.babelrc b/.babelrc index c1d62967f..6a1a2871a 100644 --- a/.babelrc +++ b/.babelrc @@ -8,12 +8,13 @@ "targets": ">1%, not dead, not ie 11, not op_mini all" } ], - "@babel/preset-react" + "@babel/preset-react", + "@babel/preset-typescript" ], - "plugins": [["@babel/proposal-class-properties", { "loose": true }]], + "plugins": [["@babel/proposal-class-properties", { "loose": true }], ["@babel/plugin-proposal-object-rest-spread", { "loose": true }]], "env": { "test": { - "plugins": ["@babel/transform-modules-commonjs", "@babel/plugin-transform-runtime"] + "plugins": ["@babel/transform-modules-commonjs"] } } } diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index b193928fd..000000000 --- a/.eslintrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "react-app", - "plugins": ["react-hooks"], - "rules": { - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn" - } -} diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index fb2d0bbfb..000000000 --- a/.prettierrc.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Prettier auto code formatting options - * - * https://prettier.io/docs/en/options.html - */ -module.exports = { - semi: false, - singleQuote: true, - printWidth: 140, - tabWidth: 2 -} diff --git a/.travis.yml b/.travis.yml index 22f1802f4..ea3004fae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,4 +7,3 @@ cache: - /home/travis/.dts/typescript-installs/ script: - 'yarn test' - - 'yarn dtslint' diff --git a/CHANGELOG.md b/CHANGELOG.md index 874fbe7a2..4fbc65f02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## 5.1.0 Release -**Summary:** important release introducing trackpad gestures. There has been some important refactoring involved. +**Summary:** important release introducing trackpad gestures. The library has been fully rewritten in TypeScript with some important refactoring involved. ### Added @@ -15,6 +15,10 @@ 1. Drag gesture will interrupt if a move event has no button pressed (that could happen if triggering a right click) and then moving the mouse around. +### Breaking changes + +1. `config` object must be passed as a second argument. + ## 5.0.1 Release **Summary:** release updating dev dependencies and fixing minor bugs. @@ -62,7 +66,7 @@ const bind = useGesture({ onDrag: ({ first }) => { if (first) setDragCount(dragCount + 1) console.log(count) //<-- count will be up to date - } + }, }) ``` @@ -183,7 +187,7 @@ const bind = useGesture({ onDrag: ({ first }) => { if (first) setDragCount(dragCount + 1) console.log(count) //<-- count will be up to date - } + }, }) ``` diff --git a/package.json b/package.json index 69a6ef7cc..51e291bc7 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,8 @@ "name": "react-use-gesture", "version": "5.1.0-beta.6", "description": "hook for receiving gestures", - "main": "dist/react-use-gesture.js", - "module": "dist/react-use-gesture.es.js", - "types": "types", + "main": "dist/react-use-gesture.cjs.js", + "module": "dist/react-use-gesture.js", "sideEffects": false, "husky": { "hooks": { @@ -17,8 +16,7 @@ "prepare": "npm run build", "test": "jest", "test:watch": "jest --watch", - "test:coverage": "jest --coverage --silent", - "dtslint": "dtslint types" + "test:coverage": "jest --coverage --silent" }, "repository": { "type": "git", @@ -46,6 +44,14 @@ "url": "https://github.com/react-spring/react-use-gesture/issues" }, "homepage": "https://github.com/react-spring/react-use-gesture#readme", + "prettier": { + "semi": false, + "trailingComma": "es5", + "singleQuote": true, + "jsxBracketSameLine": true, + "tabWidth": 2, + "printWidth": 140 + }, "devDependencies": { "@babel/core": "7.4.4", "@babel/plugin-proposal-class-properties": "^7.4.4", @@ -53,18 +59,10 @@ "@babel/plugin-transform-runtime": "7.4.4", "@babel/preset-env": "^7.4.3", "@babel/preset-react": "^7.0.0", - "@types/react": "^16.4.18", + "@babel/preset-typescript": "^7.3.3", + "@types/react": "^16.8.18", "babel-core": "7.0.0-bridge.0", - "babel-eslint": "10.x", "babel-jest": "^24.7.1", - "dtslint": "^0.7.1", - "eslint": "5.x", - "eslint-config-react-app": "^4.0.1", - "eslint-plugin-flowtype": "2.x", - "eslint-plugin-import": "2.x", - "eslint-plugin-jsx-a11y": "6.x", - "eslint-plugin-react": "7.x", - "eslint-plugin-react-hooks": "^1.6.0", "husky": "^2.2.0", "jest": "^24.7.1", "jest-dom": "^3.1.3", @@ -76,16 +74,16 @@ "rimraf": "^2.6.2", "rollup": "^1.10.0", "rollup-plugin-babel": "^4.3.2", - "typescript": "^3.4.3" + "rollup-plugin-commonjs": "^10.0.0", + "rollup-plugin-node-resolve": "^5.0.0", + "rollup-plugin-uglify": "^6.0.2", + "typescript": "^3.4.5" }, "peerDependencies": { "react": ">= 16.8.0", "react-dom": ">= 16.8.0" }, "jest": { - "testPathIgnorePatterns": [ - "components/", - "types/" - ] + "testRegex": "test.(js|ts|tsx)$" } } diff --git a/rollup.config.js b/rollup.config.js index e58df3c96..f233cfe93 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,9 +1,42 @@ -import babel from 'rollup-plugin-babel' import pkg from './package.json' +const babel = require('rollup-plugin-babel') +const resolve = require('rollup-plugin-node-resolve') +const commonjs = require('rollup-plugin-commonjs') -export default { - input: './src/index.js', - output: [{ file: pkg.main, format: 'cjs' }, { file: pkg.module, format: 'es' }], - external: [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {})], - plugins: [babel()] -} +const extensions = ['.js', '.jsx', '.ts'] + +const getBabelOptions = ({ useESModules }, targets) => ({ + babelrc: false, + comments: false, + extensions, + exclude: '**/node_modules/**', + runtimeHelpers: true, + presets: [['@babel/preset-env', { loose: true, modules: false, targets }], '@babel/preset-react', '@babel/preset-typescript'], + plugins: [ + ['@babel/plugin-proposal-class-properties', { loose: true }], + ['@babel/plugin-proposal-object-rest-spread', { loose: true }], + ['@babel/plugin-transform-runtime', { regenerator: false, useESModules }], + ], +}) + +export default [ + { + input: `./src/index`, + output: { file: pkg.module, format: 'esm' }, + external: [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {})], + plugins: [babel(getBabelOptions({ useESModules: true }, '>1%, not dead, not ie 11, not op_mini all')), resolve({ extensions })], + }, + { + input: `./src/index`, + output: { file: pkg.main, format: 'cjs' }, + external: [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {})], + plugins: [babel(getBabelOptions({ useESModules: false })), commonjs(), resolve({ extensions })], + }, +] + +// export default { +// input: './src/index', +// output: [{ file: pkg.main, format: 'cjs' }, { file: pkg.module, format: 'es' }], +// external: [...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {})], +// plugins: [babel()] +// } diff --git a/src/__tests__/Drag.test.js b/src/__tests__/Drag.test.js index 42bce56c3..fccb8ba3a 100644 --- a/src/__tests__/Drag.test.js +++ b/src/__tests__/Drag.test.js @@ -13,7 +13,7 @@ describe.each([['attached to component', Interactive, false], ['attached to node 'testing onDrag %s)', (testName, Component, domTarget) => { const prefix = domTarget ? 'dom-' : '' - const { getByTestId, queryByTestId, rerender } = render() + const { getByTestId, queryByTestId, rerender } = render() const element = getByTestId(`${prefix}drag-el`) let delta_t @@ -76,19 +76,19 @@ describe.each([['attached to component', Interactive, false], ['attached to node }) test('disabling all gestures should prevent state from updating', () => { - rerender() + rerender() fireEvent.mouseDown(element) expect(getByTestId(`${prefix}drag-dragging`)).toHaveTextContent('false') }) test('disabling the drag gesture should prevent state from updating', () => { - rerender() + rerender() fireEvent.mouseDown(element) expect(getByTestId(`${prefix}drag-dragging`)).toHaveTextContent('false') }) test('restarting the gesture should book-keep local and reset delta', () => { - rerender() + rerender() fireEvent.mouseDown(element, { clientX: 30, clientY: 60 }) fireEvent.mouseMove(document, { clientX: 20, clientY: 50, buttons: 1 }) expect(getByTestId(`${prefix}drag-local`)).toHaveTextContent('0,20') @@ -96,11 +96,11 @@ describe.each([['attached to component', Interactive, false], ['attached to node }) test('canceling the gesture should cancel the gesture in the next RAF tick', async () => { - rerender() + rerender() fireEvent.mouseDown(element, { clientX: 30, clientY: 60 }) await wait(() => [ expect(getByTestId(`${prefix}drag-canceled`)).toHaveTextContent('true'), - expect(getByTestId(`${prefix}drag-dragging`)).toHaveTextContent('false') + expect(getByTestId(`${prefix}drag-dragging`)).toHaveTextContent('false'), ]) }) } diff --git a/src/__tests__/Hover.test.js b/src/__tests__/Hover.test.js index 0e4de962f..619294597 100644 --- a/src/__tests__/Hover.test.js +++ b/src/__tests__/Hover.test.js @@ -10,11 +10,11 @@ afterAll(cleanup) // but for some reason, the tests don't work with mouseEnter/mouseLeave describe.each([ - ['attached to component', Interactive, false] + ['attached to component', Interactive, false], // ['attached to node', InteractiveDom, true] ])('testing onHover %s)', (testName, Component, domTarget) => { const prefix = domTarget ? 'dom-' : '' - const { getByTestId, rerender } = render() + const { getByTestId, rerender } = render() const element = getByTestId(`${prefix}hover-el`) test('mouseEnter should initiate hover', () => { @@ -30,13 +30,13 @@ describe.each([ }) test('disabling all gestures should prevent state from updating', () => { - rerender() + rerender() fireEvent.mouseEnter(element) expect(getByTestId(`${prefix}hover-hovering`)).toHaveTextContent('false') }) test('disabling the hover gesture should prevent state from updating', () => { - rerender() + rerender() fireEvent.mouseEnter(element) expect(getByTestId(`${prefix}hover-hovering`)).toHaveTextContent('false') }) diff --git a/src/__tests__/Move.test.js b/src/__tests__/Move.test.js index abdd904e9..da76c180f 100644 --- a/src/__tests__/Move.test.js +++ b/src/__tests__/Move.test.js @@ -10,7 +10,7 @@ describe.each([['attached to component', Interactive, false], ['attached to node 'testing onMove %s)', (testName, Component, domTarget) => { const prefix = domTarget ? 'dom-' : '' - const { getByTestId, rerender } = render() + const { getByTestId, rerender } = render() const element = getByTestId(`${prefix}move-el`) let delta_t @@ -58,7 +58,7 @@ describe.each([['attached to component', Interactive, false], ['attached to node await wait(() => [ expect(getByTestId(`${prefix}move-last`)).toHaveTextContent('true'), expect(getByTestId(`${prefix}move-active`)).toHaveTextContent('false'), - expect(getByTestId(`${prefix}move-moving`)).toHaveTextContent('false') + expect(getByTestId(`${prefix}move-moving`)).toHaveTextContent('false'), ]) }) @@ -67,13 +67,13 @@ describe.each([['attached to component', Interactive, false], ['attached to node }) test('disabling all gestures should prevent state from updating', () => { - rerender() + rerender() fireEvent.mouseMove(element) expect(getByTestId(`${prefix}move-moving`)).toHaveTextContent('false') }) test('disabling the move gesture should prevent state from updating', () => { - rerender() + rerender() fireEvent.mouseMove(element) expect(getByTestId(`${prefix}move-moving`)).toHaveTextContent('false') }) diff --git a/src/__tests__/MoveHover.test..js b/src/__tests__/MoveHover.test..js index 35d5df4a1..c3f8f2b7d 100644 --- a/src/__tests__/MoveHover.test..js +++ b/src/__tests__/MoveHover.test..js @@ -10,11 +10,11 @@ afterAll(cleanup) // but for some reason, the tests don't work with mouseEnter/mouseLeave describe.each([ - ['attached to component', Interactive, false] + ['attached to component', Interactive, false], // ['attached to node', InteractiveDom, true] ])('testing onMove and onHover %s)', (testName, Component, domTarget) => { const prefix = domTarget ? 'dom-' : '' - const { getByTestId } = render() + const { getByTestId } = render() const element = getByTestId(`${prefix}movehover-el`) test('mouseEnter/mouseMove should initiate the move gesture', () => { diff --git a/src/__tests__/Pinch.test.js b/src/__tests__/Pinch.test.js index ab7a00abe..9ee0fb2f2 100644 --- a/src/__tests__/Pinch.test.js +++ b/src/__tests__/Pinch.test.js @@ -12,7 +12,7 @@ describe.each([['attached to component', Interactive, false], ['attached to node 'testing onPinch %s)', (testName, Component, domTarget) => { const prefix = domTarget ? 'dom-' : '' - const { getByTestId, queryByTestId, rerender } = render() + const { getByTestId, queryByTestId, rerender } = render() const element = getByTestId(`${prefix}pinch-el`) let delta_t @@ -94,7 +94,7 @@ describe.each([['attached to component', Interactive, false], ['attached to node }) test('canceling the gesture should cancel the gesture in the next RAF tick', async () => { - rerender() + rerender() fireEvent.touchMove(element, { touches: [{}, {}] }) await wait(() => { expect(getByTestId(`${prefix}pinch-canceled`)).toHaveTextContent('true') @@ -103,13 +103,13 @@ describe.each([['attached to component', Interactive, false], ['attached to node }) test('disabling all gestures should prevent state from updating', () => { - rerender() + rerender() fireEvent.touchStart(element, { touches: [{ clientX: 0, clientY: 0 }, { clientX: 0, clientY: 40 }] }) expect(getByTestId(`${prefix}pinch-pinching`)).toHaveTextContent('false') }) test('disabling the pinch gesture should prevent state from updating', () => { - rerender() + rerender() fireEvent.touchStart(element, { touches: [{ clientX: 0, clientY: 0 }, { clientX: 0, clientY: 40 }] }) expect(getByTestId(`${prefix}pinch-pinching`)).toHaveTextContent('false') }) diff --git a/src/__tests__/Scroll.test.js b/src/__tests__/Scroll.test.js index 5dafffbe3..d0e9239f2 100644 --- a/src/__tests__/Scroll.test.js +++ b/src/__tests__/Scroll.test.js @@ -10,7 +10,7 @@ describe.each([['attached to component', Interactive, false], ['attached to node 'testing onScroll %s)', (testName, Component, domTarget) => { const prefix = domTarget ? 'dom-' : '' - const { getByTestId, rerender } = render() + const { getByTestId, rerender } = render() const element = getByTestId(`${prefix}scroll-el`) let delta_t @@ -63,7 +63,7 @@ describe.each([['attached to component', Interactive, false], ['attached to node await wait(() => [ expect(getByTestId(`${prefix}scroll-last`)).toHaveTextContent('true'), expect(getByTestId(`${prefix}scroll-active`)).toHaveTextContent('false'), - expect(getByTestId(`${prefix}scroll-scrolling`)).toHaveTextContent('false') + expect(getByTestId(`${prefix}scroll-scrolling`)).toHaveTextContent('false'), ]) }) @@ -72,13 +72,13 @@ describe.each([['attached to component', Interactive, false], ['attached to node }) test('disabling all gestures should prevent state from updating', () => { - rerender() + rerender() fireEvent.scroll(element) expect(getByTestId(`${prefix}scroll-scrolling`)).toHaveTextContent('false') }) test('disabling the scroll gesture should prevent state from updating', () => { - rerender() + rerender() fireEvent.scroll(element) expect(getByTestId(`${prefix}scroll-scrolling`)).toHaveTextContent('false') }) diff --git a/src/__tests__/Wheel.test.js b/src/__tests__/Wheel.test.js index f5a12a617..d07ef8c0b 100644 --- a/src/__tests__/Wheel.test.js +++ b/src/__tests__/Wheel.test.js @@ -10,7 +10,7 @@ describe.each([['attached to component', Interactive, false], ['attached to node 'testing onWheel %s)', (testName, Component, domTarget) => { const prefix = domTarget ? 'dom-' : '' - const { getByTestId, rerender } = render() + const { getByTestId, rerender } = render() const element = getByTestId(`${prefix}wheel-el`) let delta_t @@ -67,13 +67,13 @@ describe.each([['attached to component', Interactive, false], ['attached to node }) test('disabling all gestures should prevent state from updating', () => { - rerender() + rerender() fireEvent.wheel(element) expect(getByTestId(`${prefix}wheel-wheeling`)).toHaveTextContent('false') }) test('disabling the wheel gesture should prevent state from updating', () => { - rerender() + rerender() fireEvent.wheel(element) expect(getByTestId(`${prefix}wheel-wheeling`)).toHaveTextContent('false') }) diff --git a/src/__tests__/components/Api.js b/src/__tests__/components/Api.tsx similarity index 100% rename from src/__tests__/components/Api.js rename to src/__tests__/components/Api.tsx diff --git a/src/__tests__/components/Common.js b/src/__tests__/components/Common.js deleted file mode 100644 index 958fcd072..000000000 --- a/src/__tests__/components/Common.js +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react' - -export const createHandlers = ({ gesture, tempArg, canceled, set, setStartEnd }) => { - gesture = Array.isArray(gesture) ? gesture : [gesture] - return gesture.reduce( - (acc, g) => ({ - ...acc, - [`on${g}Start`]: () => void setStartEnd(([startFired]) => [startFired + 1, 0]), - [`on${g}End`]: () => void setStartEnd(([, endFired]) => [0, endFired + 1]), - [`on${g}`]: ({ event, transform, cancel, currentTarget, temp = tempArg, ...rest }) => { - set({ ...rest, temp }) - if (canceled) { - cancel() - } - return temp - } - }), - {} - ) -} - -export const Common = React.forwardRef(({ listeners, testKey, state, startFired, endFired }, ref) => { - return ( -
-
{startFired === 0 ? 'not fired' : startFired > 1 ? 'fired too much' : 'fired'}
-
{endFired === 0 ? 'not fired' : endFired > 1 ? 'fired too much' : 'fired'}
- {Object.entries(state).map(([k, v]) => ( -
- {v !== undefined ? v.toString() : 'undefined'} -
- ))} -
- ) -}) diff --git a/src/__tests__/components/Common.tsx b/src/__tests__/components/Common.tsx new file mode 100644 index 000000000..fa98a4832 --- /dev/null +++ b/src/__tests__/components/Common.tsx @@ -0,0 +1,72 @@ +import React from 'react' +import { GestureKey } from '../../../types/states' +import { Fn, TransformType, AtLeastOneOf } from '../../../types/common' +import { GestureHandlers } from '../../../types' + +export const createHandlers = ({ + gestures, + tempArg, + canceled, + set, + setStartEnd, +}: { + gestures: GestureKey[] + tempArg: any[] + canceled: boolean + set: Fn + setStartEnd: React.Dispatch> +}): AtLeastOneOf => { + return gestures.reduce( + (acc: AtLeastOneOf, g) => ({ + ...acc, + [`on${g}Start`]: () => void setStartEnd(([startFired, endFired]) => [startFired + 1, endFired]), + [`on${g}End`]: () => void setStartEnd(([, endFired]) => [0, endFired + 1]), + [`on${g}`]: ({ + event, + transform, + cancel, + currentTarget, + temp = tempArg, + ...rest + }: { + event: Event + transform: TransformType + cancel: Fn + currentTarget: EventTarget + temp: any[] + }) => { + set({ ...rest, temp }) + if (canceled) { + cancel() + } + return temp + }, + }), + {} as GestureHandlers + ) +} + +export const Common = React.forwardRef( + ( + { + listeners = {}, + testKey, + state, + startFired = 0, + endFired = 0, + }: { listeners?: object; testKey: string; state: object; startFired?: number; endFired?: number }, + ref + ) => { + return ( +
} {...listeners} data-testid={`${testKey}-el`} style={{ height: 400, width: 400 }}> +
{startFired === 0 ? 'not fired' : startFired > 1 ? 'fired too much' : 'fired'}
+
{endFired === 0 ? 'not fired' : endFired > 1 ? 'fired too much' : 'fired'}
+ {Object.entries(state).map(([k, v]) => ( +
+ {v !== undefined ? v.toString() : 'undefined'} +
+ ))} +
+ ) + } +) diff --git a/src/__tests__/components/Interactive.js b/src/__tests__/components/Interactive.js deleted file mode 100644 index f830ab6c8..000000000 --- a/src/__tests__/components/Interactive.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react' -import { Common, createHandlers } from './Common' -import { useGesture } from '../../index' - -const Interactive = ({ bindArgs = [], gesture, canceled, tempArg, config, ...props }) => { - const [state, set] = React.useState({}) - const [[startFired, endFired], setStartEnd] = React.useState([0, 0]) - - const bind = useGesture(createHandlers({ gesture, tempArg, set, setStartEnd, canceled }), config) - const testKey = Array.isArray(gesture) ? gesture.join('').toLowerCase() : gesture.toLowerCase() - - return -} - -export default Interactive diff --git a/src/__tests__/components/Interactive.tsx b/src/__tests__/components/Interactive.tsx new file mode 100644 index 000000000..b4002755a --- /dev/null +++ b/src/__tests__/components/Interactive.tsx @@ -0,0 +1,31 @@ +import React from 'react' +import { Common, createHandlers } from './Common' +import { useGesture } from '../../index' +import { GestureKey } from '../../../types/states' +import { Fn } from '../../../types/common' +import { GestureConfig } from '../../../types/config' + +const Interactive = ({ + bindArgs = [], + gestures, + canceled, + tempArg, + config, +}: { + bindArgs: any[] + gestures: GestureKey[] + cancel: Fn + canceled: boolean + tempArg: any[] + config?: Partial +}) => { + const [state, set] = React.useState({}) + const [[startFired, endFired], setStartEnd] = React.useState([0, 0]) + + const bind = useGesture(createHandlers({ gestures, tempArg, set, setStartEnd, canceled }), config) + const testKey = gestures.join('').toLowerCase() + + return +} + +export default Interactive diff --git a/src/__tests__/components/InteractiveDom.js b/src/__tests__/components/InteractiveDom.js deleted file mode 100644 index dd926c416..000000000 --- a/src/__tests__/components/InteractiveDom.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react' -import { Common, createHandlers } from './Common' -import { useGesture } from '../../index' - -const InteractiveDom = ({ bindArgs = [], gesture, canceled, tempArg, config, ...props }) => { - const domTarget = React.useRef(null) - const [state, set] = React.useState({}) - const [[startFired, endFired], setStartEnd] = React.useState([0, 0]) - - const bind = useGesture(createHandlers({ gesture, tempArg, set, setStartEnd, canceled }), { domTarget, ...config }) - React.useEffect(bind, [bind]) - - const testKey = 'dom-' + (Array.isArray(gesture) ? gesture.join('').toLowerCase() : gesture.toLowerCase()) - - return -} - -export default InteractiveDom diff --git a/src/__tests__/components/InteractiveDom.tsx b/src/__tests__/components/InteractiveDom.tsx new file mode 100644 index 000000000..f7c239267 --- /dev/null +++ b/src/__tests__/components/InteractiveDom.tsx @@ -0,0 +1,34 @@ +import React from 'react' +import { Common, createHandlers } from './Common' +import { useGesture } from '../../index' +import { GestureKey } from '../../../types/states' +import { Fn } from '../../../types/common' +import { GestureConfig } from '../../../types/config' + +const InteractiveDom = ({ + // bindArgs = [], + gestures, + canceled, + tempArg, + config, +}: { + bindArgs: any[] + gestures: GestureKey[] + cancel: Fn + canceled: boolean + tempArg: any[] + config?: Partial +}) => { + const domTarget = React.useRef(null) + const [state, set] = React.useState({}) + const [[startFired, endFired], setStartEnd] = React.useState([0, 0]) + + const bind = useGesture(createHandlers({ gestures, tempArg, set, setStartEnd, canceled }), { ...config, domTarget }) + React.useEffect(bind, [bind]) + + const testKey = 'dom-' + gestures.join('').toLowerCase() + + return +} + +export default InteractiveDom diff --git a/src/controllers/GestureController.ts b/src/controllers/GestureController.ts new file mode 100644 index 000000000..5fb7df2bb --- /dev/null +++ b/src/controllers/GestureController.ts @@ -0,0 +1,228 @@ +import { + Coordinates, + DistanceAngle, + StateKey, + StateObject, + GestureState, + SharedGestureState, + GestureKey, + FullGestureState, +} from '../../types/states.d' +import { Fn, AtLeastOneOf } from '../../types/common.d' +import { ReactEventHandlerKey, GestureFlag, ReactEventHandlers } from '../../types/events.d' +import { GestureHandlers, Handler, HandlerKey } from '../../types' +import { GestureConfig } from '../../types/config.d' + +import { defaultConfig, initialState, mappedKeys } from '../defaults' +import { addListeners, removeListeners, supportsGestureEvent, chainFns } from '../utils' + +import DragRecognizer from '../recognizers/DragRecognizer' +import ScrollRecognizer from '../recognizers/ScrollRecognizer' +import WheelRecognizer from '../recognizers/WheelRecognizer' +import MoveRecognizer from '../recognizers/MoveRecognizer' +import HoverRecognizer from '../recognizers/HoverRecognizer' +import PinchRecognizer from '../recognizers/PinchRecognizer' +import PinchWheelRecognizer from '../recognizers/PinchWheelRecognizer' +import PinchWebKitGestureRecognizer from '../recognizers/PinchWebKitGestureRecognizer' +import CoordinatesRecognizer from '../recognizers/CoordinatesRecognizer' +import DistanceAngleRecognizer from '../recognizers/DistanceAngleRecognizer' + +type GestureTimeouts = Partial<{ [stateKey in StateKey]: number }> +type WindowListeners = Partial<{ [stateKey in StateKey]: [string, Fn][] }> +type Bindings = Partial<{ [eventName in ReactEventHandlerKey]: Fn[] }> + +export default class GestureController { + public handlers!: AtLeastOneOf + public config!: GestureConfig + public state: StateObject = initialState + public timeouts: GestureTimeouts = {} + private bindings: Bindings = {} + private domListeners: [string, Fn][] = [] + private windowListeners: WindowListeners = {} + + constructor(handlers: AtLeastOneOf | Handler, config?: Partial) { + this.setHandlersAndConfig(handlers, config) + } + + public setHandlersAndConfig = (handlers: AtLeastOneOf | Handler, config?: Partial) => { + if (typeof handlers === 'function') handlers = { onDrag: handlers } as GestureHandlers + else if (handlers.onAction) { + handlers.onDrag = handlers.onAction + } + this.config = { ...defaultConfig, ...config } + const { domTarget } = this.config + const realDomTarget = domTarget && 'current' in domTarget ? domTarget.current : domTarget + this.config.domTarget = realDomTarget + + this.handlers = handlers + } + + public clean = (): void => { + this.cleanOnRender() + Object.values(this.timeouts).forEach(clearTimeout) + Object.keys(this.windowListeners).forEach(stateKey => this.removeWindowListeners(stateKey)) + } + + private cleanOnRender = (): void => { + this.bindings = {} + const { domTarget } = this.config + if (domTarget) { + removeListeners(domTarget, this.domListeners, this.config.event) + this.domListeners = [] + } + } + + public updateState = ( + sharedState: Partial | null, + gestureState: Partial>, + gestureKey: GestureKey, + flag?: GestureFlag + ): void => { + const stateKey = mappedKeys[gestureKey].stateKey + + this.state = { + ...this.state, + shared: { ...this.state.shared, ...sharedState }, + [stateKey]: { ...this.state[stateKey], ...(gestureState as object) }, + } + + if (flag) { + this.fireGestureHandler(gestureKey, flag) + } + } + + // fire the gesture handler defined by the user + public fireGestureHandler = (gestureKey: GestureKey, flag: GestureFlag): void => { + const { stateKey, handlerKey } = mappedKeys[gestureKey] + const state = { ...this.state.shared, ...this.state[stateKey] } + + if (gestureKey === 'pinch') { + const pinchState = state as FullGestureState + pinchState.da = state.values // legacy state attribute for pinch gestures + pinchState.vdva = state.velocities // legacy state attribute for pinch gestures + } else { + const coordinatesState = state as FullGestureState + coordinatesState.xy = state.values // legacy state attribute for xy gestures + coordinatesState.vxvy = state.velocities // legacy state attribute for xy gestures + } + + if (flag === GestureFlag.OnStart) { + const handlerStart = `${handlerKey}Start` as keyof GestureHandlers + const handler = this.handlers[handlerStart] as any + handler && handler(state) + } + + const handler = this.handlers[handlerKey] as any + if (handler) { + this.state[stateKey].temp = handler(state) || this.state[stateKey].temp + } + + if (flag === GestureFlag.OnEnd) { + const handlerEnd = `${handlerKey}End` as keyof GestureHandlers + const handler = this.handlers[handlerEnd] as any + handler && handler(state) + } + } + + public addWindowListeners = (stateKey: StateKey, listeners: [string, Fn][]): void => { + if (!this.config.window) return + this.windowListeners[stateKey] = listeners + addListeners(this.config.window, listeners, this.config.event) + } + + public removeWindowListeners = (stateKey: StateKey): void => { + if (!this.config.window) return + const listeners = this.windowListeners[stateKey] + if (listeners) { + removeListeners(this.config.window, listeners, this.config.event) + delete this.windowListeners[stateKey] + } + } + + private addRecognizer = (recognizer: CoordinatesRecognizer | DistanceAngleRecognizer): void => { + recognizer.getEventBindings().map(this.addEventBindings) + } + + //TODO Fix + private addEventBindings = ([eventNames, fn]: [ReactEventHandlerKey | ReactEventHandlerKey[], Fn]): void => { + const eventNamesArray = !Array.isArray(eventNames) ? [eventNames] : eventNames + + eventNamesArray.forEach(eventName => { + this.bindings[eventName] = this.bindings[eventName] ? [...(this.bindings[eventName]), fn] : [fn] + }) + } + + private addDomTargetListeners = (): void => { + const { domTarget } = this.config + removeListeners(domTarget, this.domListeners, this.config.event) + this.domListeners = [] + + Object.entries(this.bindings).forEach(([event, fns]) => { + this.domListeners.push([event.substr(2).toLowerCase(), chainFns(...(fns))]) + }) + + addListeners(domTarget, this.domListeners, this.config.event) + } + + private getBindings = (): ReactEventHandlers => { + const output: ReactEventHandlers = {} + const captureString = this.config.event.capture ? 'Capture' : '' + + Object.entries(this.bindings).forEach(([event, fns]) => { + const key = (event + captureString) as ReactEventHandlerKey + output[key] = chainFns(...(fns)) + }) + + return output + } + + public bind = (...args: any[]): BinderType => { + // if handlers contains {onDragStart, onDrag, onDragEnd, onMoveStart, onMove} + // actions will skip on[Gesture]["Start"|"End"] functions and include + // ['onDrag', 'onMove'] + + const actions: Set = new Set( + Object.keys(this.handlers) + .filter(k => k.indexOf('on') === 0) + .map(k => { + const match = k.match(/(on[A-Z][a-z]+)/) + if (match) return match[1] + }) + ) + + const { domTarget } = this.config + + this.cleanOnRender() + + if (actions.has('onDrag')) { + this.addRecognizer(new DragRecognizer(this, args)) + } + if (actions.has('onScroll')) { + this.addRecognizer(new ScrollRecognizer(this, args)) + } + if (actions.has('onWheel')) { + this.addRecognizer(new WheelRecognizer(this, args)) + } + if (actions.has('onMove')) { + this.addRecognizer(new MoveRecognizer(this, args)) + } + if (actions.has('onHover')) { + this.addRecognizer(new HoverRecognizer(this, args)) + } + if (actions.has('onPinch')) { + if (domTarget && supportsGestureEvent()) { + this.addRecognizer(new PinchWebKitGestureRecognizer(this, args)) + } else { + this.addRecognizer(new PinchRecognizer(this, args)) + this.addRecognizer(new PinchWheelRecognizer(this, args)) + } + } + + if (domTarget) { + this.addDomTargetListeners() + return this.clean as BinderType + } + + return this.getBindings() as BinderType + } +} diff --git a/src/controllers/RecognizerController.js b/src/controllers/RecognizerController.js deleted file mode 100644 index af99ae49c..000000000 --- a/src/controllers/RecognizerController.js +++ /dev/null @@ -1,48 +0,0 @@ -import { addListeners, removeListeners } from '../utils' - -export default class RecognizerController { - bindings = {} - domListeners = [] - config = {} - - setConfig = config => { - const { domTarget, ...rest } = config - const realDomTarget = domTarget && 'current' in domTarget ? domTarget.current : domTarget - this.config = { domTarget: realDomTarget, ...rest } - } - - clean = () => { - const { domTarget } = this.config - removeListeners(domTarget, this.domListeners, this.config.event) - this.domListeners = [] - this.bindings = {} - } - - add = recognizer => { - recognizer.getEventBindings().map(this.addEventBindings) - } - - addEventBindings = ([events, fn]) => { - if (!Array.isArray(events)) events = [events] - events.forEach(event => (this.bindings[event] = this.bindings[event] ? [...this.bindings[event], fn] : [fn])) - } - - addDomTargetListeners = config => { - this.setConfig(config) - const { domTarget } = this.config - removeListeners(domTarget, this.domListeners, this.config.event) - this.domListeners = [] - Object.entries(this.bindings).forEach(([k, fns]) => this.domListeners.push([k.substr(2).toLowerCase(), chainFns(...fns)])) - addListeners(domTarget, this.domListeners, this.config.event) - } - - getBindings = config => { - const output = {} - const captureString = config.event.capture ? 'Capture' : '' - Object.entries(this.bindings).forEach(([event, fns]) => (output[event + captureString] = chainFns(...fns))) - return output - } -} - -// returns a function that chains all functions given as parameters -const chainFns = (...fns) => (...args) => fns.forEach(fn => fn(...args)) diff --git a/src/default.js b/src/default.js deleted file mode 100644 index d9edeab5e..000000000 --- a/src/default.js +++ /dev/null @@ -1,63 +0,0 @@ -import { noop } from './utils' - -export const defaultConfig = { - domTarget: undefined, - event: { passive: true, capture: false }, - pointerEvents: false, - window: typeof window !== 'undefined' ? window : undefined, - transform: { x: x => x, y: y => y }, - enabled: true, - drag: true, - pinch: true, - scroll: true, - wheel: true, - hover: true, - move: true -} - -export const initialCommon = { - event: undefined, - values: [0, 0], - velocities: [0, 0], - delta: [0, 0], - initial: [0, 0], - previous: [0, 0], - transform: undefined, - local: [0, 0], - lastLocal: [0, 0], - first: false, - last: false, - active: false, - time: undefined, - temp: undefined, - cancel: noop, - canceled: false, - args: undefined -} - -const initialXY = { xy: [0, 0], vxvy: [0, 0], velocity: 0, distance: 0, direction: [0, 0] } // xy coordinates -const initialDA = { da: [0, 0], vdva: [0, 0], origin: undefined, turns: 0 } // distance and angle - -export const initialState = { - shared: { - hovering: undefined, - scrolling: undefined, - dragging: undefined, - moving: undefined, - pinching: undefined, - touches: undefined, - buttons: undefined, - down: undefined, - shiftKey: undefined, - altKey: undefined, - metaKey: undefined, - ctrlKey: undefined - }, - move: { ...initialCommon, ...initialXY }, - drag: { ...initialCommon, ...initialXY }, - scroll: { ...initialCommon, ...initialXY }, - wheel: { ...initialCommon, ...initialXY }, - pinch: { ...initialCommon, ...initialDA } -} - -export const genericEndState = { first: false, last: true, active: false } diff --git a/src/defaults.ts b/src/defaults.ts new file mode 100644 index 000000000..0df348267 --- /dev/null +++ b/src/defaults.ts @@ -0,0 +1,80 @@ +import { noop } from './utils' +import { GestureConfig } from '../types/config.d' +import { CommonGestureState, Coordinates, DistanceAngle, StateObject, StateKey, GestureKey } from '../types/states.d' +import { HandlerKey } from '../types' + +type MappedKeys = { [K in GestureKey]: { stateKey: StateKey; handlerKey: HandlerKey } } + +export const mappedKeys: MappedKeys = { + drag: { stateKey: 'drag', handlerKey: 'onDrag' }, + pinch: { stateKey: 'pinch', handlerKey: 'onPinch' }, + move: { stateKey: 'move', handlerKey: 'onMove' }, + scroll: { stateKey: 'scroll', handlerKey: 'onScroll' }, + wheel: { stateKey: 'wheel', handlerKey: 'onWheel' }, + hover: { stateKey: 'move', handlerKey: 'onHover' }, +} + +export const defaultConfig: GestureConfig = { + domTarget: undefined, + event: { passive: true, capture: false }, + pointerEvents: false, + window: typeof window !== 'undefined' ? window : undefined, + transform: { x: (x: number): number => x, y: (y: number): number => y }, + enabled: true, + drag: true, + pinch: true, + scroll: true, + wheel: true, + hover: true, + move: true, +} + +export const initialCommon: CommonGestureState = { + event: undefined, + currentTarget: undefined, + pointerId: undefined, + values: [0, 0], + velocities: [0, 0], + delta: [0, 0], + initial: [0, 0], + previous: [0, 0], + transform: undefined, + local: [0, 0], + lastLocal: [0, 0], + first: false, + last: false, + active: false, + time: undefined, + cancel: noop, + canceled: false, + temp: undefined, + args: undefined, +} + +const initialCoordinates: Coordinates = { xy: [0, 0], vxvy: [0, 0], velocity: 0, distance: 0, direction: [0, 0] } // xy coordinates +const initialDistanceAngle: DistanceAngle = { da: [0, 0], vdva: [0, 0], origin: [0, 0], turns: 0 } // distance and angle + +export const initialState: StateObject = { + shared: { + hovering: false, + scrolling: false, + wheeling: false, + dragging: false, + moving: false, + pinching: false, + touches: 0, + buttons: 0, + down: false, + shiftKey: false, + altKey: false, + metaKey: false, + ctrlKey: false, + }, + move: { ...initialCommon, ...initialCoordinates }, + drag: { ...initialCommon, ...initialCoordinates }, + scroll: { ...initialCommon, ...initialCoordinates }, + wheel: { ...initialCommon, ...initialCoordinates }, + pinch: { ...initialCommon, ...initialDistanceAngle }, +} + +export const genericEndState = { first: false, last: true, active: false } diff --git a/src/handler.js b/src/handler.js deleted file mode 100644 index 71247094f..000000000 --- a/src/handler.js +++ /dev/null @@ -1,135 +0,0 @@ -import { defaultConfig, initialState } from './default' -import { addListeners, removeListeners, supportsGestureEvent, GESTURE_ONSTART, GESTURE_ONEND } from './utils' - -import RecognizerController from './controllers/RecognizerController' -import DragRecognizer from './recognizers/DragRecognizer' -import ScrollRecognizer from './recognizers/ScrollRecognizer' -import WheelRecognizer from './recognizers/WheelRecognizer' -import MoveRecognizer from './recognizers/MoveRecognizer' -import HoverRecognizer from './recognizers/HoverRecognizer' -import PinchRecognizer from './recognizers/PinchRecognizer' -import PinchWheelRecognizer from './recognizers/PinchWheelRecognizer' -import PinchWebKitGestureRecognizer from './recognizers/PinchWebKitGestureRecognizer' - -export default class Handler { - props = null - config = null - controller = null - state = initialState - timeouts = {} - windowListeners = {} - - constructor(props, config) { - this.setPropsConfig(props, config) - this.controller = new RecognizerController() - this.createdOn = Date.now() - } - - setPropsConfig = (props, config) => { - if (typeof props === 'function') props = { onDrag: props } - if (props.onAction) { - props.onDrag = props.onAction - } - this.config = { ...defaultConfig, ...props.config, ...config } - this.props = props - } - - clean = () => { - this.controller.clean() - Object.values(this.timeouts).forEach(clearTimeout) - Object.keys(this.windowListeners).forEach(this.removeWindowListeners) - } - - updateState = (sharedState, gestureState, gestureStateKey, actionKey, flag) => { - this.state = { - ...this.state, - shared: { ...this.state.shared, ...sharedState }, - [gestureStateKey]: { ...this.state[gestureStateKey], ...gestureState } - } - - if (actionKey) { - this.fireGestureHandler(gestureStateKey, actionKey, flag) - } - } - - // fire the gesture handler defined by the user - fireGestureHandler = (gestureStateKey, actionKey, flag) => { - const state = { ...this.state.shared, ...this.state[gestureStateKey] } - state.xy = state.values // legacy state attribute for xy gestures - state.vxvy = state.velocities // legacy state attribute for xy gestures - state.da = state.values // legacy state attribute for pinch gestures - state.vdva = state.velocities // legacy state attribute for pinch gestures - - if (flag === GESTURE_ONSTART) { - const actionStart = `${actionKey}Start` - this.props[actionStart] && this.props[actionStart](state) - } - if (this.props[actionKey]) { - this.state[gestureStateKey].temp = this.props[actionKey](state) || this.state[gestureStateKey].temp - } - if (flag === GESTURE_ONEND) { - const actionEnd = `${actionKey}End` - this.props[actionEnd] && this.props[actionEnd](state) - } - } - - addWindowListeners = (stateKey, listeners) => { - this.windowListeners[this.stateKey] = listeners - addListeners(this.config.window, listeners, this.config.event) - } - - removeWindowListeners = stateKey => { - const listeners = this.windowListeners[this.stateKey] - if (listeners) { - removeListeners(this.config.window, listeners, this.config.event) - this.windowListeners[this.stateKey] = null - } - } - - bind = (...args) => { - // if props contains {onDragStart, onDrag, onDragEnd, onMoveStart, onMove} - // actions will skip on[Gesture]["Start"|"End"] functions and include - // ['onDrag', 'onMove'] - const actions = new Set( - Object.keys(this.props) - .filter(k => k.indexOf('on') === 0) - .map(k => k.match(/(on[A-Z][a-z]+)/)[1]) - ) - - const { domTarget } = this.config - - this.controller.clean() - - if (actions.has('onDrag')) { - this.controller.add(new DragRecognizer(this, args)) - } - if (actions.has('onScroll')) { - this.controller.add(new ScrollRecognizer(this, args)) - } - if (actions.has('onWheel')) { - this.controller.add(new WheelRecognizer(this, args)) - } - if (actions.has('onMove')) { - this.controller.add(new MoveRecognizer(this, args)) - } - if (actions.has('onHover')) { - this.controller.add(new HoverRecognizer(this, args)) - } - if (actions.has('onPinch')) { - if (domTarget && supportsGestureEvent()) { - // TODO also use touch events to calculate distance and origin - this.controller.add(new PinchWebKitGestureRecognizer(this, args)) - } else { - this.controller.add(new PinchRecognizer(this, args)) - this.controller.add(new PinchWheelRecognizer(this, args)) - } - } - - if (domTarget) { - this.controller.addDomTargetListeners(this.config) - return this.clean - } - - return this.controller.getBindings(this.config) - } -} diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 99a21ad97..000000000 --- a/src/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react' -import Handler from './Handler' - -export function useGesture(props, config) { - const handler = React.useRef(null) - - if (!handler.current) { - handler.current = new Handler(props, config) - } - - React.useEffect(() => { - handler.current.setPropsConfig(props, config) - }, [props, config]) - - React.useEffect(() => handler.current.clean, []) - - return handler.current.bind -} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 000000000..542e98696 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,28 @@ +import React from 'react' +import GestureController from './controllers/GestureController' +import { GestureHandlers, Handler } from '../types' +import { GestureConfig } from '../types/config.d' +import { ReactEventHandlers } from '../types/events.d' +import { Fn, AtLeastOneOf } from '../types/common.d' +import { Coordinates } from '../types/states.d' + +type GetBinderTypeFromDomTarget> = T['domTarget'] extends object ? Fn : ReactEventHandlers + +export function useGesture>( + handlers: AtLeastOneOf | Handler, + config?: T +): (...args: any[]) => GetBinderTypeFromDomTarget { + const gestureController = React.useRef>>() + + if (!gestureController.current) { + gestureController.current = new GestureController>(handlers, config) + } + + React.useEffect(() => { + gestureController.current!.setHandlersAndConfig(handlers, config) + }, [handlers, config]) + + React.useEffect(() => gestureController.current!.clean, []) + + return gestureController.current.bind +} diff --git a/src/recognizers/CoordinatesRecognizer.js b/src/recognizers/CoordinatesRecognizer.js deleted file mode 100644 index ae79047f7..000000000 --- a/src/recognizers/CoordinatesRecognizer.js +++ /dev/null @@ -1,30 +0,0 @@ -import Recognizer from './Recognizer' -import { addV, subV, calculateAllKinematics } from '../utils' - -export default class CoordinatesRecognizer extends Recognizer { - getKinematics = ({ values, event }) => { - const state = this.getState() - const { values: xy, initial, lastLocal, time } = state - const transform = state.transform || event.transform || this.getTransformConfig() - - const delta = subV(values, initial).map((v, i) => Object.values(transform)[i](v)) - const diff = subV(values, xy).map((v, i) => Object.values(transform)[i](v)) - - const delta_t = event.timeStamp - time - const { velocity, velocities, distance, direction } = calculateAllKinematics(delta, diff, delta_t) - - return { - event, - values, - delta, - velocity, - velocities, - distance, - direction, - local: addV(lastLocal, delta), - previous: xy, - transform, - time: event.timeStamp - } - } -} diff --git a/src/recognizers/CoordinatesRecognizer.ts b/src/recognizers/CoordinatesRecognizer.ts new file mode 100644 index 000000000..d46ad2bbe --- /dev/null +++ b/src/recognizers/CoordinatesRecognizer.ts @@ -0,0 +1,33 @@ +import Recognizer from './Recognizer' +import { addV, subV, calculateAllKinematics } from '../utils' +import { Vector2, TransformType } from '../../types/common.d' +import { TransformedEvent } from '../../types/events.d' +import { GestureState, Coordinates } from '../../types/states.d' + +export default abstract class CoordinatesRecognizer extends Recognizer { + protected getKinematics = ({ values, event }: { values: Vector2; event: TransformedEvent }): Partial> => { + const state = this.getState() + const { values: xy, initial, lastLocal, time = 0 } = state + const transform: TransformType = state.transform || event.transform || this.getTransformConfig() + + const delta = subV(values, initial).map((v, i) => Object.values(transform)[i](v)) as Vector2 + const diff = subV(values, xy).map((v, i) => Object.values(transform)[i](v)) as Vector2 + + const delta_t = event.timeStamp - time + const { velocity, velocities, distance, direction } = calculateAllKinematics(delta, diff, delta_t) + + return { + event, + values, + delta, + velocity, + velocities, + distance, + direction, + local: addV(lastLocal, delta), + previous: xy, + transform, + time: event.timeStamp, + } + } +} diff --git a/src/recognizers/DistanceAngleRecognizer.js b/src/recognizers/DistanceAngleRecognizer.ts similarity index 54% rename from src/recognizers/DistanceAngleRecognizer.js rename to src/recognizers/DistanceAngleRecognizer.ts index 8f40e83c6..60c82273c 100644 --- a/src/recognizers/DistanceAngleRecognizer.js +++ b/src/recognizers/DistanceAngleRecognizer.ts @@ -1,10 +1,19 @@ import Recognizer from './Recognizer' import { addV, calculateVelocities } from '../utils' +import { DistanceAngle, GestureState } from '../../types/states.d' +import { Vector2 } from '../../types/common.d' +import { TransformedEvent } from '../../types/events.d' -export default class DistanceAngleRecognizer extends Recognizer { - getKinematics = ({ values: [d, a], event }) => { +export default abstract class DistanceAngleRecognizer extends Recognizer { + getKinematics = ({ + values: [d, a], + event, + }: { + values: Vector2 | [number, number | undefined] + event: TransformedEvent + }): Partial> => { const state = this.getState() - const { values: da, turns, initial, lastLocal, time } = state + const { values: da, turns, initial, lastLocal, time = 0 } = state a = a === undefined ? da[1] : a // when angle is not defined by onCtrlWheel const diff_d = d - da[0] @@ -16,10 +25,10 @@ export default class DistanceAngleRecognizer extends Recognizer { const delta_d = d - initial[0] const delta_a = a - 360 * newTurns - initial[1] - const delta = [delta_d, delta_a] + const delta: Vector2 = [delta_d, delta_a] const delta_t = event.timeStamp - time - const velocities = calculateVelocities([diff_d, diff_a], delta_t) + const velocities = calculateVelocities([diff_d, diff_a], delta_t) as Vector2 return { event, @@ -29,7 +38,7 @@ export default class DistanceAngleRecognizer extends Recognizer { turns: newTurns, local: addV(lastLocal, delta), previous: da, - time: event.timeStamp + time: event.timeStamp, } } } diff --git a/src/recognizers/DragRecognizer.js b/src/recognizers/DragRecognizer.ts similarity index 56% rename from src/recognizers/DragRecognizer.js rename to src/recognizers/DragRecognizer.ts index d935c58ba..b91966a68 100644 --- a/src/recognizers/DragRecognizer.js +++ b/src/recognizers/DragRecognizer.ts @@ -1,46 +1,47 @@ import CoordinatesRecognizer from './CoordinatesRecognizer' -import { noop, getPointerEventData, GESTURE_ONCHANGE, GESTURE_ONSTART, GESTURE_ONEND } from '../utils' -import { genericEndState } from '../default' - -export default class DragRecognizer extends CoordinatesRecognizer { - dragListeners = [] - - constructor(...args) { - super('drag', ...args) +import { noop, getPointerEventData } from '../utils' +import GestureController from '../controllers/GestureController' +import { TransformedEvent, GestureFlag, ReactEventHandlerKey } from '../../types/events.d' +import { Fn } from '../../types/common.d' +import { genericEndState } from '../defaults' + +export default class DragRecognizer extends CoordinatesRecognizer { + constructor(controller: GestureController, args: any[]) { + super('drag', controller, args) } - onStart = event => { + onStart = (event: TransformedEvent): void => { if (!this.isEnabled()) return const { values, ...rest } = getPointerEventData(event) // making sure we're not dragging the element when more than one finger press the screen if (rest.touches > 1) return - const { currentTarget, pointerId } = event + const { currentTarget, pointerId } = event as PointerEvent if (this.hasPointerEvents()) { - currentTarget.setPointerCapture(pointerId) + currentTarget && (currentTarget as any).setPointerCapture(pointerId) } else { this.removeWindowListeners() - const dragListeners = [ + const dragListeners: [string, Fn][] = [ ['mousemove', this.onChange], ['mouseup', this.onEnd], ['touchmove', this.onChange], ['touchend', this.onEnd], - ['touchcancel', this.onEnd] + ['touchcancel', this.onEnd], ] this.addWindowListeners(dragListeners) } - const startState = this.getStartState({ args: this.args, event, values }) + const startState = this.getStartState({ values, args: this.args, event }) this.updateState( { ...rest, dragging: true, down: true }, { ...startState, currentTarget, pointerId, cancel: () => this.onCancel(event) }, - GESTURE_ONSTART + GestureFlag.OnStart ) } - onChange = event => { + onChange = (event: TransformedEvent): void => { const { canceled, active } = this.getState() if (canceled || !active) return @@ -54,26 +55,26 @@ export default class DragRecognizer extends CoordinatesRecognizer { const kinematics = this.getKinematics({ values, event }) const cancel = () => this.onCancel(event) - this.updateState(rest, { ...kinematics, first: false, cancel }, GESTURE_ONCHANGE) + this.updateState(rest, { ...kinematics, first: false, cancel }, GestureFlag.OnChange) } - onEnd = event => { + onEnd = (event: TransformedEvent): void => { const state = this.getState() if (!state.active) return const { currentTarget, pointerId } = state - if (this.hasPointerEvents()) currentTarget.releasePointerCapture(pointerId) - else this.removeWindowListeners(this.dragListeners) + if (currentTarget && this.hasPointerEvents()) (currentTarget as any).releasePointerCapture(pointerId) + else this.removeWindowListeners() - this.updateState({ dragging: false, down: false, buttons: 0, touches: 0 }, { ...genericEndState, event }, GESTURE_ONEND) + this.updateState({ dragging: false, down: false, buttons: 0, touches: 0 }, { ...genericEndState, event }, GestureFlag.OnEnd) } - onCancel = event => { + onCancel = (event: TransformedEvent): void => { this.updateState(null, { canceled: true, cancel: noop }) requestAnimationFrame(() => this.onEnd(event)) } - getEventBindings = () => { + getEventBindings(): [ReactEventHandlerKey | ReactEventHandlerKey[], Fn][] { if (this.hasPointerEvents()) { return [['onPointerDown', this.onStart], ['onPointerMove', this.onChange], [['onPointerUp', 'onPointerCancel'], this.onEnd]] } diff --git a/src/recognizers/HoverRecognizer.js b/src/recognizers/HoverRecognizer.js deleted file mode 100644 index 950f75090..000000000 --- a/src/recognizers/HoverRecognizer.js +++ /dev/null @@ -1,34 +0,0 @@ -import CoordinatesRecognizer from './CoordinatesRecognizer' -import { getPointerEventData, GESTURE_ONCHANGE, GESTURE_ONEND } from '../utils' -import { genericEndState } from '../default' - -export default class HoverRecognizer extends CoordinatesRecognizer { - timeout = null - constructor(...args) { - super('hover', ...args) - this.stateKey = 'move' - } - - onStart = event => { - if (!this.isEnabled()) return - const { values, ...rest } = getPointerEventData(event) - this.updateState({ hovering: true, ...rest }, { values, event, args: this.args }, GESTURE_ONCHANGE) - } - - onEnd = event => { - if (!this.isEnabled()) return - const { values, ...rest } = getPointerEventData(event) - const kinematics = this.getKinematics({ values, event }) - - this.updateState({ hovering: false, moving: false, ...rest }, { ...kinematics, ...genericEndState, velocity: 0, velocities: [0, 0] }) - this.handler.fireGestureHandler('move', 'onMove', GESTURE_ONEND) - this.handler.fireGestureHandler('move', 'onHover', GESTURE_ONCHANGE) - } - - getEventBindings = () => { - if (this.hasPointerEvents()) { - return [['onPointerEnter', this.onStart], ['onPointerLeave', this.onEnd]] - } - return [['onMouseEnter', this.onStart], ['onMouseLeave', this.onEnd]] - } -} diff --git a/src/recognizers/HoverRecognizer.ts b/src/recognizers/HoverRecognizer.ts new file mode 100644 index 000000000..07018d2dc --- /dev/null +++ b/src/recognizers/HoverRecognizer.ts @@ -0,0 +1,35 @@ +import CoordinatesRecognizer from './CoordinatesRecognizer' +import { getPointerEventData } from '../utils' +import GestureController from '../controllers/GestureController' +import { GestureFlag, TransformedEvent, ReactEventHandlerKey } from '../../types/events.d' +import { genericEndState } from '../defaults' +import { Fn } from '../../types/common.d' + +export default class HoverRecognizer extends CoordinatesRecognizer { + constructor(controller: GestureController, args: any[]) { + super('hover', controller, args) + } + + onStart = (event: TransformedEvent): void => { + if (!this.isEnabled()) return + const { values, ...rest } = getPointerEventData(event) + this.updateState({ hovering: true, ...rest }, { values, event, args: this.args }, GestureFlag.OnStart) + } + + onEnd = (event: TransformedEvent): void => { + if (!this.isEnabled()) return + const { values, ...rest } = getPointerEventData(event) + const kinematics = this.getKinematics({ values, event }) + + this.updateState({ hovering: false, moving: false, ...rest }, { ...kinematics, ...genericEndState, velocity: 0, velocities: [0, 0] }) + this.controller.fireGestureHandler('move', GestureFlag.OnEnd) + this.controller.fireGestureHandler('hover', GestureFlag.OnChange) + } + + getEventBindings(): [ReactEventHandlerKey | ReactEventHandlerKey[], Fn][] { + if (this.hasPointerEvents()) { + return [['onPointerEnter', this.onStart], ['onPointerLeave', this.onEnd]] + } + return [['onMouseEnter', this.onStart], ['onMouseLeave', this.onEnd]] + } +} diff --git a/src/recognizers/MoveRecognizer.js b/src/recognizers/MoveRecognizer.js deleted file mode 100644 index 59ede0aad..000000000 --- a/src/recognizers/MoveRecognizer.js +++ /dev/null @@ -1,38 +0,0 @@ -import CoordinatesRecognizer from './CoordinatesRecognizer' -import { getPointerEventData, GESTURE_ONCHANGE, GESTURE_ONSTART, GESTURE_ONEND } from '../utils' -import { genericEndState } from '../default' - -export default class MoveRecognizer extends CoordinatesRecognizer { - constructor(...args) { - super('move', ...args) - } - - onChange = event => { - if (!this.isEnabled()) return - - this.clearTimeout() - this.setTimeout(this.onEnd, 100) - - const { values, ...rest } = getPointerEventData(event) - - if (!this.getState().active) { - const startState = this.getStartState({ args: this.args, event, values }) - this.updateState({ moving: true, ...rest }, startState, GESTURE_ONSTART) - } else { - const kinematics = this.getKinematics({ values, event }) - this.updateState(rest, { ...kinematics, first: false }, GESTURE_ONCHANGE) - } - } - - onEnd = () => { - if (!this.getState().active) return - this.updateState({ moving: false }, { ...genericEndState, velocity: 0, velocities: [0, 0] }, GESTURE_ONEND) - } - - getEventBindings = () => { - if (this.hasPointerEvents()) { - return [['onPointerMove', this.onChange]] - } - return [['onMouseMove', this.onChange]] - } -} diff --git a/src/recognizers/MoveRecognizer.ts b/src/recognizers/MoveRecognizer.ts new file mode 100644 index 000000000..0f2d47eb8 --- /dev/null +++ b/src/recognizers/MoveRecognizer.ts @@ -0,0 +1,41 @@ +import CoordinatesRecognizer from './CoordinatesRecognizer' +import { getPointerEventData } from '../utils' +import GestureController from '../controllers/GestureController' +import { TransformedEvent, GestureFlag, ReactEventHandlerKey } from '../../types/events.d' +import { genericEndState } from '../defaults' +import { Fn } from '../../types/common.d' + +export default class MoveRecognizer extends CoordinatesRecognizer { + constructor(controller: GestureController, args: any[]) { + super('move', controller, args) + } + + onChange = (event: TransformedEvent): void => { + if (!this.isEnabled()) return + + this.clearTimeout() + this.setTimeout(this.onEnd, 100) + + const { values, ...rest } = getPointerEventData(event) + + if (!this.getState().active) { + const startState = this.getStartState({ args: this.args, event, values }) + this.updateState({ moving: true, ...rest }, startState, GestureFlag.OnStart) + } else { + const kinematics = this.getKinematics({ values, event }) + this.updateState(rest, { ...kinematics, first: false }, GestureFlag.OnChange) + } + } + + onEnd = (): void => { + if (!this.getState().active) return + this.updateState({ moving: false }, { ...genericEndState, velocity: 0, velocities: [0, 0] }, GestureFlag.OnEnd) + } + + getEventBindings(): [ReactEventHandlerKey | ReactEventHandlerKey[], Fn][] { + if (this.hasPointerEvents()) { + return [['onPointerMove', this.onChange]] + } + return [['onMouseMove', this.onChange]] + } +} diff --git a/src/recognizers/PinchRecognizer.js b/src/recognizers/PinchRecognizer.ts similarity index 55% rename from src/recognizers/PinchRecognizer.js rename to src/recognizers/PinchRecognizer.ts index 5fa4b3bff..f44d88d0a 100644 --- a/src/recognizers/PinchRecognizer.js +++ b/src/recognizers/PinchRecognizer.ts @@ -1,13 +1,16 @@ import DistanceAngleRecognizer from './DistanceAngleRecognizer' -import { noop, getTwoTouchesEventData, GESTURE_ONCHANGE, GESTURE_ONSTART, GESTURE_ONEND } from '../utils' -import { genericEndState } from '../default' - -export default class PinchRecognizer extends DistanceAngleRecognizer { - constructor(...args) { - super('pinch', ...args) +import { noop, getTwoTouchesEventData } from '../utils' +import GestureController from '../controllers/GestureController' +import { TransformedEvent, GestureFlag, ReactEventHandlerKey } from '../../types/events.d' +import { genericEndState } from '../defaults' +import { Fn } from '../../types/common.d' + +export default class PinchRecognizer extends DistanceAngleRecognizer { + constructor(controller: GestureController, args: any[]) { + super('pinch', controller, args) } - onStart = event => { + onStart = (event: TransformedEvent): void => { if (!this.isEnabled() || event.touches.length !== 2) return const { values, origin, ...rest } = getTwoTouchesEventData(event) @@ -16,11 +19,11 @@ export default class PinchRecognizer extends DistanceAngleRecognizer { this.updateState( { ...rest, pinching: true, down: true }, { ...startState, origin, cancel: () => this.onCancel(event) }, - GESTURE_ONSTART + GestureFlag.OnStart ) } - onChange = event => { + onChange = (event: TransformedEvent): void => { const { canceled, active } = this.getState() if (canceled || !active || event.touches.length !== 2) return @@ -29,20 +32,20 @@ export default class PinchRecognizer extends DistanceAngleRecognizer { const kinematics = this.getKinematics({ values, event }) const cancel = () => this.onCancel(event) - this.updateState(rest, { ...kinematics, origin, first: false, cancel }, GESTURE_ONCHANGE) + this.updateState(rest, { ...kinematics, origin, first: false, cancel }, GestureFlag.OnChange) } - onEnd = event => { + onEnd = (event: TransformedEvent): void => { if (!this.getState().active) return - this.updateState({ pinching: false, down: false, touches: 0 }, { ...genericEndState, event }, GESTURE_ONEND) + this.updateState({ pinching: false, down: false, touches: 0 }, { ...genericEndState, event }, GestureFlag.OnEnd) } - onCancel = event => { + onCancel = (event: TransformedEvent): void => { this.updateState(null, { canceled: true, cancel: noop }) requestAnimationFrame(() => this.onEnd(event)) } - getEventBindings = () => { + getEventBindings(): [ReactEventHandlerKey | ReactEventHandlerKey[], Fn][] { return [['onTouchStart', this.onStart], ['onTouchMove', this.onChange], [['onTouchEnd', 'onTouchCancel'], this.onEnd]] } } diff --git a/src/recognizers/PinchWebKitGestureRecognizer.js b/src/recognizers/PinchWebKitGestureRecognizer.js deleted file mode 100644 index 5741e78fe..000000000 --- a/src/recognizers/PinchWebKitGestureRecognizer.js +++ /dev/null @@ -1,59 +0,0 @@ -import DistanceAngleRecognizer from './DistanceAngleRecognizer' -import { noop, getTwoTouchesEventData, GESTURE_ONCHANGE, GESTURE_ONSTART, GESTURE_ONEND } from '../utils' -import { genericEndState } from '../default' - -const SCALE_FACTOR = 260 - -export default class PinchWebKitGestureRecognizer extends DistanceAngleRecognizer { - constructor(...args) { - super('pinch', ...args) - } - - onStart = event => { - if (!this.isEnabled()) return - event.preventDefault() - - const da = [event.scale * SCALE_FACTOR, event.rotation] - - const startState = this.getStartState({ args: this.args, event, values: da }) - this.updateState({ pinching: true, down: true, touches: 2 }, { ...startState, cancel: () => this.onCancel(event) }, GESTURE_ONSTART) - } - - onChange = event => { - const { canceled, active } = this.getState() - if (canceled || !active) return - event.preventDefault() - - const da = [event.scale * SCALE_FACTOR, event.rotation] - - const kinematics = this.getKinematics({ values: da, event }) - const cancel = () => this.onCancel(event) - - this.updateState(null, { ...kinematics, first: false, cancel }, GESTURE_ONCHANGE) - } - - onEnd = event => { - if (!this.getState().active) return - event.preventDefault() - this.updateState({ pinching: false, down: false, touches: 0 }, { ...genericEndState, event }, GESTURE_ONEND) - } - - onCancel = event => { - this.updateState(null, { canceled: true, cancel: noop }) - requestAnimationFrame(() => this.onEnd(event)) - } - - updateTouchData = event => { - const { origin } = getTwoTouchesEventData(event) - this.updateState(null, { origin }) - } - - getEventBindings = () => { - return [ - ['onGestureStart', this.onStart], - ['onGestureChange', this.onChange], - [['onGestureEnd', 'onTouchCancel'], this.onEnd], - [['onTouchStart', 'onTouchMove'], this.updateTouchData] - ] - } -} diff --git a/src/recognizers/PinchWebKitGestureRecognizer.ts b/src/recognizers/PinchWebKitGestureRecognizer.ts new file mode 100644 index 000000000..255c17806 --- /dev/null +++ b/src/recognizers/PinchWebKitGestureRecognizer.ts @@ -0,0 +1,62 @@ +import DistanceAngleRecognizer from './DistanceAngleRecognizer' +import { noop, getTwoTouchesEventData } from '../utils' +import GestureController from '../controllers/GestureController' +import { TransformedEvent, GestureFlag, ReactEventHandlerKey, GestureEvent } from '../../types/events.d' +import { genericEndState } from '../defaults' +import { Fn, Vector2 } from '../../types/common.d' + +const SCALE_FACTOR = 260 + +export default class PinchWebKitGestureRecognizer extends DistanceAngleRecognizer { + constructor(controller: GestureController, args: any[]) { + super('pinch', controller, args) + } + + onStart = (event: TransformedEvent): void => { + if (!this.isEnabled()) return + event.preventDefault() + + const da: Vector2 = [event.scale * SCALE_FACTOR, event.rotation] + + const startState = this.getStartState({ values: da, args: this.args, event }) + this.updateState({ pinching: true, down: true, touches: 2 }, { ...startState, cancel: () => this.onCancel(event) }, GestureFlag.OnStart) + } + + onChange = (event: TransformedEvent): void => { + const { canceled, active } = this.getState() + if (canceled || !active) return + event.preventDefault() + + const da: Vector2 = [event.scale * SCALE_FACTOR, event.rotation] + + const kinematics = this.getKinematics({ values: da, event }) + const cancel = () => this.onCancel(event) + + this.updateState(null, { ...kinematics, first: false, cancel }, GestureFlag.OnChange) + } + + onEnd = (event: TransformedEvent): void => { + if (!this.getState().active) return + event.preventDefault() + this.updateState({ pinching: false, down: false, touches: 0 }, { ...genericEndState, event }, GestureFlag.OnEnd) + } + + onCancel = (event: TransformedEvent): void => { + this.updateState(null, { canceled: true, cancel: noop }) + requestAnimationFrame(() => this.onEnd(event)) + } + + updateTouchData = (event: TransformedEvent): void => { + const { origin } = getTwoTouchesEventData(event) + this.updateState(null, { origin }) + } + + getEventBindings(): [ReactEventHandlerKey | ReactEventHandlerKey[], Fn][] { + return [ + ['onGestureStart', this.onStart], + ['onGestureChange', this.onChange], + [['onGestureEnd', 'onTouchCancel'], this.onEnd], + [['onTouchStart', 'onTouchMove'], this.updateTouchData], + ] + } +} diff --git a/src/recognizers/PinchWheelRecognizer.js b/src/recognizers/PinchWheelRecognizer.js deleted file mode 100644 index b90594b24..000000000 --- a/src/recognizers/PinchWheelRecognizer.js +++ /dev/null @@ -1,37 +0,0 @@ -import DistanceAngleRecognizer from './DistanceAngleRecognizer' -import { getWheelEventData, GESTURE_ONCHANGE, GESTURE_ONSTART, GESTURE_ONEND } from '../utils' -import { genericEndState } from '../default' - -export default class PinchWheelRecognizer extends DistanceAngleRecognizer { - constructor(...args) { - super('pinch', ...args) - } - - onChange = event => { - if (!this.isEnabled() || !event.ctrlKey) return - event.preventDefault() - - this.clearTimeout() - this.setTimeout(this.onEnd, 100) - - const { values, ...rest } = getWheelEventData(event) - const d = this.getState().values[0] - values[1] - - if (!this.getState().active) { - const startState = this.getStartState({ args: this.args, event, values: [d, 0] }) - this.updateState({ pinching: true, ...rest }, startState, GESTURE_ONSTART) - } else { - const kinematics = this.getKinematics({ values: [d], event }) - this.updateState(rest, { ...kinematics, first: false }, GESTURE_ONCHANGE) - } - } - - onEnd = () => { - if (!this.getState().active) return - this.updateState({ pinching: false, down: false, touches: 0 }, { ...genericEndState }, GESTURE_ONEND) - } - - getEventBindings = () => { - return [['onWheel', this.onChange]] - } -} diff --git a/src/recognizers/PinchWheelRecognizer.ts b/src/recognizers/PinchWheelRecognizer.ts new file mode 100644 index 000000000..575854025 --- /dev/null +++ b/src/recognizers/PinchWheelRecognizer.ts @@ -0,0 +1,40 @@ +import DistanceAngleRecognizer from './DistanceAngleRecognizer' +import { getWheelEventData } from '../utils' +import GestureController from '../controllers/GestureController' +import { TransformedEvent, GestureFlag, ReactEventHandlerKey } from '../../types/events.d' +import { genericEndState } from '../defaults' +import { Fn } from '../../types/common.d' + +export default class PinchWheelRecognizer extends DistanceAngleRecognizer { + constructor(controller: GestureController, args: any[]) { + super('pinch', controller, args) + } + + onChange = (event: TransformedEvent): void => { + if (!this.isEnabled() || !event.ctrlKey) return + event.preventDefault() + + this.clearTimeout() + this.setTimeout(this.onEnd, 100) + + const { values, ...rest } = getWheelEventData(event) + const d = this.getState().values[0] - values[1] + + if (!this.getState().active) { + const startState = this.getStartState({ args: this.args, event, values: [d, 0] }) + this.updateState({ pinching: true, ...rest }, startState, GestureFlag.OnStart) + } else { + const kinematics = this.getKinematics({ values: [d, undefined], event }) + this.updateState(rest, { ...kinematics, first: false }, GestureFlag.OnChange) + } + } + + onEnd = (): void => { + if (!this.getState().active) return + this.updateState({ pinching: false, down: false, touches: 0 }, { ...genericEndState }, GestureFlag.OnEnd) + } + + getEventBindings(): [ReactEventHandlerKey | ReactEventHandlerKey[], Fn][] { + return [['onWheel', this.onChange]] + } +} diff --git a/src/recognizers/Recognizer.js b/src/recognizers/Recognizer.js deleted file mode 100644 index c042efd4b..000000000 --- a/src/recognizers/Recognizer.js +++ /dev/null @@ -1,71 +0,0 @@ -import { initialState } from '../default' - -export default class Recognizer { - handler = null - args = [] - gestureKey = '' - stateKey = '' - actionKey = '' - - constructor(gestureKey, handler, args = []) { - this.gestureKey = gestureKey - this.stateKey = gestureKey - this.actionKey = 'on' + gestureKey.charAt(0).toUpperCase() + gestureKey.slice(1) - this.handler = handler - this.args = args - } - - isEnabled = () => this.handler.config.enabled && this.handler.config[this.gestureKey] - - setTimeout = (...args) => { - this.handler.timeouts[this.stateKey] = setTimeout(...args) - } - - clearTimeout = () => { - clearTimeout(this.handler.timeouts[this.stateKey]) - } - - getState = () => this.handler.state[this.stateKey] - getSharedState = () => this.handler.state.shared - hasPointerEvents = () => this.handler.config.pointerEvents - getEnabledConfig = () => this.handler.config.enabled - getTransformConfig = () => this.handler.config.transform - - addWindowListeners = listeners => { - this.handler.addWindowListeners(this.stateKey, listeners) - } - - removeWindowListeners = () => { - this.handler.removeWindowListeners(this.stateKey) - } - - // TS should be abstract - getEventBindings = () => {} - - updateState = (sharedState, gestureState, flag) => { - if (flag) this.handler.updateState(sharedState, gestureState, this.stateKey, this.actionKey, flag) - else this.handler.updateState(sharedState, gestureState, this.stateKey) - } - - getStartState = ({ values, args, event }) => { - const state = this.getState() - const initial = initialState[this.stateKey] - const transform = state.transform || event.transform || this.getTransformConfig() - const lastLocal = state.local || initial.local - - return { - ...initial, - event, - values, - initial: values, - previous: values, - local: lastLocal, - lastLocal, - first: true, - active: true, - transform, - time: event.timeStamp, - args - } - } -} diff --git a/src/recognizers/Recognizer.ts b/src/recognizers/Recognizer.ts new file mode 100644 index 000000000..9329980ef --- /dev/null +++ b/src/recognizers/Recognizer.ts @@ -0,0 +1,85 @@ +import { initialState, mappedKeys } from '../defaults' +import GestureController from '../controllers/GestureController' +import { Coordinates, DistanceAngle, StateKey, GestureState, GestureKey, SharedGestureState } from '../../types/states.d' +import { Fn, Vector2, TransformType } from '../../types/common.d' +import { ReactEventHandlerKey, GestureFlag, TransformedEvent, ReactEventHandlers } from '../../types/events.d' + +export default abstract class Recognizer { + protected stateKey: StateKey + + //Todo Fix handler any + constructor( + protected readonly gestureKey: GestureKey, + protected readonly controller: GestureController, + protected readonly args: any[] = [] + ) { + this.stateKey = mappedKeys[gestureKey].stateKey + } + + protected isEnabled = (): boolean => { + return this.controller.config.enabled && this.controller.config[this.gestureKey] + } + + protected setTimeout = (callback: (...args: any[]) => void, ms: number, ...args: any[]): void => { + this.controller.timeouts[this.stateKey] = window.setTimeout(callback, ms, ...args) + } + + protected clearTimeout = () => { + clearTimeout(this.controller.timeouts[this.stateKey]) + } + + protected getState = (): GestureState => this.controller.state[this.stateKey] as GestureState + protected getSharedState = () => this.controller.state.shared + protected hasPointerEvents = () => this.controller.config.pointerEvents + protected getEnabledConfig = () => this.controller.config.enabled + protected getTransformConfig = () => this.controller.config.transform + + protected addWindowListeners = (listeners: [string, Fn][]) => { + this.controller.addWindowListeners(this.stateKey, listeners) + } + + protected removeWindowListeners = () => { + this.controller.removeWindowListeners(this.stateKey) + } + + public abstract getEventBindings(): [ReactEventHandlerKey | ReactEventHandlerKey[], Fn][] + + protected updateState = ( + sharedState: Partial | null, + gestureState: Partial>, + gestureFlag?: GestureFlag + ): void => { + if (gestureFlag) this.controller.updateState(sharedState, gestureState, this.gestureKey, gestureFlag) + else this.controller.updateState(sharedState, gestureState, this.gestureKey) + } + + protected getStartState = ({ + values, + event, + args, + }: { + values: Vector2 + event: TransformedEvent + args: any[] + }): GestureState => { + const state = this.getState() + const initial = initialState[this.stateKey] + const transform: TransformType = state.transform || event.transform || this.getTransformConfig() + const lastLocal = state.local || initial.local + + return >{ + ...(initial as object), + event, + values, + initial: values, + previous: values, + local: lastLocal, + lastLocal, + first: true, + active: true, + transform, + time: event.timeStamp, + args, + } + } +} diff --git a/src/recognizers/ScrollRecognizer.js b/src/recognizers/ScrollRecognizer.js deleted file mode 100644 index 47969e8bf..000000000 --- a/src/recognizers/ScrollRecognizer.js +++ /dev/null @@ -1,35 +0,0 @@ -import CoordinatesRecognizer from './CoordinatesRecognizer' -import { getScrollEventData, GESTURE_ONCHANGE, GESTURE_ONSTART, GESTURE_ONEND } from '../utils' -import { genericEndState } from '../default' - -export default class ScrollRecognizer extends CoordinatesRecognizer { - constructor(...args) { - super('scroll', ...args) - } - - onChange = event => { - if (!this.isEnabled()) return - - this.clearTimeout() - this.setTimeout(this.onEnd, 100) - - const { values, ...rest } = getScrollEventData(event) - - if (!this.getState().active) { - const startState = this.getStartState({ args: this.args, event, values }) - this.updateState({ scrolling: true, ...rest }, startState, GESTURE_ONSTART) - } else { - const kinematics = this.getKinematics({ values, event }) - this.updateState(rest, { ...kinematics, first: false }, GESTURE_ONCHANGE) - } - } - - onEnd = () => { - if (!this.getState().active) return - this.updateState({ scrolling: false }, { ...genericEndState, velocity: 0, velocities: [0, 0] }, GESTURE_ONEND) - } - - getEventBindings = () => { - return [['onScroll', this.onChange]] - } -} diff --git a/src/recognizers/ScrollRecognizer.ts b/src/recognizers/ScrollRecognizer.ts new file mode 100644 index 000000000..06b81f698 --- /dev/null +++ b/src/recognizers/ScrollRecognizer.ts @@ -0,0 +1,38 @@ +import CoordinatesRecognizer from './CoordinatesRecognizer' +import { getScrollEventData } from '../utils' +import GestureController from '../controllers/GestureController' +import { TransformedEvent, GestureFlag, ReactEventHandlerKey } from '../../types/events.d' +import { genericEndState } from '../defaults' +import { Fn } from '../../types/common.d' + +export default class ScrollRecognizer extends CoordinatesRecognizer { + constructor(controller: GestureController, args: any[]) { + super('scroll', controller, args) + } + + onChange = (event: TransformedEvent): void => { + if (!this.isEnabled()) return + + this.clearTimeout() + this.setTimeout(this.onEnd, 100) + + const { values, ...rest } = getScrollEventData(event) + + if (!this.getState().active) { + const startState = this.getStartState({ args: this.args, event, values }) + this.updateState({ scrolling: true, ...rest }, startState, GestureFlag.OnStart) + } else { + const kinematics = this.getKinematics({ values, event }) + this.updateState(rest, { ...kinematics, first: false }, GestureFlag.OnChange) + } + } + + onEnd = (): void => { + if (!this.getState().active) return + this.updateState({ scrolling: false }, { ...genericEndState, velocity: 0, velocities: [0, 0] }, GestureFlag.OnEnd) + } + + getEventBindings(): [ReactEventHandlerKey | ReactEventHandlerKey[], Fn][] { + return [['onScroll', this.onChange]] + } +} diff --git a/src/recognizers/WheelRecognizer.js b/src/recognizers/WheelRecognizer.js deleted file mode 100644 index 2a1dcb465..000000000 --- a/src/recognizers/WheelRecognizer.js +++ /dev/null @@ -1,36 +0,0 @@ -import CoordinatesRecognizer from './CoordinatesRecognizer' -import { addV, getWheelEventData, GESTURE_ONCHANGE, GESTURE_ONSTART, GESTURE_ONEND } from '../utils' -import { genericEndState } from '../default' - -export default class WheelRecognizer extends CoordinatesRecognizer { - constructor(...args) { - super('wheel', ...args) - } - - onChange = event => { - if (!this.isEnabled()) return - - this.clearTimeout() - this.setTimeout(this.onEnd, 100) - - const { values: eventValues, ...rest } = getWheelEventData(event) - const values = addV(eventValues, this.getState().values) - - if (!this.getState().active) { - const startState = this.getStartState({ args: this.args, event, values }) - this.updateState({ wheeling: true, ...rest }, startState, GESTURE_ONSTART) - } else { - const kinematics = this.getKinematics({ values, event }) - this.updateState(rest, { ...kinematics, first: false }, GESTURE_ONCHANGE) - } - } - - onEnd = () => { - if (!this.getState().active) return - this.updateState({ wheeling: false }, { ...genericEndState, velocity: 0, velocities: [0, 0] }, GESTURE_ONEND) - } - - getEventBindings = () => { - return [['onWheel', this.onChange]] - } -} diff --git a/src/recognizers/WheelRecognizer.ts b/src/recognizers/WheelRecognizer.ts new file mode 100644 index 000000000..80e28e04a --- /dev/null +++ b/src/recognizers/WheelRecognizer.ts @@ -0,0 +1,39 @@ +import CoordinatesRecognizer from './CoordinatesRecognizer' +import { addV, getWheelEventData } from '../utils' +import GestureController from '../controllers/GestureController' +import { TransformedEvent, GestureFlag, ReactEventHandlerKey } from '../../types/events.d' +import { genericEndState } from '../defaults' +import { Fn } from '../../types/common.d' + +export default class WheelRecognizer extends CoordinatesRecognizer { + constructor(controller: GestureController, args: any[]) { + super('wheel', controller, args) + } + + onChange = (event: TransformedEvent): void => { + if (!this.isEnabled()) return + + this.clearTimeout() + this.setTimeout(this.onEnd, 100) + + const { values: eventValues, ...rest } = getWheelEventData(event) + const values = addV(eventValues, this.getState().values) + + if (!this.getState().active) { + const startState = this.getStartState({ args: this.args, event, values }) + this.updateState({ wheeling: true, ...rest }, startState, GestureFlag.OnStart) + } else { + const kinematics = this.getKinematics({ values, event }) + this.updateState(rest, { ...kinematics, first: false }, GestureFlag.OnChange) + } + } + + onEnd = (): void => { + if (!this.getState().active) return + this.updateState({ wheeling: false }, { ...genericEndState, velocity: 0, velocities: [0, 0] }, GestureFlag.OnEnd) + } + + getEventBindings(): [ReactEventHandlerKey | ReactEventHandlerKey[], Fn][] { + return [['onWheel', this.onChange]] + } +} diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index f3fe65af4..000000000 --- a/src/utils.js +++ /dev/null @@ -1,102 +0,0 @@ -export const GESTURE_ONCHANGE = 'GESTURE_ONCHANGE' -export const GESTURE_ONEND = 'GESTURE_ONEND' -export const GESTURE_ONSTART = 'GESTURE_ONSTART' - -export const noop = () => {} - -// vector add -export const addV = (v1, v2) => v1.map((v, i) => v + v2[i]) - -// vector substract -export const subV = (v1, v2) => v1.map((v, i) => v - v2[i]) - -const setListeners = add => (el, listeners, options) => { - const action = add ? 'addEventListener' : 'removeEventListener' - listeners.forEach(([type, fn]) => el[action](type, fn, options)) -} - -export const addListeners = setListeners(true) -export const removeListeners = setListeners(false) - -export function getModifierKeys(event) { - const { shiftKey, altKey, metaKey, ctrlKey } = event - return { shiftKey, altKey, metaKey, ctrlKey } -} - -export function getScrollEventData(event) { - // If the currentTarget is the window then we return the scrollX/Y position. - // If not (ie the currentTarget is a DOM element), then we return scrollLeft/Top - const { scrollX, scrollY, scrollLeft, scrollTop } = event.currentTarget - return { values: [scrollX || scrollLeft || 0, scrollY || scrollTop || 0], ...getModifierKeys(event) } -} - -export function getWheelEventData({ deltaX, deltaY, ...rest }) { - //TODO implement polyfill ? - // https://developer.mozilla.org/en-US/docs/Web/Events/wheel#Polyfill - return { values: [deltaX, deltaY], ...getModifierKeys(rest) } -} - -export function getPointerEventData(event) { - const { touches, buttons, changedTouches } = event - const touchEvents = touches && touches.length > 0 ? touches : changedTouches && changedTouches.length > 0 ? changedTouches : null - const { clientX, clientY } = touchEvents ? touchEvents[0] : event - const down = (touchEvents && touchEvents.length > 0) || buttons > 0 - return { - values: [clientX, clientY], - touches: (touchEvents && touchEvents.length) || 0, - down, - buttons, - ...getModifierKeys(event) - } -} - -export function getTwoTouchesEventData(event) { - const { touches } = event - const dx = touches[1].clientX - touches[0].clientX - const dy = touches[1].clientY - touches[0].clientY - - const da = [Math.hypot(dx, dy), -(Math.atan2(dx, dy) * 180) / Math.PI] - const origin = [(touches[1].clientX + touches[0].clientX) / 2, (touches[1].clientY + touches[0].clientY) / 2] - - return { - values: da, - origin, - touches: 2, - down: touches > 0, - ...getModifierKeys(event) - } -} - -export const calculateVelocity = (diff, delta_t, len) => { - len = len || Math.hypot(...diff) - return delta_t ? len / delta_t : 0 -} - -export const calculateVelocities = (diff, delta_t) => { - return delta_t ? diff.map(v => v / delta_t) : Array(diff.length).fill(0) -} - -export const calculateDistance = delta => Math.hypot(...delta) -export const calculateDirection = (diff, len) => { - len = len || Math.hypot(...diff) || 1 - return diff.map(v => v / len) -} - -export const calculateAllKinematics = (delta, diff, delta_t) => { - const len = Math.hypot(...diff) - - return { - velocities: calculateVelocities(diff, delta_t), - velocity: calculateVelocity(diff, delta_t, len), - distance: calculateDistance(delta), - direction: calculateDirection(diff, len) - } -} - -export const supportsGestureEvent = () => { - try { - return 'constructor' in GestureEvent // eslint-disable-line no-undef - } catch (e) { - return false - } -} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 000000000..0b668cfa7 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,124 @@ +import { Fn, Vector2 } from '../types/common.d' +import { EventOptions } from '../types/config.d' +import { Coordinates, FullGestureState, DistanceAngle } from '../types/states.d' +import { TransformedEvent } from '../types/events.d' + +export const noop = () => {} + +// returns a function that chains all functions given as parameters +export const chainFns = (...fns: Fn[]): Fn => (...args: any[]) => fns.forEach(fn => fn(...args)) + +// vector add +export const addV = (v1: T, v2: T): T => v1.map((v, i) => v + v2[i]) + +// vector substract +export const subV = (v1: T, v2: T): T => v1.map((v, i) => v - v2[i]) + +const setListeners = (add: boolean) => (el: EventTarget, listeners: [string, Fn][], options: EventOptions): void => { + const action = add ? 'addEventListener' : 'removeEventListener' + listeners.forEach(([type, fn]) => el[action](type, fn, options)) +} + +export const addListeners = setListeners(true) +export const removeListeners = setListeners(false) + +interface ModifierKeys { + shiftKey: boolean + altKey: boolean + metaKey: boolean + ctrlKey: boolean +} + +export function getModifierKeys(event: TransformedEvent): ModifierKeys { + const { shiftKey, altKey, metaKey, ctrlKey } = event + return { shiftKey, altKey, metaKey, ctrlKey } +} +type ScrollEventData = Pick, 'values'> & ModifierKeys + +export function getScrollEventData(event: TransformedEvent): ScrollEventData { + // If the currentTarget is the window then we return the scrollX/Y position. + // If not (ie the currentTarget is a DOM element), then we return scrollLeft/Top + const { scrollX, scrollY, scrollLeft, scrollTop } = event.currentTarget + return { values: [scrollX || scrollLeft || 0, scrollY || scrollTop || 0], ...getModifierKeys(event) } +} + +type WheelEventData = Pick, 'values'> & ModifierKeys + +export function getWheelEventData(event: TransformedEvent): WheelEventData { + const { deltaX, deltaY } = event + //TODO implement polyfill ? + // https://developer.mozilla.org/en-US/docs/Web/Events/wheel#Polyfill + return { values: [deltaX, deltaY], ...getModifierKeys(event) } +} +type PointerEventData = Pick, 'values' | 'touches' | 'down' | 'buttons'> & ModifierKeys + +export function getPointerEventData(event: MouseEvent | TouchEvent | PointerEvent): PointerEventData { + const { touches, buttons, changedTouches } = event as any + const touchEvents = touches && touches.length > 0 ? touches : changedTouches && changedTouches.length > 0 ? changedTouches : null + const { clientX, clientY } = touchEvents ? touchEvents[0] : event + const down = (touchEvents && touchEvents.length > 0) || buttons > 0 + return { + values: [clientX, clientY], + touches: (touchEvents && touchEvents.length) || 0, + down, + buttons, + ...getModifierKeys(event), + } +} + +type TwoTouchesEventData = Pick, 'values' | 'touches' | 'down' | 'origin'> & ModifierKeys + +export function getTwoTouchesEventData(event: TouchEvent): TwoTouchesEventData { + const { touches } = event + const dx = touches[1].clientX - touches[0].clientX + const dy = touches[1].clientY - touches[0].clientY + + const da: Vector2 = [Math.hypot(dx, dy), -(Math.atan2(dx, dy) * 180) / Math.PI] + const origin: Vector2 = [(touches[1].clientX + touches[0].clientX) / 2, (touches[1].clientY + touches[0].clientY) / 2] + + return { values: da, origin, touches: 2, down: touches.length > 0, ...getModifierKeys(event) } +} + +export const calculateVelocity = (diff: number[], delta_t: number, len: number): number => { + len = len || Math.hypot(...diff) + return delta_t ? len / delta_t : 0 +} + +export const calculateVelocities = (diff: T, delta_t: number): T => { + return delta_t ? diff.map(v => v / delta_t) : Array(diff.length).fill(0) +} + +export const calculateDistance = (delta: number[]): number => Math.hypot(...delta) + +export const calculateDirection = (diff: T, len: number): T => { + len = len || Math.hypot(...diff) || 1 + return diff.map(v => v / len) +} + +interface Kinematics { + velocities: T + velocity: number + distance: number + direction: T +} + +export const calculateAllKinematics = (delta: T, diff: T, delta_t: number): Kinematics => { + const len = Math.hypot(...diff) + + return { + velocities: calculateVelocities(diff, delta_t), + velocity: calculateVelocity(diff, delta_t, len), + distance: calculateDistance(delta), + direction: calculateDirection(diff, len), + } +} + +export const supportsGestureEvent = (): boolean => { + try { + // TODO [TS] possibly find GestureEvent definitions? + // @ts-ignore: Unreachable code error + return 'constructor' in GestureEvent + } catch (e) { + return false + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..381c91ec7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "include": ["src", "types"], + "compilerOptions": { + "target": "es2017", + "moduleResolution": "node", + "outDir": "./dist", + "allowJs": true, + "preserveSymlinks": true, + "jsx": "react", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strict": true + } +} diff --git a/types/common.d.ts b/types/common.d.ts new file mode 100644 index 000000000..ca819af39 --- /dev/null +++ b/types/common.d.ts @@ -0,0 +1,7 @@ +export type Omit = Pick> +export type AtLeastOneOf }> = Partial & U[keyof U] + +export type Vector2 = [number, number] +export type DomTargetRef = { current: EventTarget } +export type Fn = (...args: any[]) => any +export type TransformType = { x(x: number): number; y(y: number): number } diff --git a/types/config.d.ts b/types/config.d.ts new file mode 100644 index 000000000..ce16b6510 --- /dev/null +++ b/types/config.d.ts @@ -0,0 +1,19 @@ +import { DomTargetRef, TransformType } from './common.d' +import React from 'react' + +export type EventOptions = { capture: boolean; passive: boolean } + +export interface GestureConfig { + domTarget?: EventTarget | React.RefObject | null + event: EventOptions + window?: EventTarget | null + pointerEvents: boolean + transform: TransformType + enabled: boolean + drag: boolean + pinch: boolean + scroll: boolean + wheel: boolean + hover: boolean + move: boolean +} diff --git a/types/events.d.ts b/types/events.d.ts new file mode 100644 index 000000000..bc97cf891 --- /dev/null +++ b/types/events.d.ts @@ -0,0 +1,75 @@ +import { MouseEventHandler, PointerEventHandler, UIEventHandler, WheelEventHandler, TouchEventHandler } from 'react' +import { TransformType, Fn } from './common.d' + +export enum GestureFlag { + OnStart = 'start', + OnChange = 'change', + OnEnd = 'end', +} + +export type GestureEvent = PointerEvent & { scale: number; rotation: number } +export type TransformedEvent = T & { + transform?: TransformType +} + +export interface ReactEventHandlers { + // Mouse Events + onMouseDown?: MouseEventHandler + onMouseDownCapture?: MouseEventHandler + onMouseEnter?: MouseEventHandler + onMouseLeave?: MouseEventHandler + onMouseMove?: MouseEventHandler + onMouseMoveCapture?: MouseEventHandler + onMouseOut?: MouseEventHandler + onMouseOutCapture?: MouseEventHandler + onMouseOver?: MouseEventHandler + onMouseOverCapture?: MouseEventHandler + onMouseUp?: MouseEventHandler + onMouseUpCapture?: MouseEventHandler + // Touch Events + onTouchCancel?: TouchEventHandler + onTouchCancelCapture?: TouchEventHandler + onTouchEnd?: TouchEventHandler + onTouchEndCapture?: TouchEventHandler + onTouchMove?: TouchEventHandler + onTouchMoveCapture?: TouchEventHandler + onTouchStart?: TouchEventHandler + onTouchStartCapture?: TouchEventHandler + + // Pointer Events + onPointerDown?: PointerEventHandler + onPointerDownCapture?: PointerEventHandler + onPointerMove?: PointerEventHandler + onPointerMoveCapture?: PointerEventHandler + onPointerUp?: PointerEventHandler + onPointerUpCapture?: PointerEventHandler + onPointerCancel?: PointerEventHandler + onPointerCancelCapture?: PointerEventHandler + onPointerEnter?: PointerEventHandler + onPointerEnterCapture?: PointerEventHandler + onPointerLeave?: PointerEventHandler + onPointerLeaveCapture?: PointerEventHandler + onPointerOver?: PointerEventHandler + onPointerOverCapture?: PointerEventHandler + onPointerOut?: PointerEventHandler + onPointerOutCapture?: PointerEventHandler + onGotPointerCapture?: PointerEventHandler + onGotPointerCaptureCapture?: PointerEventHandler + onLostPointerCapture?: PointerEventHandler + onLostPointerCaptureCapture?: PointerEventHandler + + // UI Events + onScroll?: UIEventHandler + onScrollCapture?: UIEventHandler + + // Wheel Events + onWheel?: WheelEventHandler + onWheelCapture?: WheelEventHandler + + // Cheat mode for Gesture Events + onGestureStart?: Fn + onGestureChange?: Fn + onGestureEnd?: Fn +} + +export type ReactEventHandlerKey = keyof ReactEventHandlers diff --git a/types/index.d.ts b/types/index.d.ts index 21c1581cf..f9bacfbd8 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,114 +1,24 @@ -// TypeScript Version: 3.0 -import * as React from 'react' - -// Helper type, taken from: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html -export type Omit = Pick> -export type AtLeastOne }> = Partial & U[keyof U] - -export type vector2 = [number, number] - -export interface CommonGestureState { - hovering?: boolean - scrolling?: boolean - dragging?: boolean - moving?: boolean - pinching?: boolean - touches?: number - down?: boolean - buttons?: number - shiftKey?: boolean - altKey?: boolean - metaKey?: boolean - ctrlKey?: boolean - event: MouseEvent | TouchEvent - values: vector2 - velocities: vector2 - delta: vector2 - initial: vector2 - previous: vector2 - transform(): vector2 - local: vector2 - lastLocal: vector2 - first: boolean - last: boolean - active: boolean - time: number - temp: any - cancel?(): void - canceled: boolean - args: any -} - -export interface CoordinatesGestureState extends CommonGestureState { - xy: vector2 - velocity: number - vxvy: vector2 - distance: number - direction: vector2 -} - -export interface DistanceAngleGestureState extends CommonGestureState { - da: vector2 - vdva: vector2 - origin: vector2 - turns: number -} - -export interface EventConfig { - passive: boolean - capture: boolean - pointerEvents: boolean +import { DistanceAngle, FullGestureState, Coordinates } from './states.d' + +export type Handler = (state: FullGestureState) => any +export type HandlerKey = 'onDrag' | 'onPinch' | 'onMove' | 'onHover' | 'onScroll' | 'onWheel' + +export type GestureHandlers = { + onAction: Handler + onDrag: Handler + onDragStart: Handler + onDragEnd: Handler + onHover: Handler + onMove: Handler + onMoveStart: Handler + onMoveEnd: Handler + onScroll: Handler + onScrollStart: Handler + onScrollEnd: Handler + onWheel: Handler + onWheelStart: Handler + onWheelEnd: Handler + onPinch: Handler + onPinchStart: Handler + onPinchEnd: Handler } - -export interface GestureConfig { - domTarget: EventTarget - event: Partial - window: EventTarget - transform(): vector2 - enabled: boolean - drag: boolean - pinch: boolean - scroll: boolean - wheel: boolean - hover: boolean - move: boolean -} - -export type CoordinatesHandler = (state: CoordinatesGestureState) => any -export type DistanceAngleHandler = (state: DistanceAngleGestureState) => any - -export interface GestureHandlers { - onDrag: CoordinatesHandler - onDragStart: CoordinatesHandler - onDragEnd: CoordinatesHandler - onHover: CoordinatesHandler - onMove: CoordinatesHandler - onMoveStart: CoordinatesHandler - onMoveEnd: CoordinatesHandler - onScroll: CoordinatesHandler - onScrollStart: CoordinatesHandler - onScrollEnd: CoordinatesHandler - onWheel: CoordinatesHandler - onWheelStart: CoordinatesHandler - onWheelEnd: CoordinatesHandler - onPinch: DistanceAngleHandler - onPinchStart: DistanceAngleHandler - onPinchEnd: DistanceAngleHandler -} - -export interface GestureEvents { - onMouseDown: React.MouseEventHandler - onMouseUp: React.MouseEventHandler - onMouseEnter: React.MouseEventHandler - onMouseLeave: React.MouseEventHandler - onMouseMove: React.MouseEventHandler - onTouchStart: React.TouchEventHandler - onTouchMove: React.TouchEventHandler - onTouchEnd: React.TouchEventHandler - onTouchCancel: React.TouchEventHandler -} - -export function useGesture( - handlers: AtLeastOne | CoordinatesHandler, - config?: Partial -): (...args: any[]) => Partial diff --git a/types/states.d.ts b/types/states.d.ts new file mode 100644 index 000000000..6bdc31aea --- /dev/null +++ b/types/states.d.ts @@ -0,0 +1,63 @@ +import { Vector2, TransformType, Omit } from './common.d' +import { TransformedEvent } from './events.d' + +export type GestureKey = 'drag' | 'pinch' | 'move' | 'scroll' | 'wheel' | 'hover' +export type StateKey = Exclude + +export interface SharedGestureState { + hovering: boolean + scrolling: boolean + wheeling: boolean + dragging: boolean + moving: boolean + pinching: boolean + touches: number + down: boolean + buttons: number + shiftKey: boolean + altKey: boolean + metaKey: boolean + ctrlKey: boolean +} + +export interface CommonGestureState { + event?: TransformedEvent + currentTarget?: EventTarget | null + pointerId?: number | null + values: Vector2 + velocities: Vector2 + delta: Vector2 + initial: Vector2 + previous: Vector2 + transform?: TransformType + local: Vector2 + lastLocal: Vector2 + first: boolean + last: boolean + active: boolean + time?: number + cancel?(): void + canceled: boolean + temp?: any + args?: any +} + +export interface Coordinates { + xy: Vector2 + velocity: number + vxvy: Vector2 + distance: number + direction: Vector2 +} + +export interface DistanceAngle { + da: Vector2 + vdva: Vector2 + origin: Vector2 + turns: number +} + +export type GestureState = T & CommonGestureState +export type FullGestureState = SharedGestureState & GestureState + +export type StateObject = { shared: SharedGestureState } & { [K in StateKey]: GestureState } diff --git a/types/test.tsx b/types/test.tsx deleted file mode 100644 index 96e207f38..000000000 --- a/types/test.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useGesture, CoordinatesGestureState, DistanceAngleGestureState } from 'react-use-gesture' - -useGesture( - (state: CoordinatesGestureState): any => { - // do something with state - }, - { event: { passive: false } } -) - -useGesture( - { - onDrag: (state: CoordinatesGestureState): any => { - // do something with state - } - }, - { event: { passive: false }, domTarget: window } -) - -useGesture({ - onPinch: (state: DistanceAngleGestureState): any => { - // do something with state - } -}) - -useGesture() // $ExpectError -useGesture({}, { domTarget: window }) // $ExpectError diff --git a/types/tsconfig.json b/types/tsconfig.json deleted file mode 100644 index 89677e18a..000000000 --- a/types/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "jsx": "react", - "strict": true, - "lib": ["es6", "dom"], - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "baseUrl": ".", - "paths": { - "react-use-gesture": ["."] - } - } -} diff --git a/types/tslint.json b/types/tslint.json deleted file mode 100644 index 295142061..000000000 --- a/types/tslint.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false - } -} diff --git a/yarn.lock b/yarn.lock index 2674ae305..6ae2e4a15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -233,11 +233,16 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4": +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== +"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -323,6 +328,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-typescript@^7.2.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" + integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" @@ -468,12 +480,12 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz#5611d96d987dfc4a3a81c4383bb173361037d68d" - integrity sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== dependencies: - regexp-tree "^0.1.0" + regexp-tree "^0.1.6" "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" @@ -538,12 +550,12 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.2.0" -"@babel/plugin-transform-regenerator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz#5b4da4df79391895fca9e28f99e87e22cfc02072" - integrity sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g== +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== dependencies: - regenerator-transform "^0.13.4" + regenerator-transform "^0.14.0" "@babel/plugin-transform-reserved-words@^7.2.0": version "7.2.0" @@ -599,6 +611,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-typescript@^7.3.2": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz#ab3351ba35307b79981993536c93ff8be050ba28" + integrity sha512-RPB/YeGr4ZrFKNwfuQRlMf2lxoCUaU01MTw39/OFE/RiL8HDjtn68BwEPft1P7JN4akyEmjGWAMNldOV7o9V2g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + "@babel/plugin-transform-unicode-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" @@ -609,9 +629,9 @@ regexpu-core "^4.5.4" "@babel/preset-env@^7.4.3": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.4.tgz#b6f6825bfb27b3e1394ca3de4f926482722c1d6f" - integrity sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw== + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -642,12 +662,12 @@ "@babel/plugin-transform-modules-commonjs" "^7.4.4" "@babel/plugin-transform-modules-systemjs" "^7.4.4" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" "@babel/plugin-transform-new-target" "^7.4.4" "@babel/plugin-transform-object-super" "^7.2.0" "@babel/plugin-transform-parameters" "^7.4.4" "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.4" + "@babel/plugin-transform-regenerator" "^7.4.5" "@babel/plugin-transform-reserved-words" "^7.2.0" "@babel/plugin-transform-shorthand-properties" "^7.2.0" "@babel/plugin-transform-spread" "^7.2.0" @@ -656,8 +676,8 @@ "@babel/plugin-transform-typeof-symbol" "^7.2.0" "@babel/plugin-transform-unicode-regex" "^7.4.4" "@babel/types" "^7.4.4" - browserslist "^4.5.2" - core-js-compat "^3.0.0" + browserslist "^4.6.0" + core-js-compat "^3.1.1" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" @@ -673,10 +693,18 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" +"@babel/preset-typescript@^7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz#88669911053fa16b2b276ea2ede2ca603b3f307a" + integrity sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.3.2" + "@babel/runtime@^7.4.3": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.4.tgz#dc2e34982eb236803aa27a07fea6857af1b9171d" - integrity sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg== + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" + integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== dependencies: regenerator-runtime "^0.13.2" @@ -689,7 +717,22 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/traverse@^7.4.3": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== @@ -930,7 +973,7 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/node@^12.0.2": +"@types/node@*", "@types/node@^12.0.2": version "12.0.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.2.tgz#3452a24edf9fea138b48fad4a0a028a683da1e40" integrity sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA== @@ -940,24 +983,26 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== -"@types/parsimmon@^1.3.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@types/parsimmon/-/parsimmon-1.10.0.tgz#ffb81cb023ff435a41d4710a29ab23c561dc9fdf" - integrity sha512-bsTIJFVQv7jnvNiC42ld2pQW2KRI+pAG243L+iATvqzy3X6+NH1obz2itRKDZZ8VVhN3wjwYax/VBGCcXzgTqQ== - "@types/prop-types@*": version "15.7.1" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.1.tgz#f1a11e7babb0c3cad68100be381d1e064c68f1f6" integrity sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg== -"@types/react@^16.4.18": - version "16.8.17" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.17.tgz#f287b76a5badb93bc9aa3f54521a3eb53d6c2374" - integrity sha512-pln3mgc6VfkNg92WXODul/ONo140huK9OMsx62GlBlZ2lvjNK86PQJhYMPLO1i66aF5O9OPyZefogvNltBIszA== +"@types/react@^16.8.18": + version "16.8.18" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.18.tgz#fe66fb748b0b6ca9709d38b87b2d1356d960a511" + integrity sha512-lUXdKzRqWR4FebR5tGHkLCqnvQJS4fdXKCBrNGGbglqZg2gpU+J82pMONevQODUotATs9fc9k66bx3/St8vReg== dependencies: "@types/prop-types" "*" csstype "^2.2.0" +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -986,11 +1031,6 @@ acorn-globals@^4.1.0: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" - integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== - acorn-walk@^6.0.1: version "6.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" @@ -1001,12 +1041,12 @@ acorn@^5.5.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.0.7, acorn@^6.1.1: +acorn@^6.0.1, acorn@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== -ajv@^6.5.5, ajv@^6.9.1: +ajv@^6.5.5: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -1016,7 +1056,7 @@ ajv@^6.5.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -1036,11 +1076,6 @@ ansi-regex@^4.0.0, ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1076,14 +1111,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -aria-query@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" - integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1109,14 +1136,6 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -1156,11 +1175,6 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-types-flow@0.0.7, ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= - astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -1191,39 +1205,11 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -axobject-query@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" - integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== - dependencies: - ast-types-flow "0.0.7" - -babel-code-frame@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - babel-core@7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== -babel-eslint@10.x: - version "10.0.1" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" - integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - eslint-scope "3.7.1" - eslint-visitor-keys "^1.0.0" - babel-jest@^24.7.1, babel-jest@^24.8.0: version "24.8.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.8.0.tgz#5c15ff2b28e20b0f45df43fe6b7f2aae93dba589" @@ -1322,7 +1308,7 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" -browserslist@^4.5.2, browserslist@^4.5.4: +browserslist@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.0.tgz#5274028c26f4d933d5b1323307c1d1da5084c9ff" integrity sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg== @@ -1343,10 +1329,10 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= +builtin-modules@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== cache-base@^1.0.1: version "1.0.1" @@ -1393,9 +1379,9 @@ camelcase@^5.0.0: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-lite@^1.0.30000967: - version "1.0.30000969" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000969.tgz#7664f571f2072657bde70b00a1fc1ba41f1942a9" - integrity sha512-Kus0yxkoAJgVc0bax7S4gLSlFifCa7MnSZL9p9VuS/HIKEL4seaqh28KIQAAO50cD/rJ5CiJkJFapkdDAlhFxQ== + version "1.0.30000971" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000971.tgz#d1000e4546486a6977756547352bc96a4cfd2b13" + integrity sha512-TQFYFhRS0O5rdsmSbF1Wn+16latXYsQJat66f7S7lizXW1PVpWJeZw9wqqVLIjuxDRz7s7xRUj13QCfd8hKn6g== capture-exit@^2.0.0: version "2.0.0" @@ -1409,18 +1395,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1429,11 +1404,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" @@ -1454,18 +1424,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -1512,7 +1470,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.11.0, commander@^2.12.1, commander@~2.20.0: +commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== @@ -1527,21 +1485,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -confusing-browser-globals@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz#5ae852bd541a910e7ffb2dbb864a2d21a36ad29b" - integrity sha512-cgHI1azax5ATrZ8rJ+ODDML9Fvu67PimB6aNxBrc/QwSaDaM9eTfIEUHx3bBLJJ82ioSb+/5zfsMCCEJax3ByQ== - console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - convert-source-map@^1.1.0, convert-source-map@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" @@ -1554,25 +1502,19 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0" - integrity sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g== +core-js-compat@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14" + integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA== dependencies: - browserslist "^4.5.4" - core-js "3.0.1" - core-js-pure "3.0.1" - semver "^6.0.0" - -core-js-pure@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe" - integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g== + browserslist "^4.6.0" + core-js-pure "3.1.3" + semver "^6.1.0" -core-js@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" - integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew== +core-js-pure@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5" + integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -1598,7 +1540,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -1641,11 +1583,6 @@ csstype@^2.2.0: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.4.tgz#d585a6062096e324e7187f80e04f92bd0f00e37f" integrity sha512-lAJUJP3M6HxFXbqtGRc0iZrdyeN+WzOWeY0q/VnFzI+kqVrYIzC7bWlKqCW7oCIdzoPkvfp82EVvrTlQ8zsWQg== -damerau-levenshtein@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz#780cf7144eb2e8dbd1c3bb83ae31100ccc31a414" - integrity sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA== - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1662,7 +1599,7 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -1676,7 +1613,7 @@ debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -1732,14 +1669,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -definitelytyped-header-parser@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/definitelytyped-header-parser/-/definitelytyped-header-parser-1.1.0.tgz#7047dd9af5589c57f96b4d7b7f97299cfc720bf5" - integrity sha512-goGRhRUJVQhXc28OjwSCoAoutl/dcFUJXwEv3DYdtxGFCXWK+YFS/MrFfsAnHG0ZYPKBcniXWRUlr3UHGKaTHw== - dependencies: - "@types/parsimmon" "^1.3.0" - parsimmon "^1.2.0" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1765,37 +1694,10 @@ diff-sequences@^24.3.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== -diff@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-testing-library@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dom-testing-library/-/dom-testing-library-4.1.0.tgz#273264e62e9e63f4e404f7349ddd7b9356aacd23" - integrity sha512-654GHd0oPC31S+ll1bJH9NUOBRzcHcrf23/XzJh41o6g67uGUpF9tn23qmbcwjNauoRqKQfAdHCDwr/Ez/Ot7A== +dom-testing-library@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/dom-testing-library/-/dom-testing-library-4.1.1.tgz#615af61bee06db51bd8ecea60c113eba7cb49dda" + integrity sha512-PUsG7aY5BJxzulDrOtkksqudRRypcVQF6d4RGAyj9xNwallOFqrNLOyg2QW2mCpFaNVPELX8hBX/wbHQtOto/A== dependencies: "@babel/runtime" "^7.4.3" "@sheerun/mutationobserver-shim" "^0.3.2" @@ -1809,33 +1711,6 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" -download-file-sync@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/download-file-sync/-/download-file-sync-1.0.4.tgz#d3e3c543f836f41039455b9034c72e355b036019" - integrity sha1-0+PFQ/g29BA5RVuQNMcuNVsDYBk= - -dts-critic@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/dts-critic/-/dts-critic-1.0.9.tgz#af666a43bb1b22b031b9437fd3dfb11a509b42b9" - integrity sha512-fUh7YSqC+usC0r4pnslxPr02XB9txKEvk/4drxAbSNx1CZDHSkpIAXlTSp6zAz1dBM09/qakRsAsr3r6zKNl2Q== - dependencies: - definitelytyped-header-parser "^1.0.1" - download-file-sync "^1.0.4" - yargs "^12.0.5" - -dtslint@^0.7.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/dtslint/-/dtslint-0.7.3.tgz#00d784310bd444edf7f9bcac4939d1b8ed53ef4f" - integrity sha512-l4VEoeLfykG1k+ryWo7CqSAbauoqKbmJo72T/CvB15Em9kBys3tt0dhVmJcWCZmFVaBsdMmNydgyg0FepyoCNw== - dependencies: - definitelytyped-header-parser "^1.0.1" - dts-critic "^1.0.9" - fs-extra "^6.0.1" - request "^2.88.0" - strip-json-comments "^2.0.1" - tslint "5.14.0" - typescript next - ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -1845,14 +1720,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.3.133: - version "1.3.134" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.134.tgz#550222bddac43c6bd6c445c3543a0fe8a615021d" - integrity sha512-C3uK2SrtWg/gSWaluLHWSHjyebVZCe4ZC0NVgTAoTq8tCR9FareRK5T7R7AS/nPZShtlEcjVMX1kQ8wi4nU68w== - -emoji-regex@^7.0.1, emoji-regex@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + version "1.3.137" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.137.tgz#ba7c88024984c038a5c5c434529aabcea7b42944" + integrity sha512-kGi32g42a8vS/WnYE7ELJyejRT7hbr3UeOOu0WeuYuQ29gCpg9Lrf6RdcTQVXSt/v0bjCfnlb/EWOOsiKpTmkw== end-of-stream@^1.1.0: version "1.4.1" @@ -1861,14 +1731,14 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.11.0, es-abstract@^1.5.1, es-abstract@^1.7.0: +es-abstract@^1.5.1: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -1889,7 +1759,7 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -1906,162 +1776,6 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -eslint-config-react-app@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz#23fd0fd7ea89442ef1e733f66a7207674b23c8db" - integrity sha512-ZsaoXUIGsK8FCi/x4lT2bZR5mMkL/Kgj+Lnw690rbvvUr/uiwgFiD8FcfAhkCycm7Xte6O5lYz4EqMx2vX7jgw== - dependencies: - confusing-browser-globals "^1.0.7" - -eslint-import-resolver-node@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== - dependencies: - debug "^2.6.9" - resolve "^1.5.0" - -eslint-module-utils@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" - integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== - dependencies: - debug "^2.6.8" - pkg-dir "^2.0.0" - -eslint-plugin-flowtype@2.x: - version "2.50.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz#61379d6dce1d010370acd6681740fd913d68175f" - integrity sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ== - dependencies: - lodash "^4.17.10" - -eslint-plugin-import@2.x: - version "2.17.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz#d227d5c6dc67eca71eb590d2bb62fb38d86e9fcb" - integrity sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g== - dependencies: - array-includes "^3.0.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.0" - has "^1.0.3" - lodash "^4.17.11" - minimatch "^3.0.4" - read-pkg-up "^2.0.0" - resolve "^1.10.0" - -eslint-plugin-jsx-a11y@6.x: - version "6.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz#4ebba9f339b600ff415ae4166e3e2e008831cf0c" - integrity sha512-cjN2ObWrRz0TTw7vEcGQrx+YltMvZoOEx4hWU8eEERDnBIU00OTq7Vr+jA7DFKxiwLNv4tTh5Pq2GUNEa8b6+w== - dependencies: - aria-query "^3.0.0" - array-includes "^3.0.3" - ast-types-flow "^0.0.7" - axobject-query "^2.0.2" - damerau-levenshtein "^1.0.4" - emoji-regex "^7.0.2" - has "^1.0.3" - jsx-ast-utils "^2.0.1" - -eslint-plugin-react-hooks@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.0.tgz#348efcda8fb426399ac7b8609607c7b4025a6f5f" - integrity sha512-lHBVRIaz5ibnIgNG07JNiAuBUeKhEf8l4etNx5vfAEwqQ5tcuK3jV9yjmopPgQDagQb7HwIuQVsE3IVcGrRnag== - -eslint-plugin-react@7.x: - version "7.13.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.13.0.tgz#bc13fd7101de67996ea51b33873cd9dc2b7e5758" - integrity sha512-uA5LrHylu8lW/eAH3bEQe9YdzpPaFd9yAJTwTi/i/BKTD7j6aQMKVAdGM/ML72zD6womuSK7EiGtMKuK06lWjQ== - dependencies: - array-includes "^3.0.3" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.1.0" - object.fromentries "^2.0.0" - prop-types "^15.7.2" - resolve "^1.10.1" - -eslint-scope@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" - integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== - -eslint@5.x: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -2072,21 +1786,7 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -2182,15 +1882,6 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" - integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -2237,20 +1928,6 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -2261,7 +1938,7 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -2275,20 +1952,6 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" - integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== - for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2315,15 +1978,6 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fs-extra@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" - integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-minipass@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" @@ -2349,11 +2003,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2414,12 +2063,12 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -2453,13 +2102,6 @@ har-validator@~5.1.0: ajv "^6.5.5" har-schema "^2.0.0" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2550,7 +2192,7 @@ husky@^2.2.0: run-node "^1.0.0" slash "^3.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -2569,11 +2211,6 @@ ignore@^3.3.7: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -2582,14 +2219,6 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" - integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -2626,25 +2255,6 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^6.2.2: - version "6.3.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" - integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.11" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -2764,6 +2374,11 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -2778,10 +2393,12 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= +is-reference@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.2.tgz#01cf91517d21db66a34642287ed6e70d53dcbe5c" + integrity sha512-Kn5g8c7XHKejFOpTf2QN9YjiHHKl5xRj+2uAZf9iM2//nkBNi/NNeB5JMoun28nEaUVHyPUzqzhfRlfAirEjXg== + dependencies: + "@types/estree" "0.0.39" is-regex@^1.0.4: version "1.0.4" @@ -2817,7 +2434,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -2958,9 +2575,9 @@ jest-docblock@^24.3.0: detect-newline "^2.1.0" jest-dom@^3.1.3: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jest-dom/-/jest-dom-3.2.2.tgz#4876c173045ae040f12220c56eb2555ef328fd94" - integrity sha512-Fnq3Y6d0MoDAJV8pAXkqe/e4VTBihRGaJypXvaHTLL9oRYzOvz0Q04evi5SBwPQ7FBiujQQOPXoEgEBGTg5BaA== + version "3.4.0" + resolved "https://registry.yarnpkg.com/jest-dom/-/jest-dom-3.4.0.tgz#46c21984a73a4841dc57bc8fc09ccd1d971a8447" + integrity sha512-fQR5ESaxTfNbZE02y+gtaQH7+sMwzrQtJo5OE0E3BNArjTL9GWNI+uPFr1yS24eodH1X62L+qncv106M/O98gQ== dependencies: chalk "^2.4.1" css "^2.2.3" @@ -3239,7 +2856,7 @@ jest-watcher@^24.8.0: jest-util "^24.8.0" string-length "^2.0.0" -jest-worker@^24.6.0: +jest-worker@^24.0.0, jest-worker@^24.6.0: version "24.6.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== @@ -3265,12 +2882,7 @@ js-levenshtein@^1.1.3: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.7.0: +js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -3340,11 +2952,6 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -3357,13 +2964,6 @@ json5@^2.1.0: dependencies: minimist "^1.2.0" -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -3374,13 +2974,6 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jsx-ast-utils@^2.0.1, jsx-ast-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz#0ee4e2c971fb9601c67b5641b71be80faecf0b36" - integrity sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA== - dependencies: - array-includes "^3.0.3" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -3427,7 +3020,7 @@ leven@^2.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= -levn@^0.3.0, levn@~0.3.0: +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -3435,16 +3028,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -3476,7 +3059,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@^4.17.10, lodash@^4.17.11: +lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -3496,6 +3079,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +magic-string@^0.25.2: + version "0.25.2" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" + integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== + dependencies: + sourcemap-codec "^1.4.4" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -3577,11 +3167,6 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.40.0" -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -3664,11 +3249,6 @@ multimatch@^3.0.0: arrify "^1.0.1" minimatch "^3.0.4" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - nan@^2.12.1: version "2.13.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" @@ -3753,9 +3333,9 @@ node-pre-gyp@^0.12.0: tar "^4" node-releases@^1.1.19: - version "1.1.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.19.tgz#c492d1e381fea0350b338b646c27867e88e91b3d" - integrity sha512-SH/B4WwovHbulIALsQllAVwqZZD1kPmKCqrhGfR29dXjLAVZMHvBjD3S6nL9D/J9QkmZ1R92/0wCMDKXUUvyyA== + version "1.1.21" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.21.tgz#46c86f9adaceae4d63c75d3c2f2e6eee618e55f3" + integrity sha512-TwnURTCjc8a+ElJUjmDqU6+12jhli1Q61xOQmdZ7ECZVBZuQpN/1UnembiIHDM1wCcfLvh5wrWXUF5H6ufX64Q== dependencies: semver "^5.3.0" @@ -3855,16 +3435,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.fromentries@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" - integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== - dependencies: - define-properties "^1.1.2" - es-abstract "^1.11.0" - function-bind "^1.1.1" - has "^1.0.1" - object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -3887,13 +3457,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -3902,7 +3465,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= @@ -3928,7 +3491,7 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -4006,20 +3569,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -4033,11 +3582,6 @@ parse5@4.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== -parsimmon@^1.2.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/parsimmon/-/parsimmon-1.12.0.tgz#886a442fb30b5fc3c8e7c4994050f5cdcfe0ea90" - integrity sha512-uC/BjuSfb4jfaWajKCp1mVncXXq+V1twbcYChbTxN3GM7fn+8XoHwUdvUz+PTaFtDSCRQxU8+Rnh+iMhAkVwdw== - pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -4053,11 +3597,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -4068,13 +3607,6 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -4087,11 +3619,6 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -4109,13 +3636,6 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -4168,9 +3688,9 @@ pretty-format@^24.0.0, pretty-format@^24.7.0, pretty-format@^24.8.0: react-is "^16.8.4" pretty-quick@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-1.10.0.tgz#d86cc46fe92ed8cfcfba6a082ec5949c53858198" - integrity sha512-uNvm2N3UWmnZRZrClyQI45hIbV20f5BpSyZY51Spbvn4APp9+XLyX4bCjWRGT3fGyVyQ/2/iw7dbQq1UUaq7SQ== + version "1.11.0" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-1.11.0.tgz#d0bf997f3eb7de3d1bac5ffeb9c335f404d844c8" + integrity sha512-hy0yOSnqVykrgoHcCcB72p3B5ERQJcjQI6ExeSGSTFE2cDrPwCQtFb3kXA1F+jUPrbt7orra8U+fjS/Emjgpuw== dependencies: chalk "^2.3.0" execa "^0.8.0" @@ -4189,11 +3709,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - prompts@^2.0.1: version "2.0.4" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" @@ -4202,7 +3717,7 @@ prompts@^2.0.1: kleur "^3.0.2" sisteransi "^1.0.0" -prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.6.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -4270,12 +3785,12 @@ react-is@^16.8.1, react-is@^16.8.4: integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== react-testing-library@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/react-testing-library/-/react-testing-library-7.0.0.tgz#d3b535e44de94d7b0a83c56cd2e3cfed752dcec1" - integrity sha512-8SHqwG+uhN9VhAgNVkVa3f7VjTw/L5CIaoAxKmy+EZuDQ6O+VsfcpRAyUw3MDL1h8S/gGrEiazmHBVL/uXsftA== + version "7.0.1" + resolved "https://registry.yarnpkg.com/react-testing-library/-/react-testing-library-7.0.1.tgz#0cf113bb53a78599f018378f6854e91a52dbf205" + integrity sha512-doQkM3/xPcIm22x9jgTkGxU8xqXg4iWvM1WwbbQ7CI5/EMk3DhloYBwMyk+Ywtta3dIAIh9sC7llXoKovf3L+w== dependencies: "@babel/runtime" "^7.4.3" - dom-testing-library "^4.0.0" + dom-testing-library "^4.1.0" react@^16.9.0-alpha.0: version "16.9.0-alpha.0" @@ -4287,14 +3802,6 @@ react@^16.9.0-alpha.0: prop-types "^15.6.2" scheduler "^0.14.0-alpha.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -4303,15 +3810,6 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -4376,10 +3874,10 @@ regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== -regenerator-transform@^0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" - integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== dependencies: private "^0.1.6" @@ -4391,15 +3889,10 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-tree@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.6.tgz#84900fa12fdf428a2ac25f04300382a7c0148479" - integrity sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w== - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== regexpu-core@^4.5.4: version "4.5.4" @@ -4456,7 +3949,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.87.0, request@^2.88.0: +request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -4509,11 +4002,6 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -4524,27 +4012,19 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.3.2, resolve@^1.8.1: version "1.11.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== dependencies: path-parse "^1.0.6" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -4559,6 +4039,38 @@ rollup-plugin-babel@^4.3.2: "@babel/helper-module-imports" "^7.0.0" rollup-pluginutils "^2.3.0" +rollup-plugin-commonjs@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.0.0.tgz#58901ebe7ca44c2a03f0056de9bf9eb4a2dc8990" + integrity sha512-B8MoX5GRpj3kW4+YaFO/di2JsZkBxNjVmZ9LWjUoTAjq8N9wc7HObMXPsrvolVV9JXVtYSscflXM14A19dXPNQ== + dependencies: + estree-walker "^0.6.0" + is-reference "^1.1.2" + magic-string "^0.25.2" + resolve "^1.10.1" + rollup-pluginutils "^2.7.0" + +rollup-plugin-node-resolve@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.0.0.tgz#754abf4841ed4bab2241551cba0a11d04c57f290" + integrity sha512-JUFr7DkFps3div9DYwpSg0O+s8zuSSRASUZUVNx6h6zhw2m8vcpToeS68JDPsFbmisMVSMYK0IxftngCRv7M9Q== + dependencies: + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.10.1" + rollup-pluginutils "^2.7.0" + +rollup-plugin-uglify@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-6.0.2.tgz#681042cfdf7ea4e514971946344e1a95bc2772fe" + integrity sha512-qwz2Tryspn5QGtPUowq5oumKSxANKdrnfz7C0jm4lKxvRDsNe/hSGsB9FntUul7UeC4TsZEWKErVgE1qWSO0gw== + dependencies: + "@babel/code-frame" "^7.0.0" + jest-worker "^24.0.0" + serialize-javascript "^1.6.1" + uglify-js "^3.4.9" + rollup-pluginutils@^2.3.0: version "2.7.0" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.7.0.tgz#da24a6f99432626160643ac6b087d71684317c4f" @@ -4567,10 +4079,18 @@ rollup-pluginutils@^2.3.0: estree-walker "^0.6.0" micromatch "^3.1.10" +rollup-pluginutils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.7.1.tgz#a7915ce8b12c177364784bf38a1590cc6c2c8250" + integrity sha512-3nRf3buQGR9qz/IsSzhZAJyoK663kzseps8itkYHr+Z7ESuaffEPfgRinxbCRA0pf0gzLqkNKkSb8aNVTq75NA== + dependencies: + estree-walker "^0.6.0" + micromatch "^3.1.10" + rollup@^1.10.0: - version "1.12.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.12.1.tgz#02148d3d79f819b418a2f4c374f859fed56ae40c" - integrity sha512-6CL0c+HxqEY9/8G+7mYIvor0tt60mVC64410/1DeaGWZCFAvcY8ClT0bsnTxECd6vR004CMm0X2yBZmod5gWjw== + version "1.12.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.12.4.tgz#f2cb825300cea6601f12a4c3d2f3918807b27403" + integrity sha512-sHg0F05oTMJzM592MWU8irsPx8LIFMKSCnEkcp6vp/gnj+oJ9GJEBW9hl8jUqy2L6Q2uUxFzPgvoExLbfuSODA== dependencies: "@types/estree" "0.0.39" "@types/node" "^12.0.2" @@ -4581,25 +4101,11 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - run-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== -rxjs@^6.4.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" - integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== - dependencies: - tslib "^1.9.0" - safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -4655,10 +4161,15 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== -semver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" - integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== +semver@^6.0.0, semver@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" + integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== + +serialize-javascript@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" + integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -4722,15 +4233,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -4795,6 +4297,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sourcemap-codec@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== + spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" @@ -4883,7 +4390,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -4891,15 +4398,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -4921,7 +4419,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0: +strip-ansi@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -4943,16 +4441,11 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -4972,16 +4465,6 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= -table@^5.2.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/table/-/table-5.3.3.tgz#eae560c90437331b74200e011487a33442bd28b4" - integrity sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw== - dependencies: - ajv "^6.9.1" - lodash "^4.17.11" - slice-ansi "^2.1.0" - string-width "^3.0.0" - tar@^4: version "4.4.8" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" @@ -5005,28 +4488,11 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -5090,37 +4556,6 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - -tslint@5.14.0: - version "5.14.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.14.0.tgz#be62637135ac244fc9b37ed6ea5252c9eba1616e" - integrity sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ== - dependencies: - babel-code-frame "^6.22.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^3.2.0" - glob "^7.1.1" - js-yaml "^3.7.0" - minimatch "^3.0.4" - mkdirp "^0.5.1" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -5145,16 +4580,11 @@ type-fest@^0.4.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== -typescript@^3.4.3: +typescript@^3.4.5: version "3.4.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== -typescript@next: - version "3.5.0-dev.20190516" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.0-dev.20190516.tgz#7a7afb58b9508484228eee2de6823cb40e8a1147" - integrity sha512-J+1tISjR4yCmZ3F2wWZDEMoocF4wdXsHf68ln6cb0gjm8VmSDUYSPOVbCJUJoLqjWaCEPs05O7eNrbTulo/4ew== - uglify-js@^3.1.4: version "3.5.12" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.12.tgz#6b759cabc08c3e91fe82323d6387019f0c5864cd" @@ -5163,6 +4593,14 @@ uglify-js@^3.1.4: commander "~2.20.0" source-map "~0.6.1" +uglify-js@^3.4.9: + version "3.5.15" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.15.tgz#fe2b5378fd0b09e116864041437bff889105ce24" + integrity sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg== + dependencies: + commander "~2.20.0" + source-map "~0.6.1" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -5196,11 +4634,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -5366,13 +4799,6 @@ write-file-atomic@2.4.1: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" @@ -5408,7 +4834,7 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^12.0.2, yargs@^12.0.5: +yargs@^12.0.2: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==