From fb69984857238b935e56e5c39151e34ecc7b392c Mon Sep 17 00:00:00 2001 From: Evan Rusackas Date: Thu, 2 Jul 2020 08:52:24 -0700 Subject: [PATCH] feat: updated viz plugin generator (#636) * feat: hello world plugin * Fix yeoman generator * Adding Emotion to template and template result * adding `reactify` technique to example code * fixing errant comma * annoying lint issue * React needed for JSX * questionable typing fix * labelling options * freshly generated hello world * linting and freshly generated plugin * add comments to buildQuery * Add docs * nixing word cloud console logs * lint annoyance * a note on multiple plugin exports * second option for building a plugin is now enabled * Officially supporting viz plugins ;) * fresh plugin build * Adding note about controls, and TODOs for example controls * linting * new lock file * adding file structure to readme * more transform props notes * better notes, better linting * Adding a third option for rendering plugin * fresh package rendering * manually updated plugin. Now let's see if the generator matches it! * template changes, fresh plugin render. * moving file tree to the right place * touchups to template (killing third option) * thumbnail update * Spit out form data, for good measure. * more clarity * dummy controls * bold control works, fresh docs, fresh build! * typing for fancy props * bump superset-ui deps to 0.14 * Implement header text and font size * Add tests + mcense headers + inor cleanup * Replace YourPluginName with packageLabel in README * remove trailing spaces * fix hard coded reference to HelloWorld * removing legacy generators * plugin comment tweaks * typescript comments, minor formatting * adding option for badges in readme * generator offers choice of function or class plugin * Add timeseries option * killing the plugin... we'll make that a separate PR. * add new tests * remove unnecessary imports * fix timeseries type * comment on value/label in select options Co-authored-by: Jesse Yang * moving renderTrigger note up to first instance * control-utils -> chart-controls * Wrapper -> Styles nomenclature * Stronger typing (H/T @ktmud) * ControlPanelConfig type on control config * nixing requiresTime * moving Styles component to be external, passing it props * lint nits * typing tweak Co-authored-by: Ville Brofeldt Co-authored-by: Jesse Yang --- .../packages/generator-superset/README.md | 5 +- .../generators/app/index.js | 8 - .../legacy-plugin-chart-demo/index.js | 40 - .../templates/Stories.jsx | 22 - .../templates/data.js | 2 - .../templates/index.js | 8 - .../generators/legacy-plugin-chart/index.js | 39 - .../legacy-plugin-chart/templates/README.md | 34 - .../templates/_package.json | 39 - .../generators/plugin-chart/index.js | 42 +- .../plugin-chart/templates/README.erb | 26 +- .../plugin-chart/templates/package.erb | 13 +- .../plugin-chart/templates/src/MyChart.erb | 110 ++- .../templates/src/images/thumbnail.png | Bin 3619 -> 20611 bytes .../plugin-chart/templates/src/index.erb | 26 + .../templates/src/plugin/buildQuery.erb | 43 + .../templates/src/plugin/controlPanel.erb | 177 ++++ .../templates/src/plugin/index.erb | 14 + .../templates/src/plugin/transformProps.erb | 77 ++ .../templates/src/plugin/transformProps.txt | 32 - .../plugin-chart/templates/test/index.erb | 26 + .../templates/test/plugin/buildQuery.test.erb | 18 + .../test/plugin/transformProps.test.erb | 35 + .../test/legacy-plugin-chart-demo.test.js | 35 - .../test/legacy-plugin-chart.test.js | 35 - .../test/plugin-chart.test.js | 6 +- .../superset-ui-chart-controls/src/types.ts | 1 - .../superset-ui/yarn.lock | 804 +++++++++++++++++- 28 files changed, 1395 insertions(+), 322 deletions(-) delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/index.js delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/Stories.jsx delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/data.js delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/index.js delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/index.js delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/templates/README.md delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/templates/_package.json create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/buildQuery.erb create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/controlPanel.erb create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/transformProps.erb delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/transformProps.txt create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/plugin/buildQuery.test.erb create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/plugin/transformProps.test.erb delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/legacy-plugin-chart-demo.test.js delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/legacy-plugin-chart.test.js diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/README.md b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/README.md index 76193b17f1..2a7c01ef80 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/README.md +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/README.md @@ -7,7 +7,8 @@ ## Installation -First, install [Yeoman](http://yeoman.io) and `generator-superset` using [npm](https://www.npmjs.com/) (we assume you have pre-installed [node.js](https://nodejs.org/)). +First, install [Yeoman](http://yeoman.io) and `generator-superset` using +[npm](https://www.npmjs.com/) (we assume you have pre-installed [node.js](https://nodejs.org/)). ```bash npm install -g yo @@ -16,7 +17,7 @@ npm install -g @superset-ui/generator-superset ## Usage -Generate a new package in `@superset-ui` +Generate a new package or visualization plugin in `@superset-ui` ```bash cd superset-ui/packages diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/app/index.js b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/app/index.js index 8becd731ca..0bfd8cb82e 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/app/index.js +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/app/index.js @@ -25,14 +25,6 @@ module.exports = class extends Generator { name: 'Create superset-ui chart plugin package', value: 'plugin-chart', }, - { - name: 'Create superset-ui-legacy package', - value: 'legacy-plugin-chart', - }, - { - name: 'Create superset-ui-legacy chart demo in storybook', - value: 'legacy-plugin-chart-demo', - }, ], }, ]); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/index.js b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/index.js deleted file mode 100644 index fbaa76954f..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/index.js +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable sort-keys */ - -const Generator = require('yeoman-generator'); -const chalk = require('chalk'); -const yosay = require('yosay'); -const _ = require('lodash'); - -module.exports = class extends Generator { - async prompting() { - // Have Yeoman greet the user. - this.log(yosay(`Welcome to the rad ${chalk.red('generator-superset')} generator!`)); - - this.option('skipInstall'); - - this.answers = await this.prompt([ - { - type: 'input', - name: 'packageName', - message: 'Package name:', - default: _.kebabCase(this.appname.replace('legacy plugin chart', '').trim()), // Default to current folder name - }, - { - type: 'input', - name: 'packageLabel', - message: 'Package label:', - default: _.upperFirst(_.camelCase(this.appname.replace('legacy plugin chart', '').trim())), // Default to current folder name - }, - ]); - } - - writing() { - this.fs.copyTpl(this.templatePath('index.js'), this.destinationPath('index.js'), this.answers); - this.fs.copyTpl(this.templatePath('data.js'), this.destinationPath('data.js'), this.answers); - this.fs.copyTpl( - this.templatePath('Stories.jsx'), - this.destinationPath('Stories.jsx'), - this.answers, - ); - } -}; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/Stories.jsx b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/Stories.jsx deleted file mode 100644 index c3e24997c5..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/Stories.jsx +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable no-magic-numbers */ -import React from 'react'; -import { SuperChart } from '@superset-ui/chart'; -import data from './data'; - -export default [ - { - renderStory: () => ( - - ), - storyName: 'Basic', - storyPath: 'plugin-chart-<%= packageName %>|<%= packageLabel %>ChartPlugin', - }, -]; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/data.js b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/data.js deleted file mode 100644 index fb1252c9d8..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/data.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable sort-keys, no-magic-numbers */ -export default {}; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/index.js b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/index.js deleted file mode 100644 index 018685e9e6..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart-demo/templates/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import <%= packageLabel %>ChartPlugin from '../../../../superset-ui-legacy-plugin-chart-<%= packageName %>'; -import Stories from './Stories'; - -new <%= packageLabel %>ChartPlugin().configure({ key: '<%= packageName %>' }).register(); - -export default { - examples: [...Stories], -}; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/index.js b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/index.js deleted file mode 100644 index 1e2558c094..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/index.js +++ /dev/null @@ -1,39 +0,0 @@ -/* eslint-disable sort-keys */ - -const Generator = require('yeoman-generator'); -const _ = require('lodash'); - -module.exports = class extends Generator { - async prompting() { - this.option('skipInstall'); - - this.answers = await this.prompt([ - { - type: 'input', - name: 'packageName', - message: 'Package name:', - default: _.kebabCase(this.appname.replace('superset ui legacy plugin chart', '').trim()), // Default to current folder name - }, - { - type: 'input', - name: 'description', - message: 'Description:', - default: _.upperFirst( - _.startCase(this.appname.replace('superset ui legacy plugin chart', '').trim()), - ), // Default to current folder name - }, - ]); - } - - writing() { - this.fs.copyTpl( - this.templatePath('_package.json'), - this.destinationPath('package.json'), - this.answers, - ); - this.fs.copyTpl(this.templatePath('README.md'), this.destinationPath('README.md'), { - ...this.answers, - packageLabel: _.upperFirst(_.camelCase(this.answers.packageName)), - }); - } -}; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/templates/README.md b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/templates/README.md deleted file mode 100644 index 552bfa4188..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/templates/README.md +++ /dev/null @@ -1,34 +0,0 @@ -## @superset-ui/legacy-plugin-chart-<%= packageName %> - -[![Version](https://img.shields.io/npm/v/@superset-ui/legacy-plugin-chart-<%= packageName %>.svg?style=flat-square)](https://img.shields.io/npm/v/@superset-ui/legacy-plugin-chart-<%= packageName %>.svg?style=flat-square) -[![David (path)](https://img.shields.io/david/apache-superset/superset-ui.svg?path=packages%2Fsuperset-ui-legacy-plugin-chart-<%= packageName %>&style=flat-square)](https://david-dm.org/apache-superset/superset-ui?path=packages/superset-ui-legacy-plugin-chart-<%= packageName %>) - -This plugin provides <%= description %> for Superset. - -### Usage - -Configure `key`, which can be any `string`, and register the plugin. This `key` will be used to lookup this chart throughout the app. - -```js -import <%= packageLabel %>ChartPlugin from '@superset-ui/legacy-plugin-chart-<%= packageName %>'; - -new <%= packageLabel %>ChartPlugin() - .configure({ key: '<%= packageName %>' }) - .register(); -``` - -Then use it via `SuperChart`. See [storybook](https://apache-superset.github.io/superset-ui-legacy/?selectedKind=plugin-chart-<%= packageName %>) for more details. - -```js - -``` \ No newline at end of file diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/templates/_package.json b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/templates/_package.json deleted file mode 100644 index df3e368069..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/legacy-plugin-chart/templates/_package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "@superset-ui/legacy-plugin-chart-<%= packageName %>", - "version": "0.0.0", - "description": "Superset Legacy Chart - <%= description %>", - "sideEffects": false, - "main": "lib/index.js", - "module": "esm/index.js", - "files": [ - "esm", - "lib" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/apache-superset/superset-ui-legacy.git" - }, - "keywords": [ - "superset" - ], - "author": "Superset", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/apache-superset/superset-ui-legacy/issues" - }, - "homepage": "https://github.com/apache-superset/superset-ui-legacy#readme", - "publishConfig": { - "access": "public" - }, - "dependencies": { - "prop-types": "^15.6.2" - }, - "devDependencies": { - "@superset-ui/chart": "latest", - "@superset-ui/translation": "latest" - }, - "peerDependencies": { - "@superset-ui/chart": "latest", - "@superset-ui/translation": "latest" - } -} \ No newline at end of file diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/index.js b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/index.js index f43812cc79..74f506a8f7 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/index.js +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/index.js @@ -22,6 +22,42 @@ module.exports = class extends Generator { // Default to current folder name default: _.upperFirst(_.startCase(this.appname.replace('plugin chart', '').trim())), }, + { + type: 'list', + name: 'componentType', + message: 'What type of React component would you like?', + choices: [ + { + name: 'Class component', + value: 'class', + }, + { + name: 'Function component (with hooks)', + value: 'function', + }, + ], + }, + { + type: 'list', + name: 'chartType', + message: 'What type of chart would you like?', + choices: [ + { + name: 'Time-series chart', + value: 'timeseries', + }, + { + name: 'Regular chart', + value: 'regular', + }, + ], + }, + { + type: 'confirm', + name: 'addBadges', + message: "Add superset-ui badges to your plugin's README.md", + default: true, + }, ]); } @@ -37,10 +73,14 @@ module.exports = class extends Generator { ['package.erb', 'package.json'], ['README.erb', 'README.md'], ['src/index.erb', 'src/index.ts'], + ['src/plugin/buildQuery.erb', 'src/plugin/buildQuery.ts'], + ['src/plugin/controlPanel.erb', 'src/plugin/controlPanel.ts'], ['src/plugin/index.erb', 'src/plugin/index.ts'], - ['src/plugin/transformProps.txt', 'src/plugin/transformProps.ts'], + ['src/plugin/transformProps.erb', 'src/plugin/transformProps.ts'], ['src/MyChart.erb', `src/${packageLabel}.tsx`], ['test/index.erb', 'test/index.test.ts'], + ['test/plugin/buildQuery.test.erb', 'test/plugin/buildQuery.test.ts'], + ['test/plugin/transformProps.test.erb', 'test/plugin/transformProps.test.ts'], ].forEach(([src, dest]) => { this.fs.copyTpl(this.templatePath(src), this.destinationPath(dest), params); }); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/README.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/README.erb index 84617e5910..1622e13a27 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/README.erb +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/README.erb @@ -1,7 +1,7 @@ ## @superset-ui/plugin-chart-<%= packageName %> -[![Version](https://img.shields.io/npm/v/@superset-ui/plugin-chart-<%= packageName %>.svg?style=flat-square)](https://img.shields.io/npm/v/@superset-ui/plugin-chart-<%= packageName %>.svg?style=flat-square) -[![David (path)](https://img.shields.io/david/apache-superset/superset-ui.svg?path=packages%2Fsuperset-ui-plugin-chart-<%= packageName %>&style=flat-square)](https://david-dm.org/apache-superset/superset-ui?path=packages/superset-ui-plugin-chart-<%= packageName %>) +<%if (addBadges) { %>[![Version](https://img.shields.io/npm/v/@superset-ui/plugin-chart-<%= packageName %>.svg?style=flat-square)](https://img.shields.io/npm/v/@superset-ui/plugin-chart-<%= packageName %>.svg?style=flat-square) +[![David (path)](https://img.shields.io/david/apache-superset/superset-ui.svg?path=packages%2Fsuperset-ui-plugin-chart-<%= packageName %>&style=flat-square)](https://david-dm.org/apache-superset/superset-ui?path=packages/superset-ui-plugin-chart-<%= packageName %>)<% } %> This plugin provides <%= description %> for Superset. @@ -29,4 +29,26 @@ Then use it via `SuperChart`. See [storybook](https://apache-superset.github.io/ data: {...}, }} /> +``` + +### File structure generated + +``` +├── README.md +├── package.json +├── src +│   ├── <%= packageLabel %>.tsx +│   ├── images +│   │   └── thumbnail.png +│   ├── index.ts +│   ├── plugin +│   │   ├── buildQuery.ts +│   │   ├── controlPanel.ts +│   │   ├── index.ts +│   │   └── transformProps.ts +│   └── types.ts +├── test +│   └── index.test.ts +└── types + └── external.d.ts ``` \ No newline at end of file diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/package.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/package.erb index 4cf7fb4f72..84e6feda7a 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/package.erb +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/package.erb @@ -26,7 +26,16 @@ "access": "public" }, "peerDependencies": { - "@superset-ui/chart": "latest", - "@superset-ui/translation": "latest" + "@superset-ui/chart": "^0.14.1", + "@superset-ui/query": "^0.14.1", + "@superset-ui/chart-controls": "^0.14.0", + "@superset-ui/translation": "^0.14.0", + "@superset-ui/validator": "^0.14.1", + "@superset-ui/style": "^0.14.0", + "react": "^16.13.1" + }, + "devDependencies": { + "@types/jest": "^26.0.0", + "jest": "^26.0.1" } } diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/MyChart.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/MyChart.erb index 4bc2f65b31..de229fe24d 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/MyChart.erb +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/MyChart.erb @@ -16,25 +16,115 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react'; +import React, { <%if (componentType == 'class') { %>PureComponent<% } %><%if (componentType == 'function') { %>useEffect<% } %>, createRef } from 'react'; +import styled, { supersetTheme } from '@superset-ui/style'; + +interface <%= packageLabel %>StylesProps { + height: number; + width: number; + headerFontSize: keyof typeof supersetTheme.typography.sizes; + boldText: boolean; +} export type <%= packageLabel %>Props = { height: number; width: number; - data: { x: number; y: number }[]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data: Record; // please add additional typing for your data here + // add typing here for the props you pass in from transformProps.ts! + boldText: boolean; + headerFontSize: 'xxs' | 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl'; + headerText: string; }; -export default class <%= packageLabel %> extends React.PureComponent<<%= packageLabel %>Props> { +// The following Styles component is a
element, which has been styled using Emotion +// For docs, visit https://emotion.sh/docs/styled + +// Theming variables are provided for your use via a ThemeProvider +// imported from @superset-ui/style. For variables available, please visit +// https://github.com/apache-superset/superset-ui/blob/master/packages/superset-ui-style/src/index.ts + +const Styles = styled.div<<%= packageLabel %>StylesProps>` + background-color: ${({ theme }) => theme.colors.secondary.light2}; + padding: ${({ theme }) => theme.gridUnit * 4}px; + border-radius: ${({ theme }) => theme.gridUnit * 2}px; + height: ${({ height }) => height}; + width: ${({ width }) => width}; + overflow-y: scroll; + + h3 { + /* You can use your props to control CSS! */ + font-size: ${({ theme, headerFontSize }) => theme.typography.sizes[headerFontSize]}; + font-weight: ${({ theme, boldText }) => theme.typography.weights[boldText ? 'bold' : 'normal']}; + } +`; + +/** + * ******************* WHAT YOU CAN BUILD HERE ******************* + * In essence, a chart is given a few key ingredients to work with: + * * Data: provided via `props.data` + * * A DOM element + * * FormData (your controls!) provided as props by transformProps.ts + */ + +<%if (componentType == 'class') { %>export default class <%= packageLabel %> extends PureComponent<<%= packageLabel %>Props> { + // Often, you just want to get a hold of the DOM and go nuts. + // Here, you can do that with createRef, and componentDidMount. + + rootElem = createRef(); + + componentDidMount() { + const root = this.rootElem.current as HTMLElement; + console.log('Plugin element', root); + } + render() { + // height and width are the height and width of the DOM element as it exists in the dashboard. + // There is also a `data` prop, which is, of course, your DATA 🎉 + console.log('Approach 1 props', this.props); const { data, height, width } = this.props; + console.log('Plugin props', this.props); + return ( -
-

Hello!

-
-          {JSON.stringify(this.props, null, 2)}
-        
-
+ +

{this.props.headerText}

+
{JSON.stringify(data, null, 2)}
+
); } -} +}<% } %><%if (componentType == 'function') { %>export default function <%= packageLabel %>(props: <%= packageLabel %>Props) { + // height and width are the height and width of the DOM element as it exists in the dashboard. + // There is also a `data` prop, which is, of course, your DATA 🎉 + const { data, height, width } = props; + + const rootElem = createRef(); + + // Often, you just want to get a hold of the DOM and go nuts. + // Here, you can do that with createRef, and the useEffect hook. + useEffect(() => { + const root = rootElem.current as HTMLElement; + console.log('Plugin element', root); + }); + + console.log('Plugin props', props); + + return ( + +

{props.headerText}

+
${JSON.stringify(data, null, 2)}
+
+ ); +}<% } %> diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/images/thumbnail.png b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/images/thumbnail.png index 665bb0e8179f915ab31223eabb86138dbf35e873..cc2c8fbebea14c57af512a5cc6e97c5e3f4c0218 100644 GIT binary patch literal 20611 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 SH5^ZZfydp&>kR)CDdk^IXMlSE literal 3619 zcmeAS@N?(olHy`uVBq!ia0y~yV2S`?4mP03zO)&4fD~Jjx4R3&e-K=-cll(X${U_8 zjv*Cu-rlkAxnC-K{G8e!Q`^{{7RbdbQi` zKiQq!v(b=&;Y3Z^MP>$uZPJab3i_x?`( z^B-qFE?0}$Vtc3V_P&iZMV0UVzSyYz_`~0J^%xePmk%17AJ2Sz{@h;q8#}ZA{P}d= zcSlC`k7xDwB;V(*IltHb>zB#N|6_lv0}Xf+b!+d-oBtCS8IG`sF*x{)GN=~_InP_| zWh%eC07akQo|2@~zfYYyRq^nrxLVZa+CAUbf8Vxe|Bv0`$6wvtEWDO+*|t4@j!pZ1 zSvvdi(y#m=C3EDZqwmF6zx~=dEhpdl*pC+bOa=zMuJ9HH218g9L1oPT$#?B({EuTG z8_mwu8(jPUcf0HP8)as8Hs;5Uxfj1TzhCot$G^7M;AC<&JWh7?>ea>X!{aKSMnpx; zD!BOV!@u9}`?qf0y7T+$Y3rn{^=F@CwmS%P_OjBFe}T-t{~ubq8#HBY3JPqB|J>a9y}G{Oy~Vc~{mGyICtknw&i8zrAk%32qI%xS zIWCd>__2LV+1sz&vzTVDonKqt(|_&Rz3+E7=HDrLtt+g@wCu|r+hvfO>EOr2M&*Qh-@7??K?}u=`topx#v_+-|uEhPk z{A${F^J(`b`u~6W*m>>1(VK?HZbW?HU}$)IMB52l@d_?*&(^TNzEImPwvjpQ&%Yz5 zA3r(ybm#ZI)!+O6-oIxLDq`Qyt1I90b^3NO+vMAopU;{f|MlzFo!`Cj`wC-1WwBo1bs{w?W$H=|Oh6Tc4Dh%I_C{|M69L|EvPR154j)o4=9O*48e5 z?{E9}$&LEy^?Tyh#Cq>Gx2<;NfHXHz+Y+GKVN_%^5Qc8r*eILa)9c#Lz;MIw4?l9} c=FR?VqBqVg-ofPq?Da8ty85}Sb4q9e0GzGm1poj5 diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/index.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/index.erb index 48e037ea93..21a23adaa9 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/index.erb +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/index.erb @@ -1 +1,27 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +// eslint-disable-next-line import/prefer-default-export export { default as <%= packageLabel %>ChartPlugin } from './plugin'; +/** + * Note: this file exports the default export from <%= packageLabel %>.tsx. + * If you want to export multiple visualization modules, you will need to + * either add additional plugin folders (similar in structure to ./plugin) + * OR export multiple instances of `ChartPlugin` extensions in ./plugin/index.ts + * which in turn load exports from <%= packageLabel %>.tsx + */ diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/buildQuery.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/buildQuery.erb new file mode 100644 index 0000000000..4978faf571 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/buildQuery.erb @@ -0,0 +1,43 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { buildQueryContext, QueryFormData } from '@superset-ui/query'; + +/** + * The buildQuery function is used to create an instance of QueryContext that's + * sent to the chart data endpoint. In addition to containing information of which + * datasource to use, it specifies the type (e.g. full payload, samples, query) and + * format (e.g. CSV or JSON) of the result and whether or not to force refresh the data from + * the datasource as opposed to using a cached copy of the data, if available. + * + * More importantly though, QueryContext contains a property `queries`, which is an array of + * QueryObjects specifying individual data requests to be made. A QueryObject specifies which + * columns, metrics and filters, among others, to use during the query. Usually it will be enough + * to specify just one query based on the baseQueryObject, but for some more advanced use cases + * it is possible to define post processing operations in the QueryObject, or multiple queries + * if a viz needs multiple different result sets. + */ +export default function buildQuery(formData: QueryFormData) { + return buildQueryContext(formData, baseQueryObject => [ + { + ...baseQueryObject, +<%if (chartType === 'timeseries') { %> // Time series charts need to set the `is_timeseries` flag to true + is_timeseries: true, +<% } %> }, + ]); +} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/controlPanel.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/controlPanel.erb new file mode 100644 index 0000000000..b7788235b3 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/controlPanel.erb @@ -0,0 +1,177 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { t } from '@superset-ui/translation'; +import { validateNonEmpty } from '@superset-ui/validator'; +import { ControlPanelConfig } from '@superset-ui/chart-controls'; + +const config: ControlPanelConfig = { + /** + * The control panel is split into two tabs: "Query" and + * "Chart Options". The controls that define the inputs to + * the chart data request, such as columns and metrics, usually + * reside within "Query", while controls that affect the visual + * appearance or functionality of the chart are under the + * "Chart Options" section. + * + * There are several predefined controls that can be used. + * Some examples: + * - groupby: columns to group by (tranlated to GROUP BY statement) + * - series: same as groupby, but single selection. + * - metrics: multiple metrics (translated to aggregate expression) + * - metric: sane as metrics, but single selection + * - adhoc_filters: filters (translated to WHERE or HAVING + * depending on filter type) + * - row_limit: maximum number of rows (translated to LIMIT statement) + * + * If a control panel has both a `series` and `groupby` control, and + * the user has chosen `col1` as the value for the `series` control, + * and `col2` and `col3` as values for the `groupby` control, + * the resulting query will contain three groupby columns. This is due + * to the `series` control having the property `queryField` set to + * `groupby`, which automatically appends the values from the + * `series` control to the `groupby` control when the query is generated. + * + * It is also possible to define custom controls by importing the + * necessary dependencies and overriding the default parameters, which + * can then be placed in the `controlSetRows` section + * of the `Query` section instead of a predefined control. + * + * import { validateNonEmpty } from '@superset-ui/validator'; + * import { sharedControls, ControlConfig, ControlPanelConfig } from '@superset-ui/chart-controls'; + * + * const myControl: ControlConfig<'SelectControl'> = { + * name: 'secondary_entity', + * config: { + * ...sharedControls.entity, + * type: 'SelectControl', + * label: t('Secondary Entity'), + * mapStateToProps: state => ({ + * sharedControls.columnChoices(state.datasource) + * .columns.filter(c => c.groupby) + * }) + * validators: [validateNonEmpty], + * }, + * } + * + * In addition to the basic drop down control, there are several predefined + * control types (can be set via the `type` property) that can be used. Some + * commonly used examples: + * - SelectControl: Dropdown to select single or multiple values, + usually columns + * - MetricsControl: Dropdown to select metrics, triggering a modal + to define Metric details + * - AdhocFilterControl: Control to choose filters + * - CheckboxControl: A checkbox for choosing true/false values + * - SliderControl: A slider with min/max values + * - TextControl: Control for text data + * + * For more control input types, check out the `incubator-superset` repo + * and open this file: superset-frontend/src/explore/components/controls/index.js + * + * To ensure all controls have been filled out correctly, the following + * validators are provided + * by the `@superset-ui/validator` package: + * - validateNonEmpty: must have at least one value + * - validateInteger: must be an integer value + * - validateNumber: must be an intger or decimal value + */ + + // For control input types, see: superset-frontend/src/explore/components/controls/index.js + controlPanelSections: [ + { + label: t('Query'), + expanded: true, + controlSetRows: [['groupby'], ['metrics'], ['adhoc_filters'], ['row_limit', null]], + }, + { + label: t('Hello Controls!'), + expanded: true, + controlSetRows: [ + [ + { + name: 'header_text', + config: { + type: 'TextControl', + default: 'Hello, World!', + renderTrigger: true, + // ^ this makes it apply instantaneously, without triggering a "run query" button + label: t('Header Text'), + description: t('The text you want to see in the header'), + }, + }, + ], + [ + { + name: 'bold_text', + config: { + type: 'CheckboxControl', + label: t('Bold Text'), + renderTrigger: true, + default: true, + description: t('A checkbox to make the '), + }, + }, + ], + [ + { + name: 'header_font_size', + config: { + type: 'SelectControl', + label: t('Font Size'), + default: 'xl', + choices: [ + // [value, label] + ['xxs', 'xx-small'], + ['xs', 'x-small'], + ['s', 'small'], + ['m', 'medium'], + ['l', 'large'], + ['xl', 'x-large'], + ['xxl', 'xx-large'], + ], + renderTrigger: true, + description: t('The size of your header font'), + }, + }, + ], + ], + }, + ], +<%if (chartType === 'timeseries') { %> // Time series charts need to override the `druidTimeSeries` and `sqlaTimeSeries` + // sections to add the time grain dropdown. + sectionOverrides: { + druidTimeSeries: { + controlSetRows: [['granularity', 'druid_time_origin'], ['time_range']], + }, + sqlaTimeSeries: { + controlSetRows: [['granularity_sqla', 'time_grain_sqla'], ['time_range']], + }, + },<% } %> + controlOverrides: { + series: { + validators: [validateNonEmpty], + clearable: false, + }, + row_limit: { + default: 100, + }, + }, +}; + +export default config; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/index.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/index.erb index 3a3fbe480e..fe491ee33e 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/index.erb +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/index.erb @@ -18,6 +18,8 @@ */ import { t } from '@superset-ui/translation'; import { ChartMetadata, ChartPlugin } from '@superset-ui/chart'; +import buildQuery from './buildQuery'; +import controlPanel from './controlPanel'; import transformProps from './transformProps'; import thumbnail from '../images/thumbnail.png'; @@ -28,8 +30,20 @@ const metadata = new ChartMetadata({ }); export default class <%= packageLabel %>ChartPlugin extends ChartPlugin { + /** + * The constructor is used to pass relevant metadata and callbacks that get + * registered in respective registries that are used throughout the library + * and application. A more thorough description of each property is given in + * the respective imported file. + * + * It is worth noting that `buildQuery` and is optional, and only needed for + * advanced visualizations that require either post processing operations + * (pivoting, rolling aggregations, sorting etc) or submitting multiple queries. + */ constructor() { super({ + buildQuery, + controlPanel, loadChart: () => import('../<%= packageLabel %>'), metadata, transformProps, diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/transformProps.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/transformProps.erb new file mode 100644 index 0000000000..7d5d723419 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/transformProps.erb @@ -0,0 +1,77 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { ChartProps, DataRecord } from '@superset-ui/chart'; + +<%if (chartType === 'timeseries') { %>type TimestampType = string | number | Date; + +interface <%= packageLabel %>Datum extends DataRecord { + __timestamp: TimestampType; +}<% } else { %>type <%= packageLabel %>Datum = DataRecord;<% } %> + +export default function transformProps(chartProps: ChartProps) { + /** + * This function is called after a successful response has been + * received from the chart data endpoint, and is used to transform + * the incoming data prior to being sent to the Visualization. + * + * The transformProps function is also quite useful to return + * additional/modified props to your data viz component. The formData + * can also be accessed from your <%= packageLabel %>.tsx file, but + * doing supplying custom props here is often handy for integrating third + * party libraries that rely on specific props. + * + * A description of properties in `chartProps`: + * - `height`, `width`: the height/width of the DOM element in which + * the chart is located + * - `formData`: the chart data request payload that was sent to the + * backend. + * - `queryData`: the chart data response payload that was received + * from the backend. Some notable properties of `queryData`: + * - `data`: an array with data, each row with an object mapping + * the column/alias to its value. Example: + * `[{ col1: 'abc', metric1: 10 }, { col1: 'xyz', metric1: 20 }]` + * - `rowcount`: the number of rows in `data` + * - `query`: the query that was issued. + * + * Please note: the transformProps function gets cached when the + * application loads. When making changes to the `transformProps` + * function during development with hot reloading, changes won't + * be seen until restarting the development server. + */ + const { width, height, formData, queryData } = chartProps; + const data = queryData.data as <%= packageLabel %>Datum[]; + + console.log('formData via TransformProps.ts', formData); + + return { + width, + height, +<%if (chartType === 'timeseries') { %> + data: data.map((item: { __timestamp: TimestampType }) => ({ + ...item, + // convert epoch to native Date + // eslint-disable-next-line no-underscore-dangle + __timestamp: new Date(item.__timestamp), + })),<% } else { %> data,<% } %> + // and now your control data, manipulated as needed, and passed through as props! + boldText: formData.boldText, + headerFontSize: formData.headerFontSize, + headerText: formData.headerText, + }; +} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/transformProps.txt b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/transformProps.txt deleted file mode 100644 index 715f0af2f6..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/src/plugin/transformProps.txt +++ /dev/null @@ -1,32 +0,0 @@ -import { ChartProps } from '@superset-ui/chart'; - -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -export default function transformProps(chartProps: ChartProps) { - const { width, height, formData, queryData } = chartProps; - const { color } = formData; - const { data } = queryData; - - return { - width, - height, - color, - data, - }; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/index.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/index.erb index 6b2324dd4c..9eca957441 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/index.erb +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/index.erb @@ -1,5 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ import { <%= packageLabel %>ChartPlugin } from '../src'; +/** + * The example tests in this file act as a starting point, and + * we encourage you to build more. These tests check that the + * plugin loads properly, and focus on `transformProps` + * to ake sure that data, controls, and props are all + * treated correctly (e.g. formData from plugin controls + * properly transform the data and/or any resulting props). + */ describe('@superset-ui/plugin-chart-<%= packageName %>', () => { it('exists', () => { expect(<%= packageLabel %>ChartPlugin).toBeDefined(); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/plugin/buildQuery.test.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/plugin/buildQuery.test.erb new file mode 100644 index 0000000000..f559729b28 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/plugin/buildQuery.test.erb @@ -0,0 +1,18 @@ +import 'babel-polyfill'; +import buildQuery from '../../src/plugin/buildQuery'; + +describe('<%= packageLabel %> buildQuery', () => { + const formData = { + datasource: '5__table', + granularity_sqla: 'ds', + series: 'foo', + viz_type: 'my_chart', + queryFields: { series: 'groupby' }, + }; + + it('should build groupby with series in form data', () => { + const queryContext = buildQuery(formData); + const [query] = queryContext.queries; + expect(query.groupby).toEqual(['foo']); + }); +}); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/plugin/transformProps.test.erb b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/plugin/transformProps.test.erb new file mode 100644 index 0000000000..423c41e71b --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/generators/plugin-chart/templates/test/plugin/transformProps.test.erb @@ -0,0 +1,35 @@ +import 'babel-polyfill'; +import { ChartProps } from '@superset-ui/chart'; +import transformProps from '../../src/plugin/transformProps'; + +describe('<%= packageLabel %> tranformProps', () => { + const formData = { + colorScheme: 'bnbColors', + datasource: '3__table', + granularity_sqla: 'ds', + metric: 'sum__num', + series: 'name', + boldText: true, + headerFontSize: 'xs', + headerText: 'my text', + }; + const chartProps = new ChartProps({ + formData, + width: 800, + height: 600, + queryData: { + data: [{ name: 'Hulk', sum__num: 1<%if (chartType === 'timeseries') { %>, __timestamp: 599616000000<% } %> }], + }, + }); + + it('should tranform chart props for viz', () => { + expect(transformProps(chartProps)).toEqual({ + width: 800, + height: 600, + boldText: true, + headerFontSize: 'xs', + headerText: 'my text', + data: [{ name: 'Hulk', sum__num: 1<%if (chartType === 'timeseries') { %>, __timestamp: new Date(599616000000)<% } %> }], + }); + }); +}); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/legacy-plugin-chart-demo.test.js b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/legacy-plugin-chart-demo.test.js deleted file mode 100644 index f81827562a..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/legacy-plugin-chart-demo.test.js +++ /dev/null @@ -1,35 +0,0 @@ -const path = require('path'); -const assert = require('yeoman-assert'); -const helpers = require('yeoman-test'); - -describe('generator-superset:legacy-plugin-chart-demo', () => { - let dir; - - beforeAll(() => { - dir = process.cwd(); - - return helpers - .run(path.join(__dirname, '../generators/legacy-plugin-chart-demo')) - .withPrompts({ packageName: '4d-pie-chart', packageLabel: '4DPieChart' }) - .withOptions({ skipInstall: true }); - }); - - /* - * Change working directory back to original working directory - * after the test has completed. - * yeoman tests switch to tmp directory and write files there. - * Usually this is fine for solo package. - * However, for a monorepo like this one, - * it made jest confuses with current directory - * (being in tmp directory instead of superset-ui root) - * and interferes with other tests in sibling packages - * that are run after the yeoman tests. - */ - afterAll(() => { - process.chdir(dir); - }); - - it('creates files', () => { - assert.file(['index.js', 'Stories.jsx']); - }); -}); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/legacy-plugin-chart.test.js b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/legacy-plugin-chart.test.js deleted file mode 100644 index f981a539be..0000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/legacy-plugin-chart.test.js +++ /dev/null @@ -1,35 +0,0 @@ -const path = require('path'); -const assert = require('yeoman-assert'); -const helpers = require('yeoman-test'); - -describe('generator-superset:legacy-plugin-chart', () => { - let dir; - - beforeAll(() => { - dir = process.cwd(); - - return helpers - .run(path.join(__dirname, '../generators/legacy-plugin-chart')) - .withPrompts({ packageName: '4d-pie-chart', description: '4D Pie Chart' }) - .withOptions({ skipInstall: true }); - }); - - /* - * Change working directory back to original working directory - * after the test has completed. - * yeoman tests switch to tmp directory and write files there. - * Usually this is fine for solo package. - * However, for a monorepo like this one, - * it made jest confuses with current directory - * (being in tmp directory instead of superset-ui root) - * and interferes with other tests in sibling packages - * that are run after the yeoman tests. - */ - afterAll(() => { - process.chdir(dir); - }); - - it('creates files', () => { - assert.file(['package.json']); - }); -}); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/plugin-chart.test.js b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/plugin-chart.test.js index 500cf107c2..31e151517a 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/plugin-chart.test.js +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/generator-superset/test/plugin-chart.test.js @@ -33,11 +33,15 @@ describe('generator-superset:plugin-chart', () => { assert.file([ 'package.json', 'README.md', + 'src/plugin/buildQuery.ts', + 'src/plugin/controlPanel.ts', 'src/plugin/index.ts', 'src/plugin/transformProps.ts', - 'src/index.ts', 'src/ColdMap.tsx', + 'src/index.ts', 'test/index.test.ts', + 'test/plugin/buildQuery.test.ts', + 'test/plugin/transformProps.test.ts', 'types/external.d.ts', 'src/images/thumbnail.png', ]); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-chart-controls/src/types.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-chart-controls/src/types.ts index bf0a56af5f..ff0e5c65a2 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-chart-controls/src/types.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-chart-controls/src/types.ts @@ -205,7 +205,6 @@ type SelectOption = AnyDict | string | [ReactText, ReactNode]; type SelectControlType = | 'SelectControl' | 'SelectAsyncControl' - | 'SelectControl' | 'MetricsControl' | 'FixedOrMetricControl' | 'AdhocFilterControl' diff --git a/superset-frontend/temporary_superset_ui/superset-ui/yarn.lock b/superset-frontend/temporary_superset_ui/superset-ui/yarn.lock index 1bf54cd172..b80791375e 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/yarn.lock +++ b/superset-frontend/temporary_superset_ui/superset-ui/yarn.lock @@ -1825,6 +1825,17 @@ jest-util "^25.5.0" slash "^3.0.0" +"@jest/console@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.0.1.tgz#62b3b2fa8990f3cbffbef695c42ae9ddbc8f4b39" + integrity sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw== + dependencies: + "@jest/types" "^26.0.1" + chalk "^4.0.0" + jest-message-util "^26.0.1" + jest-util "^26.0.1" + slash "^3.0.0" + "@jest/core@^25.5.4": version "25.5.4" resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.5.4.tgz#3ef7412f7339210f003cdf36646bbca786efe7b4" @@ -1859,6 +1870,39 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/core@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.0.1.tgz#aa538d52497dfab56735efb00e506be83d841fae" + integrity sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ== + dependencies: + "@jest/console" "^26.0.1" + "@jest/reporters" "^26.0.1" + "@jest/test-result" "^26.0.1" + "@jest/transform" "^26.0.1" + "@jest/types" "^26.0.1" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^26.0.1" + jest-config "^26.0.1" + jest-haste-map "^26.0.1" + jest-message-util "^26.0.1" + jest-regex-util "^26.0.0" + jest-resolve "^26.0.1" + jest-resolve-dependencies "^26.0.1" + jest-runner "^26.0.1" + jest-runtime "^26.0.1" + jest-snapshot "^26.0.1" + jest-util "^26.0.1" + jest-validate "^26.0.1" + jest-watcher "^26.0.1" + micromatch "^4.0.2" + p-each-series "^2.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + "@jest/environment@^25.5.0": version "25.5.0" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.5.0.tgz#aa33b0c21a716c65686638e7ef816c0e3a0c7b37" @@ -1868,6 +1912,15 @@ "@jest/types" "^25.5.0" jest-mock "^25.5.0" +"@jest/environment@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.0.1.tgz#82f519bba71959be9b483675ee89de8c8f72a5c8" + integrity sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g== + dependencies: + "@jest/fake-timers" "^26.0.1" + "@jest/types" "^26.0.1" + jest-mock "^26.0.1" + "@jest/fake-timers@^25.5.0": version "25.5.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.5.0.tgz#46352e00533c024c90c2bc2ad9f2959f7f114185" @@ -1879,6 +1932,17 @@ jest-util "^25.5.0" lolex "^5.0.0" +"@jest/fake-timers@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.0.1.tgz#f7aeff13b9f387e9d0cac9a8de3bba538d19d796" + integrity sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg== + dependencies: + "@jest/types" "^26.0.1" + "@sinonjs/fake-timers" "^6.0.1" + jest-message-util "^26.0.1" + jest-mock "^26.0.1" + jest-util "^26.0.1" + "@jest/globals@^25.5.2": version "25.5.2" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-25.5.2.tgz#5e45e9de8d228716af3257eeb3991cc2e162ca88" @@ -1888,6 +1952,15 @@ "@jest/types" "^25.5.0" expect "^25.5.0" +"@jest/globals@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.0.1.tgz#3f67b508a7ce62b6e6efc536f3d18ec9deb19a9c" + integrity sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA== + dependencies: + "@jest/environment" "^26.0.1" + "@jest/types" "^26.0.1" + expect "^26.0.1" + "@jest/reporters@^25.5.1": version "25.5.1" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.5.1.tgz#cb686bcc680f664c2dbaf7ed873e93aa6811538b" @@ -1920,6 +1993,38 @@ optionalDependencies: node-notifier "^6.0.0" +"@jest/reporters@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.0.1.tgz#14ae00e7a93e498cec35b0c00ab21c375d9b078f" + integrity sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^26.0.1" + "@jest/test-result" "^26.0.1" + "@jest/transform" "^26.0.1" + "@jest/types" "^26.0.1" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^26.0.1" + jest-resolve "^26.0.1" + jest-util "^26.0.1" + jest-worker "^26.0.0" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^4.1.3" + optionalDependencies: + node-notifier "^7.0.0" + "@jest/source-map@^25.5.0": version "25.5.0" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.5.0.tgz#df5c20d6050aa292c2c6d3f0d2c7606af315bd1b" @@ -1929,6 +2034,15 @@ graceful-fs "^4.2.4" source-map "^0.6.0" +"@jest/source-map@^26.0.0": + version "26.0.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.0.0.tgz#fd7706484a7d3faf7792ae29783933bbf48a4749" + integrity sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + "@jest/test-result@^25.5.0": version "25.5.0" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.5.0.tgz#139a043230cdeffe9ba2d8341b27f2efc77ce87c" @@ -1939,6 +2053,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.0.1.tgz#1ffdc1ba4bc289919e54b9414b74c9c2f7b2b718" + integrity sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg== + dependencies: + "@jest/console" "^26.0.1" + "@jest/types" "^26.0.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^25.5.4": version "25.5.4" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz#9b4e685b36954c38d0f052e596d28161bdc8b737" @@ -1950,6 +2074,17 @@ jest-runner "^25.5.4" jest-runtime "^25.5.4" +"@jest/test-sequencer@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz#b0563424728f3fe9e75d1442b9ae4c11da73f090" + integrity sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg== + dependencies: + "@jest/test-result" "^26.0.1" + graceful-fs "^4.2.4" + jest-haste-map "^26.0.1" + jest-runner "^26.0.1" + jest-runtime "^26.0.1" + "@jest/transform@^25.5.1": version "25.5.1" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3" @@ -1972,6 +2107,27 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/transform@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.0.1.tgz#0e3ecbb34a11cd4b2080ed0a9c4856cf0ceb0639" + integrity sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.0.1" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.0.1" + jest-regex-util "^26.0.0" + jest-util "^26.0.1" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + "@jest/types@^25.1.0": version "25.2.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.3.tgz#035c4fb94e2da472f359ff9a211915d59987f6b6" @@ -2002,6 +2158,16 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@jest/types@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.0.1.tgz#b78333fbd113fa7aec8d39de24f88de8686dac67" + integrity sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@lerna/add@3.21.0": version "3.21.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.21.0.tgz#27007bde71cc7b0a2969ab3c2f0ae41578b4577b" @@ -2959,7 +3125,7 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^6.0.0": +"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== @@ -3922,6 +4088,14 @@ jest-diff "^25.2.1" pretty-format "^25.2.1" +"@types/jest@^26.0.0": + version "26.0.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.0.tgz#a6d7573dffa9c68cbbdf38f2e0de26f159e11134" + integrity sha512-/yeMsH9HQ1RLORlXAwoLXe8S98xxvhNtUz3yrgrwbaxYjT+6SFPZZRksmRKRA6L5vsUtSHeN71viDOTTyYAD+g== + dependencies: + jest-diff "^25.2.1" + pretty-format "^25.2.1" + "@types/jquery@*": version "3.3.34" resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.34.tgz#0d3b94057063d3854adaeb579652048fec07ba6c" @@ -3990,6 +4164,11 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== +"@types/prettier@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.1.tgz#b6e98083f13faa1e5231bfa3bdb1b0feff536b6d" + integrity sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ== + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -4969,7 +5148,7 @@ JSONStream@^1.0.4, JSONStream@^1.2.1, JSONStream@^1.3.4, JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.0: +abab@^2.0.0, abab@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== @@ -4995,6 +5174,14 @@ acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + acorn-jsx@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" @@ -5005,6 +5192,11 @@ acorn-walk@^6.0.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + acorn@^6.0.1, acorn@^6.2.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" @@ -5600,6 +5792,20 @@ babel-jest@^25.5.1: graceful-fs "^4.2.4" slash "^3.0.0" +babel-jest@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.0.1.tgz#450139ce4b6c17174b136425bda91885c397bc46" + integrity sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw== + dependencies: + "@jest/transform" "^26.0.1" + "@jest/types" "^26.0.1" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + babel-literal-to-ast@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/babel-literal-to-ast/-/babel-literal-to-ast-2.1.0.tgz#c8b12f9c36a8cee13572d65aabf6cff8adb1e8b3" @@ -5677,6 +5883,15 @@ babel-plugin-jest-hoist@^25.5.0: "@babel/types" "^7.3.3" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz#fd1d35f95cf8849fc65cb01b5e58aedd710b34a8" + integrity sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__traverse" "^7.0.6" + babel-plugin-lodash@^3.3.2: version "3.3.4" resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" @@ -5903,6 +6118,14 @@ babel-preset-jest@^25.5.0: babel-plugin-jest-hoist "^25.5.0" babel-preset-current-node-syntax "^0.1.2" +babel-preset-jest@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz#1eac82f513ad36c4db2e9263d7c485c825b1faa6" + integrity sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw== + dependencies: + babel-plugin-jest-hoist "^26.0.0" + babel-preset-current-node-syntax "^0.1.2" + "babel-preset-minify@^0.5.0 || 0.6.0-alpha.5": version "0.5.1" resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz#25f5d0bce36ec818be80338d0e594106e21eaa9f" @@ -6418,6 +6641,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" + integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== + can-use-dom@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a" @@ -6532,6 +6760,11 @@ change-emitter@^0.1.2: resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + character-entities-legacy@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" @@ -7523,7 +7756,7 @@ csso@^4.0.2: dependencies: css-tree "1.0.0-alpha.39" -cssom@^0.4.1: +cssom@^0.4.1, cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== @@ -7540,6 +7773,13 @@ cssstyle@^2.0.0: dependencies: cssom "~0.3.6" +cssstyle@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + csstype@^2.2.0, csstype@^2.5.7, csstype@^2.6.3, csstype@^2.6.4, csstype@^2.6.7: version "2.6.10" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" @@ -7866,6 +8106,15 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + datamaps@^0.5.8: version "0.5.9" resolved "https://registry.yarnpkg.com/datamaps/-/datamaps-0.5.9.tgz#2a775473aaab29b55025208b2245e840ecfd4fe1" @@ -7946,6 +8195,11 @@ decimal.js@9.0.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-9.0.1.tgz#1cc8b228177da7ab6498c1cc06eb130a290e6e1e" integrity sha512-2h0iKbJwnImBk4TGk7CG1xadoA0g3LDPlQhQzbZ221zvG0p2YVUedbKIPsOZXKZGx6YmZMJKYOalpCMxSdDqTQ== +decimal.js@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" + integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -8121,6 +8375,11 @@ diff-sequences@^25.2.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== +diff-sequences@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6" + integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg== + diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -8259,6 +8518,13 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + domhandler@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" @@ -8776,6 +9042,11 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escodegen@^1.11.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" @@ -8788,6 +9059,18 @@ escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" +escodegen@^1.14.1: + version "1.14.2" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.2.tgz#14ab71bf5026c2aa08173afba22c6f3173284a84" + integrity sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escodegen@~1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" @@ -9212,6 +9495,18 @@ expect@^25.5.0: jest-message-util "^25.5.0" jest-regex-util "^25.2.6" +expect@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.0.1.tgz#18697b9611a7e2725e20ba3ceadda49bc9865421" + integrity sha512-QcCy4nygHeqmbw564YxNbHTJlXh47dVID2BUP52cZFpLU9zHViMFK6h07cC1wf7GYCTIigTdAXhVua8Yl1FkKg== + dependencies: + "@jest/types" "^26.0.1" + ansi-styles "^4.0.0" + jest-get-type "^26.0.0" + jest-matcher-utils "^26.0.1" + jest-message-util "^26.0.1" + jest-regex-util "^26.0.0" + express@^4.17.0: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -10536,6 +10831,13 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -11312,6 +11614,11 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -11584,6 +11891,15 @@ jest-changed-files@^25.5.0: execa "^3.2.0" throat "^5.0.0" +jest-changed-files@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.0.1.tgz#1334630c6a1ad75784120f39c3aa9278e59f349f" + integrity sha512-q8LP9Sint17HaE2LjxQXL+oYWW/WeeXMPE2+Op9X3mY8IEGFVc14xRxFjUuXUbcPAlDLhtWdIEt59GdQbn76Hw== + dependencies: + "@jest/types" "^26.0.1" + execa "^4.0.0" + throat "^5.0.0" + jest-cli@^25.5.4: version "25.5.4" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.5.4.tgz#b9f1a84d1301a92c5c217684cb79840831db9f0d" @@ -11604,6 +11920,25 @@ jest-cli@^25.5.4: realpath-native "^2.0.0" yargs "^15.3.1" +jest-cli@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.0.1.tgz#3a42399a4cbc96a519b99ad069a117d955570cac" + integrity sha512-pFLfSOBcbG9iOZWaMK4Een+tTxi/Wcm34geqZEqrst9cZDkTQ1LZ2CnBrTlHWuYAiTMFr0EQeK52ScyFU8wK+w== + dependencies: + "@jest/core" "^26.0.1" + "@jest/test-result" "^26.0.1" + "@jest/types" "^26.0.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.0.1" + jest-util "^26.0.1" + jest-validate "^26.0.1" + prompts "^2.0.1" + yargs "^15.3.1" + jest-config@^25.5.4: version "25.5.4" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.5.4.tgz#38e2057b3f976ef7309b2b2c8dcd2a708a67f02c" @@ -11629,6 +11964,30 @@ jest-config@^25.5.4: pretty-format "^25.5.0" realpath-native "^2.0.0" +jest-config@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.0.1.tgz#096a3d4150afadf719d1fab00e9a6fb2d6d67507" + integrity sha512-9mWKx2L1LFgOXlDsC4YSeavnblN6A4CPfXFiobq+YYLaBMymA/SczN7xYTSmLaEYHZOcB98UdoN4m5uNt6tztg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.0.1" + "@jest/types" "^26.0.1" + babel-jest "^26.0.1" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.0.1" + jest-environment-node "^26.0.1" + jest-get-type "^26.0.0" + jest-jasmine2 "^26.0.1" + jest-regex-util "^26.0.0" + jest-resolve "^26.0.1" + jest-util "^26.0.1" + jest-validate "^26.0.1" + micromatch "^4.0.2" + pretty-format "^26.0.1" + jest-diff@^25.2.1: version "25.2.6" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.6.tgz#a6d70a9ab74507715ea1092ac513d1ab81c1b5e7" @@ -11649,6 +12008,16 @@ jest-diff@^25.5.0: jest-get-type "^25.2.6" pretty-format "^25.5.0" +jest-diff@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.0.1.tgz#c44ab3cdd5977d466de69c46929e0e57f89aa1de" + integrity sha512-odTcHyl5X+U+QsczJmOjWw5tPvww+y9Yim5xzqxVl/R1j4z71+fHW4g8qu1ugMmKdFdxw+AtQgs5mupPnzcIBQ== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.0.0" + jest-get-type "^26.0.0" + pretty-format "^26.0.1" + jest-docblock@^25.3.0: version "25.3.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" @@ -11656,6 +12025,13 @@ jest-docblock@^25.3.0: dependencies: detect-newline "^3.0.0" +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + jest-each@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.5.0.tgz#0c3c2797e8225cb7bec7e4d249dcd96b934be516" @@ -11667,6 +12043,17 @@ jest-each@^25.5.0: jest-util "^25.5.0" pretty-format "^25.5.0" +jest-each@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.0.1.tgz#633083061619302fc90dd8f58350f9d77d67be04" + integrity sha512-OTgJlwXCAR8NIWaXFL5DBbeS4QIYPuNASkzSwMCJO+ywo9BEa6TqkaSWsfR7VdbMLdgYJqSfQcIyjJCNwl5n4Q== + dependencies: + "@jest/types" "^26.0.1" + chalk "^4.0.0" + jest-get-type "^26.0.0" + jest-util "^26.0.1" + pretty-format "^26.0.1" + jest-environment-jsdom@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz#dcbe4da2ea997707997040ecf6e2560aec4e9834" @@ -11679,6 +12066,18 @@ jest-environment-jsdom@^25.5.0: jest-util "^25.5.0" jsdom "^15.2.1" +jest-environment-jsdom@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.0.1.tgz#217690852e5bdd7c846a4e3b50c8ffd441dfd249" + integrity sha512-u88NJa3aptz2Xix2pFhihRBAatwZHWwSiRLBDBQE1cdJvDjPvv7ZGA0NQBxWwDDn7D0g1uHqxM8aGgfA9Bx49g== + dependencies: + "@jest/environment" "^26.0.1" + "@jest/fake-timers" "^26.0.1" + "@jest/types" "^26.0.1" + jest-mock "^26.0.1" + jest-util "^26.0.1" + jsdom "^16.2.2" + jest-environment-node@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.5.0.tgz#0f55270d94804902988e64adca37c6ce0f7d07a1" @@ -11691,11 +12090,27 @@ jest-environment-node@^25.5.0: jest-util "^25.5.0" semver "^6.3.0" +jest-environment-node@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.0.1.tgz#584a9ff623124ff6eeb49e0131b5f7612b310b13" + integrity sha512-4FRBWcSn5yVo0KtNav7+5NH5Z/tEgDLp7VRQVS5tCouWORxj+nI+1tOLutM07Zb2Qi7ja+HEDoOUkjBSWZg/IQ== + dependencies: + "@jest/environment" "^26.0.1" + "@jest/fake-timers" "^26.0.1" + "@jest/types" "^26.0.1" + jest-mock "^26.0.1" + jest-util "^26.0.1" + jest-get-type@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== +jest-get-type@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039" + integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg== + jest-haste-map@^25.5.1: version "25.5.1" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943" @@ -11716,6 +12131,26 @@ jest-haste-map@^25.5.1: optionalDependencies: fsevents "^2.1.2" +jest-haste-map@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.0.1.tgz#40dcc03c43ac94d25b8618075804d09cd5d49de7" + integrity sha512-J9kBl/EdjmDsvyv7CiyKY5+DsTvVOScenprz/fGqfLg/pm1gdjbwwQ98nW0t+OIt+f+5nAVaElvn/6wP5KO7KA== + dependencies: + "@jest/types" "^26.0.1" + "@types/graceful-fs" "^4.1.2" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-serializer "^26.0.0" + jest-util "^26.0.1" + jest-worker "^26.0.0" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + which "^2.0.2" + optionalDependencies: + fsevents "^2.1.2" + jest-jasmine2@^25.5.4: version "25.5.4" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz#66ca8b328fb1a3c5364816f8958f6970a8526968" @@ -11739,6 +12174,29 @@ jest-jasmine2@^25.5.4: pretty-format "^25.5.0" throat "^5.0.0" +jest-jasmine2@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.0.1.tgz#947c40ee816636ba23112af3206d6fa7b23c1c1c" + integrity sha512-ILaRyiWxiXOJ+RWTKupzQWwnPaeXPIoLS5uW41h18varJzd9/7I0QJGqg69fhTT1ev9JpSSo9QtalriUN0oqOg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.0.1" + "@jest/source-map" "^26.0.0" + "@jest/test-result" "^26.0.1" + "@jest/types" "^26.0.1" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.0.1" + is-generator-fn "^2.0.0" + jest-each "^26.0.1" + jest-matcher-utils "^26.0.1" + jest-message-util "^26.0.1" + jest-runtime "^26.0.1" + jest-snapshot "^26.0.1" + jest-util "^26.0.1" + pretty-format "^26.0.1" + throat "^5.0.0" + jest-leak-detector@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz#2291c6294b0ce404241bb56fe60e2d0c3e34f0bb" @@ -11747,6 +12205,14 @@ jest-leak-detector@^25.5.0: jest-get-type "^25.2.6" pretty-format "^25.5.0" +jest-leak-detector@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.0.1.tgz#79b19ab3f41170e0a78eb8fa754a116d3447fb8c" + integrity sha512-93FR8tJhaYIWrWsbmVN1pQ9ZNlbgRpfvrnw5LmgLRX0ckOJ8ut/I35CL7awi2ecq6Ca4lL59bEK9hr7nqoHWPA== + dependencies: + jest-get-type "^26.0.0" + pretty-format "^26.0.1" + jest-matcher-utils@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867" @@ -11757,6 +12223,16 @@ jest-matcher-utils@^25.5.0: jest-get-type "^25.2.6" pretty-format "^25.5.0" +jest-matcher-utils@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.0.1.tgz#12e1fc386fe4f14678f4cc8dbd5ba75a58092911" + integrity sha512-PUMlsLth0Azen8Q2WFTwnSkGh2JZ8FYuwijC8NR47vXKpsrKmA1wWvgcj1CquuVfcYiDEdj985u5Wmg7COEARw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.0.1" + jest-get-type "^26.0.0" + pretty-format "^26.0.1" + jest-message-util@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.5.0.tgz#ea11d93204cc7ae97456e1d8716251185b8880ea" @@ -11771,6 +12247,20 @@ jest-message-util@^25.5.0: slash "^3.0.0" stack-utils "^1.0.1" +jest-message-util@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.0.1.tgz#07af1b42fc450b4cc8e90e4c9cef11b33ce9b0ac" + integrity sha512-CbK8uQREZ8umUfo8+zgIfEt+W7HAHjQCoRaNs4WxKGhAYBGwEyvxuK81FXa7VeB9pwDEXeeKOB2qcsNVCAvB7Q== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.0.1" + "@types/stack-utils" "^1.0.1" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + slash "^3.0.0" + stack-utils "^2.0.2" + jest-mock-console@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/jest-mock-console/-/jest-mock-console-1.0.1.tgz#07978047735a782d0d4172d1afcabd82f6de9b08" @@ -11783,6 +12273,13 @@ jest-mock@^25.5.0: dependencies: "@jest/types" "^25.5.0" +jest-mock@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.0.1.tgz#7fd1517ed4955397cf1620a771dc2d61fad8fd40" + integrity sha512-MpYTBqycuPYSY6xKJognV7Ja46/TeRbAZept987Zp+tuJvMN0YBWyyhG9mXyYQaU3SBI0TUlSaO5L3p49agw7Q== + dependencies: + "@jest/types" "^26.0.1" + jest-pnp-resolver@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" @@ -11793,6 +12290,11 @@ jest-regex-util@^25.2.6: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + jest-resolve-dependencies@^25.5.4: version "25.5.4" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz#85501f53957c8e3be446e863a74777b5a17397a7" @@ -11802,6 +12304,15 @@ jest-resolve-dependencies@^25.5.4: jest-regex-util "^25.2.6" jest-snapshot "^25.5.1" +jest-resolve-dependencies@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.0.1.tgz#607ba7ccc32151d185a477cff45bf33bce417f0b" + integrity sha512-9d5/RS/ft0vB/qy7jct/qAhzJsr6fRQJyGAFigK3XD4hf9kIbEH5gks4t4Z7kyMRhowU6HWm/o8ILqhaHdSqLw== + dependencies: + "@jest/types" "^26.0.1" + jest-regex-util "^26.0.0" + jest-snapshot "^26.0.1" + jest-resolve@^25.5.1: version "25.5.1" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.5.1.tgz#0e6fbcfa7c26d2a5fe8f456088dc332a79266829" @@ -11817,6 +12328,20 @@ jest-resolve@^25.5.1: resolve "^1.17.0" slash "^3.0.0" +jest-resolve@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.0.1.tgz#21d1ee06f9ea270a343a8893051aeed940cde736" + integrity sha512-6jWxk0IKZkPIVTvq6s72RH735P8f9eCJW3IM5CX/SJFeKq1p2cZx0U49wf/SdMlhaB/anann5J2nCJj6HrbezQ== + dependencies: + "@jest/types" "^26.0.1" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.1" + jest-util "^26.0.1" + read-pkg-up "^7.0.1" + resolve "^1.17.0" + slash "^3.0.0" + jest-runner@^25.5.4: version "25.5.4" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.5.4.tgz#ffec5df3875da5f5c878ae6d0a17b8e4ecd7c71d" @@ -11842,6 +12367,31 @@ jest-runner@^25.5.4: source-map-support "^0.5.6" throat "^5.0.0" +jest-runner@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.0.1.tgz#ea03584b7ae4bacfb7e533d680a575a49ae35d50" + integrity sha512-CApm0g81b49Znm4cZekYQK67zY7kkB4umOlI2Dx5CwKAzdgw75EN+ozBHRvxBzwo1ZLYZ07TFxkaPm+1t4d8jA== + dependencies: + "@jest/console" "^26.0.1" + "@jest/environment" "^26.0.1" + "@jest/test-result" "^26.0.1" + "@jest/types" "^26.0.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.0.1" + jest-docblock "^26.0.0" + jest-haste-map "^26.0.1" + jest-jasmine2 "^26.0.1" + jest-leak-detector "^26.0.1" + jest-message-util "^26.0.1" + jest-resolve "^26.0.1" + jest-runtime "^26.0.1" + jest-util "^26.0.1" + jest-worker "^26.0.0" + source-map-support "^0.5.6" + throat "^5.0.0" + jest-runtime@^25.5.4: version "25.5.4" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.5.4.tgz#dc981fe2cb2137abcd319e74ccae7f7eeffbfaab" @@ -11874,6 +12424,38 @@ jest-runtime@^25.5.4: strip-bom "^4.0.0" yargs "^15.3.1" +jest-runtime@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.0.1.tgz#a121a6321235987d294168e282d52b364d7d3f89" + integrity sha512-Ci2QhYFmANg5qaXWf78T2Pfo6GtmIBn2rRaLnklRyEucmPccmCKvS9JPljcmtVamsdMmkyNkVFb9pBTD6si9Lw== + dependencies: + "@jest/console" "^26.0.1" + "@jest/environment" "^26.0.1" + "@jest/fake-timers" "^26.0.1" + "@jest/globals" "^26.0.1" + "@jest/source-map" "^26.0.0" + "@jest/test-result" "^26.0.1" + "@jest/transform" "^26.0.1" + "@jest/types" "^26.0.1" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.0.1" + jest-haste-map "^26.0.1" + jest-message-util "^26.0.1" + jest-mock "^26.0.1" + jest-regex-util "^26.0.0" + jest-resolve "^26.0.1" + jest-snapshot "^26.0.1" + jest-util "^26.0.1" + jest-validate "^26.0.1" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.3.1" + jest-serializer@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" @@ -11881,6 +12463,13 @@ jest-serializer@^25.5.0: dependencies: graceful-fs "^4.2.4" +jest-serializer@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.0.0.tgz#f6c521ddb976943b93e662c0d4d79245abec72a3" + integrity sha512-sQGXLdEGWFAE4wIJ2ZaIDb+ikETlUirEOBsLXdoBbeLhTHkZUJwgk3+M8eyFizhM6le43PDCCKPA1hzkSDo4cQ== + dependencies: + graceful-fs "^4.2.4" + jest-snapshot@^25.5.1: version "25.5.1" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.5.1.tgz#1a2a576491f9961eb8d00c2e5fd479bc28e5ff7f" @@ -11902,6 +12491,27 @@ jest-snapshot@^25.5.1: pretty-format "^25.5.0" semver "^6.3.0" +jest-snapshot@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.0.1.tgz#1baa942bd83d47b837a84af7fcf5fd4a236da399" + integrity sha512-jxd+cF7+LL+a80qh6TAnTLUZHyQoWwEHSUFJjkw35u3Gx+BZUNuXhYvDqHXr62UQPnWo2P6fvQlLjsU93UKyxA== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.0.1" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.0.1" + graceful-fs "^4.2.4" + jest-diff "^26.0.1" + jest-get-type "^26.0.0" + jest-matcher-utils "^26.0.1" + jest-message-util "^26.0.1" + jest-resolve "^26.0.1" + make-dir "^3.0.0" + natural-compare "^1.4.0" + pretty-format "^26.0.1" + semver "^7.3.2" + jest-util@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0" @@ -11913,6 +12523,17 @@ jest-util@^25.5.0: is-ci "^2.0.0" make-dir "^3.0.0" +jest-util@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.0.1.tgz#72c4c51177b695fdd795ca072a6f94e3d7cef00a" + integrity sha512-byQ3n7ad1BO/WyFkYvlWQHTsomB6GIewBh8tlGtusiylAlaxQ1UpS0XYH0ngOyhZuHVLN79Qvl6/pMiDMSSG1g== + dependencies: + "@jest/types" "^26.0.1" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + make-dir "^3.0.0" + jest-validate@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.5.0.tgz#fb4c93f332c2e4cf70151a628e58a35e459a413a" @@ -11925,6 +12546,18 @@ jest-validate@^25.5.0: leven "^3.1.0" pretty-format "^25.5.0" +jest-validate@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.0.1.tgz#a62987e1da5b7f724130f904725e22f4e5b2e23c" + integrity sha512-u0xRc+rbmov/VqXnX3DlkxD74rHI/CfS5xaV2VpeaVySjbb1JioNVOyly5b56q2l9ZKe7bVG5qWmjfctkQb0bA== + dependencies: + "@jest/types" "^26.0.1" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.0.0" + leven "^3.1.0" + pretty-format "^26.0.1" + jest-watcher@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.5.0.tgz#d6110d101df98badebe435003956fd4a465e8456" @@ -11937,6 +12570,18 @@ jest-watcher@^25.5.0: jest-util "^25.5.0" string-length "^3.1.0" +jest-watcher@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.0.1.tgz#5b5e3ebbdf10c240e22a98af66d645631afda770" + integrity sha512-pdZPydsS8475f89kGswaNsN3rhP6lnC3/QDCppP7bg1L9JQz7oU9Mb/5xPETk1RHDCWeqmVC47M4K5RR7ejxFw== + dependencies: + "@jest/test-result" "^26.0.1" + "@jest/types" "^26.0.1" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.0.1" + string-length "^4.0.1" + jest-worker@^25.1.0: version "25.2.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.1.tgz#209617015c768652646aa33a7828cc2ab472a18a" @@ -11953,6 +12598,14 @@ jest-worker@^25.5.0: merge-stream "^2.0.0" supports-color "^7.0.0" +jest-worker@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.0.0.tgz#4920c7714f0a96c6412464718d0c58a3df3fb066" + integrity sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + jest@^25.5.4: version "25.5.4" resolved "https://registry.yarnpkg.com/jest/-/jest-25.5.4.tgz#f21107b6489cfe32b076ce2adcadee3587acb9db" @@ -11962,6 +12615,15 @@ jest@^25.5.4: import-local "^3.0.2" jest-cli "^25.5.4" +jest@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.0.1.tgz#5c51a2e58dff7525b65f169721767173bf832694" + integrity sha512-29Q54kn5Bm7ZGKIuH2JRmnKl85YRigp0o0asTc6Sb6l2ch1DCXIeZTLLFy9ultJvhkTqbswF5DEx4+RlkmCxWg== + dependencies: + "@jest/core" "^26.0.1" + import-local "^3.0.2" + jest-cli "^26.0.1" + jquery@>=1.7, jquery@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" @@ -12033,6 +12695,38 @@ jsdom@^15.2.1: ws "^7.0.0" xml-name-validator "^3.0.0" +jsdom@^16.2.2: + version "16.2.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.2.2.tgz#76f2f7541646beb46a938f5dc476b88705bedf2b" + integrity sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.0.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -13542,6 +14236,18 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" +node-notifier@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.1.tgz#a355e33e6bebacef9bf8562689aed0f4230ca6f9" + integrity sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg== + dependencies: + growly "^1.3.0" + is-wsl "^2.1.1" + semver "^7.2.1" + shellwords "^0.1.1" + uuid "^7.0.3" + which "^2.0.2" + node-releases@^1.1.29, node-releases@^1.1.53: version "1.1.53" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" @@ -14212,6 +14918,11 @@ parse5@5.1.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -14622,6 +15333,16 @@ pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" +pretty-format@^26.0.1: + version "26.0.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.0.1.tgz#a4fe54fe428ad2fd3413ca6bbd1ec8c2e277e197" + integrity sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw== + dependencies: + "@jest/types" "^26.0.1" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -15824,7 +16545,7 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" -request-promise-native@^1.0.7: +request-promise-native@^1.0.7, request-promise-native@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== @@ -15833,7 +16554,7 @@ request-promise-native@^1.0.7: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.88.0: +request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -16151,6 +16872,13 @@ saxes@^3.1.9: dependencies: xmlchars "^2.1.1" +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" @@ -16221,7 +16949,7 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.2, semver@^7.1.3, semver@^7.2.1: +semver@^7.1.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== @@ -16770,6 +17498,13 @@ stack-utils@^1.0.1: resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== +stack-utils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" + integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== + dependencies: + escape-string-regexp "^2.0.0" + static-eval@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.5.tgz#f0782e66999c4b3651cda99d9ce59c507d188f71" @@ -16890,6 +17625,14 @@ string-length@^3.1.0: astral-regex "^1.0.0" strip-ansi "^5.2.0" +string-length@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" + integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -17230,7 +17973,7 @@ symbol-observable@^1.0.4: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -symbol-tree@^3.2.2: +symbol-tree@^3.2.2, symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -17590,6 +18333,13 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -18035,6 +18785,11 @@ uuid@^3.0.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + v8-compile-cache@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" @@ -18463,7 +19218,7 @@ w-json@^1.3.5: resolved "https://registry.yarnpkg.com/w-json/-/w-json-1.3.9.tgz#c1ddfbae1279f7e84d5a1bd587b53a03f5c5cff8" integrity sha512-9hvWhnNZ5J3ypOJt2LzmAQBl1NrQBZED/E8MwkZQ+lGTq51hyR9zeH0dgaJzLfzOVoTbxe/yPqL10c5WVsHvbg== -w3c-hr-time@^1.0.1: +w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== @@ -18479,6 +19234,13 @@ w3c-xmlserializer@^1.1.2: webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -18521,6 +19283,16 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + webpack-dev-middleware@^3.7.0: version "3.7.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" @@ -18648,6 +19420,15 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +whatwg-url@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771" + integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^5.0.0" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -18820,12 +19601,17 @@ ws@^7.0.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== +ws@^7.2.3: + version "7.3.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" + integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xmlchars@^2.1.1: +xmlchars@^2.1.1, xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==