diff --git a/.babelrc b/.babelrc index 220c557b..0b86a087 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,5 @@ { - "presets": ["env", "react"], - "plugins": ["transform-class-properties", "babel-root-slash-import", "babel-plugin-transform-object-rest-spread"] + "presets": ["@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript"], + // this plugin add support for async/await + "plugins": ["@babel/plugin-transform-runtime"] } diff --git a/.esdoc.json b/.esdoc.json deleted file mode 100644 index 7eeba9e3..00000000 --- a/.esdoc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "source": "./src", - "destination": "./docs", - "excludes": ["demo*", "demo\\/.*"], - "plugins": [ - {"name": "esdoc-standard-plugin"}, - {"name": "esdoc-jsx-plugin", "option": {"enable": true}}, - {"name": "esdoc-ecmascript-proposal-plugin", "option": {"all": true}} - ] -} diff --git a/.gitignore b/.gitignore index c3e2b13c..5a381dd0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Build dir dist/ lib/ +types/ # Docs docs/ @@ -22,3 +23,5 @@ node_modules/ .lvimrc .DS_Store /.idea +# Storybook +storybook-static/ diff --git a/.storybook/.babelrc b/.storybook/.babelrc deleted file mode 100644 index b35ca240..00000000 --- a/.storybook/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "presets": ["@babel/preset-env", "@babel/preset-react"], -} - \ No newline at end of file diff --git a/.storybook/main.js b/.storybook/main.js deleted file mode 100644 index 26dfeaf6..00000000 --- a/.storybook/main.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - "stories": [ - "../src/**/*.stories.mdx", - "../src/**/*.stories.@(js|jsx|ts|tsx)" - ], - "addons": [ - "@storybook/addon-links", - "@storybook/addon-essentials" - ] -} \ No newline at end of file diff --git a/.storybook/preview.js b/.storybook/preview.js deleted file mode 100644 index 48afd568..00000000 --- a/.storybook/preview.js +++ /dev/null @@ -1,9 +0,0 @@ -export const parameters = { - actions: { argTypesRegex: "^on[A-Z].*" }, - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/, - }, - }, -} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8660128a..940f07d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,208 @@ -# Change Log - ## Unreleased + +## v2.12.0 + +* [Fix exception when zooming or resizing window due to undefined grid reference](https://github.com/flower-platform/react-timeline-10000/pull/107) +* [Add public api for zoom in/out](https://github.com/flower-platform/react-timeline-10000/pull/106) + +## v2.11.0 + +* [Prevented wrong segments on empty rows by giving them IDs with a special prefix](https://github.com/flower-platform/react-timeline-10000/pull/102) +* [Fix to avoid rendering of the context menu and scrollbar at every mouse move](https://github.com/flower-platform/react-timeline-10000/pull/99) +* [Add `scrollToItem` feature](https://github.com/flower-platform/react-timeline-10000/pull/100) +* [Fix `onItemHover` and `onItemLeave` firing too often on items with children](https://github.com/flower-platform/react-timeline-10000/pull/98) +* [Change color used for BackgroundGradient](https://github.com/flower-platform/react-timeline-10000/pull/96) +* [Add `verticalGapBetweenOverlappingItems` and `rowTopBottomPadding` properties](https://github.com/flower-platform/react-timeline-10000/pull/97) + +## v2.10.0 + +* [Default split size](https://github.com/flower-platform/react-timeline-10000/pull/94/files) + +## v2.9.0 + +* [Fix to allow variable row heights + programmatic scroll](https://github.com/flower-platform/react-timeline-10000/pull/69/files) +* [Small fix for resize cursor size](https://github.com/flower-platform/react-timeline-10000/pull/89/files) + +## v2.8.0, v2.8.1 + +* [Add `zoomEnabled` flag](https://github.com/flower-platform/react-timeline-10000/pull/90/files) +* [Small fix for context menu on mobile and item leave event](https://github.com/flower-platform/react-timeline-10000/pull/86/files) +* [Update comment for rct9k-items-inner style class](https://github.com/flower-platform/react-timeline-10000/pull/88/files) + +## v2.7.5 + +* [Allow group.id to be any number (remove the "consecutive numbers starting from 0" restriction)](https://github.com/flower-platform/react-timeline-10000/pull/74/files) + +## v2.7.4 + +* Updated `@famiprog-foundation/tests-are-demo` @ v1.0.1. + +## v2.7.3 + +* [Improved API for Context Menu](https://github.com/flower-platform/react-timeline-10000/pull/79) +* [Add z-index to now marker to show on top of items, layers](https://github.com/flower-platform/react-timeline-10000/pull/82) +* [Small fix for zoom when have multiple instances, catch the event only if mouse is on our instance body](https://github.com/flower-platform/react-timeline-10000/pull/81) +* [Small issue at update when useMoment props is true](https://github.com/flower-platform/react-timeline-10000/pull/83) + +## v2.7.1 + +* Updated `@famiprog-foundation/scriptable-ui` @ v1.0.0. + +## v2.7.0 + +* [Zoom](https://github.com/flower-platform/react-timeline-10000/pull/58) and [small fix for Firefox](https://github.com/flower-platform/react-timeline-10000/pull/80) + +## v2.6.1 + +* [Error when moving the mouse and the grid inside the gantt in not yet rendered](https://github.com/flower-platform/react-timeline-10000/pull/77) + +## v2.6.0 + +* Internal: for `demo-app`, upgraded storybook version to v7.5. It also uses vite now. +* Small issue: on props changed, the width of the table was reset to the original value. +* [Highlighted interval positioned at the beginning of the gantt was not displayed](https://github.com/flower-platform/react-timeline-10000/pull/70) +* [Controlled/uncontrolled split + rename `onTableResize` into `onSplitChange`](https://github.com/flower-platform/react-timeline-10000/pull/75) +* [Add `displayItemOnSeparateRowIfOverlap` property](https://github.com/flower-platform/react-timeline-10000/pull/72/files) + +## v2.5.0 + +* [Separated lib and demo-app](https://github.com/flower-platform/react-timeline-10000/commit/b5936969f7ffe67a52139c04b2275849e9c5b078) +* [Upgraded to TAD v0.11.0](https://github.com/flower-platform/react-timeline-10000/commit/a87a58b74898e3a5017b8e4d5028e9e5a4c0f325), generated screenshots, .md reports, and first .md docs + +## v2.4.1 + +### Fixed + +* [Reseting start/end date didn't work](https://github.com/flower-platform/react-timeline-10000/pull/65) + +## v2.4.0 + +### Added + +* [Horizontal scrollbar](https://github.com/flower-platform/react-timeline-10000/pull/57) +* [Added `onTableResize` property](https://github.com/flower-platform/react-timeline-10000/pull/62) + +### Fixed + +* [External drag and drop doesn't work](https://github.com/flower-platform/react-timeline-10000/pull/60) +* [Changing the `width` property of the table didn't updated of the UI](https://github.com/flower-platform/react-timeline-10000/pull/59) +* [Various small isues](https://github.com/flower-platform/react-timeline-10000/pull/63) + * Problem with the scroll after reseting the `groups` + * `SplitPanel` has `absolute` position instead of `relative`position + * Exception when dragging above the timeline + * Exception when reseting the `groups` of a gantt that was scrolled + * Gantt surface was not receiving events because of the `backgroundLayers` + * Background layers were overlapping the vertical scrollbar + +## v2.3.0 + +### Added + +* [A `` is used for displaying rows](https://github.com/flower-platform/react-timeline-10000/pull/52), i.e. in the left part of the Gantt. `
` comes from the [FixedDataTable lib](https://schrodinger.github.io/fixed-data-table-2/). This addition is **not backwards compatible**. + +## v2.2.4 + +### Added + +* `forceDragToCreateMode` example in storybook +* `forceDragToCreateMode` test case + +### Changed + +* [Modify selection trigger: from `click` to `mouseDown`](https://github.com/flower-platform/react-timeline-10000/pull/50) + +### Fixed + +* Drag to create rectangle was blue instead of green when `forceDragToCreateMode = true` +* [Parameter `selectedItems` of `onSelectionChange` handler was `number[]` instead of `(number|string)[]`](https://github.com/flower-platform/react-timeline-10000/pull/51) + +## v2.2.3 + +### Fixed + +Right click selection didn't worked on custom segments with a complex children hierarchy + +## v2.2.2 + +### Fixed + +* [Various small issues](https://github.com/flower-platform/react-timeline-10000/pull/47) + * drag to create popup auto-closing + * visual improvements of the selected and hovered segments style + * Error in console when running an action without `run` property defined + * Right clicking on one segments caused drag to select on the entire row + * A semantic-ui `Icon` can be passed to IAction.icon + * On Firefox a thin blue line appeared on top of segments + * Improve storybook documentation for "drag to create" feature + +## v2.2.1 + +### Added + +* [In some places, key of type string was not supported](https://github.com/flower-platform/react-timeline-10000/pull/40). Now keys of type `number | string` are supported. + +### Fixed + +* [Bug related to `key of type string was not supported`](https://github.com/flower-platform/react-timeline-10000/pull/45) + +## v2.2.0 + +### Added + +* [Click and double click handler for a group](https://github.com/flower-platform/react-timeline-10000/pull/11) +* [Drag to create](https://github.com/flower-platform/react-timeline-10000/pull/25) +* [Context menu and selection](https://github.com/flower-platform/react-timeline-10000/pull/37) + +### Fixed + +* [Various small isues](https://github.com/flower-platform/react-timeline-10000/pull/29) + * style was considered mandatory in HighlightedInterval + * align BackgroundLayer with TimelineBody + * rowLayers were not rendererd correctly after update + * typo + * weekends calculation depended on moment.locale + * remove margin and border from selection box +* [Drag to create issues](https://github.com/flower-platform/react-timeline-10000/pull/32) + * selection was going up on mouse move on different browsers + * right click was prevented even if it was not in `drag to create` mode +* Item click was not working for complex renderers. A special css class was searched only 2 levels. Now there is a loop, so deeper nesting is possible. + +## v2.1.1 + +### Fixed + +* [In some cases, depending on the parent DomElem, scrollbars appear/disappear in an infinite loop](https://github.com/flower-platform/react-timeline-10000/issues/26) + +## v2.1.0 + +### Added + +* [Background layer: vertical grid, highlight weekends, highlighted intervals, now marker, markers](https://github.com/flower-platform/react-timeline-10000/pull/19) + +## v2.0.2 + +### Fixed + +* [Upgraded color lib and code updated](https://github.com/flower-platform/react-timeline-10000/pull/20) + +## v2.0.1 + +The first official version published since the project was forked from `react-timeline-9000` to `@famiprog-foundation/react-gantt`. + +### Added + +| Short description | Issue | Pull request #19| +| - | - | - | +| Multiple columns / table mode. | React9k/react-timeline-9000#190 | React9k/react-timeline-9000#243 | +| Support for milliseconds. | React9k/react-timeline-9000#196 | React9k/react-timeline-9000#239 | +| Use of date/millis for compatibility w/ Redux. Moment.js support is still kept. | React9k/react-timeline-9000#221 | React9k/react-timeline-9000#241 | +| Storybook | React9k/react-timeline-9000#234 | React9k/react-timeline-9000#237 | +| Improved ItemRenderer and nice default styles | | [commit](https://github.com/flower-platform/react-timeline-10000/commit/e005eab4b4fbee1c737c2ebf323ad65304cdc26f) +| Generate TypeScript `.d.ts` files. Storybook uses TS | | [commit](https://github.com/flower-platform/react-timeline-10000/commit/a6bb813fe2c229c97aff306d3bf9c79ce23e6503) +| minor | | React9k/react-timeline-9000#257 | +| minor | | React9k/react-timeline-9000#260 | +| minor | React9k/react-timeline-9000#271 | React9k/react-timeline-9000#272 | + ## v1.1.2 ### Added - Pass resolution props to timeline diff --git a/Makefile b/Makefile index e6538614..fd2afaad 100644 --- a/Makefile +++ b/Makefile @@ -17,10 +17,10 @@ run: install yarn start test: install - env NODE_PATH=$$NODE_PATH:$$PWD/src/ $(mocha) --require babel-core/register --require ignore-styles "./src/**/*.test.js" + env NODE_PATH=$$NODE_PATH:$$PWD/src/ $(mocha) --require @babel/register --require ignore-styles "./src/**/*.test.js" test-watch: install - env NODE_PATH=$$NODE_PATH:$$PWD/src/ $(mocha) -w --require babel-core/register --require ignore-styles "./src/**/*.test.js" + env NODE_PATH=$$NODE_PATH:$$PWD/src/ $(mocha) -w --require @babel/register --require ignore-styles "./src/**/*.test.js" install: yarn @@ -28,3 +28,4 @@ install: clean: rm -rf dist rm -rf lib + rm -rf types diff --git a/README.md b/README.md index 2f4b5d75..41f66d06 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,87 @@ -# React Timeline 9000 +# React Timeline 10000 (forked by the Flower Platform team) + +## About `demo-app` + +Previously, there was a single project containing the lib + demo app. Now, the demo, scenarios, tests are demo: exist in the `demo-app` subproject. This way, `demo-app` can depend on `foundation`, which itself depends on this lib. Thanks to the separation, we don't have a dependency cycle. + +Currently the dependency towards `foundation` is done by using its source dir. Hence 1/ `foundation` needs to be cloned from git, next to this repo. And 2/ one should run from `foundation-react`: `yarn install`. `foundation` can be also be used as a lib. This is experimental. Look in `demo-app/vite.config.ts` for info. + +In `demo-app/tsconfig.json` and `demo-app/vite.config.ts`, we created the `@famiprog-foundation/react-gantt` alias. This means that from `demo-app` source files: + +```ts +// we can do this +import { Timeline, ItemRenderer } from "@famiprog-foundation/react-gantt"; + +// instead of this +import { ItemRenderer } from "../../src"; +``` + +--- + +## Intro + +This fork is developed and maintained by the "Flower Platform" team (which FYI has authored in the past [Gantt4Flex](http://gantt4flex.crispico.com/), a popular (at that time) commercial Gantt diagramming component during the [Adobe Flex](http://flex.apache.org/) era). The motivation of our contributions is driven by the fact that we use "react-timeline-9000" in some of our industrial projects. The intention is to develop new features that we can use ASAP in our software. ALL our contributions are meant to be integrated in the upstream repo, so they are developed having this constraint in mind. The upstream repo is the **official** one (for releases, clone, adding issues, etc.). And this is to be considered as an internal repo for us = the Flower Platform team. + +Admin discussions w/ the upstream repo team are held in [this discussion](https://github.com/React9k/react-timeline-9000/discussions/255). + +## Process and versioning + +`package.json` on the **upstream repo** / `master` branch looks like this: + +``` +{ + "name": "react-timeline-9000", + "version": "1.1.3", + ... +``` + +But in **this repo** / `master-flower-platform` branch (which is considered to be the main branch of this repo) we have: + +``` +{ + "name": "@crispico/react-timeline-10000", + "version": "1.1.3-fp-ver-3", + ... +``` + +The `name` is changed so that we can publish it in our local NPM repo. We append to the original `version` the suffix `-fp-ver-N`. Where N is the version from Flower Platform. E.g. 3 means we added 3 commits compared to the original upstream. When a new contribution is added to our main branch = `master-flower-platform`, we increment this number. So we'll have e.g.: *1.1.3-fp-ver-**4***, *1.1.3-fp-ver-**5***, *1.1.**4**-fp-ver-**5***, *1.1.**4**-fp-ver-**6***, etc. + +Before we begin new work, we should first create an issue in the upstream repo: +* we prefix it w/ *[rt10000]*, like in this [example](https://github.com/React9k/react-timeline-9000/issues/190); +* we explain what we want to do and ask for advice if needed. + +New work is always done on new branches. E.g. `my-new-branch`. At the end of the work we **squash everything into a single commit** and perform a pull request towards upstream (mentioning the original issue cf. above). If we need the commit ASAP into our main branch: +* we don't need to wait for their approval of the PR; +* we make a PR and/or merge it into `master-flower-platform`; +* then, we increment *fp-ver-N* to *fp-ver-N+1* cf. above. + +## Working with linked libraries in development + +Sometimes even if I ```yarn link``` a library, when running storybook it doesn't take into account the linked library. +This was noticed working with the ```fixed-data-table-2``` libray as a linked library. + +The solution for this problem was mentioned here: https://dev.to/hontas/using-vite-with-linked-dependencies-37n7: it should be added in the ```vite.config.ts``` file, on the ```optimizeDeps``` section: ```exclude: ["fixed-data-table-2"]``` + +Even the above solution worked for our case, we don't understand very good from were the old library version was taken from. Because in our case, even if we removed the ```node_modules/.cached```, an old version of the library was used (could be that it was requested from the npm registry, because in ```package.json``` the old version was referenced). + +## Tracking of the pull requests submitted to the upstream repo + +We prefix our issues in the upstream repo w/ `[rt10000]`. + +| Issue (mouse hover for title) | Pull request | Merged | +| - | - | - | +| React9k/react-timeline-9000#190 | React9k/react-timeline-9000#243 | yes | +| React9k/react-timeline-9000#196 | React9k/react-timeline-9000#239 | yes | +| React9k/react-timeline-9000#221 | React9k/react-timeline-9000#241 | yes | +| React9k/react-timeline-9000#234 | React9k/react-timeline-9000#237 | yes | +| minor | React9k/react-timeline-9000#257 | yes | +| minor | React9k/react-timeline-9000#260 | yes | +| React9k/react-timeline-9000#271 | React9k/react-timeline-9000#272 | | + +## Original `README.md` of the upstream repo is below + +--- + A performance focused timeline component in react ## Build Status [![Build Status](https://travis-ci.org/BHP-DevHub/react-timeline-9000.svg?branch=master)](https://travis-ci.org/BHP-DevHub/react-timeline-9000) @@ -60,6 +143,7 @@ See http://react-timeline-9000.s3-website-ap-southeast-2.amazonaws.com/docs/ for | timelineMode | | | | timebarFormat | | | | itemRenderer | | | +| itemClassName | | Class name applied to all items | | groupRenderer | | | | shallowUpdateCheck | False | If true timeline will try to minimize re-renders . Set to false if items don't show up/update on prop change | | forceRedrawFunc | () => False | Function called when `shallowUpdateCheck`==true. If returns true the timeline will be redrawn. If false the library will decide if redrawing is required | @@ -72,18 +156,30 @@ See http://react-timeline-9000.s3-website-ap-southeast-2.amazonaws.com/docs/ for | groups | | selectedItems | +### Items + +Required props: +* key - number or string + +### Groups + +Required props: +* id - number - needs to be consecutive + ## Callbacks -| Name | -| ---------------- | -| onItemClick | -| onItemDoubleClick | -| onItemContext | -| onInteraction | -| onRowClick | -| onRowContext | -| onRowDoubleClick | -| onItemHover | -| onItemLeave | +| Name | +| ---------------- | +| onItemClick | +| onItemDoubleClick | +| onItemContext | +| onInteraction | +| onRowClick | +| onRowContext | +| onRowDoubleClick | +| onItemHover | +| onItemLeave | +| onGroupRowClick | +| onGroupRowDoubleClick | # Styling * View `src/style.css` for styling examples. @@ -97,5 +193,4 @@ See http://react-timeline-9000.s3-website-ap-southeast-2.amazonaws.com/docs/ for | Timeline items | 3 | | Timeline items when dragging/resizing | 4 | | Selection box (for multi-select) | 5 | -| Group column | 6 | diff --git a/demo-app/.eslintrc.cjs b/demo-app/.eslintrc.cjs new file mode 100644 index 00000000..29cb6d5a --- /dev/null +++ b/demo-app/.eslintrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended', 'plugin:storybook/recommended'], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/demo-app/.storybook/main.ts b/demo-app/.storybook/main.ts new file mode 100644 index 00000000..3b8e2fe6 --- /dev/null +++ b/demo-app/.storybook/main.ts @@ -0,0 +1,35 @@ +import { mergeConfig } from 'vite'; + +export default { + "stories": [ + "../src/**/*.stories.mdx", + "../src/**/*.stories.@(js|jsx|ts|tsx)" + ], + + "addons": [ + "@storybook/addon-links", + "@storybook/addon-essentials", + "@storybook/addon-storysource", + "@storybook/addon-mdx-gfm" + ], + + "staticDirs": [ + '../docs' + ], + + framework: { + name: "@storybook/react-vite", + options: {} + }, + + async viteFinal(config) { + return mergeConfig(config, { + server: { + fs: { + // idem cf. demo-app/vite.config.ts; apparently some settings (such as this one) are not inherited + allow: ['..'], + }, + } + }); + } +} \ No newline at end of file diff --git a/demo-app/.storybook/preview.jsx b/demo-app/.storybook/preview.jsx new file mode 100644 index 00000000..47f0b14d --- /dev/null +++ b/demo-app/.storybook/preview.jsx @@ -0,0 +1,47 @@ +import "semantic-ui-css/semantic.min.css"; +import { Label, Segment } from "semantic-ui-react"; + +import '../src/stories/storybook.css'; +import '../../src/style.css'; + +export const parameters = { + // actions: { argTypesRegex: "^on[A-Z].*" }, + previewTabs: { + 'storybook/docs/panel': { hidden: true } + }, + viewMode: 'story', + controls: { + disable: true, + // matchers: { + // color: /(background|color)$/i, + // date: /Date$/, + // }, + }, + actions: { + disable: true + }, + options: { + storySort: { + method: 'configure', + includeNames: true, + order: [ + 'Features', + ['Basic', 'Item Renderer', 'Background Layer', '*'] + ] + } + } +} + +export const decorators = [ + (Story, context) => <> + {context.parameters.scenarios && } +
+ +
+ +]; + +const ScenariosList = (props) => + Illustrated scenarios:   + {props.scenarios.map((scenario, i) => )} + \ No newline at end of file diff --git a/demo-app/index.html b/demo-app/index.html new file mode 100644 index 00000000..77742933 --- /dev/null +++ b/demo-app/index.html @@ -0,0 +1,12 @@ + + + + + + Vite + React + TS + + +
+ + + diff --git a/demo-app/package.json b/demo-app/package.json new file mode 100644 index 00000000..771ea392 --- /dev/null +++ b/demo-app/package.json @@ -0,0 +1,57 @@ +{ + "name": "demo-app", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "docs": "typedoc && mv docs/index.html docs/index-docs.html", + "storybook": "yarn docs && storybook dev -p 6006", + "storybook-build": "yarn docs && cross-env NODE_OPTIONS=--max-old-space-size=3096 storybook build", + "storybook-move": "rm -r ../../flower-platform.github.io/foundation-react-gantt; mv storybook-static ../../flower-platform.github.io/foundation-react-gantt", + "storybook-build-move": "yarn storybook-build && yarn storybook-move", + "tad-puppeteer-3000": "node ../node_modules/@famiprog-foundation/tests-are-demo/src/node/tad-puppeteer.mjs \"http://localhost:3000/?TestsAreDemo&puppeteer\"", + "tad-puppeteer-3000-screenshots": "node ../node_modules/@famiprog-foundation/tests-are-demo/src/node/tad-puppeteer.mjs \"http://localhost:3000/?TestsAreDemo&puppeteer&forceStepByStep\"", + "tad-gen-doc": "node ../node_modules/@famiprog-foundation/tests-are-demo/src/node/tad-gen-doc.mjs" + }, + "// COMMENT regarding dependencies": "For this app, the parent app is practically not a lib. It has a/ source files and b/ `node_modules` w/ deps. So we don't define a dep towards the parent project. And the parent proj also has `node_modules` w/ deps needed by the files in src. And node will look there as well. Node 'climbs' dirs to look for `node_modules`/deps.", + "devDependencies": { + "@storybook/addon-actions": "^7.5.0", + "@storybook/addon-essentials": "^7.5.0", + "@storybook/addon-links": "^7.5.0", + "@storybook/addon-mdx-gfm": "^7.5.0", + "@storybook/addon-storysource": "^7.5.0", + "@storybook/react": "^7.5.0", + "@storybook/react-vite": "^7.5.0", + "@types/react": "17.0.69", + "@vitejs/plugin-react": "^4.2.1", + "cross-env": "^7.0.3", + "eslint-plugin-storybook": "^0.6.15", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "storybook": "^7.5.0", + "vite": "^5.2.0", + "vite-plugin-node-polyfills": "^0.17.0" + }, + "// COMMENT devDependencies": { + "vite-plugin-node-polyfills": "^0.17.0: in after upgrading to vite 5, I also upgraded this to latest = 0.21. In found: works w/o issues. Here I have this non-blocking error: https://github.com/davidmyersdev/vite-plugin-node-polyfills/issues/81. Hence I downgrade to 0.17" + }, + "dependencies": { + "antd": "^4.15.1", + "typedoc": "^0.24.8" + }, + "peerDependencies": { + "react": "^16.4.1 || ^17.0.0", + "react-dom": "^16.4.1 || ^17.0.0" + }, + "resolutions": { + "// @types/react": "Needed, because a lot of packages import this w/ *. And yarn resolves + hoists this as the latest available version.", + "// @types/react 2": "UPDATE: @see in foundation", + "@types/react": "17.0.69", + "// jackspeak": "Appeared after migrating storybook to v7.5.0. The program detected it automatically and proposed this link: https://github.com/storybookjs/storybook/issues/22431#issuecomment-1630086092", + "jackspeak": "2.1.1" + } +} diff --git a/demo-app/public/README.md b/demo-app/public/README.md new file mode 100644 index 00000000..44fa6d6b --- /dev/null +++ b/demo-app/public/README.md @@ -0,0 +1,4 @@ +1/ By default, vite projects have such a `public` dir, containing the entry point/html file. +2/ Here, we removed this dir, because the entry point is under `src`. +3/ To use the beta of TAD + Markdown reports, we recreated this dir, because TAD has `public` hardcoded. +4/ But in the future, maybe 2 is a better approach. I.e. to have all under `src`. And an adaptation will be made for 3/. \ No newline at end of file diff --git a/demo-app/public/contextMenu.md b/demo-app/public/contextMenu.md new file mode 100644 index 00000000..a26f2d1c --- /dev/null +++ b/demo-app/public/contextMenu.md @@ -0,0 +1,82 @@ +
+ + + + + + + + +
Fig. 1Fig. 2
+
+
Click to expand full image + +![](screenshots/ContextMenuTestsAreDemo.whenRightClickOnASegment/ContextMenu_popup.png) + +
+ +![](screenshots/ContextMenuTestsAreDemo.whenRightClickOnASegment/ContextMenu_popup_small.png) + +
+ +On right click, a context menu appears. Each line of the context menu is an **action**. An action has a **label**, **icon**, and a **run** callback (called when the user clicks on it). + +
+
+
+
Click to expand full image + +![](screenshots/ContextMenuTestsAreDemo.whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2.png) + +
+ +![](screenshots/ContextMenuTestsAreDemo.whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_small.png) + +
+ +If label and icon is not enough, a custom renderer can be provided. It can be a normal renderer w/ some additional customizations (e.g. color). Or it can be any arbitrary component. + +
+
+ + + + + + + + + +
Fig. 3Fig. 4
+
+
Click to expand full image + +![](screenshots/ContextMenuTestsAreDemo.whenCTRLRightClickOnAnotherSegment/ContextMenu_popup.png) + +
+ +![](screenshots/ContextMenuTestsAreDemo.whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_small.png) + +
+ +Before the actions are displayed, they are 'asked' is they want to be visible or not. They usually decide this based on the **current selection**. E.g. here, the *Edit* action is not shown, because it needs exactly one element is selected (and 2 are currently selected). + +
+
+
+
Click to expand full image + +![](screenshots/ContextMenuTestsAreDemo.whenClickTheHamburgerButton/ContextMenu_popup.png) + +
+ +![](screenshots/ContextMenuTestsAreDemo.whenClickTheHamburgerButton/ContextMenu_popup_small.png) + +
+ +The menu can also be opened from the **hamburger button**. Particular useful on mobile. + + Based on the selection, an action can perform any logic, not only decide its visibility. E.g. here it changes its label, complaining that there is no current row. True: when the context menu is opened from the hamburger button, we have selection, but we don't have mouse info (x, y, current row). + +
+
diff --git a/demo-app/public/docDescriptors/contextMenu.json b/demo-app/public/docDescriptors/contextMenu.json new file mode 100644 index 00000000..0db624b6 --- /dev/null +++ b/demo-app/public/docDescriptors/contextMenu.json @@ -0,0 +1,21 @@ +{ + "cells": [ + { + "image": "ContextMenuTestsAreDemo.whenRightClickOnASegment/ContextMenu_popup.png", + "text": "On right click, a context menu appears. Each line of the context menu is an **action**. An action has a **label**, **icon**, and a **run** callback (called when the user clicks on it)." + }, + { + "image": "ContextMenuTestsAreDemo.whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2.png", + "text": "If label and icon is not enough, a custom renderer can be provided. It can be a normal renderer w/ some additional customizations (e.g. color). Or it can be any arbitrary component.", + "newLineAfter": true + }, + { + "image": "ContextMenuTestsAreDemo.whenCTRLRightClickOnAnotherSegment/ContextMenu_popup.png", + "text": "Before the actions are displayed, they are 'asked' is they want to be visible or not. They usually decide this based on the **current selection**. E.g. here, the *Edit* action is not shown, because it needs exactly one element is selected (and 2 are currently selected)." + }, + { + "image": "ContextMenuTestsAreDemo.whenClickTheHamburgerButton/ContextMenu_popup.png", + "text": "The menu can also be opened from the **hamburger button**. Particular useful on mobile.\n\n Based on the selection, an action can perform any logic, not only decide its visibility. E.g. here it changes its label, complaining that there is no current row. True: when the context menu is opened from the hamburger button, we have selection, but we don't have mouse info (x, y, current row)." + } + ] +} \ No newline at end of file diff --git a/demo-app/public/docDescriptors/dragToCreate.json b/demo-app/public/docDescriptors/dragToCreate.json new file mode 100644 index 00000000..afb409f9 --- /dev/null +++ b/demo-app/public/docDescriptors/dragToCreate.json @@ -0,0 +1,21 @@ +{ + "cells": [ + { + "image": "DragToCreateTestsAreDemo.whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0.png", + "text": "Open the context menu (right click or click on the hamburger button from the top/left corner. Click ..." + }, + { + "image": "DragToCreateTestsAreDemo.whenClickAddMenuEntry/Timeline_dragToCreatePopup.png", + "text": "... and you enter in the 'drag to create' mode. The popup hides itself quickly, to make sure it doesn't bother the user. This mode is cancelable via button or simple click (i.e. not click and drag).", + "newLineAfter": true + }, + { + "image": "DragToCreateTestsAreDemo.givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2.png", + "text": "Click and drag on a row. A green rectangle appears as you drag. A right drag cancels the operation and exits the 'drag to create' mode.\n\n **TODO!!!** avem acest comportament de anulare a dragului?" + }, + { + "image": "DragToCreateTestsAreDemo.givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11.png", + "text": "When you do `mouse up` (to `drop`), your handler will be called, receiving useful args (e.g. row, start/end, etc.). It can e.g. create a new segment.\n\n **TODO!!!** poza nu e buna. Ar fi trebuit sa captureze segmentul nou creat" + } + ] +} \ No newline at end of file diff --git a/demo-app/public/docDescriptors/index.json b/demo-app/public/docDescriptors/index.json new file mode 100644 index 00000000..a8a98e06 --- /dev/null +++ b/demo-app/public/docDescriptors/index.json @@ -0,0 +1 @@ +["dragToCreate.json", "contextMenu.json"] \ No newline at end of file diff --git a/demo-app/public/dragToCreate.md b/demo-app/public/dragToCreate.md new file mode 100644 index 00000000..a44e82c0 --- /dev/null +++ b/demo-app/public/dragToCreate.md @@ -0,0 +1,84 @@ + + + + + + + + + +
Fig. 1Fig. 2
+
+
Click to expand full image + +![](screenshots/DragToCreateTestsAreDemo.whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0.png) + +
+ +![](screenshots/DragToCreateTestsAreDemo.whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0_small.png) + +
+ +Open the context menu (right click or click on the hamburger button from the top/left corner. Click ... + +
+
+
+
Click to expand full image + +![](screenshots/DragToCreateTestsAreDemo.whenClickAddMenuEntry/Timeline_dragToCreatePopup.png) + +
+ +![](screenshots/DragToCreateTestsAreDemo.whenClickAddMenuEntry/Timeline_dragToCreatePopup_small.png) + +
+ +... and you enter in the 'drag to create' mode. The popup hides itself quickly, to make sure it doesn't bother the user. This mode is cancelable via button or simple click (i.e. not click and drag). + +
+
+ + + + + + + + + +
Fig. 3Fig. 4
+
+
Click to expand full image + +![](screenshots/DragToCreateTestsAreDemo.givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2.png) + +
+ +![](screenshots/DragToCreateTestsAreDemo.givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2_small.png) + +
+ +Click and drag on a row. A green rectangle appears as you drag. A right drag cancels the operation and exits the 'drag to create' mode. + + **TODO!!!** avem acest comportament de anulare a dragului? + +
+
+
+
Click to expand full image + +![](screenshots/DragToCreateTestsAreDemo.givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11.png) + +
+ +![](screenshots/DragToCreateTestsAreDemo.givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11_small.png) + +
+ +When you do `mouse up` (to `drop`), your handler will be called, receiving useful args (e.g. row, start/end, etc.). It can e.g. create a new segment. + + **TODO!!!** poza nu e buna. Ar fi trebuit sa captureze segmentul nou creat + +
+
diff --git a/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/HighlightedInterval_interval_0.png b/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/HighlightedInterval_interval_0.png new file mode 100644 index 00000000..c73380fa Binary files /dev/null and b/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/HighlightedInterval_interval_0.png differ diff --git a/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/HighlightedInterval_interval_0_small.png b/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/HighlightedInterval_interval_0_small.png new file mode 100644 index 00000000..4ce46b02 Binary files /dev/null and b/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/HighlightedInterval_interval_0_small.png differ diff --git a/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/recordedTest.json b/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/recordedTest.json new file mode 100644 index 00000000..30296ad4 --- /dev/null +++ b/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"HighlightedInterval_interval_0","sourceFile":"BackgroundLayersTestsAreDemo.tsx","sourceLine":17}],"sourceFiles":{"BackgroundLayersTestsAreDemo.tsx":"import { Only, Scenario, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { Main } from \"../stories/backgroundLayer/BackgroundLayer.stories\";\nimport { dateAndHourOfCurrentMonth } from \"../stories/sampleData\";\nimport {PARENT_ELEMENT, Timeline, getPixelAtTime, getPixelsFromDuration, highlightedIntervalTestIds} from \"@famiprog-foundation/react-gantt\";\nimport moment from \"moment\";\n\nexport class BackgroundLayersTestsAreDemo {\n async before() {\n render(
);\n }\n \n @Scenario(\"The highlighted intervals are correctly displayed\")\n async highlightedIntervalsAreDisplayed() {\n const ganttLeftOffset = PARENT_ELEMENT(tad.getObjectViaCheat(Timeline).props.componentId).getBoundingClientRect().left;\n\n var interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + \"_0\");\n await tad.assertWaitable.exists(interval);\n await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(4)));\n await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(4), dateAndHourOfCurrentMonth(6)));\n\n interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + \"_1\");\n await tad.assertWaitable.exists(interval);\n await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(11)));\n await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(11), dateAndHourOfCurrentMonth(13)));\n\n interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + \"_2\");\n await tad.assertWaitable.exists(interval);\n await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(18)));\n await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(18), dateAndHourOfCurrentMonth(20)));\n\n interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + \"_3\");\n await tad.assertWaitable.exists(interval);\n await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(25)));\n await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(25), dateAndHourOfCurrentMonth(27)));\n\n interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + \"_4\");\n await tad.assertWaitable.exists(interval);\n await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(1)));\n await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(1), dateAndHourOfCurrentMonth(2)));\n\n interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + \"_5\");\n await tad.assertWaitable.exists(interval);\n await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(15)));\n await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(15), dateAndHourOfCurrentMonth(18)));\n\n interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + \"_6\");\n await tad.assertWaitable.exists(interval);\n await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(20, 19)));\n await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(20, 19), dateAndHourOfCurrentMonth(21, 10)));\n }\n\n getPixelsAtDate(date) {\n const timeline = tad.getObjectViaCheat(Timeline);\n return Math.round(getPixelAtTime(moment(date), timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined)));\n }\n getPixelsFromDuration(start, end) {\n const timeline = tad.getObjectViaCheat(Timeline);\n return Math.round(getPixelsFromDuration(moment(end).diff(start, \"milliseconds\"), timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap()));\n\n }\n}"},"duration":36,"error":"Error: Uncaught TypeError: Cannot read properties of null (reading 'recomputeGridSize') (http://localhost:3000/@fs/home/poweruser/git/react-timeline-10000/src/timeline.js:433)\n\t at _global.onerror [fn(new Error(err + ' (' + url + ':' + line + ')'));] (http://localhost:3000/node_modules/mocha/browser-entry.js:75:10)"} \ No newline at end of file diff --git a/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/report.md b/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/report.md new file mode 100644 index 00000000..45464350 --- /dev/null +++ b/demo-app/public/recordedTests/BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/report.md @@ -0,0 +1,119 @@ + +# BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed() + +### undefined + +--- + +## The following error was caught while running the test: + +``` +Error: Uncaught TypeError: Cannot read properties of null (reading 'recomputeGridSize') (http://localhost:3000/@fs/home/poweruser/git/react-timeline-10000/src/timeline.js:433) + at _global.onerror [fn(new Error(err + ' (' + url + ':' + line + ')'));] (http://localhost:3000/node_modules/mocha/browser-entry.js:75:10) +``` + +--- + + +There are 1 screenshots. [Go to first](#screenshot-1) + +## BackgroundLayersTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { Main } from "../stories/backgroundLayer/BackgroundLayer.stories"; +/* 3*/import { dateAndHourOfCurrentMonth } from "../stories/sampleData"; +/* 4*/import {PARENT_ELEMENT, Timeline, getPixelAtTime, getPixelsFromDuration, highlightedIntervalTestIds} from "@famiprog-foundation/react-gantt"; +/* 5*/import moment from "moment"; +/* 6*/ +/* 7*/export class BackgroundLayersTestsAreDemo { +``` + +
+ +```tsx +/* 8*/ async before() { +/* 9*/ render(
); +/*10*/ } +/*11*/ +/*12*/ @Scenario("The highlighted intervals are correctly displayed") +/*13*/ async highlightedIntervalsAreDisplayed() { +/*14*/ const ganttLeftOffset = PARENT_ELEMENT(tad.getObjectViaCheat(Timeline).props.componentId).getBoundingClientRect().left; +/*15*/ +/*16*/ var interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + "_0"); +/*17*/ await tad.assertWaitable.exists(interval); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed/HighlightedInterval_interval_0.png
+![](HighlightedInterval_interval_0.png) + +
+
+ +![](HighlightedInterval_interval_0_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*18*/ await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(4))); +/*19*/ await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(4), dateAndHourOfCurrentMonth(6))); +/*20*/ +/*21*/ interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + "_1"); +/*22*/ await tad.assertWaitable.exists(interval); +/*23*/ await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(11))); +/*24*/ await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(11), dateAndHourOfCurrentMonth(13))); +/*25*/ +/*26*/ interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + "_2"); +/*27*/ await tad.assertWaitable.exists(interval); +/*28*/ await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(18))); +/*29*/ await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(18), dateAndHourOfCurrentMonth(20))); +/*30*/ +/*31*/ interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + "_3"); +/*32*/ await tad.assertWaitable.exists(interval); +/*33*/ await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(25))); +/*34*/ await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(25), dateAndHourOfCurrentMonth(27))); +/*35*/ +/*36*/ interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + "_4"); +/*37*/ await tad.assertWaitable.exists(interval); +/*38*/ await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(1))); +/*39*/ await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(1), dateAndHourOfCurrentMonth(2))); +/*40*/ +/*41*/ interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + "_5"); +/*42*/ await tad.assertWaitable.exists(interval); +/*43*/ await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(15))); +/*44*/ await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(15), dateAndHourOfCurrentMonth(18))); +/*45*/ +/*46*/ interval = tad.screenCapturing.getByTestId(highlightedIntervalTestIds.interval + "_6"); +/*47*/ await tad.assertWaitable.exists(interval); +/*48*/ await tad.assertWaitable.equal(Math.round(interval.getBoundingClientRect().x - ganttLeftOffset), this.getPixelsAtDate(dateAndHourOfCurrentMonth(20, 19))); +/*49*/ await tad.assertWaitable.equal(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfCurrentMonth(20, 19), dateAndHourOfCurrentMonth(21, 10))); +/*50*/ } +/*51*/ +/*52*/ getPixelsAtDate(date) { +/*53*/ const timeline = tad.getObjectViaCheat(Timeline); +/*54*/ return Math.round(getPixelAtTime(moment(date), timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined))); +/*55*/ } +/*56*/ getPixelsFromDuration(start, end) { +/*57*/ const timeline = tad.getObjectViaCheat(Timeline); +/*58*/ return Math.round(getPixelsFromDuration(moment(end).diff(start, "milliseconds"), timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap())); +/*59*/ +/*60*/ } +/*61*/} +``` + +
diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup.png new file mode 100644 index 00000000..3da1f13c Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_0.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_0.png new file mode 100644 index 00000000..80c75813 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_0.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_0_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_0_small.png new file mode 100644 index 00000000..da2af035 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_0_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_1.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_1.png new file mode 100644 index 00000000..83d8be6c Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_1.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_1_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_1_small.png new file mode 100644 index 00000000..3026cded Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_1_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_small.png new file mode 100644 index 00000000..9d820929 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png new file mode 100644 index 00000000..0160754e Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png new file mode 100644 index 00000000..150edc83 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/recordedTest.json b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/recordedTest.json new file mode 100644 index 00000000..2894efe9 --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":108},{"screenshot":"ContextMenu_popup","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":114},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_0","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":118},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_1","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":121}],"sourceFiles":{"ContextMenuTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { ContextMenu, addTaskActionIcon, addTaskActionLabel, addTaskNotPossibleAction, deleteActionIcon, deleteActionIconColor, deleteActionLabel, editActionLabel } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someHumanResources, someTasks } from \"../stories/sampleData\";\nimport Timeline, { PARENT_ELEMENT, timelineTestids as testids } from \"../../../src/timeline\";\nimport { getPixelAtTime, getTimeAtPixel } from \"../../../src/utils/timeUtils\";\nimport { rightClick } from \"./testUtils\";\n\nconst CLICK_X =30;\nexport class ContextMenuTestsAreDemo {\n\n async before() {\n render();\n }\n\n @Scenario(\"WHEN I right click on a row, THEN a context menu with one action opens\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenRightClickOnARow() {\n // WHEN right click on a row\n const firstRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + CLICK_X, clientY: Math.round(firstRow.getBoundingClientRect().y) + 20 };\n await tad.showSpotlight({ message: \"I right click on a row\", focusOnLastElementCaptured: true });\n rightClick(firstRow, clickPosition);\n\n // THEN CM is opened at the clicked position\n tad.demoForEndUserHide();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), { x: clickPosition.clientX, y: clickPosition.clientY });\n tad.demoForEndUserShow();\n\n // AND it has an 'Add task' actions\n let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\");\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(menuEntry.textContent, addTaskActionLabel + someHumanResources[0].title);\n tad.demoForEndUserHideNext();\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, addTaskActionIcon);\n }\n\n @Scenario(\"WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenClickAnAction() {\n // WHEN I click on \"Add\"\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n // THEN a new task is added\n let newSegment = tad.screenCapturing.getByTestId(testids.item + \"_\" + someTasks.length);\n await tad.assertWaitable.exists(newSegment);\n\n tad.demoForEndUserHide();\n // AND the CM is closed\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup));\n\n // AND the new task is position correctly on x axes\n // Gantt works with times \"snapped to grid\" so the position for the new task should be snapped to grid \n const timeline = tad.getObjectViaCheat(Timeline);\n const firstRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n const ganttLeftOffset = PARENT_ELEMENT(timeline.props.componentId).getBoundingClientRect().left;\n const clickedX = firstRow.getBoundingClientRect().x + CLICK_X;\n const clickedXInGantt = clickedX - ganttLeftOffset;\n const clickedTime = getTimeAtPixel(clickedXInGantt, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap());\n const clickedXSnappedToGrid = getPixelAtTime(clickedTime, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined))\n + ganttLeftOffset; \n await tad.assertWaitable.equal(Math.round(newSegment.getBoundingClientRect().x), Math.round(clickedXSnappedToGrid));\n \n // AND is correctly added to the clicked row\n await tad.assertWaitable.equal(newSegment.getBoundingClientRect().y, firstRow.getBoundingClientRect().y);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN I right click on a segment, THEN a context menu with 3 actions is shown\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenRightClickOnASegment() {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_0\");\n const segmentBoundingRect = segment.getBoundingClientRect();\n\n // WHEN right click on a segment\n await tad.showSpotlight({ message: \"I right click on a segment\", focusOnLastElementCaptured: true });\n rightClick(segment, { clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 });\n \n // THEN the CM opens\n tad.demoForEndUserHideNext();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n\n // AND it has: 'Add', 'Edit' and 'Delete' actions\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskActionLabel + someHumanResources[0].title);\n \n tad.cc(\"And an 'Edit' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, editActionLabel);\n \n tad.cc(\"And a 'Delete' action\");\n let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_2\");\n await tad.assertWaitable.equal(menuEntry.textContent, deleteActionLabel);\n tad.cc(\"With a custom red renderer\");\n tad.demoForEndUserHideNext();\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, deleteActionIcon);\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, deleteActionIconColor);\n }\n\n @Scenario(\"WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenCTRLRightClickOnAnotherSegment() {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_3\");\n const segmentBoundingRect = segment.getBoundingClientRect();\n await tad.showSpotlight({ message: \"WHEN I CTRL + right click another segment\", focusOnLastElementCaptured: true });\n rightClick(segment, { ctrlKey: true, clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 });\n\n // THEN the CM opens\n tad.demoForEndUserHideNext();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n\n // AND it has: 'Add' and 'Delete' actions\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskActionLabel + someHumanResources[1].title);\n \n tad.cc(\"And a 'Delete' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, deleteActionLabel);\n }\n\n @Scenario(\"WHEN I click the hamburger button, THEN the context menu is shown besides that button\")\n async whenClickTheHamburgerButton() {\n // GIVEN I select one segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n\n // WHEN\n const menuButton = tad.screenCapturing.getByTestId(testids.menuButton);\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(menuButton);\n\n // THEN the context menu is opened and positioned near the center of the hamburger button\");\n tad.demoForEndUserHide();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n const menuButtonCenter = { x: menuButton.getBoundingClientRect().x + menuButton.getBoundingClientRect().width / 2, y: menuButton.getBoundingClientRect().y + menuButton.getBoundingClientRect().height / 2 };\n await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), menuButtonCenter);\n tad.demoForEndUserShow();\n\n // AND it has: 'Add task: not possible', 'Edit' adn 'Delete' actions\n tad.cc(\"The context menu contains an 'Add task not possible' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskNotPossibleAction);\n tad.cc(\"And an 'Edit' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, editActionLabel);\n tad.cc(\"And a 'Delete' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_2\").textContent, deleteActionLabel);\n\n // WHEN click 'Edit' (dontCloseContextMenuAfterRunAutomatically = true) THEN the CM doesn't close \n // We putted this verification at the end of the tests, because else we needed to close the prompt for the next scenarios, and this was not trivial \n tad.demoForEndUserHide();\n await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\"));\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n tad.demoForEndUserShow();\n }\n\n async isPopupPositionedNearPoint({ x: popupX, y: popupY, width: popupWidth, height: popupHeight }, { x, y }) {\n const popupEndX = Math.round(popupX + popupWidth);\n const popupEndY = Math.round(popupY + popupHeight);\n popupX = Math.floor(popupX);\n popupY = Math.round(popupY);\n\n // We didn't understood why it is a difference of some decimals (maximum 1 px) between the expected position and the actual position. \n // These difference in decimals is not the same every time, is variable regarding the dimension of the window and the dpi of the screen\n // So the only thing in common is that the actual value is near the expected one at a maximum 1 px distance (below or above)\n await tad.assertWaitable.include([popupX - 1, popupX, popupX + 1, popupEndX - 1, popupEndX, popupEndX + 1], Math.round(x));\n // semantic ui popup is displayed 10 px below or 10 px above the mouse position\n await tad.assertWaitable.include([popupY - 11, popupY - 10, popupY - 9, popupEndY + 9, popupEndY + 10, popupEndY + 11], Math.round(y));\n }\n}"},"duration":531} \ No newline at end of file diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/report.md b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/report.md new file mode 100644 index 00000000..60b5d022 --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/report.md @@ -0,0 +1,291 @@ + +# ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment() + +### undefined + +--- + +There are 4 screenshots. [Go to first](#screenshot-1) + +## ContextMenuTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { ContextMenu, addTaskActionIcon, addTaskActionLabel, addTaskNotPossibleAction, deleteActionIcon, deleteActionIconColor, deleteActionLabel, editActionLabel } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someHumanResources, someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { PARENT_ELEMENT, timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { getPixelAtTime, getTimeAtPixel } from "../../../src/utils/timeUtils"; +/* 7*/import { rightClick } from "./testUtils"; +/* 8*/ +/* 9*/const CLICK_X =30; +/* 10*/export class ContextMenuTestsAreDemo { +/* 11*/ +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN I right click on a row, THEN a context menu with one action opens") +/* 17*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 18*/ async whenRightClickOnARow() { +/* 19*/ // WHEN right click on a row +/* 20*/ const firstRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/* 21*/ const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + CLICK_X, clientY: Math.round(firstRow.getBoundingClientRect().y) + 20 }; +/* 22*/ await tad.showSpotlight({ message: "I right click on a row", focusOnLastElementCaptured: true }); +/* 23*/ rightClick(firstRow, clickPosition); +/* 24*/ +/* 25*/ // THEN CM is opened at the clicked position +/* 26*/ tad.demoForEndUserHide(); +/* 27*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 28*/ await tad.assertWaitable.exists(popup); +/* 29*/ await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), { x: clickPosition.clientX, y: clickPosition.clientY }); +/* 30*/ tad.demoForEndUserShow(); +/* 31*/ +/* 32*/ // AND it has an 'Add task' actions +/* 33*/ let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0"); +/* 34*/ tad.cc("The context menu contains an 'Add' action"); +/* 35*/ await tad.assertWaitable.equal(menuEntry.textContent, addTaskActionLabel + someHumanResources[0].title); +/* 36*/ tad.demoForEndUserHideNext(); +/* 37*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, addTaskActionIcon); +/* 38*/ } +/* 39*/ +/* 40*/ @Scenario("WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)") +/* 41*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 42*/ async whenClickAnAction() { +/* 43*/ // WHEN I click on "Add" +/* 44*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 45*/ await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 46*/ +/* 47*/ // THEN a new task is added +/* 48*/ let newSegment = tad.screenCapturing.getByTestId(testids.item + "_" + someTasks.length); +/* 49*/ await tad.assertWaitable.exists(newSegment); +/* 50*/ +/* 51*/ tad.demoForEndUserHide(); +/* 52*/ // AND the CM is closed +/* 53*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup)); +/* 54*/ +/* 55*/ // AND the new task is position correctly on x axes +/* 56*/ // Gantt works with times "snapped to grid" so the position for the new task should be snapped to grid +/* 57*/ const timeline = tad.getObjectViaCheat(Timeline); +/* 58*/ const firstRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/* 59*/ const ganttLeftOffset = PARENT_ELEMENT(timeline.props.componentId).getBoundingClientRect().left; +/* 60*/ const clickedX = firstRow.getBoundingClientRect().x + CLICK_X; +/* 61*/ const clickedXInGantt = clickedX - ganttLeftOffset; +/* 62*/ const clickedTime = getTimeAtPixel(clickedXInGantt, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap()); +/* 63*/ const clickedXSnappedToGrid = getPixelAtTime(clickedTime, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined)) +/* 64*/ + ganttLeftOffset; +/* 65*/ await tad.assertWaitable.equal(Math.round(newSegment.getBoundingClientRect().x), Math.round(clickedXSnappedToGrid)); +/* 66*/ +/* 67*/ // AND is correctly added to the clicked row +/* 68*/ await tad.assertWaitable.equal(newSegment.getBoundingClientRect().y, firstRow.getBoundingClientRect().y); +/* 69*/ tad.demoForEndUserShow(); +/* 70*/ } +/* 71*/ +/* 72*/ @Scenario("WHEN I right click on a segment, THEN a context menu with 3 actions is shown") +/* 73*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 74*/ async whenRightClickOnASegment() { +/* 75*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_0"); +/* 76*/ const segmentBoundingRect = segment.getBoundingClientRect(); +/* 77*/ +/* 78*/ // WHEN right click on a segment +/* 79*/ await tad.showSpotlight({ message: "I right click on a segment", focusOnLastElementCaptured: true }); +/* 80*/ rightClick(segment, { clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); +/* 81*/ +/* 82*/ // THEN the CM opens +/* 83*/ tad.demoForEndUserHideNext(); +/* 84*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 85*/ await tad.assertWaitable.exists(popup); +/* 86*/ +/* 87*/ // AND it has: 'Add', 'Edit' and 'Delete' actions +/* 88*/ tad.cc("The context menu contains an 'Add' action"); +/* 89*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[0].title); +/* 90*/ +/* 91*/ tad.cc("And an 'Edit' action"); +/* 92*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); +/* 93*/ +/* 94*/ tad.cc("And a 'Delete' action"); +/* 95*/ let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2"); +/* 96*/ await tad.assertWaitable.equal(menuEntry.textContent, deleteActionLabel); +/* 97*/ tad.cc("With a custom red renderer"); +/* 98*/ tad.demoForEndUserHideNext(); +``` + +
+ +```tsx +/* 99*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIcon); +/*100*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIconColor); +/*101*/ } +/*102*/ +/*103*/ @Scenario("WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown") +/*104*/ @ScenarioOptions({ linkWithNextScenario: true }) +/*105*/ async whenCTRLRightClickOnAnotherSegment() { +/*106*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_3"); +/*107*/ const segmentBoundingRect = segment.getBoundingClientRect(); +/*108*/ await tad.showSpotlight({ message: "WHEN I CTRL + right click another segment", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png) + +
+ +```tsx +/*109*/ rightClick(segment, { ctrlKey: true, clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); +/*110*/ +/*111*/ // THEN the CM opens +/*112*/ tad.demoForEndUserHideNext(); +/*113*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/*114*/ await tad.assertWaitable.exists(popup); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup.png
+![](ContextMenu_popup.png) + +
+
+ +![](ContextMenu_popup_small.png) + +
+ +```tsx +/*115*/ +/*116*/ // AND it has: 'Add' and 'Delete' actions +/*117*/ tad.cc("The context menu contains an 'Add' action"); +/*118*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[1].title); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_0.png
+![](ContextMenu_popup_ContextMenu_menuItem_0.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_0_small.png) + +
+ +```tsx +/*119*/ +/*120*/ tad.cc("And a 'Delete' action"); +/*121*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, deleteActionLabel); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment/ContextMenu_popup_ContextMenu_menuItem_1.png
+![](ContextMenu_popup_ContextMenu_menuItem_1.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_1_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*122*/ } +/*123*/ +/*124*/ @Scenario("WHEN I click the hamburger button, THEN the context menu is shown besides that button") +/*125*/ async whenClickTheHamburgerButton() { +/*126*/ // GIVEN I select one segment +/*127*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/*128*/ +/*129*/ // WHEN +/*130*/ const menuButton = tad.screenCapturing.getByTestId(testids.menuButton); +/*131*/ tad.cc("Click on the menu button"); +/*132*/ await tad.userEventWaitable.click(menuButton); +/*133*/ +/*134*/ // THEN the context menu is opened and positioned near the center of the hamburger button"); +/*135*/ tad.demoForEndUserHide(); +/*136*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/*137*/ await tad.assertWaitable.exists(popup); +/*138*/ const menuButtonCenter = { x: menuButton.getBoundingClientRect().x + menuButton.getBoundingClientRect().width / 2, y: menuButton.getBoundingClientRect().y + menuButton.getBoundingClientRect().height / 2 }; +/*139*/ await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), menuButtonCenter); +/*140*/ tad.demoForEndUserShow(); +/*141*/ +/*142*/ // AND it has: 'Add task: not possible', 'Edit' adn 'Delete' actions +/*143*/ tad.cc("The context menu contains an 'Add task not possible' action"); +/*144*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskNotPossibleAction); +/*145*/ tad.cc("And an 'Edit' action"); +/*146*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); +/*147*/ tad.cc("And a 'Delete' action"); +/*148*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2").textContent, deleteActionLabel); +/*149*/ +/*150*/ // WHEN click 'Edit' (dontCloseContextMenuAfterRunAutomatically = true) THEN the CM doesn't close +/*151*/ // We putted this verification at the end of the tests, because else we needed to close the prompt for the next scenarios, and this was not trivial +/*152*/ tad.demoForEndUserHide(); +/*153*/ await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1")); +/*154*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +/*155*/ tad.demoForEndUserShow(); +/*156*/ } +/*157*/ +/*158*/ async isPopupPositionedNearPoint({ x: popupX, y: popupY, width: popupWidth, height: popupHeight }, { x, y }) { +/*159*/ const popupEndX = Math.round(popupX + popupWidth); +/*160*/ const popupEndY = Math.round(popupY + popupHeight); +/*161*/ popupX = Math.floor(popupX); +/*162*/ popupY = Math.round(popupY); +/*163*/ +/*164*/ // We didn't understood why it is a difference of some decimals (maximum 1 px) between the expected position and the actual position. +/*165*/ // These difference in decimals is not the same every time, is variable regarding the dimension of the window and the dpi of the screen +/*166*/ // So the only thing in common is that the actual value is near the expected one at a maximum 1 px distance (below or above) +/*167*/ await tad.assertWaitable.include([popupX - 1, popupX, popupX + 1, popupEndX - 1, popupEndX, popupEndX + 1], Math.round(x)); +/*168*/ // semantic ui popup is displayed 10 px below or 10 px above the mouse position +/*169*/ await tad.assertWaitable.include([popupY - 11, popupY - 10, popupY - 9, popupEndY + 9, popupEndY + 10, popupEndY + 11], Math.round(y)); +/*170*/ } +/*171*/} +``` + +
diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickAnAction/recordedTest.json b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickAnAction/recordedTest.json new file mode 100644 index 00000000..6eac770b --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickAnAction/recordedTest.json @@ -0,0 +1 @@ +{"slides":[],"sourceFiles":{},"duration":2,"error":"Error: Unable to find an element by: [data-testid=\"ContextMenu_popup\"]\n\t at Object.getElementError [return new Error(message || \"n/a\"); // I observed that message is null (at least) for the case where multiple elements are found, and only one was expected] (http://localhost:3000/node_modules/@famiprog-foundation/tests-are-demo/src/lib/reactTestingLibraryCustomized.tsx:24:12)\n\t [throw getConfig().getElementError(getMissingError(container, ...args), container);] (http://localhost:3000/node_modules/@testing-library/dom/dist/@testing-library/dom.esm.js:1149:25)\n\t [const els = allQuery(container, ...args);] (http://localhost:3000/node_modules/@testing-library/dom/dist/@testing-library/dom.esm.js:1128:17)\n\t [const element = query(container, ...args);] (http://localhost:3000/node_modules/@testing-library/dom/dist/@testing-library/dom.esm.js:1171:19)\n\t at Object.getByTestId [const result: any = oldFunction.apply(null, args);] (http://localhost:3000/node_modules/@famiprog-foundation/tests-are-demo/src/lib/TestsAreDemoFunctions.tsx:203:49)\n\t at ContextMenuTestsAreDemo.whenClickAnAction [const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);] (http://localhost:3000ContextMenuTestsAreDemo.tsx:44:43)\n\t at callFn [var result = fn.call(ctx);] (http://localhost:3000/node_modules/mocha/lib/runnable.js:366:21)\n\t at Runnable.run [callFn(this.fn);] (http://localhost:3000/node_modules/mocha/lib/runnable.js:354:5)\n\t at Runner.runTest [test.run(fn);] (http://localhost:3000/node_modules/mocha/lib/runner.js:666:10)\n\t [self.runTest(function (err) {] (http://localhost:3000/node_modules/mocha/lib/runner.js:789:12)\n\t at next [return fn();] (http://localhost:3000/node_modules/mocha/lib/runner.js:581:14)\n\t [next(suites.pop());] (http://localhost:3000/node_modules/mocha/lib/runner.js:591:7)\n\t at next [return fn();] (http://localhost:3000/node_modules/mocha/lib/runner.js:474:14)\n\t [next(0);] (http://localhost:3000/node_modules/mocha/lib/runner.js:559:5)\n\t at timeslice [immediateQueue.shift()();] (http://localhost:3000/node_modules/mocha/browser-entry.js:100:28)"} \ No newline at end of file diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickAnAction/report.md b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickAnAction/report.md new file mode 100644 index 00000000..53588fa9 --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickAnAction/report.md @@ -0,0 +1,32 @@ + +# ContextMenuTestsAreDemo/whenClickAnAction() + +### undefined + +--- + +## The following error was caught while running the test: + +``` +Error: Unable to find an element by: [data-testid="ContextMenu_popup"] + at Object.getElementError [return new Error(message || "n/a"); // I observed that message is null (at least) for the case where multiple elements are found, and only one was expected] (http://localhost:3000/node_modules/@famiprog-foundation/tests-are-demo/src/lib/reactTestingLibraryCustomized.tsx:24:12) + [throw getConfig().getElementError(getMissingError(container, ...args), container);] (http://localhost:3000/node_modules/@testing-library/dom/dist/@testing-library/dom.esm.js:1149:25) + [const els = allQuery(container, ...args);] (http://localhost:3000/node_modules/@testing-library/dom/dist/@testing-library/dom.esm.js:1128:17) + [const element = query(container, ...args);] (http://localhost:3000/node_modules/@testing-library/dom/dist/@testing-library/dom.esm.js:1171:19) + at Object.getByTestId [const result: any = oldFunction.apply(null, args);] (http://localhost:3000/node_modules/@famiprog-foundation/tests-are-demo/src/lib/TestsAreDemoFunctions.tsx:203:49) + at ContextMenuTestsAreDemo.whenClickAnAction [const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);] (http://localhost:3000ContextMenuTestsAreDemo.tsx:44:43) + at callFn [var result = fn.call(ctx);] (http://localhost:3000/node_modules/mocha/lib/runnable.js:366:21) + at Runnable.run [callFn(this.fn);] (http://localhost:3000/node_modules/mocha/lib/runnable.js:354:5) + at Runner.runTest [test.run(fn);] (http://localhost:3000/node_modules/mocha/lib/runner.js:666:10) + [self.runTest(function (err) {] (http://localhost:3000/node_modules/mocha/lib/runner.js:789:12) + at next [return fn();] (http://localhost:3000/node_modules/mocha/lib/runner.js:581:14) + [next(suites.pop());] (http://localhost:3000/node_modules/mocha/lib/runner.js:591:7) + at next [return fn();] (http://localhost:3000/node_modules/mocha/lib/runner.js:474:14) + [next(0);] (http://localhost:3000/node_modules/mocha/lib/runner.js:559:5) + at timeslice [immediateQueue.shift()();] (http://localhost:3000/node_modules/mocha/browser-entry.js:100:28) +``` + +--- + + +There are 0 screenshots. [Go to first](#screenshot-1) diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup.png new file mode 100644 index 00000000..268bcbcf Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_0.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_0.png new file mode 100644 index 00000000..b9fcfaa8 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_0.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_0_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_0_small.png new file mode 100644 index 00000000..db85215c Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_0_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1.png new file mode 100644 index 00000000..8e958ec7 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_REP1.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_REP1.png new file mode 100644 index 00000000..374de5b6 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_REP1.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_REP1_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_REP1_small.png new file mode 100644 index 00000000..f48c2f49 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_REP1_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_small.png new file mode 100644 index 00000000..f48c2f49 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_2.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_2.png new file mode 100644 index 00000000..30491058 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_2.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_2_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_2_small.png new file mode 100644 index 00000000..c824c03b Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_2_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP1.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP1.png new file mode 100644 index 00000000..a36aa93c Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP1.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP1_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP1_small.png new file mode 100644 index 00000000..2eb39816 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP1_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP2.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP2.png new file mode 100644 index 00000000..b388b179 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP2.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP2_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP2_small.png new file mode 100644 index 00000000..2eb39816 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP2_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP3.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP3.png new file mode 100644 index 00000000..b9ff0d5d Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP3.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP3_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP3_small.png new file mode 100644 index 00000000..bbae136f Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP3_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_small.png new file mode 100644 index 00000000..2eb39816 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png new file mode 100644 index 00000000..dac87edf Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_ganttBody_Timeline_row_0_Timeline_item_1_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_ganttBody_Timeline_row_0_Timeline_item_1_small.png new file mode 100644 index 00000000..2cddbabb Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_ganttBody_Timeline_row_0_Timeline_item_1_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_menuButton.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_menuButton.png new file mode 100644 index 00000000..b6e98c85 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_menuButton.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_menuButton_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_menuButton_small.png new file mode 100644 index 00000000..b79b0e7a Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_menuButton_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/recordedTest.json b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/recordedTest.json new file mode 100644 index 00000000..64d0a9b8 --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_0_Timeline_item_1","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":127},{"screenshot":"Timeline_menuButton","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":132},{"screenshot":"ContextMenu_popup","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":137},{"screenshot":"ContextMenu_popup_REP1","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":167},{"screenshot":"ContextMenu_popup_REP2","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":169},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_0","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":144},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_1","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":146},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_2","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":148},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_1_REP1","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":153},{"screenshot":"ContextMenu_popup_REP3","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":154}],"sourceFiles":{"ContextMenuTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { ContextMenu, addTaskActionIcon, addTaskActionLabel, addTaskNotPossibleAction, deleteActionIcon, deleteActionIconColor, deleteActionLabel, editActionLabel } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someHumanResources, someTasks } from \"../stories/sampleData\";\nimport Timeline, { PARENT_ELEMENT, timelineTestids as testids } from \"../../../src/timeline\";\nimport { getPixelAtTime, getTimeAtPixel } from \"../../../src/utils/timeUtils\";\nimport { rightClick } from \"./testUtils\";\n\nconst CLICK_X =30;\nexport class ContextMenuTestsAreDemo {\n\n async before() {\n render();\n }\n\n @Scenario(\"WHEN I right click on a row, THEN a context menu with one action opens\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenRightClickOnARow() {\n // WHEN right click on a row\n const firstRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + CLICK_X, clientY: Math.round(firstRow.getBoundingClientRect().y) + 20 };\n await tad.showSpotlight({ message: \"I right click on a row\", focusOnLastElementCaptured: true });\n rightClick(firstRow, clickPosition);\n\n // THEN CM is opened at the clicked position\n tad.demoForEndUserHide();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), { x: clickPosition.clientX, y: clickPosition.clientY });\n tad.demoForEndUserShow();\n\n // AND it has an 'Add task' actions\n let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\");\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(menuEntry.textContent, addTaskActionLabel + someHumanResources[0].title);\n tad.demoForEndUserHideNext();\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, addTaskActionIcon);\n }\n\n @Scenario(\"WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenClickAnAction() {\n // WHEN I click on \"Add\"\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n // THEN a new task is added\n let newSegment = tad.screenCapturing.getByTestId(testids.item + \"_\" + someTasks.length);\n await tad.assertWaitable.exists(newSegment);\n\n tad.demoForEndUserHide();\n // AND the CM is closed\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup));\n\n // AND the new task is position correctly on x axes\n // Gantt works with times \"snapped to grid\" so the position for the new task should be snapped to grid \n const timeline = tad.getObjectViaCheat(Timeline);\n const firstRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n const ganttLeftOffset = PARENT_ELEMENT(timeline.props.componentId).getBoundingClientRect().left;\n const clickedX = firstRow.getBoundingClientRect().x + CLICK_X;\n const clickedXInGantt = clickedX - ganttLeftOffset;\n const clickedTime = getTimeAtPixel(clickedXInGantt, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap());\n const clickedXSnappedToGrid = getPixelAtTime(clickedTime, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined))\n + ganttLeftOffset; \n await tad.assertWaitable.equal(Math.round(newSegment.getBoundingClientRect().x), Math.round(clickedXSnappedToGrid));\n \n // AND is correctly added to the clicked row\n await tad.assertWaitable.equal(newSegment.getBoundingClientRect().y, firstRow.getBoundingClientRect().y);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN I right click on a segment, THEN a context menu with 3 actions is shown\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenRightClickOnASegment() {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_0\");\n const segmentBoundingRect = segment.getBoundingClientRect();\n\n // WHEN right click on a segment\n await tad.showSpotlight({ message: \"I right click on a segment\", focusOnLastElementCaptured: true });\n rightClick(segment, { clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 });\n \n // THEN the CM opens\n tad.demoForEndUserHideNext();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n\n // AND it has: 'Add', 'Edit' and 'Delete' actions\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskActionLabel + someHumanResources[0].title);\n \n tad.cc(\"And an 'Edit' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, editActionLabel);\n \n tad.cc(\"And a 'Delete' action\");\n let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_2\");\n await tad.assertWaitable.equal(menuEntry.textContent, deleteActionLabel);\n tad.cc(\"With a custom red renderer\");\n tad.demoForEndUserHideNext();\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, deleteActionIcon);\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, deleteActionIconColor);\n }\n\n @Scenario(\"WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenCTRLRightClickOnAnotherSegment() {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_3\");\n const segmentBoundingRect = segment.getBoundingClientRect();\n await tad.showSpotlight({ message: \"WHEN I CTRL + right click another segment\", focusOnLastElementCaptured: true });\n rightClick(segment, { ctrlKey: true, clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 });\n\n // THEN the CM opens\n tad.demoForEndUserHideNext();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n\n // AND it has: 'Add' and 'Delete' actions\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskActionLabel + someHumanResources[1].title);\n \n tad.cc(\"And a 'Delete' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, deleteActionLabel);\n }\n\n @Scenario(\"WHEN I click the hamburger button, THEN the context menu is shown besides that button\")\n async whenClickTheHamburgerButton() {\n // GIVEN I select one segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n\n // WHEN\n const menuButton = tad.screenCapturing.getByTestId(testids.menuButton);\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(menuButton);\n\n // THEN the context menu is opened and positioned near the center of the hamburger button\");\n tad.demoForEndUserHide();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n const menuButtonCenter = { x: menuButton.getBoundingClientRect().x + menuButton.getBoundingClientRect().width / 2, y: menuButton.getBoundingClientRect().y + menuButton.getBoundingClientRect().height / 2 };\n await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), menuButtonCenter);\n tad.demoForEndUserShow();\n\n // AND it has: 'Add task: not possible', 'Edit' adn 'Delete' actions\n tad.cc(\"The context menu contains an 'Add task not possible' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskNotPossibleAction);\n tad.cc(\"And an 'Edit' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, editActionLabel);\n tad.cc(\"And a 'Delete' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_2\").textContent, deleteActionLabel);\n\n // WHEN click 'Edit' (dontCloseContextMenuAfterRunAutomatically = true) THEN the CM doesn't close \n // We putted this verification at the end of the tests, because else we needed to close the prompt for the next scenarios, and this was not trivial \n tad.demoForEndUserHide();\n await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\"));\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n tad.demoForEndUserShow();\n }\n\n async isPopupPositionedNearPoint({ x: popupX, y: popupY, width: popupWidth, height: popupHeight }, { x, y }) {\n const popupEndX = Math.round(popupX + popupWidth);\n const popupEndY = Math.round(popupY + popupHeight);\n popupX = Math.floor(popupX);\n popupY = Math.round(popupY);\n\n // We didn't understood why it is a difference of some decimals (maximum 1 px) between the expected position and the actual position. \n // These difference in decimals is not the same every time, is variable regarding the dimension of the window and the dpi of the screen\n // So the only thing in common is that the actual value is near the expected one at a maximum 1 px distance (below or above)\n await tad.assertWaitable.include([popupX - 1, popupX, popupX + 1, popupEndX - 1, popupEndX, popupEndX + 1], Math.round(x));\n // semantic ui popup is displayed 10 px below or 10 px above the mouse position\n await tad.assertWaitable.include([popupY - 11, popupY - 10, popupY - 9, popupEndY + 9, popupEndY + 10, popupEndY + 11], Math.round(y));\n }\n}"},"duration":1387} \ No newline at end of file diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/report.md b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/report.md new file mode 100644 index 00000000..bdf89a6d --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenClickTheHamburgerButton/report.md @@ -0,0 +1,435 @@ + +# ContextMenuTestsAreDemo/whenClickTheHamburgerButton() + +### undefined + +--- + +There are 10 screenshots. [Go to first](#screenshot-1) + +## ContextMenuTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { ContextMenu, addTaskActionIcon, addTaskActionLabel, addTaskNotPossibleAction, deleteActionIcon, deleteActionIconColor, deleteActionLabel, editActionLabel } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someHumanResources, someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { PARENT_ELEMENT, timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { getPixelAtTime, getTimeAtPixel } from "../../../src/utils/timeUtils"; +/* 7*/import { rightClick } from "./testUtils"; +/* 8*/ +/* 9*/const CLICK_X =30; +/* 10*/export class ContextMenuTestsAreDemo { +/* 11*/ +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN I right click on a row, THEN a context menu with one action opens") +/* 17*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 18*/ async whenRightClickOnARow() { +/* 19*/ // WHEN right click on a row +/* 20*/ const firstRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/* 21*/ const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + CLICK_X, clientY: Math.round(firstRow.getBoundingClientRect().y) + 20 }; +/* 22*/ await tad.showSpotlight({ message: "I right click on a row", focusOnLastElementCaptured: true }); +/* 23*/ rightClick(firstRow, clickPosition); +/* 24*/ +/* 25*/ // THEN CM is opened at the clicked position +/* 26*/ tad.demoForEndUserHide(); +/* 27*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 28*/ await tad.assertWaitable.exists(popup); +/* 29*/ await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), { x: clickPosition.clientX, y: clickPosition.clientY }); +/* 30*/ tad.demoForEndUserShow(); +/* 31*/ +/* 32*/ // AND it has an 'Add task' actions +/* 33*/ let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0"); +/* 34*/ tad.cc("The context menu contains an 'Add' action"); +/* 35*/ await tad.assertWaitable.equal(menuEntry.textContent, addTaskActionLabel + someHumanResources[0].title); +/* 36*/ tad.demoForEndUserHideNext(); +/* 37*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, addTaskActionIcon); +/* 38*/ } +/* 39*/ +/* 40*/ @Scenario("WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)") +/* 41*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 42*/ async whenClickAnAction() { +/* 43*/ // WHEN I click on "Add" +/* 44*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 45*/ await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 46*/ +/* 47*/ // THEN a new task is added +/* 48*/ let newSegment = tad.screenCapturing.getByTestId(testids.item + "_" + someTasks.length); +/* 49*/ await tad.assertWaitable.exists(newSegment); +/* 50*/ +/* 51*/ tad.demoForEndUserHide(); +/* 52*/ // AND the CM is closed +/* 53*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup)); +/* 54*/ +/* 55*/ // AND the new task is position correctly on x axes +/* 56*/ // Gantt works with times "snapped to grid" so the position for the new task should be snapped to grid +/* 57*/ const timeline = tad.getObjectViaCheat(Timeline); +/* 58*/ const firstRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/* 59*/ const ganttLeftOffset = PARENT_ELEMENT(timeline.props.componentId).getBoundingClientRect().left; +/* 60*/ const clickedX = firstRow.getBoundingClientRect().x + CLICK_X; +/* 61*/ const clickedXInGantt = clickedX - ganttLeftOffset; +/* 62*/ const clickedTime = getTimeAtPixel(clickedXInGantt, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap()); +/* 63*/ const clickedXSnappedToGrid = getPixelAtTime(clickedTime, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined)) +/* 64*/ + ganttLeftOffset; +/* 65*/ await tad.assertWaitable.equal(Math.round(newSegment.getBoundingClientRect().x), Math.round(clickedXSnappedToGrid)); +/* 66*/ +/* 67*/ // AND is correctly added to the clicked row +/* 68*/ await tad.assertWaitable.equal(newSegment.getBoundingClientRect().y, firstRow.getBoundingClientRect().y); +/* 69*/ tad.demoForEndUserShow(); +/* 70*/ } +/* 71*/ +/* 72*/ @Scenario("WHEN I right click on a segment, THEN a context menu with 3 actions is shown") +/* 73*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 74*/ async whenRightClickOnASegment() { +/* 75*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_0"); +/* 76*/ const segmentBoundingRect = segment.getBoundingClientRect(); +/* 77*/ +/* 78*/ // WHEN right click on a segment +/* 79*/ await tad.showSpotlight({ message: "I right click on a segment", focusOnLastElementCaptured: true }); +/* 80*/ rightClick(segment, { clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); +/* 81*/ +/* 82*/ // THEN the CM opens +/* 83*/ tad.demoForEndUserHideNext(); +/* 84*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 85*/ await tad.assertWaitable.exists(popup); +/* 86*/ +/* 87*/ // AND it has: 'Add', 'Edit' and 'Delete' actions +/* 88*/ tad.cc("The context menu contains an 'Add' action"); +/* 89*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[0].title); +/* 90*/ +/* 91*/ tad.cc("And an 'Edit' action"); +/* 92*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); +/* 93*/ +/* 94*/ tad.cc("And a 'Delete' action"); +/* 95*/ let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2"); +/* 96*/ await tad.assertWaitable.equal(menuEntry.textContent, deleteActionLabel); +/* 97*/ tad.cc("With a custom red renderer"); +/* 98*/ tad.demoForEndUserHideNext(); +/* 99*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIcon); +/*100*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIconColor); +/*101*/ } +/*102*/ +/*103*/ @Scenario("WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown") +/*104*/ @ScenarioOptions({ linkWithNextScenario: true }) +/*105*/ async whenCTRLRightClickOnAnotherSegment() { +/*106*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_3"); +/*107*/ const segmentBoundingRect = segment.getBoundingClientRect(); +/*108*/ await tad.showSpotlight({ message: "WHEN I CTRL + right click another segment", focusOnLastElementCaptured: true }); +/*109*/ rightClick(segment, { ctrlKey: true, clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); +/*110*/ +/*111*/ // THEN the CM opens +/*112*/ tad.demoForEndUserHideNext(); +/*113*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/*114*/ await tad.assertWaitable.exists(popup); +/*115*/ +/*116*/ // AND it has: 'Add' and 'Delete' actions +/*117*/ tad.cc("The context menu contains an 'Add' action"); +``` + +
+ +```tsx +/*118*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[1].title); +/*119*/ +/*120*/ tad.cc("And a 'Delete' action"); +/*121*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, deleteActionLabel); +/*122*/ } +/*123*/ +/*124*/ @Scenario("WHEN I click the hamburger button, THEN the context menu is shown besides that button") +/*125*/ async whenClickTheHamburgerButton() { +/*126*/ // GIVEN I select one segment +/*127*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png
+![](Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_Timeline_item_1_small.png) + +
+ +```tsx +/*128*/ +/*129*/ // WHEN +/*130*/ const menuButton = tad.screenCapturing.getByTestId(testids.menuButton); +/*131*/ tad.cc("Click on the menu button"); +/*132*/ await tad.userEventWaitable.click(menuButton); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/Timeline_menuButton.png
+![](Timeline_menuButton.png) + +
+
+ +![](Timeline_menuButton_small.png) + +
+ +```tsx +/*133*/ +/*134*/ // THEN the context menu is opened and positioned near the center of the hamburger button"); +/*135*/ tad.demoForEndUserHide(); +/*136*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/*137*/ await tad.assertWaitable.exists(popup); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup.png
+![](ContextMenu_popup.png) + +
+
+ +![](ContextMenu_popup_small.png) + +
+ +```tsx +/*138*/ const menuButtonCenter = { x: menuButton.getBoundingClientRect().x + menuButton.getBoundingClientRect().width / 2, y: menuButton.getBoundingClientRect().y + menuButton.getBoundingClientRect().height / 2 }; +/*139*/ await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), menuButtonCenter); +/*140*/ tad.demoForEndUserShow(); +/*141*/ +/*142*/ // AND it has: 'Add task: not possible', 'Edit' adn 'Delete' actions +/*143*/ tad.cc("The context menu contains an 'Add task not possible' action"); +/*144*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskNotPossibleAction); +``` + + + + +
+ +### Screenshot 6 + +[Go to previous](#screenshot-5) | [Go to next](#screenshot-7) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_0.png
+![](ContextMenu_popup_ContextMenu_menuItem_0.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_0_small.png) + +
+ +```tsx +/*145*/ tad.cc("And an 'Edit' action"); +/*146*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); +``` + + + + +
+ +### Screenshot 7 + +[Go to previous](#screenshot-6) | [Go to next](#screenshot-8) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1.png
+![](ContextMenu_popup_ContextMenu_menuItem_1.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_1_small.png) + +
+ +```tsx +/*147*/ tad.cc("And a 'Delete' action"); +/*148*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2").textContent, deleteActionLabel); +``` + + + + +
+ +### Screenshot 8 + +[Go to previous](#screenshot-7) | [Go to next](#screenshot-9) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_2.png
+![](ContextMenu_popup_ContextMenu_menuItem_2.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_2_small.png) + +
+ +```tsx +/*149*/ +/*150*/ // WHEN click 'Edit' (dontCloseContextMenuAfterRunAutomatically = true) THEN the CM doesn't close +/*151*/ // We putted this verification at the end of the tests, because else we needed to close the prompt for the next scenarios, and this was not trivial +/*152*/ tad.demoForEndUserHide(); +/*153*/ await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1")); +``` + + + + +
+ +### Screenshot 9 + +[Go to previous](#screenshot-8) | [Go to next](#screenshot-10) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_ContextMenu_menuItem_1_REP1.png
+![](ContextMenu_popup_ContextMenu_menuItem_1_REP1.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_1_REP1_small.png) + +
+ +```tsx +/*154*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +``` + + + + +
+ +### Screenshot 10 + +[Go to previous](#screenshot-9) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP3.png
+![](ContextMenu_popup_REP3.png) + +
+
+ +![](ContextMenu_popup_REP3_small.png) + +
+ +```tsx +/*155*/ tad.demoForEndUserShow(); +/*156*/ } +/*157*/ +/*158*/ async isPopupPositionedNearPoint({ x: popupX, y: popupY, width: popupWidth, height: popupHeight }, { x, y }) { +/*159*/ const popupEndX = Math.round(popupX + popupWidth); +/*160*/ const popupEndY = Math.round(popupY + popupHeight); +/*161*/ popupX = Math.floor(popupX); +/*162*/ popupY = Math.round(popupY); +/*163*/ +/*164*/ // We didn't understood why it is a difference of some decimals (maximum 1 px) between the expected position and the actual position. +/*165*/ // These difference in decimals is not the same every time, is variable regarding the dimension of the window and the dpi of the screen +/*166*/ // So the only thing in common is that the actual value is near the expected one at a maximum 1 px distance (below or above) +/*167*/ await tad.assertWaitable.include([popupX - 1, popupX, popupX + 1, popupEndX - 1, popupEndX, popupEndX + 1], Math.round(x)); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP1.png
+![](ContextMenu_popup_REP1.png) + +
+
+ +![](ContextMenu_popup_REP1_small.png) + +
+ +```tsx +/*168*/ // semantic ui popup is displayed 10 px below or 10 px above the mouse position +/*169*/ await tad.assertWaitable.include([popupY - 11, popupY - 10, popupY - 9, popupEndY + 9, popupEndY + 10, popupEndY + 11], Math.round(y)); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) | [Go to next](#screenshot-6) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenClickTheHamburgerButton/ContextMenu_popup_REP2.png
+![](ContextMenu_popup_REP2.png) + +
+
+ +![](ContextMenu_popup_REP2_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*170*/ } +/*171*/} +``` + +
diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/Timeline_ganttBody_Timeline_row_0.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/Timeline_ganttBody_Timeline_row_0.png new file mode 100644 index 00000000..6a906ab9 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/Timeline_ganttBody_Timeline_row_0.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/Timeline_ganttBody_Timeline_row_0_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/Timeline_ganttBody_Timeline_row_0_small.png new file mode 100644 index 00000000..6d1389fd Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/Timeline_ganttBody_Timeline_row_0_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/recordedTest.json b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/recordedTest.json new file mode 100644 index 00000000..64ff45a0 --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_0","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":22}],"sourceFiles":{"ContextMenuTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { ContextMenu, addTaskActionIcon, addTaskActionLabel, addTaskNotPossibleAction, deleteActionIcon, deleteActionIconColor, deleteActionLabel, editActionLabel } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someHumanResources, someTasks } from \"../stories/sampleData\";\nimport Timeline, { PARENT_ELEMENT, timelineTestids as testids } from \"../../../src/timeline\";\nimport { getPixelAtTime, getTimeAtPixel } from \"../../../src/utils/timeUtils\";\nimport { rightClick } from \"./testUtils\";\n\nconst CLICK_X =30;\nexport class ContextMenuTestsAreDemo {\n\n async before() {\n render();\n }\n\n @Scenario(\"WHEN I right click on a row, THEN a context menu with one action opens\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenRightClickOnARow() {\n // WHEN right click on a row\n const firstRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + CLICK_X, clientY: Math.round(firstRow.getBoundingClientRect().y) + 20 };\n await tad.showSpotlight({ message: \"I right click on a row\", focusOnLastElementCaptured: true });\n rightClick(firstRow, clickPosition);\n\n // THEN CM is opened at the clicked position\n tad.demoForEndUserHide();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), { x: clickPosition.clientX, y: clickPosition.clientY });\n tad.demoForEndUserShow();\n\n // AND it has an 'Add task' actions\n let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\");\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(menuEntry.textContent, addTaskActionLabel + someHumanResources[0].title);\n tad.demoForEndUserHideNext();\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, addTaskActionIcon);\n }\n\n @Scenario(\"WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenClickAnAction() {\n // WHEN I click on \"Add\"\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n // THEN a new task is added\n let newSegment = tad.screenCapturing.getByTestId(testids.item + \"_\" + someTasks.length);\n await tad.assertWaitable.exists(newSegment);\n\n tad.demoForEndUserHide();\n // AND the CM is closed\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup));\n\n // AND the new task is position correctly on x axes\n // Gantt works with times \"snapped to grid\" so the position for the new task should be snapped to grid \n const timeline = tad.getObjectViaCheat(Timeline);\n const firstRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n const ganttLeftOffset = PARENT_ELEMENT(timeline.props.componentId).getBoundingClientRect().left;\n const clickedX = firstRow.getBoundingClientRect().x + CLICK_X;\n const clickedXInGantt = clickedX - ganttLeftOffset;\n const clickedTime = getTimeAtPixel(clickedXInGantt, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap());\n const clickedXSnappedToGrid = getPixelAtTime(clickedTime, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined))\n + ganttLeftOffset; \n await tad.assertWaitable.equal(Math.round(newSegment.getBoundingClientRect().x), Math.round(clickedXSnappedToGrid));\n \n // AND is correctly added to the clicked row\n await tad.assertWaitable.equal(newSegment.getBoundingClientRect().y, firstRow.getBoundingClientRect().y);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN I right click on a segment, THEN a context menu with 3 actions is shown\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenRightClickOnASegment() {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_0\");\n const segmentBoundingRect = segment.getBoundingClientRect();\n\n // WHEN right click on a segment\n await tad.showSpotlight({ message: \"I right click on a segment\", focusOnLastElementCaptured: true });\n rightClick(segment, { clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 });\n \n // THEN the CM opens\n tad.demoForEndUserHideNext();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n\n // AND it has: 'Add', 'Edit' and 'Delete' actions\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskActionLabel + someHumanResources[0].title);\n \n tad.cc(\"And an 'Edit' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, editActionLabel);\n \n tad.cc(\"And a 'Delete' action\");\n let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_2\");\n await tad.assertWaitable.equal(menuEntry.textContent, deleteActionLabel);\n tad.cc(\"With a custom red renderer\");\n tad.demoForEndUserHideNext();\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, deleteActionIcon);\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, deleteActionIconColor);\n }\n\n @Scenario(\"WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenCTRLRightClickOnAnotherSegment() {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_3\");\n const segmentBoundingRect = segment.getBoundingClientRect();\n await tad.showSpotlight({ message: \"WHEN I CTRL + right click another segment\", focusOnLastElementCaptured: true });\n rightClick(segment, { ctrlKey: true, clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 });\n\n // THEN the CM opens\n tad.demoForEndUserHideNext();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n\n // AND it has: 'Add' and 'Delete' actions\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskActionLabel + someHumanResources[1].title);\n \n tad.cc(\"And a 'Delete' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, deleteActionLabel);\n }\n\n @Scenario(\"WHEN I click the hamburger button, THEN the context menu is shown besides that button\")\n async whenClickTheHamburgerButton() {\n // GIVEN I select one segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n\n // WHEN\n const menuButton = tad.screenCapturing.getByTestId(testids.menuButton);\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(menuButton);\n\n // THEN the context menu is opened and positioned near the center of the hamburger button\");\n tad.demoForEndUserHide();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n const menuButtonCenter = { x: menuButton.getBoundingClientRect().x + menuButton.getBoundingClientRect().width / 2, y: menuButton.getBoundingClientRect().y + menuButton.getBoundingClientRect().height / 2 };\n await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), menuButtonCenter);\n tad.demoForEndUserShow();\n\n // AND it has: 'Add task: not possible', 'Edit' adn 'Delete' actions\n tad.cc(\"The context menu contains an 'Add task not possible' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskNotPossibleAction);\n tad.cc(\"And an 'Edit' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, editActionLabel);\n tad.cc(\"And a 'Delete' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_2\").textContent, deleteActionLabel);\n\n // WHEN click 'Edit' (dontCloseContextMenuAfterRunAutomatically = true) THEN the CM doesn't close \n // We putted this verification at the end of the tests, because else we needed to close the prompt for the next scenarios, and this was not trivial \n tad.demoForEndUserHide();\n await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\"));\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n tad.demoForEndUserShow();\n }\n\n async isPopupPositionedNearPoint({ x: popupX, y: popupY, width: popupWidth, height: popupHeight }, { x, y }) {\n const popupEndX = Math.round(popupX + popupWidth);\n const popupEndY = Math.round(popupY + popupHeight);\n popupX = Math.floor(popupX);\n popupY = Math.round(popupY);\n\n // We didn't understood why it is a difference of some decimals (maximum 1 px) between the expected position and the actual position. \n // These difference in decimals is not the same every time, is variable regarding the dimension of the window and the dpi of the screen\n // So the only thing in common is that the actual value is near the expected one at a maximum 1 px distance (below or above)\n await tad.assertWaitable.include([popupX - 1, popupX, popupX + 1, popupEndX - 1, popupEndX, popupEndX + 1], Math.round(x));\n // semantic ui popup is displayed 10 px below or 10 px above the mouse position\n await tad.assertWaitable.include([popupY - 11, popupY - 10, popupY - 9, popupEndY + 9, popupEndY + 10, popupEndY + 11], Math.round(y));\n }\n}"},"duration":35,"error":"Error: Uncaught TypeError: Cannot read properties of null (reading 'recomputeGridSize') (http://localhost:3000/@fs/home/poweruser/git/react-timeline-10000/src/timeline.js:433)\n\t at _global.onerror [fn(new Error(err + ' (' + url + ':' + line + ')'));] (http://localhost:3000/node_modules/mocha/browser-entry.js:75:10)"} \ No newline at end of file diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/report.md b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/report.md new file mode 100644 index 00000000..755bf50f --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnARow/report.md @@ -0,0 +1,229 @@ + +# ContextMenuTestsAreDemo/whenRightClickOnARow() + +### undefined + +--- + +## The following error was caught while running the test: + +``` +Error: Uncaught TypeError: Cannot read properties of null (reading 'recomputeGridSize') (http://localhost:3000/@fs/home/poweruser/git/react-timeline-10000/src/timeline.js:433) + at _global.onerror [fn(new Error(err + ' (' + url + ':' + line + ')'));] (http://localhost:3000/node_modules/mocha/browser-entry.js:75:10) +``` + +--- + + +There are 1 screenshots. [Go to first](#screenshot-1) + +## ContextMenuTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { ContextMenu, addTaskActionIcon, addTaskActionLabel, addTaskNotPossibleAction, deleteActionIcon, deleteActionIconColor, deleteActionLabel, editActionLabel } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someHumanResources, someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { PARENT_ELEMENT, timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { getPixelAtTime, getTimeAtPixel } from "../../../src/utils/timeUtils"; +/* 7*/import { rightClick } from "./testUtils"; +/* 8*/ +/* 9*/const CLICK_X =30; +/* 10*/export class ContextMenuTestsAreDemo { +/* 11*/ +/* 12*/ async before() { +``` + +
+ +```tsx +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN I right click on a row, THEN a context menu with one action opens") +/* 17*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 18*/ async whenRightClickOnARow() { +/* 19*/ // WHEN right click on a row +/* 20*/ const firstRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/* 21*/ const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + CLICK_X, clientY: Math.round(firstRow.getBoundingClientRect().y) + 20 }; +/* 22*/ await tad.showSpotlight({ message: "I right click on a row", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +ContextMenuTestsAreDemo/whenRightClickOnARow/Timeline_ganttBody_Timeline_row_0.png
+![](Timeline_ganttBody_Timeline_row_0.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/* 23*/ rightClick(firstRow, clickPosition); +/* 24*/ +/* 25*/ // THEN CM is opened at the clicked position +/* 26*/ tad.demoForEndUserHide(); +/* 27*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 28*/ await tad.assertWaitable.exists(popup); +/* 29*/ await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), { x: clickPosition.clientX, y: clickPosition.clientY }); +/* 30*/ tad.demoForEndUserShow(); +/* 31*/ +/* 32*/ // AND it has an 'Add task' actions +/* 33*/ let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0"); +/* 34*/ tad.cc("The context menu contains an 'Add' action"); +/* 35*/ await tad.assertWaitable.equal(menuEntry.textContent, addTaskActionLabel + someHumanResources[0].title); +/* 36*/ tad.demoForEndUserHideNext(); +/* 37*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, addTaskActionIcon); +/* 38*/ } +/* 39*/ +/* 40*/ @Scenario("WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)") +/* 41*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 42*/ async whenClickAnAction() { +/* 43*/ // WHEN I click on "Add" +/* 44*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 45*/ await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 46*/ +/* 47*/ // THEN a new task is added +/* 48*/ let newSegment = tad.screenCapturing.getByTestId(testids.item + "_" + someTasks.length); +/* 49*/ await tad.assertWaitable.exists(newSegment); +/* 50*/ +/* 51*/ tad.demoForEndUserHide(); +/* 52*/ // AND the CM is closed +/* 53*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup)); +/* 54*/ +/* 55*/ // AND the new task is position correctly on x axes +/* 56*/ // Gantt works with times "snapped to grid" so the position for the new task should be snapped to grid +/* 57*/ const timeline = tad.getObjectViaCheat(Timeline); +/* 58*/ const firstRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/* 59*/ const ganttLeftOffset = PARENT_ELEMENT(timeline.props.componentId).getBoundingClientRect().left; +/* 60*/ const clickedX = firstRow.getBoundingClientRect().x + CLICK_X; +/* 61*/ const clickedXInGantt = clickedX - ganttLeftOffset; +/* 62*/ const clickedTime = getTimeAtPixel(clickedXInGantt, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap()); +/* 63*/ const clickedXSnappedToGrid = getPixelAtTime(clickedTime, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined)) +/* 64*/ + ganttLeftOffset; +/* 65*/ await tad.assertWaitable.equal(Math.round(newSegment.getBoundingClientRect().x), Math.round(clickedXSnappedToGrid)); +/* 66*/ +/* 67*/ // AND is correctly added to the clicked row +/* 68*/ await tad.assertWaitable.equal(newSegment.getBoundingClientRect().y, firstRow.getBoundingClientRect().y); +/* 69*/ tad.demoForEndUserShow(); +/* 70*/ } +/* 71*/ +/* 72*/ @Scenario("WHEN I right click on a segment, THEN a context menu with 3 actions is shown") +/* 73*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 74*/ async whenRightClickOnASegment() { +/* 75*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_0"); +/* 76*/ const segmentBoundingRect = segment.getBoundingClientRect(); +/* 77*/ +/* 78*/ // WHEN right click on a segment +/* 79*/ await tad.showSpotlight({ message: "I right click on a segment", focusOnLastElementCaptured: true }); +/* 80*/ rightClick(segment, { clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); +/* 81*/ +/* 82*/ // THEN the CM opens +/* 83*/ tad.demoForEndUserHideNext(); +/* 84*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 85*/ await tad.assertWaitable.exists(popup); +/* 86*/ +/* 87*/ // AND it has: 'Add', 'Edit' and 'Delete' actions +/* 88*/ tad.cc("The context menu contains an 'Add' action"); +/* 89*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[0].title); +/* 90*/ +/* 91*/ tad.cc("And an 'Edit' action"); +/* 92*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); +/* 93*/ +/* 94*/ tad.cc("And a 'Delete' action"); +/* 95*/ let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2"); +/* 96*/ await tad.assertWaitable.equal(menuEntry.textContent, deleteActionLabel); +/* 97*/ tad.cc("With a custom red renderer"); +/* 98*/ tad.demoForEndUserHideNext(); +/* 99*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIcon); +/*100*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIconColor); +/*101*/ } +/*102*/ +/*103*/ @Scenario("WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown") +/*104*/ @ScenarioOptions({ linkWithNextScenario: true }) +/*105*/ async whenCTRLRightClickOnAnotherSegment() { +/*106*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_3"); +/*107*/ const segmentBoundingRect = segment.getBoundingClientRect(); +/*108*/ await tad.showSpotlight({ message: "WHEN I CTRL + right click another segment", focusOnLastElementCaptured: true }); +/*109*/ rightClick(segment, { ctrlKey: true, clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); +/*110*/ +/*111*/ // THEN the CM opens +/*112*/ tad.demoForEndUserHideNext(); +/*113*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/*114*/ await tad.assertWaitable.exists(popup); +/*115*/ +/*116*/ // AND it has: 'Add' and 'Delete' actions +/*117*/ tad.cc("The context menu contains an 'Add' action"); +/*118*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[1].title); +/*119*/ +/*120*/ tad.cc("And a 'Delete' action"); +/*121*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, deleteActionLabel); +/*122*/ } +/*123*/ +/*124*/ @Scenario("WHEN I click the hamburger button, THEN the context menu is shown besides that button") +/*125*/ async whenClickTheHamburgerButton() { +/*126*/ // GIVEN I select one segment +/*127*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/*128*/ +/*129*/ // WHEN +/*130*/ const menuButton = tad.screenCapturing.getByTestId(testids.menuButton); +/*131*/ tad.cc("Click on the menu button"); +/*132*/ await tad.userEventWaitable.click(menuButton); +/*133*/ +/*134*/ // THEN the context menu is opened and positioned near the center of the hamburger button"); +/*135*/ tad.demoForEndUserHide(); +/*136*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/*137*/ await tad.assertWaitable.exists(popup); +/*138*/ const menuButtonCenter = { x: menuButton.getBoundingClientRect().x + menuButton.getBoundingClientRect().width / 2, y: menuButton.getBoundingClientRect().y + menuButton.getBoundingClientRect().height / 2 }; +/*139*/ await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), menuButtonCenter); +/*140*/ tad.demoForEndUserShow(); +/*141*/ +/*142*/ // AND it has: 'Add task: not possible', 'Edit' adn 'Delete' actions +/*143*/ tad.cc("The context menu contains an 'Add task not possible' action"); +/*144*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskNotPossibleAction); +/*145*/ tad.cc("And an 'Edit' action"); +/*146*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); +/*147*/ tad.cc("And a 'Delete' action"); +/*148*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2").textContent, deleteActionLabel); +/*149*/ +/*150*/ // WHEN click 'Edit' (dontCloseContextMenuAfterRunAutomatically = true) THEN the CM doesn't close +/*151*/ // We putted this verification at the end of the tests, because else we needed to close the prompt for the next scenarios, and this was not trivial +/*152*/ tad.demoForEndUserHide(); +/*153*/ await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1")); +/*154*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +/*155*/ tad.demoForEndUserShow(); +/*156*/ } +/*157*/ +/*158*/ async isPopupPositionedNearPoint({ x: popupX, y: popupY, width: popupWidth, height: popupHeight }, { x, y }) { +/*159*/ const popupEndX = Math.round(popupX + popupWidth); +/*160*/ const popupEndY = Math.round(popupY + popupHeight); +/*161*/ popupX = Math.floor(popupX); +/*162*/ popupY = Math.round(popupY); +/*163*/ +/*164*/ // We didn't understood why it is a difference of some decimals (maximum 1 px) between the expected position and the actual position. +/*165*/ // These difference in decimals is not the same every time, is variable regarding the dimension of the window and the dpi of the screen +/*166*/ // So the only thing in common is that the actual value is near the expected one at a maximum 1 px distance (below or above) +/*167*/ await tad.assertWaitable.include([popupX - 1, popupX, popupX + 1, popupEndX - 1, popupEndX, popupEndX + 1], Math.round(x)); +/*168*/ // semantic ui popup is displayed 10 px below or 10 px above the mouse position +/*169*/ await tad.assertWaitable.include([popupY - 11, popupY - 10, popupY - 9, popupEndY + 9, popupEndY + 10, popupEndY + 11], Math.round(y)); +/*170*/ } +/*171*/} +``` + +
diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup.png new file mode 100644 index 00000000..bdd1a99f Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_0.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_0.png new file mode 100644 index 00000000..51918fbb Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_0.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_0_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_0_small.png new file mode 100644 index 00000000..b8ba2803 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_0_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_1.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_1.png new file mode 100644 index 00000000..4960905c Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_1.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_1_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_1_small.png new file mode 100644 index 00000000..f1587b08 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_1_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2.png new file mode 100644 index 00000000..a6fcbbba Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP1.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP1.png new file mode 100644 index 00000000..35165119 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP1.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP1_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP1_small.png new file mode 100644 index 00000000..16bf44a8 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP1_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP2.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP2.png new file mode 100644 index 00000000..7ee53c11 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP2.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP2_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP2_small.png new file mode 100644 index 00000000..16bf44a8 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP2_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_small.png new file mode 100644 index 00000000..16bf44a8 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_small.png new file mode 100644 index 00000000..be6c655d Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png new file mode 100644 index 00000000..ec47dad6 Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_small.png b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_small.png new file mode 100644 index 00000000..775edcbf Binary files /dev/null and b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_small.png differ diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/recordedTest.json b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/recordedTest.json new file mode 100644 index 00000000..1051b486 --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_0_Timeline_item_0","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":79},{"screenshot":"ContextMenu_popup","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":85},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_0","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":89},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_1","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":92},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_2","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":96},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_2_REP1","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":99},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_2_REP2","sourceFile":"ContextMenuTestsAreDemo.tsx","sourceLine":100}],"sourceFiles":{"ContextMenuTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { ContextMenu, addTaskActionIcon, addTaskActionLabel, addTaskNotPossibleAction, deleteActionIcon, deleteActionIconColor, deleteActionLabel, editActionLabel } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someHumanResources, someTasks } from \"../stories/sampleData\";\nimport Timeline, { PARENT_ELEMENT, timelineTestids as testids } from \"../../../src/timeline\";\nimport { getPixelAtTime, getTimeAtPixel } from \"../../../src/utils/timeUtils\";\nimport { rightClick } from \"./testUtils\";\n\nconst CLICK_X =30;\nexport class ContextMenuTestsAreDemo {\n\n async before() {\n render();\n }\n\n @Scenario(\"WHEN I right click on a row, THEN a context menu with one action opens\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenRightClickOnARow() {\n // WHEN right click on a row\n const firstRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + CLICK_X, clientY: Math.round(firstRow.getBoundingClientRect().y) + 20 };\n await tad.showSpotlight({ message: \"I right click on a row\", focusOnLastElementCaptured: true });\n rightClick(firstRow, clickPosition);\n\n // THEN CM is opened at the clicked position\n tad.demoForEndUserHide();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), { x: clickPosition.clientX, y: clickPosition.clientY });\n tad.demoForEndUserShow();\n\n // AND it has an 'Add task' actions\n let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\");\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(menuEntry.textContent, addTaskActionLabel + someHumanResources[0].title);\n tad.demoForEndUserHideNext();\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, addTaskActionIcon);\n }\n\n @Scenario(\"WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenClickAnAction() {\n // WHEN I click on \"Add\"\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n // THEN a new task is added\n let newSegment = tad.screenCapturing.getByTestId(testids.item + \"_\" + someTasks.length);\n await tad.assertWaitable.exists(newSegment);\n\n tad.demoForEndUserHide();\n // AND the CM is closed\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup));\n\n // AND the new task is position correctly on x axes\n // Gantt works with times \"snapped to grid\" so the position for the new task should be snapped to grid \n const timeline = tad.getObjectViaCheat(Timeline);\n const firstRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n const ganttLeftOffset = PARENT_ELEMENT(timeline.props.componentId).getBoundingClientRect().left;\n const clickedX = firstRow.getBoundingClientRect().x + CLICK_X;\n const clickedXInGantt = clickedX - ganttLeftOffset;\n const clickedTime = getTimeAtPixel(clickedXInGantt, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap());\n const clickedXSnappedToGrid = getPixelAtTime(clickedTime, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined))\n + ganttLeftOffset; \n await tad.assertWaitable.equal(Math.round(newSegment.getBoundingClientRect().x), Math.round(clickedXSnappedToGrid));\n \n // AND is correctly added to the clicked row\n await tad.assertWaitable.equal(newSegment.getBoundingClientRect().y, firstRow.getBoundingClientRect().y);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN I right click on a segment, THEN a context menu with 3 actions is shown\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenRightClickOnASegment() {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_0\");\n const segmentBoundingRect = segment.getBoundingClientRect();\n\n // WHEN right click on a segment\n await tad.showSpotlight({ message: \"I right click on a segment\", focusOnLastElementCaptured: true });\n rightClick(segment, { clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 });\n \n // THEN the CM opens\n tad.demoForEndUserHideNext();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n\n // AND it has: 'Add', 'Edit' and 'Delete' actions\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskActionLabel + someHumanResources[0].title);\n \n tad.cc(\"And an 'Edit' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, editActionLabel);\n \n tad.cc(\"And a 'Delete' action\");\n let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_2\");\n await tad.assertWaitable.equal(menuEntry.textContent, deleteActionLabel);\n tad.cc(\"With a custom red renderer\");\n tad.demoForEndUserHideNext();\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, deleteActionIcon);\n await tad.assertWaitable.include(menuEntry.querySelector(\"i\").className, deleteActionIconColor);\n }\n\n @Scenario(\"WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown\")\n @ScenarioOptions({ linkWithNextScenario: true })\n async whenCTRLRightClickOnAnotherSegment() {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_3\");\n const segmentBoundingRect = segment.getBoundingClientRect();\n await tad.showSpotlight({ message: \"WHEN I CTRL + right click another segment\", focusOnLastElementCaptured: true });\n rightClick(segment, { ctrlKey: true, clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 });\n\n // THEN the CM opens\n tad.demoForEndUserHideNext();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n\n // AND it has: 'Add' and 'Delete' actions\n tad.cc(\"The context menu contains an 'Add' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskActionLabel + someHumanResources[1].title);\n \n tad.cc(\"And a 'Delete' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, deleteActionLabel);\n }\n\n @Scenario(\"WHEN I click the hamburger button, THEN the context menu is shown besides that button\")\n async whenClickTheHamburgerButton() {\n // GIVEN I select one segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n\n // WHEN\n const menuButton = tad.screenCapturing.getByTestId(testids.menuButton);\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(menuButton);\n\n // THEN the context menu is opened and positioned near the center of the hamburger button\");\n tad.demoForEndUserHide();\n const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup);\n await tad.assertWaitable.exists(popup);\n const menuButtonCenter = { x: menuButton.getBoundingClientRect().x + menuButton.getBoundingClientRect().width / 2, y: menuButton.getBoundingClientRect().y + menuButton.getBoundingClientRect().height / 2 };\n await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), menuButtonCenter);\n tad.demoForEndUserShow();\n\n // AND it has: 'Add task: not possible', 'Edit' adn 'Delete' actions\n tad.cc(\"The context menu contains an 'Add task not possible' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, addTaskNotPossibleAction);\n tad.cc(\"And an 'Edit' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\").textContent, editActionLabel);\n tad.cc(\"And a 'Delete' action\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_2\").textContent, deleteActionLabel);\n\n // WHEN click 'Edit' (dontCloseContextMenuAfterRunAutomatically = true) THEN the CM doesn't close \n // We putted this verification at the end of the tests, because else we needed to close the prompt for the next scenarios, and this was not trivial \n tad.demoForEndUserHide();\n await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + \"_1\"));\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n tad.demoForEndUserShow();\n }\n\n async isPopupPositionedNearPoint({ x: popupX, y: popupY, width: popupWidth, height: popupHeight }, { x, y }) {\n const popupEndX = Math.round(popupX + popupWidth);\n const popupEndY = Math.round(popupY + popupHeight);\n popupX = Math.floor(popupX);\n popupY = Math.round(popupY);\n\n // We didn't understood why it is a difference of some decimals (maximum 1 px) between the expected position and the actual position. \n // These difference in decimals is not the same every time, is variable regarding the dimension of the window and the dpi of the screen\n // So the only thing in common is that the actual value is near the expected one at a maximum 1 px distance (below or above)\n await tad.assertWaitable.include([popupX - 1, popupX, popupX + 1, popupEndX - 1, popupEndX, popupEndX + 1], Math.round(x));\n // semantic ui popup is displayed 10 px below or 10 px above the mouse position\n await tad.assertWaitable.include([popupY - 11, popupY - 10, popupY - 9, popupEndY + 9, popupEndY + 10, popupEndY + 11], Math.round(y));\n }\n}"},"duration":988} \ No newline at end of file diff --git a/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/report.md b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/report.md new file mode 100644 index 00000000..673c40dc --- /dev/null +++ b/demo-app/public/recordedTests/ContextMenuTestsAreDemo/whenRightClickOnASegment/report.md @@ -0,0 +1,363 @@ + +# ContextMenuTestsAreDemo/whenRightClickOnASegment() + +### undefined + +--- + +There are 7 screenshots. [Go to first](#screenshot-1) + +## ContextMenuTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { ContextMenu, addTaskActionIcon, addTaskActionLabel, addTaskNotPossibleAction, deleteActionIcon, deleteActionIconColor, deleteActionLabel, editActionLabel } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someHumanResources, someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { PARENT_ELEMENT, timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { getPixelAtTime, getTimeAtPixel } from "../../../src/utils/timeUtils"; +/* 7*/import { rightClick } from "./testUtils"; +/* 8*/ +/* 9*/const CLICK_X =30; +/* 10*/export class ContextMenuTestsAreDemo { +/* 11*/ +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN I right click on a row, THEN a context menu with one action opens") +/* 17*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 18*/ async whenRightClickOnARow() { +/* 19*/ // WHEN right click on a row +/* 20*/ const firstRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/* 21*/ const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + CLICK_X, clientY: Math.round(firstRow.getBoundingClientRect().y) + 20 }; +/* 22*/ await tad.showSpotlight({ message: "I right click on a row", focusOnLastElementCaptured: true }); +/* 23*/ rightClick(firstRow, clickPosition); +/* 24*/ +/* 25*/ // THEN CM is opened at the clicked position +/* 26*/ tad.demoForEndUserHide(); +/* 27*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 28*/ await tad.assertWaitable.exists(popup); +/* 29*/ await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), { x: clickPosition.clientX, y: clickPosition.clientY }); +/* 30*/ tad.demoForEndUserShow(); +/* 31*/ +/* 32*/ // AND it has an 'Add task' actions +/* 33*/ let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0"); +/* 34*/ tad.cc("The context menu contains an 'Add' action"); +/* 35*/ await tad.assertWaitable.equal(menuEntry.textContent, addTaskActionLabel + someHumanResources[0].title); +/* 36*/ tad.demoForEndUserHideNext(); +/* 37*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, addTaskActionIcon); +/* 38*/ } +/* 39*/ +/* 40*/ @Scenario("WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)") +/* 41*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 42*/ async whenClickAnAction() { +/* 43*/ // WHEN I click on "Add" +/* 44*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 45*/ await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 46*/ +/* 47*/ // THEN a new task is added +/* 48*/ let newSegment = tad.screenCapturing.getByTestId(testids.item + "_" + someTasks.length); +/* 49*/ await tad.assertWaitable.exists(newSegment); +/* 50*/ +/* 51*/ tad.demoForEndUserHide(); +/* 52*/ // AND the CM is closed +/* 53*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup)); +/* 54*/ +/* 55*/ // AND the new task is position correctly on x axes +/* 56*/ // Gantt works with times "snapped to grid" so the position for the new task should be snapped to grid +/* 57*/ const timeline = tad.getObjectViaCheat(Timeline); +/* 58*/ const firstRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/* 59*/ const ganttLeftOffset = PARENT_ELEMENT(timeline.props.componentId).getBoundingClientRect().left; +/* 60*/ const clickedX = firstRow.getBoundingClientRect().x + CLICK_X; +/* 61*/ const clickedXInGantt = clickedX - ganttLeftOffset; +/* 62*/ const clickedTime = getTimeAtPixel(clickedXInGantt, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap()); +/* 63*/ const clickedXSnappedToGrid = getPixelAtTime(clickedTime, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined)) +/* 64*/ + ganttLeftOffset; +/* 65*/ await tad.assertWaitable.equal(Math.round(newSegment.getBoundingClientRect().x), Math.round(clickedXSnappedToGrid)); +/* 66*/ +/* 67*/ // AND is correctly added to the clicked row +/* 68*/ await tad.assertWaitable.equal(newSegment.getBoundingClientRect().y, firstRow.getBoundingClientRect().y); +/* 69*/ tad.demoForEndUserShow(); +``` + +
+ +```tsx +/* 70*/ } +/* 71*/ +/* 72*/ @Scenario("WHEN I right click on a segment, THEN a context menu with 3 actions is shown") +/* 73*/ @ScenarioOptions({ linkWithNextScenario: true }) +/* 74*/ async whenRightClickOnASegment() { +/* 75*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_0"); +/* 76*/ const segmentBoundingRect = segment.getBoundingClientRect(); +/* 77*/ +/* 78*/ // WHEN right click on a segment +/* 79*/ await tad.showSpotlight({ message: "I right click on a segment", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenRightClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png
+![](Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_Timeline_item_0_small.png) + +
+ +```tsx +/* 80*/ rightClick(segment, { clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); +/* 81*/ +/* 82*/ // THEN the CM opens +/* 83*/ tad.demoForEndUserHideNext(); +/* 84*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/* 85*/ await tad.assertWaitable.exists(popup); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup.png
+![](ContextMenu_popup.png) + +
+
+ +![](ContextMenu_popup_small.png) + +
+ +```tsx +/* 86*/ +/* 87*/ // AND it has: 'Add', 'Edit' and 'Delete' actions +/* 88*/ tad.cc("The context menu contains an 'Add' action"); +/* 89*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[0].title); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_0.png
+![](ContextMenu_popup_ContextMenu_menuItem_0.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_0_small.png) + +
+ +```tsx +/* 90*/ +/* 91*/ tad.cc("And an 'Edit' action"); +/* 92*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_1.png
+![](ContextMenu_popup_ContextMenu_menuItem_1.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_1_small.png) + +
+ +```tsx +/* 93*/ +/* 94*/ tad.cc("And a 'Delete' action"); +/* 95*/ let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2"); +/* 96*/ await tad.assertWaitable.equal(menuEntry.textContent, deleteActionLabel); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) | [Go to next](#screenshot-6) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2.png
+![](ContextMenu_popup_ContextMenu_menuItem_2.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_2_small.png) + +
+ +```tsx +/* 97*/ tad.cc("With a custom red renderer"); +/* 98*/ tad.demoForEndUserHideNext(); +/* 99*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIcon); +``` + + + + +
+ +### Screenshot 6 + +[Go to previous](#screenshot-5) | [Go to next](#screenshot-7) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP1.png
+![](ContextMenu_popup_ContextMenu_menuItem_2_REP1.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_2_REP1_small.png) + +
+ +```tsx +/*100*/ await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIconColor); +``` + + + + +
+ +### Screenshot 7 + +[Go to previous](#screenshot-6) + +
Click to expand full image + +ContextMenuTestsAreDemo/whenRightClickOnASegment/ContextMenu_popup_ContextMenu_menuItem_2_REP2.png
+![](ContextMenu_popup_ContextMenu_menuItem_2_REP2.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_2_REP2_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*101*/ } +/*102*/ +/*103*/ @Scenario("WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown") +/*104*/ @ScenarioOptions({ linkWithNextScenario: true }) +/*105*/ async whenCTRLRightClickOnAnotherSegment() { +/*106*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_3"); +/*107*/ const segmentBoundingRect = segment.getBoundingClientRect(); +/*108*/ await tad.showSpotlight({ message: "WHEN I CTRL + right click another segment", focusOnLastElementCaptured: true }); +/*109*/ rightClick(segment, { ctrlKey: true, clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); +/*110*/ +/*111*/ // THEN the CM opens +/*112*/ tad.demoForEndUserHideNext(); +/*113*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/*114*/ await tad.assertWaitable.exists(popup); +/*115*/ +/*116*/ // AND it has: 'Add' and 'Delete' actions +/*117*/ tad.cc("The context menu contains an 'Add' action"); +/*118*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[1].title); +/*119*/ +/*120*/ tad.cc("And a 'Delete' action"); +/*121*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, deleteActionLabel); +/*122*/ } +/*123*/ +/*124*/ @Scenario("WHEN I click the hamburger button, THEN the context menu is shown besides that button") +/*125*/ async whenClickTheHamburgerButton() { +/*126*/ // GIVEN I select one segment +/*127*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/*128*/ +/*129*/ // WHEN +/*130*/ const menuButton = tad.screenCapturing.getByTestId(testids.menuButton); +/*131*/ tad.cc("Click on the menu button"); +/*132*/ await tad.userEventWaitable.click(menuButton); +/*133*/ +/*134*/ // THEN the context menu is opened and positioned near the center of the hamburger button"); +/*135*/ tad.demoForEndUserHide(); +/*136*/ const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); +/*137*/ await tad.assertWaitable.exists(popup); +/*138*/ const menuButtonCenter = { x: menuButton.getBoundingClientRect().x + menuButton.getBoundingClientRect().width / 2, y: menuButton.getBoundingClientRect().y + menuButton.getBoundingClientRect().height / 2 }; +/*139*/ await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), menuButtonCenter); +/*140*/ tad.demoForEndUserShow(); +/*141*/ +/*142*/ // AND it has: 'Add task: not possible', 'Edit' adn 'Delete' actions +/*143*/ tad.cc("The context menu contains an 'Add task not possible' action"); +/*144*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskNotPossibleAction); +/*145*/ tad.cc("And an 'Edit' action"); +/*146*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); +/*147*/ tad.cc("And a 'Delete' action"); +/*148*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2").textContent, deleteActionLabel); +/*149*/ +/*150*/ // WHEN click 'Edit' (dontCloseContextMenuAfterRunAutomatically = true) THEN the CM doesn't close +/*151*/ // We putted this verification at the end of the tests, because else we needed to close the prompt for the next scenarios, and this was not trivial +/*152*/ tad.demoForEndUserHide(); +/*153*/ await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1")); +/*154*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +/*155*/ tad.demoForEndUserShow(); +/*156*/ } +/*157*/ +/*158*/ async isPopupPositionedNearPoint({ x: popupX, y: popupY, width: popupWidth, height: popupHeight }, { x, y }) { +/*159*/ const popupEndX = Math.round(popupX + popupWidth); +/*160*/ const popupEndY = Math.round(popupY + popupHeight); +/*161*/ popupX = Math.floor(popupX); +/*162*/ popupY = Math.round(popupY); +/*163*/ +/*164*/ // We didn't understood why it is a difference of some decimals (maximum 1 px) between the expected position and the actual position. +/*165*/ // These difference in decimals is not the same every time, is variable regarding the dimension of the window and the dpi of the screen +/*166*/ // So the only thing in common is that the actual value is near the expected one at a maximum 1 px distance (below or above) +/*167*/ await tad.assertWaitable.include([popupX - 1, popupX, popupX + 1, popupEndX - 1, popupEndX, popupEndX + 1], Math.round(x)); +/*168*/ // semantic ui popup is displayed 10 px below or 10 px above the mouse position +/*169*/ await tad.assertWaitable.include([popupY - 11, popupY - 10, popupY - 9, popupEndY + 9, popupEndY + 10, popupEndY + 11], Math.round(y)); +/*170*/ } +/*171*/} +``` + +
diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11.png new file mode 100644 index 00000000..d1173293 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11_small.png new file mode 100644 index 00000000..673ca67f Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3.png new file mode 100644 index 00000000..47cce864 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP1.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP1.png new file mode 100644 index 00000000..d4022086 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP1.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP1_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP1_small.png new file mode 100644 index 00000000..28c4a344 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP1_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2.png new file mode 100644 index 00000000..6faa17c1 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2_small.png new file mode 100644 index 00000000..4e2b8f9f Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_small.png new file mode 100644 index 00000000..f0dc3fa0 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/recordedTest.json b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/recordedTest.json new file mode 100644 index 00000000..de1e47bf --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_3","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":196},{"screenshot":"Timeline_ganttBody_Timeline_row_3_REP1","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":199},{"screenshot":"Timeline_ganttBody_Timeline_row_3_REP2","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":135},{"screenshot":"Timeline_ganttBody_Timeline_row_2_Timeline_item_11","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":138}],"sourceFiles":{"DragToCreateTestsAreDemo.tsx":"import { Only, render, Scenario, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { Main } from \"../stories/dragToCreate/DragToCreate.stories\";\nimport Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from \"../../../src/timeline\";\nimport { dragToCreateStoriesTestIds as testIds } from \"../stories/dragToCreate/DragToCreate.stories\";\n\nexport class DragToCreateTestsAreDemo {\n\n async before() {\n render(
);\n }\n\n @Scenario(\"WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry\")\n async whenClickMenuButton() {\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Check if the context menu is open\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n\n tad.cc(\"Check if exist the 'Drag To Create' action\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, DRAG_TO_CREATE_ACTION_LABEL);\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n }\n\n @Scenario(\"WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears\")\n async whenClickAddMenuEntry() {\n // GIVEN context menu is opened by pressing the hamburger button\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n \n // WHEN\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // THEN\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Drag to create mode should be active\");\n\t\n\t const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup);\n tad.cc(\"Check if drag to create popup exists\");\n await tad.assertWaitable.exists(popup);\n \n // Check the labels\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_1\").innerHTML, \"Click and drag to create a new segment\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_2\").textContent, DRAG_TO_CREATE_POPUP_LABEL_2);\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_3\").innerHTML, \"To cancel you can also click on gantt\");\n const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton);\n tad.cc(\"Check if exists 'Cancel' button\");\n await tad.assertWaitable.exists(cancelButton);\n tad.cc(\"Check if the cancel button is negative\");\n await tad.assertWaitable.include(cancelButton.className, \"negative\");\n\n // Test auto closing of the popup\n tad.demoForEndUserHide();\n\n // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME \n // I tried to test also from time to time that the popup is opened but the setTimeout(time) \n // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause\n // inexact test for when the popup is still opened)\n await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup));\n \n // AND still in drag to create mode\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode);\n tad.demoForEndUserShow();\n\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled\")\n async givenDragToCreateModeWhenClickCancel() {\n // GIVEN context menu was opened and 'Drag To Create' was pressed\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // WHEN\n tad.cc(\"Click on `Cancel 'drag to create' mode` button from the drag to create popup\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton));\n \n // THEN\n await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Check if the drag to create mode is cancelled\");\n \n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears\")\n async givenDragToCreateModeWhenClickAndDrag() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n const { height } = selector.getBoundingClientRect();\n tad.cc(\"A green selection rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_4\");\n await tad.showSpotlight({ message: \"On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n await tad.showSpotlight({ message: \"Move the mouse on previous row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n\n tad.getObjectViaCheat(Timeline)._selectBox.end();\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN right click, THEN cancel\")\n async givenDragToCreateModeInProgressWhenRightClick() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n await startDragKeepInProgress(3, 100);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the right click\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).rightClick();\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The segment wasn't created, the row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN mouse up, THEN handler is called\")\n async givenDragToCreateModeInProgressWhenMouseUp() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n tad.cc(\"The segment was created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_11\"));\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created\")\n async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() {\n // WHEN forceDragToCreate = true\n await tad.cc(\"WHEN I set forceDragToCreate = true AND I drag to create\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio));\n\n // AND WHEN I drag and move\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n\n tad.cc(\"AND I perform\");\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n // THEN\n tad.cc(\"THEN the drag to create rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n tad.cc(\"AND it is green\");\n await tad.assertWaitable.include(Array.from(selector.classList), \"rct9k-selector-outer-add\");\n\n // AND WHEN I perform mouse up\n await tad.showSpotlight({ message: \"AND when I perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n \n // THEN\n tad.cc(\"THEN A segment is created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_12\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n\n // WHEN forceDragToCreate = false \n await tad.cc(\"WHEN I set forceDragToCreate = false AND I drag and drop\");\n // TODO era uitat await; dar crapa in modul \"fast\";\n // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton)\n // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam\n // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio));\n\n // THEN segments are not created at drag\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + \"_13\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n }\n}\n\nasync function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) {\n // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform click for start the drag\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragStart(row, xOffset);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform mouse move with \" + x + \"px on X axis\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(x, 0);\n}\n"},"duration":790} \ No newline at end of file diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/report.md b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/report.md new file mode 100644 index 00000000..646dd1dc --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/report.md @@ -0,0 +1,322 @@ + +# DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp() + +### undefined + +--- + +There are 4 screenshots. [Go to first](#screenshot-1) + +## DragToCreateTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, render, Scenario, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { Main } from "../stories/dragToCreate/DragToCreate.stories"; +/* 4*/import Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from "../../../src/timeline"; +/* 5*/import { dragToCreateStoriesTestIds as testIds } from "../stories/dragToCreate/DragToCreate.stories"; +/* 6*/ +/* 7*/export class DragToCreateTestsAreDemo { +/* 8*/ +/* 9*/ async before() { +/* 10*/ render(
); +/* 11*/ } +/* 12*/ +/* 13*/ @Scenario("WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry") +/* 14*/ async whenClickMenuButton() { +/* 15*/ tad.cc("Click on the menu button"); +/* 16*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 17*/ tad.cc("Check if the context menu is open"); +/* 18*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +/* 19*/ +/* 20*/ tad.cc("Check if exist the 'Drag To Create' action"); +/* 21*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0").textContent, DRAG_TO_CREATE_ACTION_LABEL); +/* 22*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 23*/ } +/* 24*/ +/* 25*/ @Scenario("WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears") +/* 26*/ async whenClickAddMenuEntry() { +/* 27*/ // GIVEN context menu is opened by pressing the hamburger button +/* 28*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 29*/ +/* 30*/ // WHEN +/* 31*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 33*/ +/* 34*/ // THEN +/* 35*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Drag to create mode should be active"); +/* 36*/ +/* 37*/ const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup); +/* 38*/ tad.cc("Check if drag to create popup exists"); +/* 39*/ await tad.assertWaitable.exists(popup); +/* 40*/ +/* 41*/ // Check the labels +/* 42*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_1").innerHTML, "Click and drag to create a new segment"); +/* 43*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_2").textContent, DRAG_TO_CREATE_POPUP_LABEL_2); +/* 44*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_3").innerHTML, "To cancel you can also click on gantt"); +/* 45*/ const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton); +/* 46*/ tad.cc("Check if exists 'Cancel' button"); +/* 47*/ await tad.assertWaitable.exists(cancelButton); +/* 48*/ tad.cc("Check if the cancel button is negative"); +/* 49*/ await tad.assertWaitable.include(cancelButton.className, "negative"); +/* 50*/ +/* 51*/ // Test auto closing of the popup +/* 52*/ tad.demoForEndUserHide(); +/* 53*/ +/* 54*/ // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME +/* 55*/ // I tried to test also from time to time that the popup is opened but the setTimeout(time) +/* 56*/ // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause +/* 57*/ // inexact test for when the popup is still opened) +/* 58*/ await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME)); +/* 59*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup)); +/* 60*/ +/* 61*/ // AND still in drag to create mode +/* 62*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode); +/* 63*/ tad.demoForEndUserShow(); +/* 64*/ +/* 65*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 66*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 67*/ } +/* 68*/ +/* 69*/ @Scenario("GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled") +/* 70*/ async givenDragToCreateModeWhenClickCancel() { +/* 71*/ // GIVEN context menu was opened and 'Drag To Create' was pressed +/* 72*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 73*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 74*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 75*/ +/* 76*/ // WHEN +/* 77*/ tad.cc("Click on `Cancel 'drag to create' mode` button from the drag to create popup"); +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton)); +/* 79*/ +/* 80*/ // THEN +/* 81*/ await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Check if the drag to create mode is cancelled"); +/* 82*/ +/* 83*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 84*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 85*/ } +/* 86*/ +/* 87*/ @Scenario("GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears") +/* 88*/ async givenDragToCreateModeWhenClickAndDrag() { +/* 89*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/* 90*/ +/* 91*/ await startDragKeepInProgress(3, 100); +/* 92*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/* 93*/ const { height } = selector.getBoundingClientRect(); +/* 94*/ tad.cc("A green selection rectangle appears on the row"); +/* 95*/ await tad.assertWaitable.exists(selector); +/* 96*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_4"); +/* 97*/ await tad.showSpotlight({ message: "On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row", focusOnLastElementCaptured: true }); +/* 98*/ await tad.getObjectViaCheat(Timeline).dragMove(0, height); +/* 99*/ tad.cc("The height of the section regtagle isn't changed"); +/*100*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*101*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*102*/ await tad.showSpotlight({ message: "Move the mouse on previous row", focusOnLastElementCaptured: true }); +/*103*/ await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height); +/*104*/ tad.cc("The height of the section regtagle isn't changed"); +/*105*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*106*/ +/*107*/ tad.getObjectViaCheat(Timeline)._selectBox.end(); +/*108*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*109*/ } +/*110*/ +/*111*/ @Scenario("GIVEN drag to create in progress, WHEN right click, THEN cancel") +/*112*/ async givenDragToCreateModeInProgressWhenRightClick() { +/*113*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*114*/ +/*115*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*116*/ tad.cc("The row don't have the segments"); +/*117*/ await tad.assertWaitable.equal(row.children.length, 0); +/*118*/ await startDragKeepInProgress(3, 100); +/*119*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*120*/ await tad.showSpotlight({ message: "We perform the right click", focusOnLastElementCaptured: true }); +/*121*/ tad.getObjectViaCheat(Timeline).rightClick(); +/*122*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*123*/ tad.cc("The segment wasn't created, the row don't have the segments"); +/*124*/ await tad.assertWaitable.equal(row.children.length, 0); +/*125*/ +``` + +
+ +```tsx +/*126*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*127*/ } +/*128*/ +/*129*/ @Scenario("GIVEN drag to create in progress, WHEN mouse up, THEN handler is called") +/*130*/ async givenDragToCreateModeInProgressWhenMouseUp() { +/*131*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*132*/ +/*133*/ await startDragKeepInProgress(3, 100); +/*134*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*135*/ await tad.showSpotlight({ message: "We perform the mouse up", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP2.png
+![](Timeline_ganttBody_Timeline_row_3_REP2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_REP2_small.png) + +
+ +```tsx +/*136*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*137*/ tad.cc("The segment was created"); +/*138*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_11")); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_2_Timeline_item_11.png
+![](Timeline_ganttBody_Timeline_row_2_Timeline_item_11.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_2_Timeline_item_11_small.png) + +
+ +```tsx +/*139*/ +/*140*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*141*/ } +/*142*/ +/*143*/ @Scenario("WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created") +/*144*/ async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() { +/*145*/ // WHEN forceDragToCreate = true +/*146*/ await tad.cc("WHEN I set forceDragToCreate = true AND I drag to create"); +/*147*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio)); +/*148*/ +/*149*/ // AND WHEN I drag and move +/*150*/ await startDragKeepInProgress(2, 100); +/*151*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*152*/ +/*153*/ tad.cc("AND I perform"); +/*154*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/*155*/ // THEN +/*156*/ tad.cc("THEN the drag to create rectangle appears on the row"); +/*157*/ await tad.assertWaitable.exists(selector); +/*158*/ tad.cc("AND it is green"); +/*159*/ await tad.assertWaitable.include(Array.from(selector.classList), "rct9k-selector-outer-add"); +/*160*/ +/*161*/ // AND WHEN I perform mouse up +/*162*/ await tad.showSpotlight({ message: "AND when I perform the mouse up", focusOnLastElementCaptured: true }); +/*163*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*164*/ +/*165*/ // THEN +/*166*/ tad.cc("THEN A segment is created"); +/*167*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_12")); +/*168*/ +/*169*/ // AND +/*170*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*171*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*172*/ +/*173*/ // WHEN forceDragToCreate = false +/*174*/ await tad.cc("WHEN I set forceDragToCreate = false AND I drag and drop"); +/*175*/ // TODO era uitat await; dar crapa in modul "fast"; +/*176*/ // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton) +/*177*/ // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam +/*178*/ // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio)); +/*180*/ +/*181*/ // THEN segments are not created at drag +/*182*/ await startDragKeepInProgress(2, 100); +/*183*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*184*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*185*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + "_13")); +/*186*/ +/*187*/ // AND +/*188*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*189*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*190*/ } +/*191*/} +/*192*/ +/*193*/async function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) { +/*194*/ // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost +/*195*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*196*/ await tad.showSpotlight({ message: "We perform click for start the drag", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3.png
+![](Timeline_ganttBody_Timeline_row_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_small.png) + +
+ +```tsx +/*197*/ tad.getObjectViaCheat(Timeline).dragStart(row, xOffset); +/*198*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*199*/ await tad.showSpotlight({ message: "We perform mouse move with " + x + "px on X axis", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp/Timeline_ganttBody_Timeline_row_3_REP1.png
+![](Timeline_ganttBody_Timeline_row_3_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_REP1_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*200*/ await tad.getObjectViaCheat(Timeline).dragMove(x, 0); +/*201*/} +/*202*/ +``` + +
diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3.png new file mode 100644 index 00000000..d6a67448 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP1.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP1.png new file mode 100644 index 00000000..a7b671a7 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP1.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP1_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP1_small.png new file mode 100644 index 00000000..f0dc3fa0 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP1_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP2.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP2.png new file mode 100644 index 00000000..01905f21 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP2.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP2_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP2_small.png new file mode 100644 index 00000000..28c4a344 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP2_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP3.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP3.png new file mode 100644 index 00000000..fd97c06d Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP3.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP3_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP3_small.png new file mode 100644 index 00000000..4e2b8f9f Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP3_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP4.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP4.png new file mode 100644 index 00000000..68f702de Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP4.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP4_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP4_small.png new file mode 100644 index 00000000..f0dc3fa0 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP4_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_small.png new file mode 100644 index 00000000..f0dc3fa0 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/recordedTest.json b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/recordedTest.json new file mode 100644 index 00000000..6478f71a --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_3","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":117},{"screenshot":"Timeline_ganttBody_Timeline_row_3_REP1","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":196},{"screenshot":"Timeline_ganttBody_Timeline_row_3_REP2","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":199},{"screenshot":"Timeline_ganttBody_Timeline_row_3_REP3","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":120},{"screenshot":"Timeline_ganttBody_Timeline_row_3_REP4","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":124}],"sourceFiles":{"DragToCreateTestsAreDemo.tsx":"import { Only, render, Scenario, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { Main } from \"../stories/dragToCreate/DragToCreate.stories\";\nimport Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from \"../../../src/timeline\";\nimport { dragToCreateStoriesTestIds as testIds } from \"../stories/dragToCreate/DragToCreate.stories\";\n\nexport class DragToCreateTestsAreDemo {\n\n async before() {\n render(
);\n }\n\n @Scenario(\"WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry\")\n async whenClickMenuButton() {\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Check if the context menu is open\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n\n tad.cc(\"Check if exist the 'Drag To Create' action\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, DRAG_TO_CREATE_ACTION_LABEL);\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n }\n\n @Scenario(\"WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears\")\n async whenClickAddMenuEntry() {\n // GIVEN context menu is opened by pressing the hamburger button\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n \n // WHEN\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // THEN\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Drag to create mode should be active\");\n\t\n\t const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup);\n tad.cc(\"Check if drag to create popup exists\");\n await tad.assertWaitable.exists(popup);\n \n // Check the labels\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_1\").innerHTML, \"Click and drag to create a new segment\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_2\").textContent, DRAG_TO_CREATE_POPUP_LABEL_2);\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_3\").innerHTML, \"To cancel you can also click on gantt\");\n const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton);\n tad.cc(\"Check if exists 'Cancel' button\");\n await tad.assertWaitable.exists(cancelButton);\n tad.cc(\"Check if the cancel button is negative\");\n await tad.assertWaitable.include(cancelButton.className, \"negative\");\n\n // Test auto closing of the popup\n tad.demoForEndUserHide();\n\n // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME \n // I tried to test also from time to time that the popup is opened but the setTimeout(time) \n // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause\n // inexact test for when the popup is still opened)\n await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup));\n \n // AND still in drag to create mode\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode);\n tad.demoForEndUserShow();\n\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled\")\n async givenDragToCreateModeWhenClickCancel() {\n // GIVEN context menu was opened and 'Drag To Create' was pressed\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // WHEN\n tad.cc(\"Click on `Cancel 'drag to create' mode` button from the drag to create popup\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton));\n \n // THEN\n await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Check if the drag to create mode is cancelled\");\n \n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears\")\n async givenDragToCreateModeWhenClickAndDrag() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n const { height } = selector.getBoundingClientRect();\n tad.cc(\"A green selection rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_4\");\n await tad.showSpotlight({ message: \"On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n await tad.showSpotlight({ message: \"Move the mouse on previous row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n\n tad.getObjectViaCheat(Timeline)._selectBox.end();\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN right click, THEN cancel\")\n async givenDragToCreateModeInProgressWhenRightClick() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n await startDragKeepInProgress(3, 100);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the right click\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).rightClick();\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The segment wasn't created, the row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN mouse up, THEN handler is called\")\n async givenDragToCreateModeInProgressWhenMouseUp() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n tad.cc(\"The segment was created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_11\"));\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created\")\n async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() {\n // WHEN forceDragToCreate = true\n await tad.cc(\"WHEN I set forceDragToCreate = true AND I drag to create\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio));\n\n // AND WHEN I drag and move\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n\n tad.cc(\"AND I perform\");\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n // THEN\n tad.cc(\"THEN the drag to create rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n tad.cc(\"AND it is green\");\n await tad.assertWaitable.include(Array.from(selector.classList), \"rct9k-selector-outer-add\");\n\n // AND WHEN I perform mouse up\n await tad.showSpotlight({ message: \"AND when I perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n \n // THEN\n tad.cc(\"THEN A segment is created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_12\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n\n // WHEN forceDragToCreate = false \n await tad.cc(\"WHEN I set forceDragToCreate = false AND I drag and drop\");\n // TODO era uitat await; dar crapa in modul \"fast\";\n // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton)\n // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam\n // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio));\n\n // THEN segments are not created at drag\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + \"_13\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n }\n}\n\nasync function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) {\n // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform click for start the drag\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragStart(row, xOffset);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform mouse move with \" + x + \"px on X axis\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(x, 0);\n}\n"},"duration":974} \ No newline at end of file diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/report.md b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/report.md new file mode 100644 index 00000000..de429136 --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/report.md @@ -0,0 +1,346 @@ + +# DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick() + +### undefined + +--- + +There are 5 screenshots. [Go to first](#screenshot-1) + +## DragToCreateTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, render, Scenario, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { Main } from "../stories/dragToCreate/DragToCreate.stories"; +/* 4*/import Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from "../../../src/timeline"; +/* 5*/import { dragToCreateStoriesTestIds as testIds } from "../stories/dragToCreate/DragToCreate.stories"; +/* 6*/ +/* 7*/export class DragToCreateTestsAreDemo { +/* 8*/ +/* 9*/ async before() { +/* 10*/ render(
); +/* 11*/ } +/* 12*/ +/* 13*/ @Scenario("WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry") +/* 14*/ async whenClickMenuButton() { +/* 15*/ tad.cc("Click on the menu button"); +/* 16*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 17*/ tad.cc("Check if the context menu is open"); +/* 18*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +/* 19*/ +/* 20*/ tad.cc("Check if exist the 'Drag To Create' action"); +/* 21*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0").textContent, DRAG_TO_CREATE_ACTION_LABEL); +/* 22*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 23*/ } +/* 24*/ +/* 25*/ @Scenario("WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears") +/* 26*/ async whenClickAddMenuEntry() { +/* 27*/ // GIVEN context menu is opened by pressing the hamburger button +/* 28*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 29*/ +/* 30*/ // WHEN +/* 31*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 33*/ +/* 34*/ // THEN +/* 35*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Drag to create mode should be active"); +/* 36*/ +/* 37*/ const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup); +/* 38*/ tad.cc("Check if drag to create popup exists"); +/* 39*/ await tad.assertWaitable.exists(popup); +/* 40*/ +/* 41*/ // Check the labels +/* 42*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_1").innerHTML, "Click and drag to create a new segment"); +/* 43*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_2").textContent, DRAG_TO_CREATE_POPUP_LABEL_2); +/* 44*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_3").innerHTML, "To cancel you can also click on gantt"); +/* 45*/ const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton); +/* 46*/ tad.cc("Check if exists 'Cancel' button"); +/* 47*/ await tad.assertWaitable.exists(cancelButton); +/* 48*/ tad.cc("Check if the cancel button is negative"); +/* 49*/ await tad.assertWaitable.include(cancelButton.className, "negative"); +/* 50*/ +/* 51*/ // Test auto closing of the popup +/* 52*/ tad.demoForEndUserHide(); +/* 53*/ +/* 54*/ // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME +/* 55*/ // I tried to test also from time to time that the popup is opened but the setTimeout(time) +/* 56*/ // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause +/* 57*/ // inexact test for when the popup is still opened) +/* 58*/ await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME)); +/* 59*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup)); +/* 60*/ +/* 61*/ // AND still in drag to create mode +/* 62*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode); +/* 63*/ tad.demoForEndUserShow(); +/* 64*/ +/* 65*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 66*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 67*/ } +/* 68*/ +/* 69*/ @Scenario("GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled") +/* 70*/ async givenDragToCreateModeWhenClickCancel() { +/* 71*/ // GIVEN context menu was opened and 'Drag To Create' was pressed +/* 72*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 73*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 74*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 75*/ +/* 76*/ // WHEN +/* 77*/ tad.cc("Click on `Cancel 'drag to create' mode` button from the drag to create popup"); +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton)); +/* 79*/ +/* 80*/ // THEN +/* 81*/ await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Check if the drag to create mode is cancelled"); +/* 82*/ +/* 83*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 84*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 85*/ } +/* 86*/ +/* 87*/ @Scenario("GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears") +/* 88*/ async givenDragToCreateModeWhenClickAndDrag() { +/* 89*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/* 90*/ +/* 91*/ await startDragKeepInProgress(3, 100); +/* 92*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/* 93*/ const { height } = selector.getBoundingClientRect(); +/* 94*/ tad.cc("A green selection rectangle appears on the row"); +/* 95*/ await tad.assertWaitable.exists(selector); +/* 96*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_4"); +/* 97*/ await tad.showSpotlight({ message: "On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row", focusOnLastElementCaptured: true }); +/* 98*/ await tad.getObjectViaCheat(Timeline).dragMove(0, height); +/* 99*/ tad.cc("The height of the section regtagle isn't changed"); +/*100*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*101*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*102*/ await tad.showSpotlight({ message: "Move the mouse on previous row", focusOnLastElementCaptured: true }); +/*103*/ await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height); +/*104*/ tad.cc("The height of the section regtagle isn't changed"); +/*105*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*106*/ +/*107*/ tad.getObjectViaCheat(Timeline)._selectBox.end(); +``` + +
+ +```tsx +/*108*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*109*/ } +/*110*/ +/*111*/ @Scenario("GIVEN drag to create in progress, WHEN right click, THEN cancel") +/*112*/ async givenDragToCreateModeInProgressWhenRightClick() { +/*113*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*114*/ +/*115*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*116*/ tad.cc("The row don't have the segments"); +/*117*/ await tad.assertWaitable.equal(row.children.length, 0); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3.png
+![](Timeline_ganttBody_Timeline_row_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_small.png) + +
+ +```tsx +/*118*/ await startDragKeepInProgress(3, 100); +/*119*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*120*/ await tad.showSpotlight({ message: "We perform the right click", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP3.png
+![](Timeline_ganttBody_Timeline_row_3_REP3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_REP3_small.png) + +
+ +```tsx +/*121*/ tad.getObjectViaCheat(Timeline).rightClick(); +/*122*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*123*/ tad.cc("The segment wasn't created, the row don't have the segments"); +/*124*/ await tad.assertWaitable.equal(row.children.length, 0); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP4.png
+![](Timeline_ganttBody_Timeline_row_3_REP4.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_REP4_small.png) + +
+ +```tsx +/*125*/ +/*126*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*127*/ } +/*128*/ +/*129*/ @Scenario("GIVEN drag to create in progress, WHEN mouse up, THEN handler is called") +/*130*/ async givenDragToCreateModeInProgressWhenMouseUp() { +/*131*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*132*/ +/*133*/ await startDragKeepInProgress(3, 100); +/*134*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*135*/ await tad.showSpotlight({ message: "We perform the mouse up", focusOnLastElementCaptured: true }); +/*136*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*137*/ tad.cc("The segment was created"); +/*138*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_11")); +/*139*/ +/*140*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*141*/ } +/*142*/ +/*143*/ @Scenario("WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created") +/*144*/ async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() { +/*145*/ // WHEN forceDragToCreate = true +/*146*/ await tad.cc("WHEN I set forceDragToCreate = true AND I drag to create"); +/*147*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio)); +/*148*/ +/*149*/ // AND WHEN I drag and move +/*150*/ await startDragKeepInProgress(2, 100); +/*151*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*152*/ +/*153*/ tad.cc("AND I perform"); +/*154*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/*155*/ // THEN +/*156*/ tad.cc("THEN the drag to create rectangle appears on the row"); +/*157*/ await tad.assertWaitable.exists(selector); +/*158*/ tad.cc("AND it is green"); +/*159*/ await tad.assertWaitable.include(Array.from(selector.classList), "rct9k-selector-outer-add"); +/*160*/ +/*161*/ // AND WHEN I perform mouse up +/*162*/ await tad.showSpotlight({ message: "AND when I perform the mouse up", focusOnLastElementCaptured: true }); +/*163*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*164*/ +/*165*/ // THEN +/*166*/ tad.cc("THEN A segment is created"); +/*167*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_12")); +/*168*/ +/*169*/ // AND +/*170*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*171*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*172*/ +/*173*/ // WHEN forceDragToCreate = false +/*174*/ await tad.cc("WHEN I set forceDragToCreate = false AND I drag and drop"); +/*175*/ // TODO era uitat await; dar crapa in modul "fast"; +/*176*/ // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton) +/*177*/ // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam +/*178*/ // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio)); +/*180*/ +/*181*/ // THEN segments are not created at drag +/*182*/ await startDragKeepInProgress(2, 100); +/*183*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*184*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*185*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + "_13")); +/*186*/ +/*187*/ // AND +/*188*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*189*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*190*/ } +/*191*/} +/*192*/ +/*193*/async function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) { +/*194*/ // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost +/*195*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*196*/ await tad.showSpotlight({ message: "We perform click for start the drag", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP1.png
+![](Timeline_ganttBody_Timeline_row_3_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_REP1_small.png) + +
+ +```tsx +/*197*/ tad.getObjectViaCheat(Timeline).dragStart(row, xOffset); +/*198*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*199*/ await tad.showSpotlight({ message: "We perform mouse move with " + x + "px on X axis", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick/Timeline_ganttBody_Timeline_row_3_REP2.png
+![](Timeline_ganttBody_Timeline_row_3_REP2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_REP2_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*200*/ await tad.getObjectViaCheat(Timeline).dragMove(x, 0); +/*201*/} +/*202*/ +``` + +
diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_2.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_2.png new file mode 100644 index 00000000..7f17106e Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_2.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_2_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_2_small.png new file mode 100644 index 00000000..71376d5c Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_2_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3.png new file mode 100644 index 00000000..a9925945 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_REP1.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_REP1.png new file mode 100644 index 00000000..2dbc81b0 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_REP1.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_REP1_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_REP1_small.png new file mode 100644 index 00000000..28c4a344 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_REP1_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_small.png new file mode 100644 index 00000000..751c1948 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_4.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_4.png new file mode 100644 index 00000000..9cf9cfd0 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_4.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_4_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_4_small.png new file mode 100644 index 00000000..e45a9510 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_4_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector.png new file mode 100644 index 00000000..2d27674e Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP1.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP1.png new file mode 100644 index 00000000..0255ba19 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP1.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP1_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP1_small.png new file mode 100644 index 00000000..5ee52cb2 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP1_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP2.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP2.png new file mode 100644 index 00000000..a21e1e85 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP2.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP2_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP2_small.png new file mode 100644 index 00000000..5ee52cb2 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP2_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_small.png new file mode 100644 index 00000000..5ee52cb2 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/recordedTest.json b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/recordedTest.json new file mode 100644 index 00000000..519740bd --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_3","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":196},{"screenshot":"Timeline_ganttBody_Timeline_row_3_REP1","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":199},{"screenshot":"Timeline_selector","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":95},{"screenshot":"Timeline_ganttBody_Timeline_row_4","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":97},{"screenshot":"Timeline_selector_REP1","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":100},{"screenshot":"Timeline_ganttBody_Timeline_row_2","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":102},{"screenshot":"Timeline_selector_REP2","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":105}],"sourceFiles":{"DragToCreateTestsAreDemo.tsx":"import { Only, render, Scenario, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { Main } from \"../stories/dragToCreate/DragToCreate.stories\";\nimport Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from \"../../../src/timeline\";\nimport { dragToCreateStoriesTestIds as testIds } from \"../stories/dragToCreate/DragToCreate.stories\";\n\nexport class DragToCreateTestsAreDemo {\n\n async before() {\n render(
);\n }\n\n @Scenario(\"WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry\")\n async whenClickMenuButton() {\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Check if the context menu is open\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n\n tad.cc(\"Check if exist the 'Drag To Create' action\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, DRAG_TO_CREATE_ACTION_LABEL);\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n }\n\n @Scenario(\"WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears\")\n async whenClickAddMenuEntry() {\n // GIVEN context menu is opened by pressing the hamburger button\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n \n // WHEN\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // THEN\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Drag to create mode should be active\");\n\t\n\t const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup);\n tad.cc(\"Check if drag to create popup exists\");\n await tad.assertWaitable.exists(popup);\n \n // Check the labels\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_1\").innerHTML, \"Click and drag to create a new segment\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_2\").textContent, DRAG_TO_CREATE_POPUP_LABEL_2);\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_3\").innerHTML, \"To cancel you can also click on gantt\");\n const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton);\n tad.cc(\"Check if exists 'Cancel' button\");\n await tad.assertWaitable.exists(cancelButton);\n tad.cc(\"Check if the cancel button is negative\");\n await tad.assertWaitable.include(cancelButton.className, \"negative\");\n\n // Test auto closing of the popup\n tad.demoForEndUserHide();\n\n // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME \n // I tried to test also from time to time that the popup is opened but the setTimeout(time) \n // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause\n // inexact test for when the popup is still opened)\n await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup));\n \n // AND still in drag to create mode\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode);\n tad.demoForEndUserShow();\n\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled\")\n async givenDragToCreateModeWhenClickCancel() {\n // GIVEN context menu was opened and 'Drag To Create' was pressed\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // WHEN\n tad.cc(\"Click on `Cancel 'drag to create' mode` button from the drag to create popup\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton));\n \n // THEN\n await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Check if the drag to create mode is cancelled\");\n \n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears\")\n async givenDragToCreateModeWhenClickAndDrag() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n const { height } = selector.getBoundingClientRect();\n tad.cc(\"A green selection rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_4\");\n await tad.showSpotlight({ message: \"On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n await tad.showSpotlight({ message: \"Move the mouse on previous row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n\n tad.getObjectViaCheat(Timeline)._selectBox.end();\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN right click, THEN cancel\")\n async givenDragToCreateModeInProgressWhenRightClick() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n await startDragKeepInProgress(3, 100);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the right click\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).rightClick();\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The segment wasn't created, the row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN mouse up, THEN handler is called\")\n async givenDragToCreateModeInProgressWhenMouseUp() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n tad.cc(\"The segment was created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_11\"));\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created\")\n async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() {\n // WHEN forceDragToCreate = true\n await tad.cc(\"WHEN I set forceDragToCreate = true AND I drag to create\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio));\n\n // AND WHEN I drag and move\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n\n tad.cc(\"AND I perform\");\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n // THEN\n tad.cc(\"THEN the drag to create rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n tad.cc(\"AND it is green\");\n await tad.assertWaitable.include(Array.from(selector.classList), \"rct9k-selector-outer-add\");\n\n // AND WHEN I perform mouse up\n await tad.showSpotlight({ message: \"AND when I perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n \n // THEN\n tad.cc(\"THEN A segment is created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_12\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n\n // WHEN forceDragToCreate = false \n await tad.cc(\"WHEN I set forceDragToCreate = false AND I drag and drop\");\n // TODO era uitat await; dar crapa in modul \"fast\";\n // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton)\n // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam\n // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio));\n\n // THEN segments are not created at drag\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + \"_13\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n }\n}\n\nasync function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) {\n // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform click for start the drag\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragStart(row, xOffset);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform mouse move with \" + x + \"px on X axis\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(x, 0);\n}\n"},"duration":1182} \ No newline at end of file diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/report.md b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/report.md new file mode 100644 index 00000000..967e5c05 --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/report.md @@ -0,0 +1,394 @@ + +# DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag() + +### undefined + +--- + +There are 7 screenshots. [Go to first](#screenshot-1) + +## DragToCreateTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, render, Scenario, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { Main } from "../stories/dragToCreate/DragToCreate.stories"; +/* 4*/import Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from "../../../src/timeline"; +/* 5*/import { dragToCreateStoriesTestIds as testIds } from "../stories/dragToCreate/DragToCreate.stories"; +/* 6*/ +/* 7*/export class DragToCreateTestsAreDemo { +/* 8*/ +/* 9*/ async before() { +/* 10*/ render(
); +/* 11*/ } +/* 12*/ +/* 13*/ @Scenario("WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry") +/* 14*/ async whenClickMenuButton() { +/* 15*/ tad.cc("Click on the menu button"); +/* 16*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 17*/ tad.cc("Check if the context menu is open"); +/* 18*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +/* 19*/ +/* 20*/ tad.cc("Check if exist the 'Drag To Create' action"); +/* 21*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0").textContent, DRAG_TO_CREATE_ACTION_LABEL); +/* 22*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 23*/ } +/* 24*/ +/* 25*/ @Scenario("WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears") +/* 26*/ async whenClickAddMenuEntry() { +/* 27*/ // GIVEN context menu is opened by pressing the hamburger button +/* 28*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 29*/ +/* 30*/ // WHEN +/* 31*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 33*/ +/* 34*/ // THEN +/* 35*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Drag to create mode should be active"); +/* 36*/ +/* 37*/ const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup); +/* 38*/ tad.cc("Check if drag to create popup exists"); +/* 39*/ await tad.assertWaitable.exists(popup); +/* 40*/ +/* 41*/ // Check the labels +/* 42*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_1").innerHTML, "Click and drag to create a new segment"); +/* 43*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_2").textContent, DRAG_TO_CREATE_POPUP_LABEL_2); +/* 44*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_3").innerHTML, "To cancel you can also click on gantt"); +/* 45*/ const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton); +/* 46*/ tad.cc("Check if exists 'Cancel' button"); +/* 47*/ await tad.assertWaitable.exists(cancelButton); +/* 48*/ tad.cc("Check if the cancel button is negative"); +/* 49*/ await tad.assertWaitable.include(cancelButton.className, "negative"); +/* 50*/ +/* 51*/ // Test auto closing of the popup +/* 52*/ tad.demoForEndUserHide(); +/* 53*/ +/* 54*/ // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME +/* 55*/ // I tried to test also from time to time that the popup is opened but the setTimeout(time) +/* 56*/ // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause +/* 57*/ // inexact test for when the popup is still opened) +/* 58*/ await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME)); +/* 59*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup)); +/* 60*/ +/* 61*/ // AND still in drag to create mode +/* 62*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode); +/* 63*/ tad.demoForEndUserShow(); +/* 64*/ +/* 65*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 66*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 67*/ } +/* 68*/ +/* 69*/ @Scenario("GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled") +/* 70*/ async givenDragToCreateModeWhenClickCancel() { +/* 71*/ // GIVEN context menu was opened and 'Drag To Create' was pressed +/* 72*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 73*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 74*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 75*/ +/* 76*/ // WHEN +/* 77*/ tad.cc("Click on `Cancel 'drag to create' mode` button from the drag to create popup"); +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton)); +/* 79*/ +/* 80*/ // THEN +/* 81*/ await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Check if the drag to create mode is cancelled"); +/* 82*/ +/* 83*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 84*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 85*/ } +``` + +
+ +```tsx +/* 86*/ +/* 87*/ @Scenario("GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears") +/* 88*/ async givenDragToCreateModeWhenClickAndDrag() { +/* 89*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/* 90*/ +/* 91*/ await startDragKeepInProgress(3, 100); +/* 92*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/* 93*/ const { height } = selector.getBoundingClientRect(); +/* 94*/ tad.cc("A green selection rectangle appears on the row"); +/* 95*/ await tad.assertWaitable.exists(selector); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector.png
+![](Timeline_selector.png) + +
+
+ +![](Timeline_selector_small.png) + +
+ +```tsx +/* 96*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_4"); +/* 97*/ await tad.showSpotlight({ message: "On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_4.png
+![](Timeline_ganttBody_Timeline_row_4.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_4_small.png) + +
+ +```tsx +/* 98*/ await tad.getObjectViaCheat(Timeline).dragMove(0, height); +/* 99*/ tad.cc("The height of the section regtagle isn't changed"); +/*100*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) | [Go to next](#screenshot-6) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP1.png
+![](Timeline_selector_REP1.png) + +
+
+ +![](Timeline_selector_REP1_small.png) + +
+ +```tsx +/*101*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*102*/ await tad.showSpotlight({ message: "Move the mouse on previous row", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 6 + +[Go to previous](#screenshot-5) | [Go to next](#screenshot-7) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_2.png
+![](Timeline_ganttBody_Timeline_row_2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_2_small.png) + +
+ +```tsx +/*103*/ await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height); +/*104*/ tad.cc("The height of the section regtagle isn't changed"); +/*105*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +``` + + + + +
+ +### Screenshot 7 + +[Go to previous](#screenshot-6) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_selector_REP2.png
+![](Timeline_selector_REP2.png) + +
+
+ +![](Timeline_selector_REP2_small.png) + +
+ +```tsx +/*106*/ +/*107*/ tad.getObjectViaCheat(Timeline)._selectBox.end(); +/*108*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*109*/ } +/*110*/ +/*111*/ @Scenario("GIVEN drag to create in progress, WHEN right click, THEN cancel") +/*112*/ async givenDragToCreateModeInProgressWhenRightClick() { +/*113*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*114*/ +/*115*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*116*/ tad.cc("The row don't have the segments"); +/*117*/ await tad.assertWaitable.equal(row.children.length, 0); +/*118*/ await startDragKeepInProgress(3, 100); +/*119*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*120*/ await tad.showSpotlight({ message: "We perform the right click", focusOnLastElementCaptured: true }); +/*121*/ tad.getObjectViaCheat(Timeline).rightClick(); +/*122*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*123*/ tad.cc("The segment wasn't created, the row don't have the segments"); +/*124*/ await tad.assertWaitable.equal(row.children.length, 0); +/*125*/ +/*126*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*127*/ } +/*128*/ +/*129*/ @Scenario("GIVEN drag to create in progress, WHEN mouse up, THEN handler is called") +/*130*/ async givenDragToCreateModeInProgressWhenMouseUp() { +/*131*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*132*/ +/*133*/ await startDragKeepInProgress(3, 100); +/*134*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*135*/ await tad.showSpotlight({ message: "We perform the mouse up", focusOnLastElementCaptured: true }); +/*136*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*137*/ tad.cc("The segment was created"); +/*138*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_11")); +/*139*/ +/*140*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*141*/ } +/*142*/ +/*143*/ @Scenario("WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created") +/*144*/ async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() { +/*145*/ // WHEN forceDragToCreate = true +/*146*/ await tad.cc("WHEN I set forceDragToCreate = true AND I drag to create"); +/*147*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio)); +/*148*/ +/*149*/ // AND WHEN I drag and move +/*150*/ await startDragKeepInProgress(2, 100); +/*151*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*152*/ +/*153*/ tad.cc("AND I perform"); +/*154*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/*155*/ // THEN +/*156*/ tad.cc("THEN the drag to create rectangle appears on the row"); +/*157*/ await tad.assertWaitable.exists(selector); +/*158*/ tad.cc("AND it is green"); +/*159*/ await tad.assertWaitable.include(Array.from(selector.classList), "rct9k-selector-outer-add"); +/*160*/ +/*161*/ // AND WHEN I perform mouse up +/*162*/ await tad.showSpotlight({ message: "AND when I perform the mouse up", focusOnLastElementCaptured: true }); +/*163*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*164*/ +/*165*/ // THEN +/*166*/ tad.cc("THEN A segment is created"); +/*167*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_12")); +/*168*/ +/*169*/ // AND +/*170*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*171*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*172*/ +/*173*/ // WHEN forceDragToCreate = false +/*174*/ await tad.cc("WHEN I set forceDragToCreate = false AND I drag and drop"); +/*175*/ // TODO era uitat await; dar crapa in modul "fast"; +/*176*/ // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton) +/*177*/ // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam +/*178*/ // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio)); +/*180*/ +/*181*/ // THEN segments are not created at drag +/*182*/ await startDragKeepInProgress(2, 100); +/*183*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*184*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*185*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + "_13")); +/*186*/ +/*187*/ // AND +/*188*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*189*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*190*/ } +/*191*/} +/*192*/ +/*193*/async function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) { +/*194*/ // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost +/*195*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*196*/ await tad.showSpotlight({ message: "We perform click for start the drag", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3.png
+![](Timeline_ganttBody_Timeline_row_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_small.png) + +
+ +```tsx +/*197*/ tad.getObjectViaCheat(Timeline).dragStart(row, xOffset); +/*198*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*199*/ await tad.showSpotlight({ message: "We perform mouse move with " + x + "px on X axis", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag/Timeline_ganttBody_Timeline_row_3_REP1.png
+![](Timeline_ganttBody_Timeline_row_3_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_REP1_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*200*/ await tad.getObjectViaCheat(Timeline).dragMove(x, 0); +/*201*/} +/*202*/ +``` + +
diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/ContextMenu_popup_ContextMenu_menuItem_0.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/ContextMenu_popup_ContextMenu_menuItem_0.png new file mode 100644 index 00000000..0cfc7aff Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/ContextMenu_popup_ContextMenu_menuItem_0.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/ContextMenu_popup_ContextMenu_menuItem_0_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/ContextMenu_popup_ContextMenu_menuItem_0_small.png new file mode 100644 index 00000000..aa288fcb Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/ContextMenu_popup_ContextMenu_menuItem_0_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png new file mode 100644 index 00000000..fa53588f Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_small.png new file mode 100644 index 00000000..6c2de42b Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_menuButton.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_menuButton.png new file mode 100644 index 00000000..280f87dc Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_menuButton.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_menuButton_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_menuButton_small.png new file mode 100644 index 00000000..3c275751 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_menuButton_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/_LAP.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/_LAP.png new file mode 100644 index 00000000..4edc60f1 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/_LAP.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/_LAP_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/_LAP_small.png new file mode 100644 index 00000000..4edc60f1 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/_LAP_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/recordedTest.json b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/recordedTest.json new file mode 100644 index 00000000..2e5a8041 --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_menuButton","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":72},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_0","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":74},{"screenshot":"Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":78},{"screenshot":"_LAP","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":81}],"sourceFiles":{"DragToCreateTestsAreDemo.tsx":"import { Only, render, Scenario, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { Main } from \"../stories/dragToCreate/DragToCreate.stories\";\nimport Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from \"../../../src/timeline\";\nimport { dragToCreateStoriesTestIds as testIds } from \"../stories/dragToCreate/DragToCreate.stories\";\n\nexport class DragToCreateTestsAreDemo {\n\n async before() {\n render(
);\n }\n\n @Scenario(\"WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry\")\n async whenClickMenuButton() {\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Check if the context menu is open\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n\n tad.cc(\"Check if exist the 'Drag To Create' action\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, DRAG_TO_CREATE_ACTION_LABEL);\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n }\n\n @Scenario(\"WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears\")\n async whenClickAddMenuEntry() {\n // GIVEN context menu is opened by pressing the hamburger button\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n \n // WHEN\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // THEN\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Drag to create mode should be active\");\n\t\n\t const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup);\n tad.cc(\"Check if drag to create popup exists\");\n await tad.assertWaitable.exists(popup);\n \n // Check the labels\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_1\").innerHTML, \"Click and drag to create a new segment\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_2\").textContent, DRAG_TO_CREATE_POPUP_LABEL_2);\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_3\").innerHTML, \"To cancel you can also click on gantt\");\n const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton);\n tad.cc(\"Check if exists 'Cancel' button\");\n await tad.assertWaitable.exists(cancelButton);\n tad.cc(\"Check if the cancel button is negative\");\n await tad.assertWaitable.include(cancelButton.className, \"negative\");\n\n // Test auto closing of the popup\n tad.demoForEndUserHide();\n\n // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME \n // I tried to test also from time to time that the popup is opened but the setTimeout(time) \n // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause\n // inexact test for when the popup is still opened)\n await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup));\n \n // AND still in drag to create mode\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode);\n tad.demoForEndUserShow();\n\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled\")\n async givenDragToCreateModeWhenClickCancel() {\n // GIVEN context menu was opened and 'Drag To Create' was pressed\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // WHEN\n tad.cc(\"Click on `Cancel 'drag to create' mode` button from the drag to create popup\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton));\n \n // THEN\n await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Check if the drag to create mode is cancelled\");\n \n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears\")\n async givenDragToCreateModeWhenClickAndDrag() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n const { height } = selector.getBoundingClientRect();\n tad.cc(\"A green selection rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_4\");\n await tad.showSpotlight({ message: \"On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n await tad.showSpotlight({ message: \"Move the mouse on previous row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n\n tad.getObjectViaCheat(Timeline)._selectBox.end();\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN right click, THEN cancel\")\n async givenDragToCreateModeInProgressWhenRightClick() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n await startDragKeepInProgress(3, 100);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the right click\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).rightClick();\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The segment wasn't created, the row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN mouse up, THEN handler is called\")\n async givenDragToCreateModeInProgressWhenMouseUp() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n tad.cc(\"The segment was created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_11\"));\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created\")\n async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() {\n // WHEN forceDragToCreate = true\n await tad.cc(\"WHEN I set forceDragToCreate = true AND I drag to create\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio));\n\n // AND WHEN I drag and move\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n\n tad.cc(\"AND I perform\");\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n // THEN\n tad.cc(\"THEN the drag to create rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n tad.cc(\"AND it is green\");\n await tad.assertWaitable.include(Array.from(selector.classList), \"rct9k-selector-outer-add\");\n\n // AND WHEN I perform mouse up\n await tad.showSpotlight({ message: \"AND when I perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n \n // THEN\n tad.cc(\"THEN A segment is created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_12\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n\n // WHEN forceDragToCreate = false \n await tad.cc(\"WHEN I set forceDragToCreate = false AND I drag and drop\");\n // TODO era uitat await; dar crapa in modul \"fast\";\n // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton)\n // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam\n // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio));\n\n // THEN segments are not created at drag\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + \"_13\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n }\n}\n\nasync function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) {\n // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform click for start the drag\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragStart(row, xOffset);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform mouse move with \" + x + \"px on X axis\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(x, 0);\n}\n"},"duration":566} \ No newline at end of file diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/report.md b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/report.md new file mode 100644 index 00000000..56b35d7e --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/report.md @@ -0,0 +1,322 @@ + +# DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel() + +### undefined + +--- + +There are 4 screenshots. [Go to first](#screenshot-1) + +## DragToCreateTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, render, Scenario, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { Main } from "../stories/dragToCreate/DragToCreate.stories"; +/* 4*/import Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from "../../../src/timeline"; +/* 5*/import { dragToCreateStoriesTestIds as testIds } from "../stories/dragToCreate/DragToCreate.stories"; +/* 6*/ +/* 7*/export class DragToCreateTestsAreDemo { +/* 8*/ +/* 9*/ async before() { +/* 10*/ render(
); +/* 11*/ } +/* 12*/ +/* 13*/ @Scenario("WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry") +/* 14*/ async whenClickMenuButton() { +/* 15*/ tad.cc("Click on the menu button"); +/* 16*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 17*/ tad.cc("Check if the context menu is open"); +/* 18*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +/* 19*/ +/* 20*/ tad.cc("Check if exist the 'Drag To Create' action"); +/* 21*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0").textContent, DRAG_TO_CREATE_ACTION_LABEL); +/* 22*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 23*/ } +/* 24*/ +/* 25*/ @Scenario("WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears") +/* 26*/ async whenClickAddMenuEntry() { +/* 27*/ // GIVEN context menu is opened by pressing the hamburger button +/* 28*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 29*/ +/* 30*/ // WHEN +/* 31*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 33*/ +/* 34*/ // THEN +/* 35*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Drag to create mode should be active"); +/* 36*/ +/* 37*/ const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup); +/* 38*/ tad.cc("Check if drag to create popup exists"); +/* 39*/ await tad.assertWaitable.exists(popup); +/* 40*/ +/* 41*/ // Check the labels +/* 42*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_1").innerHTML, "Click and drag to create a new segment"); +/* 43*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_2").textContent, DRAG_TO_CREATE_POPUP_LABEL_2); +/* 44*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_3").innerHTML, "To cancel you can also click on gantt"); +/* 45*/ const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton); +/* 46*/ tad.cc("Check if exists 'Cancel' button"); +/* 47*/ await tad.assertWaitable.exists(cancelButton); +/* 48*/ tad.cc("Check if the cancel button is negative"); +/* 49*/ await tad.assertWaitable.include(cancelButton.className, "negative"); +/* 50*/ +/* 51*/ // Test auto closing of the popup +/* 52*/ tad.demoForEndUserHide(); +/* 53*/ +/* 54*/ // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME +/* 55*/ // I tried to test also from time to time that the popup is opened but the setTimeout(time) +/* 56*/ // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause +/* 57*/ // inexact test for when the popup is still opened) +/* 58*/ await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME)); +/* 59*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup)); +/* 60*/ +/* 61*/ // AND still in drag to create mode +/* 62*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode); +``` + +
+ +```tsx +/* 63*/ tad.demoForEndUserShow(); +/* 64*/ +/* 65*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 66*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 67*/ } +/* 68*/ +/* 69*/ @Scenario("GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled") +/* 70*/ async givenDragToCreateModeWhenClickCancel() { +/* 71*/ // GIVEN context menu was opened and 'Drag To Create' was pressed +/* 72*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_menuButton.png
+![](Timeline_menuButton.png) + +
+
+ +![](Timeline_menuButton_small.png) + +
+ +```tsx +/* 73*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 74*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/ContextMenu_popup_ContextMenu_menuItem_0.png
+![](ContextMenu_popup_ContextMenu_menuItem_0.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_0_small.png) + +
+ +```tsx +/* 75*/ +/* 76*/ // WHEN +/* 77*/ tad.cc("Click on `Cancel 'drag to create' mode` button from the drag to create popup"); +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton)); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png
+![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png) + +
+
+ +![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_small.png) + +
+ +```tsx +/* 79*/ +/* 80*/ // THEN +/* 81*/ await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Check if the drag to create mode is cancelled"); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) + +
Click to expand full image + +DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel/_LAP.png
+![](_LAP.png) + +
+
+ +![](_LAP_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/* 82*/ +/* 83*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 84*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 85*/ } +/* 86*/ +/* 87*/ @Scenario("GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears") +/* 88*/ async givenDragToCreateModeWhenClickAndDrag() { +/* 89*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/* 90*/ +/* 91*/ await startDragKeepInProgress(3, 100); +/* 92*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/* 93*/ const { height } = selector.getBoundingClientRect(); +/* 94*/ tad.cc("A green selection rectangle appears on the row"); +/* 95*/ await tad.assertWaitable.exists(selector); +/* 96*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_4"); +/* 97*/ await tad.showSpotlight({ message: "On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row", focusOnLastElementCaptured: true }); +/* 98*/ await tad.getObjectViaCheat(Timeline).dragMove(0, height); +/* 99*/ tad.cc("The height of the section regtagle isn't changed"); +/*100*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*101*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*102*/ await tad.showSpotlight({ message: "Move the mouse on previous row", focusOnLastElementCaptured: true }); +/*103*/ await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height); +/*104*/ tad.cc("The height of the section regtagle isn't changed"); +/*105*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*106*/ +/*107*/ tad.getObjectViaCheat(Timeline)._selectBox.end(); +/*108*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*109*/ } +/*110*/ +/*111*/ @Scenario("GIVEN drag to create in progress, WHEN right click, THEN cancel") +/*112*/ async givenDragToCreateModeInProgressWhenRightClick() { +/*113*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*114*/ +/*115*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*116*/ tad.cc("The row don't have the segments"); +/*117*/ await tad.assertWaitable.equal(row.children.length, 0); +/*118*/ await startDragKeepInProgress(3, 100); +/*119*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*120*/ await tad.showSpotlight({ message: "We perform the right click", focusOnLastElementCaptured: true }); +/*121*/ tad.getObjectViaCheat(Timeline).rightClick(); +/*122*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*123*/ tad.cc("The segment wasn't created, the row don't have the segments"); +/*124*/ await tad.assertWaitable.equal(row.children.length, 0); +/*125*/ +/*126*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*127*/ } +/*128*/ +/*129*/ @Scenario("GIVEN drag to create in progress, WHEN mouse up, THEN handler is called") +/*130*/ async givenDragToCreateModeInProgressWhenMouseUp() { +/*131*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*132*/ +/*133*/ await startDragKeepInProgress(3, 100); +/*134*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*135*/ await tad.showSpotlight({ message: "We perform the mouse up", focusOnLastElementCaptured: true }); +/*136*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*137*/ tad.cc("The segment was created"); +/*138*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_11")); +/*139*/ +/*140*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*141*/ } +/*142*/ +/*143*/ @Scenario("WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created") +/*144*/ async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() { +/*145*/ // WHEN forceDragToCreate = true +/*146*/ await tad.cc("WHEN I set forceDragToCreate = true AND I drag to create"); +/*147*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio)); +/*148*/ +/*149*/ // AND WHEN I drag and move +/*150*/ await startDragKeepInProgress(2, 100); +/*151*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*152*/ +/*153*/ tad.cc("AND I perform"); +/*154*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/*155*/ // THEN +/*156*/ tad.cc("THEN the drag to create rectangle appears on the row"); +/*157*/ await tad.assertWaitable.exists(selector); +/*158*/ tad.cc("AND it is green"); +/*159*/ await tad.assertWaitable.include(Array.from(selector.classList), "rct9k-selector-outer-add"); +/*160*/ +/*161*/ // AND WHEN I perform mouse up +/*162*/ await tad.showSpotlight({ message: "AND when I perform the mouse up", focusOnLastElementCaptured: true }); +/*163*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*164*/ +/*165*/ // THEN +/*166*/ tad.cc("THEN A segment is created"); +/*167*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_12")); +/*168*/ +/*169*/ // AND +/*170*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*171*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*172*/ +/*173*/ // WHEN forceDragToCreate = false +/*174*/ await tad.cc("WHEN I set forceDragToCreate = false AND I drag and drop"); +/*175*/ // TODO era uitat await; dar crapa in modul "fast"; +/*176*/ // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton) +/*177*/ // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam +/*178*/ // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio)); +/*180*/ +/*181*/ // THEN segments are not created at drag +/*182*/ await startDragKeepInProgress(2, 100); +/*183*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*184*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*185*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + "_13")); +/*186*/ +/*187*/ // AND +/*188*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*189*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*190*/ } +/*191*/} +/*192*/ +/*193*/async function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) { +/*194*/ // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost +/*195*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*196*/ await tad.showSpotlight({ message: "We perform click for start the drag", focusOnLastElementCaptured: true }); +/*197*/ tad.getObjectViaCheat(Timeline).dragStart(row, xOffset); +/*198*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*199*/ await tad.showSpotlight({ message: "We perform mouse move with " + x + "px on X axis", focusOnLastElementCaptured: true }); +/*200*/ await tad.getObjectViaCheat(Timeline).dragMove(x, 0); +/*201*/} +/*202*/ +``` + +
diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0.png new file mode 100644 index 00000000..a0c39c79 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0_small.png new file mode 100644 index 00000000..aa288fcb Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup.png new file mode 100644 index 00000000..9e912a50 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png new file mode 100644 index 00000000..ade3c942 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1.png new file mode 100644 index 00000000..59d0f950 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1_small.png new file mode 100644 index 00000000..6c2de42b Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_small.png new file mode 100644 index 00000000..6c2de42b Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1.png new file mode 100644 index 00000000..24dc6804 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1_small.png new file mode 100644 index 00000000..85265ece Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2.png new file mode 100644 index 00000000..a18eeb43 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2_small.png new file mode 100644 index 00000000..887f372e Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3.png new file mode 100644 index 00000000..d8f8e5f7 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3_small.png new file mode 100644 index 00000000..dd348744 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_small.png new file mode 100644 index 00000000..e95f1bfa Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_menuButton.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_menuButton.png new file mode 100644 index 00000000..cca370e1 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_menuButton.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_menuButton_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_menuButton_small.png new file mode 100644 index 00000000..3c275751 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_menuButton_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP.png new file mode 100644 index 00000000..6384e344 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP1.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP1.png new file mode 100644 index 00000000..a292c1b2 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP1.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP2.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP2.png new file mode 100644 index 00000000..5d41761c Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP2.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP2_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP2_small.png new file mode 100644 index 00000000..5d41761c Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP2_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_small.png new file mode 100644 index 00000000..ccf7793f Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/recordedTest.json b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/recordedTest.json new file mode 100644 index 00000000..e67dea77 --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_menuButton","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":28},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_0","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":32},{"screenshot":"_LAP","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":35},{"screenshot":"Timeline_dragToCreatePopup","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":39},{"screenshot":"Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":42},{"screenshot":"Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":43},{"screenshot":"Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":44},{"screenshot":"Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":47},{"screenshot":"Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":49},{"screenshot":"_LAP_REP1","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":59},{"screenshot":"_LAP_REP2","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":62}],"sourceFiles":{"DragToCreateTestsAreDemo.tsx":"import { Only, render, Scenario, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { Main } from \"../stories/dragToCreate/DragToCreate.stories\";\nimport Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from \"../../../src/timeline\";\nimport { dragToCreateStoriesTestIds as testIds } from \"../stories/dragToCreate/DragToCreate.stories\";\n\nexport class DragToCreateTestsAreDemo {\n\n async before() {\n render(
);\n }\n\n @Scenario(\"WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry\")\n async whenClickMenuButton() {\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Check if the context menu is open\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n\n tad.cc(\"Check if exist the 'Drag To Create' action\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, DRAG_TO_CREATE_ACTION_LABEL);\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n }\n\n @Scenario(\"WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears\")\n async whenClickAddMenuEntry() {\n // GIVEN context menu is opened by pressing the hamburger button\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n \n // WHEN\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // THEN\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Drag to create mode should be active\");\n\t\n\t const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup);\n tad.cc(\"Check if drag to create popup exists\");\n await tad.assertWaitable.exists(popup);\n \n // Check the labels\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_1\").innerHTML, \"Click and drag to create a new segment\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_2\").textContent, DRAG_TO_CREATE_POPUP_LABEL_2);\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_3\").innerHTML, \"To cancel you can also click on gantt\");\n const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton);\n tad.cc(\"Check if exists 'Cancel' button\");\n await tad.assertWaitable.exists(cancelButton);\n tad.cc(\"Check if the cancel button is negative\");\n await tad.assertWaitable.include(cancelButton.className, \"negative\");\n\n // Test auto closing of the popup\n tad.demoForEndUserHide();\n\n // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME \n // I tried to test also from time to time that the popup is opened but the setTimeout(time) \n // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause\n // inexact test for when the popup is still opened)\n await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup));\n \n // AND still in drag to create mode\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode);\n tad.demoForEndUserShow();\n\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled\")\n async givenDragToCreateModeWhenClickCancel() {\n // GIVEN context menu was opened and 'Drag To Create' was pressed\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // WHEN\n tad.cc(\"Click on `Cancel 'drag to create' mode` button from the drag to create popup\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton));\n \n // THEN\n await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Check if the drag to create mode is cancelled\");\n \n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears\")\n async givenDragToCreateModeWhenClickAndDrag() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n const { height } = selector.getBoundingClientRect();\n tad.cc(\"A green selection rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_4\");\n await tad.showSpotlight({ message: \"On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n await tad.showSpotlight({ message: \"Move the mouse on previous row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n\n tad.getObjectViaCheat(Timeline)._selectBox.end();\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN right click, THEN cancel\")\n async givenDragToCreateModeInProgressWhenRightClick() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n await startDragKeepInProgress(3, 100);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the right click\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).rightClick();\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The segment wasn't created, the row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN mouse up, THEN handler is called\")\n async givenDragToCreateModeInProgressWhenMouseUp() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n tad.cc(\"The segment was created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_11\"));\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created\")\n async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() {\n // WHEN forceDragToCreate = true\n await tad.cc(\"WHEN I set forceDragToCreate = true AND I drag to create\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio));\n\n // AND WHEN I drag and move\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n\n tad.cc(\"AND I perform\");\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n // THEN\n tad.cc(\"THEN the drag to create rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n tad.cc(\"AND it is green\");\n await tad.assertWaitable.include(Array.from(selector.classList), \"rct9k-selector-outer-add\");\n\n // AND WHEN I perform mouse up\n await tad.showSpotlight({ message: \"AND when I perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n \n // THEN\n tad.cc(\"THEN A segment is created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_12\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n\n // WHEN forceDragToCreate = false \n await tad.cc(\"WHEN I set forceDragToCreate = false AND I drag and drop\");\n // TODO era uitat await; dar crapa in modul \"fast\";\n // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton)\n // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam\n // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio));\n\n // THEN segments are not created at drag\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + \"_13\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n }\n}\n\nasync function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) {\n // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform click for start the drag\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragStart(row, xOffset);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform mouse move with \" + x + \"px on X axis\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(x, 0);\n}\n"},"duration":6651} \ No newline at end of file diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/report.md b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/report.md new file mode 100644 index 00000000..1905979b --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickAddMenuEntry/report.md @@ -0,0 +1,490 @@ + +# DragToCreateTestsAreDemo/whenClickAddMenuEntry() + +### undefined + +--- + +There are 11 screenshots. [Go to first](#screenshot-1) + +## DragToCreateTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, render, Scenario, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { Main } from "../stories/dragToCreate/DragToCreate.stories"; +/* 4*/import Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from "../../../src/timeline"; +/* 5*/import { dragToCreateStoriesTestIds as testIds } from "../stories/dragToCreate/DragToCreate.stories"; +/* 6*/ +/* 7*/export class DragToCreateTestsAreDemo { +/* 8*/ +/* 9*/ async before() { +/* 10*/ render(
); +/* 11*/ } +/* 12*/ +/* 13*/ @Scenario("WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry") +/* 14*/ async whenClickMenuButton() { +/* 15*/ tad.cc("Click on the menu button"); +/* 16*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 17*/ tad.cc("Check if the context menu is open"); +/* 18*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +``` + +
+ +```tsx +/* 19*/ +/* 20*/ tad.cc("Check if exist the 'Drag To Create' action"); +/* 21*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0").textContent, DRAG_TO_CREATE_ACTION_LABEL); +/* 22*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 23*/ } +/* 24*/ +/* 25*/ @Scenario("WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears") +/* 26*/ async whenClickAddMenuEntry() { +/* 27*/ // GIVEN context menu is opened by pressing the hamburger button +/* 28*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_menuButton.png
+![](Timeline_menuButton.png) + +
+
+ +![](Timeline_menuButton_small.png) + +
+ +```tsx +/* 29*/ +/* 30*/ // WHEN +/* 31*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/ContextMenu_popup_ContextMenu_menuItem_0.png
+![](ContextMenu_popup_ContextMenu_menuItem_0.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_0_small.png) + +
+ +```tsx +/* 33*/ +/* 34*/ // THEN +/* 35*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Drag to create mode should be active"); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP.png
+![](_LAP.png) + +
+
+ +![](_LAP_small.png) + +
+ +```tsx +/* 36*/ +/* 37*/ const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup); +/* 38*/ tad.cc("Check if drag to create popup exists"); +/* 39*/ await tad.assertWaitable.exists(popup); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup.png
+![](Timeline_dragToCreatePopup.png) + +
+
+ +![](Timeline_dragToCreatePopup_small.png) + +
+ +```tsx +/* 40*/ +/* 41*/ // Check the labels +/* 42*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_1").innerHTML, "Click and drag to create a new segment"); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) | [Go to next](#screenshot-6) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1.png
+![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1.png) + +
+
+ +![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_1_small.png) + +
+ +```tsx +/* 43*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_2").textContent, DRAG_TO_CREATE_POPUP_LABEL_2); +``` + + + + +
+ +### Screenshot 6 + +[Go to previous](#screenshot-5) | [Go to next](#screenshot-7) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2.png
+![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2.png) + +
+
+ +![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_2_small.png) + +
+ +```tsx +/* 44*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_3").innerHTML, "To cancel you can also click on gantt"); +``` + + + + +
+ +### Screenshot 7 + +[Go to previous](#screenshot-6) | [Go to next](#screenshot-8) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3.png
+![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3.png) + +
+
+ +![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupLabel_3_small.png) + +
+ +```tsx +/* 45*/ const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton); +/* 46*/ tad.cc("Check if exists 'Cancel' button"); +/* 47*/ await tad.assertWaitable.exists(cancelButton); +``` + + + + +
+ +### Screenshot 8 + +[Go to previous](#screenshot-7) | [Go to next](#screenshot-9) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png
+![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton.png) + +
+
+ +![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_small.png) + +
+ +```tsx +/* 48*/ tad.cc("Check if the cancel button is negative"); +/* 49*/ await tad.assertWaitable.include(cancelButton.className, "negative"); +``` + + + + +
+ +### Screenshot 9 + +[Go to previous](#screenshot-8) | [Go to next](#screenshot-10) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1.png
+![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1.png) + +
+
+ +![](Timeline_dragToCreatePopup_Timeline_dragToCreatePopupCancelButton_REP1_small.png) + +
+ +```tsx +/* 50*/ +/* 51*/ // Test auto closing of the popup +/* 52*/ tad.demoForEndUserHide(); +/* 53*/ +/* 54*/ // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME +/* 55*/ // I tried to test also from time to time that the popup is opened but the setTimeout(time) +/* 56*/ // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause +/* 57*/ // inexact test for when the popup is still opened) +/* 58*/ await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME)); +/* 59*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup)); +``` + + + + +
+ +### Screenshot 10 + +[Go to previous](#screenshot-9) | [Go to next](#screenshot-11) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP1.png
+![](_LAP_REP1.png) + +
+
+ +![](_LAP_REP1_small.png) + +
+ +```tsx +/* 60*/ +/* 61*/ // AND still in drag to create mode +/* 62*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode); +``` + + + + +
+ +### Screenshot 11 + +[Go to previous](#screenshot-10) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickAddMenuEntry/_LAP_REP2.png
+![](_LAP_REP2.png) + +
+
+ +![](_LAP_REP2_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/* 63*/ tad.demoForEndUserShow(); +/* 64*/ +/* 65*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 66*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 67*/ } +/* 68*/ +/* 69*/ @Scenario("GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled") +/* 70*/ async givenDragToCreateModeWhenClickCancel() { +/* 71*/ // GIVEN context menu was opened and 'Drag To Create' was pressed +/* 72*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 73*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 74*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 75*/ +/* 76*/ // WHEN +/* 77*/ tad.cc("Click on `Cancel 'drag to create' mode` button from the drag to create popup"); +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton)); +/* 79*/ +/* 80*/ // THEN +/* 81*/ await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Check if the drag to create mode is cancelled"); +/* 82*/ +/* 83*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 84*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 85*/ } +/* 86*/ +/* 87*/ @Scenario("GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears") +/* 88*/ async givenDragToCreateModeWhenClickAndDrag() { +/* 89*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/* 90*/ +/* 91*/ await startDragKeepInProgress(3, 100); +/* 92*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/* 93*/ const { height } = selector.getBoundingClientRect(); +/* 94*/ tad.cc("A green selection rectangle appears on the row"); +/* 95*/ await tad.assertWaitable.exists(selector); +/* 96*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_4"); +/* 97*/ await tad.showSpotlight({ message: "On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row", focusOnLastElementCaptured: true }); +/* 98*/ await tad.getObjectViaCheat(Timeline).dragMove(0, height); +/* 99*/ tad.cc("The height of the section regtagle isn't changed"); +/*100*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*101*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*102*/ await tad.showSpotlight({ message: "Move the mouse on previous row", focusOnLastElementCaptured: true }); +/*103*/ await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height); +/*104*/ tad.cc("The height of the section regtagle isn't changed"); +/*105*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*106*/ +/*107*/ tad.getObjectViaCheat(Timeline)._selectBox.end(); +/*108*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*109*/ } +/*110*/ +/*111*/ @Scenario("GIVEN drag to create in progress, WHEN right click, THEN cancel") +/*112*/ async givenDragToCreateModeInProgressWhenRightClick() { +/*113*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*114*/ +/*115*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*116*/ tad.cc("The row don't have the segments"); +/*117*/ await tad.assertWaitable.equal(row.children.length, 0); +/*118*/ await startDragKeepInProgress(3, 100); +/*119*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*120*/ await tad.showSpotlight({ message: "We perform the right click", focusOnLastElementCaptured: true }); +/*121*/ tad.getObjectViaCheat(Timeline).rightClick(); +/*122*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*123*/ tad.cc("The segment wasn't created, the row don't have the segments"); +/*124*/ await tad.assertWaitable.equal(row.children.length, 0); +/*125*/ +/*126*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*127*/ } +/*128*/ +/*129*/ @Scenario("GIVEN drag to create in progress, WHEN mouse up, THEN handler is called") +/*130*/ async givenDragToCreateModeInProgressWhenMouseUp() { +/*131*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*132*/ +/*133*/ await startDragKeepInProgress(3, 100); +/*134*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*135*/ await tad.showSpotlight({ message: "We perform the mouse up", focusOnLastElementCaptured: true }); +/*136*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*137*/ tad.cc("The segment was created"); +/*138*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_11")); +/*139*/ +/*140*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*141*/ } +/*142*/ +/*143*/ @Scenario("WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created") +/*144*/ async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() { +/*145*/ // WHEN forceDragToCreate = true +/*146*/ await tad.cc("WHEN I set forceDragToCreate = true AND I drag to create"); +/*147*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio)); +/*148*/ +/*149*/ // AND WHEN I drag and move +/*150*/ await startDragKeepInProgress(2, 100); +/*151*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*152*/ +/*153*/ tad.cc("AND I perform"); +/*154*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/*155*/ // THEN +/*156*/ tad.cc("THEN the drag to create rectangle appears on the row"); +/*157*/ await tad.assertWaitable.exists(selector); +/*158*/ tad.cc("AND it is green"); +/*159*/ await tad.assertWaitable.include(Array.from(selector.classList), "rct9k-selector-outer-add"); +/*160*/ +/*161*/ // AND WHEN I perform mouse up +/*162*/ await tad.showSpotlight({ message: "AND when I perform the mouse up", focusOnLastElementCaptured: true }); +/*163*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*164*/ +/*165*/ // THEN +/*166*/ tad.cc("THEN A segment is created"); +/*167*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_12")); +/*168*/ +/*169*/ // AND +/*170*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*171*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*172*/ +/*173*/ // WHEN forceDragToCreate = false +/*174*/ await tad.cc("WHEN I set forceDragToCreate = false AND I drag and drop"); +/*175*/ // TODO era uitat await; dar crapa in modul "fast"; +/*176*/ // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton) +/*177*/ // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam +/*178*/ // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio)); +/*180*/ +/*181*/ // THEN segments are not created at drag +/*182*/ await startDragKeepInProgress(2, 100); +/*183*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*184*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*185*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + "_13")); +/*186*/ +/*187*/ // AND +/*188*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*189*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*190*/ } +/*191*/} +/*192*/ +/*193*/async function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) { +/*194*/ // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost +/*195*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*196*/ await tad.showSpotlight({ message: "We perform click for start the drag", focusOnLastElementCaptured: true }); +/*197*/ tad.getObjectViaCheat(Timeline).dragStart(row, xOffset); +/*198*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*199*/ await tad.showSpotlight({ message: "We perform mouse move with " + x + "px on X axis", focusOnLastElementCaptured: true }); +/*200*/ await tad.getObjectViaCheat(Timeline).dragMove(x, 0); +/*201*/} +/*202*/ +``` + +
diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup.png new file mode 100644 index 00000000..504bd0b2 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_ContextMenu_menuItem_0.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_ContextMenu_menuItem_0.png new file mode 100644 index 00000000..f28d436d Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_ContextMenu_menuItem_0.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_ContextMenu_menuItem_0_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_ContextMenu_menuItem_0_small.png new file mode 100644 index 00000000..aa288fcb Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_ContextMenu_menuItem_0_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_small.png new file mode 100644 index 00000000..aa3d91f4 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/Timeline_menuButton.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/Timeline_menuButton.png new file mode 100644 index 00000000..c5098152 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/Timeline_menuButton.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/Timeline_menuButton_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/Timeline_menuButton_small.png new file mode 100644 index 00000000..3c275751 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/Timeline_menuButton_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/recordedTest.json b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/recordedTest.json new file mode 100644 index 00000000..355ade03 --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_menuButton","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":16},{"screenshot":"ContextMenu_popup","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":18},{"screenshot":"ContextMenu_popup_ContextMenu_menuItem_0","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":21}],"sourceFiles":{"DragToCreateTestsAreDemo.tsx":"import { Only, render, Scenario, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { Main } from \"../stories/dragToCreate/DragToCreate.stories\";\nimport Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from \"../../../src/timeline\";\nimport { dragToCreateStoriesTestIds as testIds } from \"../stories/dragToCreate/DragToCreate.stories\";\n\nexport class DragToCreateTestsAreDemo {\n\n async before() {\n render(
);\n }\n\n @Scenario(\"WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry\")\n async whenClickMenuButton() {\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Check if the context menu is open\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n\n tad.cc(\"Check if exist the 'Drag To Create' action\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, DRAG_TO_CREATE_ACTION_LABEL);\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n }\n\n @Scenario(\"WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears\")\n async whenClickAddMenuEntry() {\n // GIVEN context menu is opened by pressing the hamburger button\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n \n // WHEN\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // THEN\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Drag to create mode should be active\");\n\t\n\t const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup);\n tad.cc(\"Check if drag to create popup exists\");\n await tad.assertWaitable.exists(popup);\n \n // Check the labels\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_1\").innerHTML, \"Click and drag to create a new segment\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_2\").textContent, DRAG_TO_CREATE_POPUP_LABEL_2);\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_3\").innerHTML, \"To cancel you can also click on gantt\");\n const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton);\n tad.cc(\"Check if exists 'Cancel' button\");\n await tad.assertWaitable.exists(cancelButton);\n tad.cc(\"Check if the cancel button is negative\");\n await tad.assertWaitable.include(cancelButton.className, \"negative\");\n\n // Test auto closing of the popup\n tad.demoForEndUserHide();\n\n // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME \n // I tried to test also from time to time that the popup is opened but the setTimeout(time) \n // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause\n // inexact test for when the popup is still opened)\n await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup));\n \n // AND still in drag to create mode\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode);\n tad.demoForEndUserShow();\n\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled\")\n async givenDragToCreateModeWhenClickCancel() {\n // GIVEN context menu was opened and 'Drag To Create' was pressed\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // WHEN\n tad.cc(\"Click on `Cancel 'drag to create' mode` button from the drag to create popup\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton));\n \n // THEN\n await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Check if the drag to create mode is cancelled\");\n \n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears\")\n async givenDragToCreateModeWhenClickAndDrag() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n const { height } = selector.getBoundingClientRect();\n tad.cc(\"A green selection rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_4\");\n await tad.showSpotlight({ message: \"On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n await tad.showSpotlight({ message: \"Move the mouse on previous row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n\n tad.getObjectViaCheat(Timeline)._selectBox.end();\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN right click, THEN cancel\")\n async givenDragToCreateModeInProgressWhenRightClick() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n await startDragKeepInProgress(3, 100);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the right click\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).rightClick();\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The segment wasn't created, the row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN mouse up, THEN handler is called\")\n async givenDragToCreateModeInProgressWhenMouseUp() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n tad.cc(\"The segment was created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_11\"));\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created\")\n async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() {\n // WHEN forceDragToCreate = true\n await tad.cc(\"WHEN I set forceDragToCreate = true AND I drag to create\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio));\n\n // AND WHEN I drag and move\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n\n tad.cc(\"AND I perform\");\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n // THEN\n tad.cc(\"THEN the drag to create rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n tad.cc(\"AND it is green\");\n await tad.assertWaitable.include(Array.from(selector.classList), \"rct9k-selector-outer-add\");\n\n // AND WHEN I perform mouse up\n await tad.showSpotlight({ message: \"AND when I perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n \n // THEN\n tad.cc(\"THEN A segment is created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_12\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n\n // WHEN forceDragToCreate = false \n await tad.cc(\"WHEN I set forceDragToCreate = false AND I drag and drop\");\n // TODO era uitat await; dar crapa in modul \"fast\";\n // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton)\n // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam\n // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio));\n\n // THEN segments are not created at drag\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + \"_13\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n }\n}\n\nasync function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) {\n // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform click for start the drag\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragStart(row, xOffset);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform mouse move with \" + x + \"px on X axis\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(x, 0);\n}\n"},"duration":621} \ No newline at end of file diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/report.md b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/report.md new file mode 100644 index 00000000..3c70e23a --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenClickMenuButton/report.md @@ -0,0 +1,298 @@ + +# DragToCreateTestsAreDemo/whenClickMenuButton() + +### undefined + +--- + +There are 3 screenshots. [Go to first](#screenshot-1) + +## DragToCreateTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, render, Scenario, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { Main } from "../stories/dragToCreate/DragToCreate.stories"; +/* 4*/import Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from "../../../src/timeline"; +/* 5*/import { dragToCreateStoriesTestIds as testIds } from "../stories/dragToCreate/DragToCreate.stories"; +/* 6*/ +``` + +
+ +```tsx +/* 7*/export class DragToCreateTestsAreDemo { +/* 8*/ +/* 9*/ async before() { +/* 10*/ render(
); +/* 11*/ } +/* 12*/ +/* 13*/ @Scenario("WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry") +/* 14*/ async whenClickMenuButton() { +/* 15*/ tad.cc("Click on the menu button"); +/* 16*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickMenuButton/Timeline_menuButton.png
+![](Timeline_menuButton.png) + +
+
+ +![](Timeline_menuButton_small.png) + +
+ +```tsx +/* 17*/ tad.cc("Check if the context menu is open"); +/* 18*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup.png
+![](ContextMenu_popup.png) + +
+
+ +![](ContextMenu_popup_small.png) + +
+ +```tsx +/* 19*/ +/* 20*/ tad.cc("Check if exist the 'Drag To Create' action"); +/* 21*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0").textContent, DRAG_TO_CREATE_ACTION_LABEL); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenClickMenuButton/ContextMenu_popup_ContextMenu_menuItem_0.png
+![](ContextMenu_popup_ContextMenu_menuItem_0.png) + +
+
+ +![](ContextMenu_popup_ContextMenu_menuItem_0_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/* 22*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 23*/ } +/* 24*/ +/* 25*/ @Scenario("WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears") +/* 26*/ async whenClickAddMenuEntry() { +/* 27*/ // GIVEN context menu is opened by pressing the hamburger button +/* 28*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 29*/ +/* 30*/ // WHEN +/* 31*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 33*/ +/* 34*/ // THEN +/* 35*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Drag to create mode should be active"); +/* 36*/ +/* 37*/ const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup); +/* 38*/ tad.cc("Check if drag to create popup exists"); +/* 39*/ await tad.assertWaitable.exists(popup); +/* 40*/ +/* 41*/ // Check the labels +/* 42*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_1").innerHTML, "Click and drag to create a new segment"); +/* 43*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_2").textContent, DRAG_TO_CREATE_POPUP_LABEL_2); +/* 44*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_3").innerHTML, "To cancel you can also click on gantt"); +/* 45*/ const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton); +/* 46*/ tad.cc("Check if exists 'Cancel' button"); +/* 47*/ await tad.assertWaitable.exists(cancelButton); +/* 48*/ tad.cc("Check if the cancel button is negative"); +/* 49*/ await tad.assertWaitable.include(cancelButton.className, "negative"); +/* 50*/ +/* 51*/ // Test auto closing of the popup +/* 52*/ tad.demoForEndUserHide(); +/* 53*/ +/* 54*/ // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME +/* 55*/ // I tried to test also from time to time that the popup is opened but the setTimeout(time) +/* 56*/ // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause +/* 57*/ // inexact test for when the popup is still opened) +/* 58*/ await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME)); +/* 59*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup)); +/* 60*/ +/* 61*/ // AND still in drag to create mode +/* 62*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode); +/* 63*/ tad.demoForEndUserShow(); +/* 64*/ +/* 65*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 66*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 67*/ } +/* 68*/ +/* 69*/ @Scenario("GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled") +/* 70*/ async givenDragToCreateModeWhenClickCancel() { +/* 71*/ // GIVEN context menu was opened and 'Drag To Create' was pressed +/* 72*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 73*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 74*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 75*/ +/* 76*/ // WHEN +/* 77*/ tad.cc("Click on `Cancel 'drag to create' mode` button from the drag to create popup"); +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton)); +/* 79*/ +/* 80*/ // THEN +/* 81*/ await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Check if the drag to create mode is cancelled"); +/* 82*/ +/* 83*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 84*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 85*/ } +/* 86*/ +/* 87*/ @Scenario("GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears") +/* 88*/ async givenDragToCreateModeWhenClickAndDrag() { +/* 89*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/* 90*/ +/* 91*/ await startDragKeepInProgress(3, 100); +/* 92*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/* 93*/ const { height } = selector.getBoundingClientRect(); +/* 94*/ tad.cc("A green selection rectangle appears on the row"); +/* 95*/ await tad.assertWaitable.exists(selector); +/* 96*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_4"); +/* 97*/ await tad.showSpotlight({ message: "On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row", focusOnLastElementCaptured: true }); +/* 98*/ await tad.getObjectViaCheat(Timeline).dragMove(0, height); +/* 99*/ tad.cc("The height of the section regtagle isn't changed"); +/*100*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*101*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*102*/ await tad.showSpotlight({ message: "Move the mouse on previous row", focusOnLastElementCaptured: true }); +/*103*/ await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height); +/*104*/ tad.cc("The height of the section regtagle isn't changed"); +/*105*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*106*/ +/*107*/ tad.getObjectViaCheat(Timeline)._selectBox.end(); +/*108*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*109*/ } +/*110*/ +/*111*/ @Scenario("GIVEN drag to create in progress, WHEN right click, THEN cancel") +/*112*/ async givenDragToCreateModeInProgressWhenRightClick() { +/*113*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*114*/ +/*115*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*116*/ tad.cc("The row don't have the segments"); +/*117*/ await tad.assertWaitable.equal(row.children.length, 0); +/*118*/ await startDragKeepInProgress(3, 100); +/*119*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*120*/ await tad.showSpotlight({ message: "We perform the right click", focusOnLastElementCaptured: true }); +/*121*/ tad.getObjectViaCheat(Timeline).rightClick(); +/*122*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*123*/ tad.cc("The segment wasn't created, the row don't have the segments"); +/*124*/ await tad.assertWaitable.equal(row.children.length, 0); +/*125*/ +/*126*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*127*/ } +/*128*/ +/*129*/ @Scenario("GIVEN drag to create in progress, WHEN mouse up, THEN handler is called") +/*130*/ async givenDragToCreateModeInProgressWhenMouseUp() { +/*131*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*132*/ +/*133*/ await startDragKeepInProgress(3, 100); +/*134*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*135*/ await tad.showSpotlight({ message: "We perform the mouse up", focusOnLastElementCaptured: true }); +/*136*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*137*/ tad.cc("The segment was created"); +/*138*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_11")); +/*139*/ +/*140*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*141*/ } +/*142*/ +/*143*/ @Scenario("WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created") +/*144*/ async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() { +/*145*/ // WHEN forceDragToCreate = true +/*146*/ await tad.cc("WHEN I set forceDragToCreate = true AND I drag to create"); +/*147*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio)); +/*148*/ +/*149*/ // AND WHEN I drag and move +/*150*/ await startDragKeepInProgress(2, 100); +/*151*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*152*/ +/*153*/ tad.cc("AND I perform"); +/*154*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/*155*/ // THEN +/*156*/ tad.cc("THEN the drag to create rectangle appears on the row"); +/*157*/ await tad.assertWaitable.exists(selector); +/*158*/ tad.cc("AND it is green"); +/*159*/ await tad.assertWaitable.include(Array.from(selector.classList), "rct9k-selector-outer-add"); +/*160*/ +/*161*/ // AND WHEN I perform mouse up +/*162*/ await tad.showSpotlight({ message: "AND when I perform the mouse up", focusOnLastElementCaptured: true }); +/*163*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*164*/ +/*165*/ // THEN +/*166*/ tad.cc("THEN A segment is created"); +/*167*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_12")); +/*168*/ +/*169*/ // AND +/*170*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*171*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*172*/ +/*173*/ // WHEN forceDragToCreate = false +/*174*/ await tad.cc("WHEN I set forceDragToCreate = false AND I drag and drop"); +/*175*/ // TODO era uitat await; dar crapa in modul "fast"; +/*176*/ // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton) +/*177*/ // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam +/*178*/ // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio)); +/*180*/ +/*181*/ // THEN segments are not created at drag +/*182*/ await startDragKeepInProgress(2, 100); +/*183*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*184*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*185*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + "_13")); +/*186*/ +/*187*/ // AND +/*188*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*189*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*190*/ } +/*191*/} +/*192*/ +/*193*/async function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) { +/*194*/ // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost +/*195*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*196*/ await tad.showSpotlight({ message: "We perform click for start the drag", focusOnLastElementCaptured: true }); +/*197*/ tad.getObjectViaCheat(Timeline).dragStart(row, xOffset); +/*198*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*199*/ await tad.showSpotlight({ message: "We perform mouse move with " + x + "px on X axis", focusOnLastElementCaptured: true }); +/*200*/ await tad.getObjectViaCheat(Timeline).dragMove(x, 0); +/*201*/} +/*202*/ +``` + +
diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeFalseRadio.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeFalseRadio.png new file mode 100644 index 00000000..ed104383 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeFalseRadio.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeFalseRadio_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeFalseRadio_small.png new file mode 100644 index 00000000..b3e8caf7 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeFalseRadio_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeTrueRadio.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeTrueRadio.png new file mode 100644 index 00000000..6c63a433 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeTrueRadio.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeTrueRadio_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeTrueRadio_small.png new file mode 100644 index 00000000..9ca42d35 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeTrueRadio_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2.png new file mode 100644 index 00000000..fcec5015 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP1.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP1.png new file mode 100644 index 00000000..e2650a53 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP1.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP1_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP1_small.png new file mode 100644 index 00000000..60a9ec7e Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP1_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP2.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP2.png new file mode 100644 index 00000000..8412dc0d Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP2.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP2_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP2_small.png new file mode 100644 index 00000000..5ff2dc5d Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP2_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP3.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP3.png new file mode 100644 index 00000000..c89e0067 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP3.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP3_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP3_small.png new file mode 100644 index 00000000..cec00182 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP3_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_Timeline_item_13.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_Timeline_item_13.png new file mode 100644 index 00000000..7afa54ef Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_Timeline_item_13.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_Timeline_item_13_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_Timeline_item_13_small.png new file mode 100644 index 00000000..ded8dde4 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_Timeline_item_13_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_small.png new file mode 100644 index 00000000..06eec6e0 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_3_Timeline_item_12.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_3_Timeline_item_12.png new file mode 100644 index 00000000..aaef0667 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_3_Timeline_item_12.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_3_Timeline_item_12_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_3_Timeline_item_12_small.png new file mode 100644 index 00000000..ccf1b3b6 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_3_Timeline_item_12_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_menuButton.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_menuButton.png new file mode 100644 index 00000000..1bf7aeb2 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_menuButton.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_menuButton_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_menuButton_small.png new file mode 100644 index 00000000..3c275751 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_menuButton_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector.png new file mode 100644 index 00000000..5c6276e4 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP1.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP1.png new file mode 100644 index 00000000..92f012e4 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP1.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP1_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP1_small.png new file mode 100644 index 00000000..74c58d8d Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP1_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP2.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP2.png new file mode 100644 index 00000000..80542022 Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP2.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP2_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP2_small.png new file mode 100644 index 00000000..74c58d8d Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP2_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_small.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_small.png new file mode 100644 index 00000000..74c58d8d Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_small.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/_LAP.png b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/_LAP.png new file mode 100644 index 00000000..2843a70b Binary files /dev/null and b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/_LAP.png differ diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/recordedTest.json b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/recordedTest.json new file mode 100644 index 00000000..38ef8f09 --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"DragToCreateStory_forceDragToCreateModeTrueRadio","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":147},{"screenshot":"Timeline_ganttBody_Timeline_row_2","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":196},{"screenshot":"Timeline_ganttBody_Timeline_row_2_REP1","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":199},{"screenshot":"Timeline_selector","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":157},{"screenshot":"Timeline_selector_REP1","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":159},{"screenshot":"Timeline_selector_REP2","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":162},{"screenshot":"Timeline_ganttBody_Timeline_row_3_Timeline_item_12","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":167},{"screenshot":"Timeline_menuButton","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":170},{"screenshot":"_LAP","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":171},{"screenshot":"DragToCreateStory_forceDragToCreateModeFalseRadio","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":179},{"screenshot":"Timeline_ganttBody_Timeline_row_2_REP2","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":196},{"screenshot":"Timeline_ganttBody_Timeline_row_2_REP3","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":199},{"screenshot":"Timeline_ganttBody_Timeline_row_2_Timeline_item_13","sourceFile":"DragToCreateTestsAreDemo.tsx","sourceLine":185}],"sourceFiles":{"DragToCreateTestsAreDemo.tsx":"import { Only, render, Scenario, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { contextMenuTestIds } from \"../../../src/components/ContextMenu/ContextMenu\";\nimport { Main } from \"../stories/dragToCreate/DragToCreate.stories\";\nimport Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from \"../../../src/timeline\";\nimport { dragToCreateStoriesTestIds as testIds } from \"../stories/dragToCreate/DragToCreate.stories\";\n\nexport class DragToCreateTestsAreDemo {\n\n async before() {\n render(
);\n }\n\n @Scenario(\"WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry\")\n async whenClickMenuButton() {\n tad.cc(\"Click on the menu button\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Check if the context menu is open\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup));\n\n tad.cc(\"Check if exist the 'Drag To Create' action\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\").textContent, DRAG_TO_CREATE_ACTION_LABEL);\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n }\n\n @Scenario(\"WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears\")\n async whenClickAddMenuEntry() {\n // GIVEN context menu is opened by pressing the hamburger button\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n \n // WHEN\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // THEN\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Drag to create mode should be active\");\n\t\n\t const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup);\n tad.cc(\"Check if drag to create popup exists\");\n await tad.assertWaitable.exists(popup);\n \n // Check the labels\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_1\").innerHTML, \"Click and drag to create a new segment\");\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_2\").textContent, DRAG_TO_CREATE_POPUP_LABEL_2);\n await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + \"_3\").innerHTML, \"To cancel you can also click on gantt\");\n const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton);\n tad.cc(\"Check if exists 'Cancel' button\");\n await tad.assertWaitable.exists(cancelButton);\n tad.cc(\"Check if the cancel button is negative\");\n await tad.assertWaitable.include(cancelButton.className, \"negative\");\n\n // Test auto closing of the popup\n tad.demoForEndUserHide();\n\n // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME \n // I tried to test also from time to time that the popup is opened but the setTimeout(time) \n // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause\n // inexact test for when the popup is still opened)\n await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup));\n \n // AND still in drag to create mode\n await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode);\n tad.demoForEndUserShow();\n\n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled\")\n async givenDragToCreateModeWhenClickCancel() {\n // GIVEN context menu was opened and 'Drag To Create' was pressed\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n tad.cc(\"Click 'Drag To Create' menu entry\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + \"_0\"));\n\n\t // WHEN\n tad.cc(\"Click on `Cancel 'drag to create' mode` button from the drag to create popup\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton));\n \n // THEN\n await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, \"Check if the drag to create mode is cancelled\");\n \n tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined });\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears\")\n async givenDragToCreateModeWhenClickAndDrag() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n const { height } = selector.getBoundingClientRect();\n tad.cc(\"A green selection rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_4\");\n await tad.showSpotlight({ message: \"On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n await tad.showSpotlight({ message: \"Move the mouse on previous row\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height);\n tad.cc(\"The height of the section regtagle isn't changed\");\n await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height);\n\n tad.getObjectViaCheat(Timeline)._selectBox.end();\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN right click, THEN cancel\")\n async givenDragToCreateModeInProgressWhenRightClick() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n await startDragKeepInProgress(3, 100);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the right click\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).rightClick();\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n tad.cc(\"The segment wasn't created, the row don't have the segments\");\n await tad.assertWaitable.equal(row.children.length, 0);\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"GIVEN drag to create in progress, WHEN mouse up, THEN handler is called\")\n async givenDragToCreateModeInProgressWhenMouseUp() {\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true });\n\n await startDragKeepInProgress(3, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_3\");\n await tad.showSpotlight({ message: \"We perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n tad.cc(\"The segment was created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_11\"));\n\n tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false });\n }\n\n @Scenario(\"WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created\")\n async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() {\n // WHEN forceDragToCreate = true\n await tad.cc(\"WHEN I set forceDragToCreate = true AND I drag to create\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio));\n\n // AND WHEN I drag and move\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n\n tad.cc(\"AND I perform\");\n const selector = tad.screenCapturing.getByTestId(timelineTestids.selector);\n // THEN\n tad.cc(\"THEN the drag to create rectangle appears on the row\");\n await tad.assertWaitable.exists(selector);\n tad.cc(\"AND it is green\");\n await tad.assertWaitable.include(Array.from(selector.classList), \"rct9k-selector-outer-add\");\n\n // AND WHEN I perform mouse up\n await tad.showSpotlight({ message: \"AND when I perform the mouse up\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragEnd();\n \n // THEN\n tad.cc(\"THEN A segment is created\");\n await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + \"_12\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n\n // WHEN forceDragToCreate = false \n await tad.cc(\"WHEN I set forceDragToCreate = false AND I drag and drop\");\n // TODO era uitat await; dar crapa in modul \"fast\";\n // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton)\n // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam\n // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio));\n\n // THEN segments are not created at drag\n await startDragKeepInProgress(2, 100);\n tad.screenCapturing.getByTestId(timelineTestids.row + \"_2\");\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + \"_13\"));\n\n // AND \n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton));\n await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), \"AND no 'Drag to create' action is shown\");\n }\n}\n\nasync function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) {\n // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost\n let row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform click for start the drag\", focusOnLastElementCaptured: true });\n tad.getObjectViaCheat(Timeline).dragStart(row, xOffset);\n row = tad.screenCapturing.getByTestId(timelineTestids.row + \"_\" + rowNumber);\n await tad.showSpotlight({ message: \"We perform mouse move with \" + x + \"px on X axis\", focusOnLastElementCaptured: true });\n await tad.getObjectViaCheat(Timeline).dragMove(x, 0);\n}\n"},"duration":2164,"error":"AssertionError: expected Task Mary Danton13 to not exist\n\t [oldFunction.apply(null, args);] (http://localhost:3000/node_modules/@famiprog-foundation/tests-are-demo/src/lib/TestsAreDemoFunctions.tsx:124:29)"} \ No newline at end of file diff --git a/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/report.md b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/report.md new file mode 100644 index 00000000..1b42defa --- /dev/null +++ b/demo-app/public/recordedTests/DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/report.md @@ -0,0 +1,542 @@ + +# DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() + +### undefined + +--- + +## The following error was caught while running the test: + +``` +AssertionError: expected Task Mary Danton13 to not exist + [oldFunction.apply(null, args);] (http://localhost:3000/node_modules/@famiprog-foundation/tests-are-demo/src/lib/TestsAreDemoFunctions.tsx:124:29) +``` + +--- + + +There are 13 screenshots. [Go to first](#screenshot-1) + +## DragToCreateTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, render, Scenario, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +/* 3*/import { Main } from "../stories/dragToCreate/DragToCreate.stories"; +/* 4*/import Timeline, { DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2, timelineTestids } from "../../../src/timeline"; +/* 5*/import { dragToCreateStoriesTestIds as testIds } from "../stories/dragToCreate/DragToCreate.stories"; +/* 6*/ +/* 7*/export class DragToCreateTestsAreDemo { +/* 8*/ +/* 9*/ async before() { +/* 10*/ render(
); +/* 11*/ } +/* 12*/ +/* 13*/ @Scenario("WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry") +/* 14*/ async whenClickMenuButton() { +/* 15*/ tad.cc("Click on the menu button"); +/* 16*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 17*/ tad.cc("Check if the context menu is open"); +/* 18*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); +/* 19*/ +/* 20*/ tad.cc("Check if exist the 'Drag To Create' action"); +/* 21*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0").textContent, DRAG_TO_CREATE_ACTION_LABEL); +/* 22*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 23*/ } +/* 24*/ +/* 25*/ @Scenario("WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears") +/* 26*/ async whenClickAddMenuEntry() { +/* 27*/ // GIVEN context menu is opened by pressing the hamburger button +/* 28*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 29*/ +/* 30*/ // WHEN +/* 31*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 33*/ +/* 34*/ // THEN +/* 35*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Drag to create mode should be active"); +/* 36*/ +/* 37*/ const popup = tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopup); +/* 38*/ tad.cc("Check if drag to create popup exists"); +/* 39*/ await tad.assertWaitable.exists(popup); +/* 40*/ +/* 41*/ // Check the labels +/* 42*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_1").innerHTML, "Click and drag to create a new segment"); +/* 43*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_2").textContent, DRAG_TO_CREATE_POPUP_LABEL_2); +/* 44*/ await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupLabel + "_3").innerHTML, "To cancel you can also click on gantt"); +/* 45*/ const cancelButton = tad.withinCapturing(popup).getByTestId(timelineTestids.dragToCreatePopupCancelButton); +/* 46*/ tad.cc("Check if exists 'Cancel' button"); +/* 47*/ await tad.assertWaitable.exists(cancelButton); +/* 48*/ tad.cc("Check if the cancel button is negative"); +/* 49*/ await tad.assertWaitable.include(cancelButton.className, "negative"); +/* 50*/ +/* 51*/ // Test auto closing of the popup +/* 52*/ tad.demoForEndUserHide(); +/* 53*/ +/* 54*/ // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME +/* 55*/ // I tried to test also from time to time that the popup is opened but the setTimeout(time) +/* 56*/ // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause +/* 57*/ // inexact test for when the popup is still opened) +/* 58*/ await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME)); +/* 59*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.dragToCreatePopup)); +/* 60*/ +/* 61*/ // AND still in drag to create mode +/* 62*/ await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline).state.dragToCreateMode); +/* 63*/ tad.demoForEndUserShow(); +/* 64*/ +/* 65*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 66*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 67*/ } +/* 68*/ +/* 69*/ @Scenario("GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled") +/* 70*/ async givenDragToCreateModeWhenClickCancel() { +/* 71*/ // GIVEN context menu was opened and 'Drag To Create' was pressed +/* 72*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/* 73*/ tad.cc("Click 'Drag To Create' menu entry"); +/* 74*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); +/* 75*/ +/* 76*/ // WHEN +/* 77*/ tad.cc("Click on `Cancel 'drag to create' mode` button from the drag to create popup"); +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.dragToCreatePopupCancelButton)); +/* 79*/ +/* 80*/ // THEN +/* 81*/ await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline).state.dragToCreateMode, "Check if the drag to create mode is cancelled"); +/* 82*/ +/* 83*/ tad.getObjectViaCheat(Timeline).setState({ openedContextMenuCoordinates: undefined }); +/* 84*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/* 85*/ } +/* 86*/ +/* 87*/ @Scenario("GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears") +/* 88*/ async givenDragToCreateModeWhenClickAndDrag() { +/* 89*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/* 90*/ +/* 91*/ await startDragKeepInProgress(3, 100); +/* 92*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/* 93*/ const { height } = selector.getBoundingClientRect(); +/* 94*/ tad.cc("A green selection rectangle appears on the row"); +/* 95*/ await tad.assertWaitable.exists(selector); +/* 96*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_4"); +/* 97*/ await tad.showSpotlight({ message: "On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row", focusOnLastElementCaptured: true }); +/* 98*/ await tad.getObjectViaCheat(Timeline).dragMove(0, height); +/* 99*/ tad.cc("The height of the section regtagle isn't changed"); +/*100*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*101*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*102*/ await tad.showSpotlight({ message: "Move the mouse on previous row", focusOnLastElementCaptured: true }); +/*103*/ await tad.getObjectViaCheat(Timeline).dragMove(0, -2 * height); +/*104*/ tad.cc("The height of the section regtagle isn't changed"); +/*105*/ await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(timelineTestids.selector).getBoundingClientRect().height, height); +/*106*/ +/*107*/ tad.getObjectViaCheat(Timeline)._selectBox.end(); +/*108*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*109*/ } +/*110*/ +/*111*/ @Scenario("GIVEN drag to create in progress, WHEN right click, THEN cancel") +/*112*/ async givenDragToCreateModeInProgressWhenRightClick() { +/*113*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*114*/ +/*115*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*116*/ tad.cc("The row don't have the segments"); +/*117*/ await tad.assertWaitable.equal(row.children.length, 0); +/*118*/ await startDragKeepInProgress(3, 100); +/*119*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*120*/ await tad.showSpotlight({ message: "We perform the right click", focusOnLastElementCaptured: true }); +/*121*/ tad.getObjectViaCheat(Timeline).rightClick(); +/*122*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*123*/ tad.cc("The segment wasn't created, the row don't have the segments"); +/*124*/ await tad.assertWaitable.equal(row.children.length, 0); +/*125*/ +/*126*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*127*/ } +/*128*/ +/*129*/ @Scenario("GIVEN drag to create in progress, WHEN mouse up, THEN handler is called") +/*130*/ async givenDragToCreateModeInProgressWhenMouseUp() { +/*131*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: true }); +/*132*/ +/*133*/ await startDragKeepInProgress(3, 100); +/*134*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_3"); +/*135*/ await tad.showSpotlight({ message: "We perform the mouse up", focusOnLastElementCaptured: true }); +/*136*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*137*/ tad.cc("The segment was created"); +``` + +
+ +```tsx +/*138*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_11")); +/*139*/ +/*140*/ tad.getObjectViaCheat(Timeline).setState({ dragToCreateMode: false }); +/*141*/ } +/*142*/ +/*143*/ @Scenario("WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created") +/*144*/ async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() { +/*145*/ // WHEN forceDragToCreate = true +/*146*/ await tad.cc("WHEN I set forceDragToCreate = true AND I drag to create"); +/*147*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio)); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeTrueRadio.png
+![](DragToCreateStory_forceDragToCreateModeTrueRadio.png) + +
+
+ +![](DragToCreateStory_forceDragToCreateModeTrueRadio_small.png) + +
+ +```tsx +/*148*/ +/*149*/ // AND WHEN I drag and move +/*150*/ await startDragKeepInProgress(2, 100); +/*151*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*152*/ +/*153*/ tad.cc("AND I perform"); +/*154*/ const selector = tad.screenCapturing.getByTestId(timelineTestids.selector); +/*155*/ // THEN +/*156*/ tad.cc("THEN the drag to create rectangle appears on the row"); +/*157*/ await tad.assertWaitable.exists(selector); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector.png
+![](Timeline_selector.png) + +
+
+ +![](Timeline_selector_small.png) + +
+ +```tsx +/*158*/ tad.cc("AND it is green"); +/*159*/ await tad.assertWaitable.include(Array.from(selector.classList), "rct9k-selector-outer-add"); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) | [Go to next](#screenshot-6) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP1.png
+![](Timeline_selector_REP1.png) + +
+
+ +![](Timeline_selector_REP1_small.png) + +
+ +```tsx +/*160*/ +/*161*/ // AND WHEN I perform mouse up +/*162*/ await tad.showSpotlight({ message: "AND when I perform the mouse up", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 6 + +[Go to previous](#screenshot-5) | [Go to next](#screenshot-7) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_selector_REP2.png
+![](Timeline_selector_REP2.png) + +
+
+ +![](Timeline_selector_REP2_small.png) + +
+ +```tsx +/*163*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*164*/ +/*165*/ // THEN +/*166*/ tad.cc("THEN A segment is created"); +/*167*/ await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(timelineTestids.item + "_12")); +``` + + + + +
+ +### Screenshot 7 + +[Go to previous](#screenshot-6) | [Go to next](#screenshot-8) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_3_Timeline_item_12.png
+![](Timeline_ganttBody_Timeline_row_3_Timeline_item_12.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_3_Timeline_item_12_small.png) + +
+ +```tsx +/*168*/ +/*169*/ // AND +/*170*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +``` + + + + +
+ +### Screenshot 8 + +[Go to previous](#screenshot-7) | [Go to next](#screenshot-9) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_menuButton.png
+![](Timeline_menuButton.png) + +
+
+ +![](Timeline_menuButton_small.png) + +
+ +```tsx +/*171*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +``` + + + + +
+ +### Screenshot 9 + +[Go to previous](#screenshot-8) | [Go to next](#screenshot-10) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/_LAP.png
+![](_LAP.png) + +
+
+ +![](_LAP_small.png) + +
+ +```tsx +/*172*/ +/*173*/ // WHEN forceDragToCreate = false +/*174*/ await tad.cc("WHEN I set forceDragToCreate = false AND I drag and drop"); +/*175*/ // TODO era uitat await; dar crapa in modul "fast"; +/*176*/ // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton) +/*177*/ // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam +/*178*/ // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio)); +``` + + + + +
+ +### Screenshot 10 + +[Go to previous](#screenshot-9) | [Go to next](#screenshot-11) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/DragToCreateStory_forceDragToCreateModeFalseRadio.png
+![](DragToCreateStory_forceDragToCreateModeFalseRadio.png) + +
+
+ +![](DragToCreateStory_forceDragToCreateModeFalseRadio_small.png) + +
+ +```tsx +/*180*/ +/*181*/ // THEN segments are not created at drag +/*182*/ await startDragKeepInProgress(2, 100); +/*183*/ tad.screenCapturing.getByTestId(timelineTestids.row + "_2"); +/*184*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*185*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(timelineTestids.item + "_13")); +``` + + + + +
+ +### Screenshot 13 + +[Go to previous](#screenshot-12) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_Timeline_item_13.png
+![](Timeline_ganttBody_Timeline_row_2_Timeline_item_13.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_2_Timeline_item_13_small.png) + +
+ +```tsx +/*186*/ +/*187*/ // AND +/*188*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(timelineTestids.menuButton)); +/*189*/ await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); +/*190*/ } +/*191*/} +/*192*/ +/*193*/async function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) { +/*194*/ // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost +/*195*/ let row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*196*/ await tad.showSpotlight({ message: "We perform click for start the drag", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2.png
+![](Timeline_ganttBody_Timeline_row_2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_2_small.png) + +
+ + + + +
+ +### Screenshot 11 + +[Go to previous](#screenshot-10) | [Go to next](#screenshot-12) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP2.png
+![](Timeline_ganttBody_Timeline_row_2_REP2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_2_REP2_small.png) + +
+ +```tsx +/*197*/ tad.getObjectViaCheat(Timeline).dragStart(row, xOffset); +/*198*/ row = tad.screenCapturing.getByTestId(timelineTestids.row + "_" + rowNumber); +/*199*/ await tad.showSpotlight({ message: "We perform mouse move with " + x + "px on X axis", focusOnLastElementCaptured: true }); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP1.png
+![](Timeline_ganttBody_Timeline_row_2_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_2_REP1_small.png) + +
+ + + + +
+ +### Screenshot 12 + +[Go to previous](#screenshot-11) | [Go to next](#screenshot-13) + +
Click to expand full image + +DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot/Timeline_ganttBody_Timeline_row_2_REP3.png
+![](Timeline_ganttBody_Timeline_row_2_REP3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_2_REP3_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*200*/ await tad.getObjectViaCheat(Timeline).dragMove(x, 0); +/*201*/} +/*202*/ +``` + +
diff --git a/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/DynamicConfigurationStory_changeDisplayIntervalButton.png b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/DynamicConfigurationStory_changeDisplayIntervalButton.png new file mode 100644 index 00000000..65f0402b Binary files /dev/null and b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/DynamicConfigurationStory_changeDisplayIntervalButton.png differ diff --git a/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/DynamicConfigurationStory_changeDisplayIntervalButton_small.png b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/DynamicConfigurationStory_changeDisplayIntervalButton_small.png new file mode 100644 index 00000000..6a33eb49 Binary files /dev/null and b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/DynamicConfigurationStory_changeDisplayIntervalButton_small.png differ diff --git a/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_0.png b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_0.png new file mode 100644 index 00000000..c5a74942 Binary files /dev/null and b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_0.png differ diff --git a/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_0_small.png b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_0_small.png new file mode 100644 index 00000000..01105037 Binary files /dev/null and b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_0_small.png differ diff --git a/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_23.png b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_23.png new file mode 100644 index 00000000..b4382873 Binary files /dev/null and b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_23.png differ diff --git a/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_23_small.png b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_23_small.png new file mode 100644 index 00000000..3cc05fcd Binary files /dev/null and b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_23_small.png differ diff --git a/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/recordedTest.json b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/recordedTest.json new file mode 100644 index 00000000..2e1f641c --- /dev/null +++ b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"DynamicConfigurationStory_changeDisplayIntervalButton","sourceFile":"DynamicConfigurationTestsAreDemo.tsx","sourceLine":16},{"screenshot":"Timebar_timebarInnerBottom_Timebar_timebarItem_0","sourceFile":"DynamicConfigurationTestsAreDemo.tsx","sourceLine":20},{"screenshot":"Timebar_timebarInnerBottom_Timebar_timebarItem_23","sourceFile":"DynamicConfigurationTestsAreDemo.tsx","sourceLine":21}],"sourceFiles":{"DynamicConfigurationTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { Main, testIds } from \"../stories/dynamicConfiguration/DynamicConfiguration.stories\";\nimport { timebarTestIds } from \"../../../src/components/timebar\";\n\n/**\n * @author Daniela Buzatu\n */\nexport class DynamicConfigurationTestsAreDemo {\n async before() {\n render(
);\n }\n\n @Scenario(\"WHEN I change the startDate/endDate properties THEN the new interval is displayed\")\n async whenStartEndDateChanges() {\n // WHEN I change the start/end date properties by clicking the \"Change display interval\" button\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.changeDisplayIntervalButton));\n \n // THEN the new interval is displayed\n const timebarBottom = tad.screenCapturing.getByTestId(timebarTestIds.timebarInnerBottom);\n await tad.assertWaitable.oneOf(tad.withinCapturing(timebarBottom).getByTestId(timebarTestIds.timebarItem + \"_\" + 0).textContent, [\"01\", \"01:00\"]);\n await tad.assertWaitable.oneOf(tad.withinCapturing(timebarBottom).getByTestId(timebarTestIds.timebarItem + \"_\" + 23).textContent, [\"00\", \"00:00\"]);\n }\n}"},"duration":442} \ No newline at end of file diff --git a/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/report.md b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/report.md new file mode 100644 index 00000000..a6271c12 --- /dev/null +++ b/demo-app/public/recordedTests/DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/report.md @@ -0,0 +1,119 @@ + +# DynamicConfigurationTestsAreDemo/whenStartEndDateChanges() + +### undefined + +--- + +There are 3 screenshots. [Go to first](#screenshot-1) + +## DynamicConfigurationTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { Main, testIds } from "../stories/dynamicConfiguration/DynamicConfiguration.stories"; +/* 3*/import { timebarTestIds } from "../../../src/components/timebar"; +/* 4*/ +/* 5*//** +/* 6*/ * @author Daniela Buzatu +``` + +
+ +```tsx +/* 7*/ */ +/* 8*/export class DynamicConfigurationTestsAreDemo { +/* 9*/ async before() { +/*10*/ render(
); +/*11*/ } +/*12*/ +/*13*/ @Scenario("WHEN I change the startDate/endDate properties THEN the new interval is displayed") +/*14*/ async whenStartEndDateChanges() { +/*15*/ // WHEN I change the start/end date properties by clicking the "Change display interval" button +/*16*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.changeDisplayIntervalButton)); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/DynamicConfigurationStory_changeDisplayIntervalButton.png
+![](DynamicConfigurationStory_changeDisplayIntervalButton.png) + +
+
+ +![](DynamicConfigurationStory_changeDisplayIntervalButton_small.png) + +
+ +```tsx +/*17*/ +/*18*/ // THEN the new interval is displayed +/*19*/ const timebarBottom = tad.screenCapturing.getByTestId(timebarTestIds.timebarInnerBottom); +/*20*/ await tad.assertWaitable.oneOf(tad.withinCapturing(timebarBottom).getByTestId(timebarTestIds.timebarItem + "_" + 0).textContent, ["01", "01:00"]); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_0.png
+![](Timebar_timebarInnerBottom_Timebar_timebarItem_0.png) + +
+
+ +![](Timebar_timebarInnerBottom_Timebar_timebarItem_0_small.png) + +
+ +```tsx +/*21*/ await tad.assertWaitable.oneOf(tad.withinCapturing(timebarBottom).getByTestId(timebarTestIds.timebarItem + "_" + 23).textContent, ["00", "00:00"]); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) + +
Click to expand full image + +DynamicConfigurationTestsAreDemo/whenStartEndDateChanges/Timebar_timebarInnerBottom_Timebar_timebarItem_23.png
+![](Timebar_timebarInnerBottom_Timebar_timebarItem_23.png) + +
+
+ +![](Timebar_timebarInnerBottom_Timebar_timebarItem_23_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*22*/ } +/*23*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png new file mode 100644 index 00000000..1c06f579 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1.png new file mode 100644 index 00000000..a6e019de Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1_small.png new file mode 100644 index 00000000..520ba9d5 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_small.png new file mode 100644 index 00000000..6ac6ba36 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png new file mode 100644 index 00000000..d5a295ba Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png new file mode 100644 index 00000000..192df6ca Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4.png new file mode 100644 index 00000000..62d83725 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1.png new file mode 100644 index 00000000..46337e89 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1_small.png new file mode 100644 index 00000000..27179811 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_small.png new file mode 100644 index 00000000..293b7b35 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/recordedTest.json new file mode 100644 index 00000000..d6bebe4c --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_0_Timeline_item_0","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":71},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_4","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":78},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":82},{"screenshot":"Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":102},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":103}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":899} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/report.md new file mode 100644 index 00000000..01e0d208 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/report.md @@ -0,0 +1,484 @@ + +# SelectedItemsTestsAreDemo/whenCTRLClickOnASegment() + +### undefined + +--- + +There are 5 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +``` + +
+ +```tsx +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png
+![](Timeline_ganttBody_Timeline_row_0_Timeline_item_0.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_Timeline_item_0_small.png) + +
+ +```tsx +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_4.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_4_small.png) + +
+ +```tsx +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_4_REP1_small.png) + +
+ +```tsx +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1.png
+![](Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_Timeline_item_0_REP1_small.png) + +
+ +```tsx +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLClickOnASegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png new file mode 100644 index 00000000..1ae35a11 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png new file mode 100644 index 00000000..35c42b6a Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/recordedTest.json new file mode 100644 index 00000000..59b0a45f --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":112}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":197} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/report.md new file mode 100644 index 00000000..dd9427b8 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/report.md @@ -0,0 +1,388 @@ + +# SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment() + +### undefined + +--- + +There are 1 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +``` + +
+ +```tsx +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1.png new file mode 100644 index 00000000..53a72d69 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_REP1.png new file mode 100644 index 00000000..583ba262 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_REP1_small.png new file mode 100644 index 00000000..fe633f01 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_small.png new file mode 100644 index 00000000..9880bc0c Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/recordedTest.json new file mode 100644 index 00000000..6b6cace9 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":121},{"screenshot":"Timeline_ganttBody_Timeline_row_1_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":128}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":387} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/report.md new file mode 100644 index 00000000..7cdcb7eb --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLClickOutside/report.md @@ -0,0 +1,412 @@ + +# SelectedItemsTestsAreDemo/whenCTRLClickOutside() + +### undefined + +--- + +There are 2 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +``` + +
+ +```tsx +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1.png
+![](Timeline_ganttBody_Timeline_row_1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_small.png) + +
+ +```tsx +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLClickOutside/Timeline_ganttBody_Timeline_row_1_REP1.png
+![](Timeline_ganttBody_Timeline_row_1_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_REP1_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/SelectionStory_selectedItemsSpan.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/SelectionStory_selectedItemsSpan.png new file mode 100644 index 00000000..a805efc9 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/SelectionStory_selectedItemsSpan.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/SelectionStory_selectedItemsSpan_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/SelectionStory_selectedItemsSpan_small.png new file mode 100644 index 00000000..bd1252a8 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/SelectionStory_selectedItemsSpan_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1.png new file mode 100644 index 00000000..bec7d862 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP1.png new file mode 100644 index 00000000..7f2046f1 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP1_small.png new file mode 100644 index 00000000..84ed6953 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP2.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP2.png new file mode 100644 index 00000000..a49143e6 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP2.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP2_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP2_small.png new file mode 100644 index 00000000..fa811759 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP2_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP3.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP3.png new file mode 100644 index 00000000..c81c4f43 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP3.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP3_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP3_small.png new file mode 100644 index 00000000..a0b60890 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP3_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png new file mode 100644 index 00000000..a0039215 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png new file mode 100644 index 00000000..0fe3fbe8 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1_small.png new file mode 100644 index 00000000..c57790eb Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2.png new file mode 100644 index 00000000..2caaeb18 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2_small.png new file mode 100644 index 00000000..7aa496e8 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3.png new file mode 100644 index 00000000..b4229738 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3_small.png new file mode 100644 index 00000000..cb900e2c Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png new file mode 100644 index 00000000..7aa496e8 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_small.png new file mode 100644 index 00000000..771c6822 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/recordedTest.json new file mode 100644 index 00000000..8596cb16 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"SelectionStory_selectedItemsSpan","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":201},{"screenshot":"Timeline_ganttBody_Timeline_row_1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":209},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":313},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":313},{"screenshot":"Timeline_ganttBody_Timeline_row_1_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":218},{"screenshot":"Timeline_ganttBody_Timeline_row_1_REP2","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":227},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":313},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":313},{"screenshot":"Timeline_ganttBody_Timeline_row_1_REP3","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":236}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":5526} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/report.md new file mode 100644 index 00000000..cb4034db --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/report.md @@ -0,0 +1,571 @@ + +# SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() + +### undefined + +--- + +There are 9 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +``` + +
+ +```tsx +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/SelectionStory_selectedItemsSpan.png
+![](SelectionStory_selectedItemsSpan.png) + +
+
+ +![](SelectionStory_selectedItemsSpan_small.png) + +
+ +```tsx +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1.png
+![](Timeline_ganttBody_Timeline_row_1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_small.png) + +
+ +```tsx +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) | [Go to next](#screenshot-6) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP1.png
+![](Timeline_ganttBody_Timeline_row_1_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_REP1_small.png) + +
+ +```tsx +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +``` + + + + +
+ +### Screenshot 6 + +[Go to previous](#screenshot-5) | [Go to next](#screenshot-7) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP2.png
+![](Timeline_ganttBody_Timeline_row_1_REP2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_REP2_small.png) + +
+ +```tsx +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +``` + + + + +
+ +### Screenshot 9 + +[Go to previous](#screenshot-8) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_REP3.png
+![](Timeline_ganttBody_Timeline_row_1_REP3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_REP3_small.png) + +
+ +```tsx +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png) + +
+ + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1_small.png) + +
+ + + + +
+ +### Screenshot 7 + +[Go to previous](#screenshot-6) | [Go to next](#screenshot-8) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP2_small.png) + +
+ + + + +
+ +### Screenshot 8 + +[Go to previous](#screenshot-7) | [Go to next](#screenshot-9) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP3_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0.png new file mode 100644 index 00000000..66e24fd3 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1.png new file mode 100644 index 00000000..f4f819ab Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1_small.png new file mode 100644 index 00000000..eef598ac Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2.png new file mode 100644 index 00000000..c54cdac5 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2_small.png new file mode 100644 index 00000000..eef598ac Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_small.png new file mode 100644 index 00000000..eef598ac Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/_LAP.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/_LAP.png new file mode 100644 index 00000000..eb0032f8 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/_LAP.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/_LAP_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/_LAP_small.png new file mode 100644 index 00000000..54054ca4 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/_LAP_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/recordedTest.json new file mode 100644 index 00000000..888b8d64 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"_LAP","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":246},{"screenshot":"Timeline_ganttBody_Timeline_row_0","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":257},{"screenshot":"Timeline_ganttBody_Timeline_row_0_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":258},{"screenshot":"Timeline_ganttBody_Timeline_row_0_REP2","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":259}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":600} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/report.md new file mode 100644 index 00000000..2b738b92 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/report.md @@ -0,0 +1,460 @@ + +# SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea() + +### undefined + +--- + +There are 4 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +``` + +
+ +```tsx +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/_LAP.png
+![](_LAP.png) + +
+
+ +![](_LAP_small.png) + +
+ +```tsx +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0.png
+![](Timeline_ganttBody_Timeline_row_0.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_small.png) + +
+ +```tsx +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1.png
+![](Timeline_ganttBody_Timeline_row_0_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_REP1_small.png) + +
+ +```tsx +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2.png
+![](Timeline_ganttBody_Timeline_row_0_REP2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_REP2_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan.png new file mode 100644 index 00000000..fc13fe89 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan_small.png new file mode 100644 index 00000000..0258e218 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/recordedTest.json new file mode 100644 index 00000000..4f04a2b8 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"SelectionStory_selectedItemsSpan","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":193}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":411} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/report.md new file mode 100644 index 00000000..6669d307 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/report.md @@ -0,0 +1,388 @@ + +# SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment() + +### undefined + +--- + +There are 1 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +``` + +
+ +```tsx +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan.png
+![](SelectionStory_selectedItemsSpan.png) + +
+
+ +![](SelectionStory_selectedItemsSpan_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png new file mode 100644 index 00000000..68ef3fab Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png new file mode 100644 index 00000000..c8ca1267 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/recordedTest.json new file mode 100644 index 00000000..54b4e569 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":62}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":133} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/report.md new file mode 100644 index 00000000..47b373ba --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickAnotherSegment/report.md @@ -0,0 +1,388 @@ + +# SelectedItemsTestsAreDemo/whenClickAnotherSegment() + +### undefined + +--- + +There are 1 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +``` + +
+ +```tsx +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenClickAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png new file mode 100644 index 00000000..52ef805c Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_1_small.png new file mode 100644 index 00000000..2c5acf1e Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2.png new file mode 100644 index 00000000..5eda4155 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1.png new file mode 100644 index 00000000..6761e6b6 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1_small.png new file mode 100644 index 00000000..3c3ddb20 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2.png new file mode 100644 index 00000000..a0f4a35d Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2_small.png new file mode 100644 index 00000000..b4622aab Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3.png new file mode 100644 index 00000000..8f84be82 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3_small.png new file mode 100644 index 00000000..8e0debd4 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_small.png new file mode 100644 index 00000000..c486e5ba Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_1.png new file mode 100644 index 00000000..c80c09ab Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_1_small.png new file mode 100644 index 00000000..8fd07c02 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/recordedTest.json new file mode 100644 index 00000000..0e0656c9 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_0_Timeline_item_2","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":20},{"screenshot":"Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":27},{"screenshot":"Timeline_ganttBody_Timeline_row_1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":32},{"screenshot":"Timeline_ganttBody_Timeline_row_0_Timeline_item_1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":47},{"screenshot":"Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":48},{"screenshot":"Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":53}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":1045} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/report.md new file mode 100644 index 00000000..0f05b0e1 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOnASegment/report.md @@ -0,0 +1,508 @@ + +# SelectedItemsTestsAreDemo/whenClickOnASegment() + +### undefined + +--- + +There are 6 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +``` + +
+ +```tsx +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2.png
+![](Timeline_ganttBody_Timeline_row_0_Timeline_item_2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_Timeline_item_2_small.png) + +
+ +```tsx +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1.png
+![](Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP1_small.png) + +
+ +```tsx +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_1.png
+![](Timeline_ganttBody_Timeline_row_1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_small.png) + +
+ +```tsx +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png
+![](Timeline_ganttBody_Timeline_row_0_Timeline_item_1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_Timeline_item_1_small.png) + +
+ +```tsx +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) | [Go to next](#screenshot-6) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2.png
+![](Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP2_small.png) + +
+ +```tsx +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +``` + + + + +
+ +### Screenshot 6 + +[Go to previous](#screenshot-5) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenClickOnASegment/Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3.png
+![](Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_Timeline_item_2_REP3_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1.png new file mode 100644 index 00000000..c04e6224 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_REP1.png new file mode 100644 index 00000000..0c6b5b7e Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_REP1_small.png new file mode 100644 index 00000000..b2bf515f Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_small.png new file mode 100644 index 00000000..fe633f01 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/recordedTest.json new file mode 100644 index 00000000..62e4f5a0 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_ganttBody_Timeline_row_1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":146},{"screenshot":"Timeline_ganttBody_Timeline_row_1_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":147}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":391} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/report.md new file mode 100644 index 00000000..ecd9f2a1 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenClickOutside/report.md @@ -0,0 +1,412 @@ + +# SelectedItemsTestsAreDemo/whenClickOutside() + +### undefined + +--- + +There are 2 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +``` + +
+ +```tsx +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1.png
+![](Timeline_ganttBody_Timeline_row_1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_small.png) + +
+ +```tsx +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenClickOutside/Timeline_ganttBody_Timeline_row_1_REP1.png
+![](Timeline_ganttBody_Timeline_row_1_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_REP1_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/SelectionStory_selectedItemsSpan.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/SelectionStory_selectedItemsSpan.png new file mode 100644 index 00000000..7b2e5664 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/SelectionStory_selectedItemsSpan.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/SelectionStory_selectedItemsSpan_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/SelectionStory_selectedItemsSpan_small.png new file mode 100644 index 00000000..18c7545f Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/SelectionStory_selectedItemsSpan_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0.png new file mode 100644 index 00000000..3b90693d Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1.png new file mode 100644 index 00000000..a3dbad8e Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1_small.png new file mode 100644 index 00000000..00a9b455 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2.png new file mode 100644 index 00000000..7af2e3e9 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2_small.png new file mode 100644 index 00000000..00a9b455 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_small.png new file mode 100644 index 00000000..fe4aa1fe Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png new file mode 100644 index 00000000..8fd3f1f1 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png new file mode 100644 index 00000000..1eeb89aa Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/_LAP.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/_LAP.png new file mode 100644 index 00000000..9cde2029 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/_LAP.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/_LAP_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/_LAP_small.png new file mode 100644 index 00000000..6e872d31 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/_LAP_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/recordedTest.json new file mode 100644 index 00000000..857d2990 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"SelectionStory_selectedItemsSpan","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":268},{"screenshot":"_LAP","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":273},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":280},{"screenshot":"Timeline_ganttBody_Timeline_row_0","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":283},{"screenshot":"Timeline_ganttBody_Timeline_row_0_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":284},{"screenshot":"Timeline_ganttBody_Timeline_row_0_REP2","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":285}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":897} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/report.md new file mode 100644 index 00000000..e12c7f43 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/report.md @@ -0,0 +1,508 @@ + +# SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea() + +### undefined + +--- + +There are 6 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +``` + +
+ +```tsx +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/SelectionStory_selectedItemsSpan.png
+![](SelectionStory_selectedItemsSpan.png) + +
+
+ +![](SelectionStory_selectedItemsSpan_small.png) + +
+ +```tsx +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/_LAP.png
+![](_LAP.png) + +
+
+ +![](_LAP_small.png) + +
+ +```tsx +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png) + +
+ +```tsx +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +``` + + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) | [Go to next](#screenshot-5) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0.png
+![](Timeline_ganttBody_Timeline_row_0.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_small.png) + +
+ +```tsx +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +``` + + + + +
+ +### Screenshot 5 + +[Go to previous](#screenshot-4) | [Go to next](#screenshot-6) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP1.png
+![](Timeline_ganttBody_Timeline_row_0_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_REP1_small.png) + +
+ +```tsx +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +``` + + + + +
+ +### Screenshot 6 + +[Go to previous](#screenshot-5) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea/Timeline_ganttBody_Timeline_row_0_REP2.png
+![](Timeline_ganttBody_Timeline_row_0_REP2.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_0_REP2_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan.png new file mode 100644 index 00000000..5776adb1 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan_small.png new file mode 100644 index 00000000..bd1252a8 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1.png new file mode 100644 index 00000000..66c66d79 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png new file mode 100644 index 00000000..3dd2c1d3 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png new file mode 100644 index 00000000..a8408237 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1_small.png new file mode 100644 index 00000000..cb900e2c Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png new file mode 100644 index 00000000..f36276ce Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_small.png new file mode 100644 index 00000000..5a36318b Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/recordedTest.json new file mode 100644 index 00000000..6bee5105 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"SelectionStory_selectedItemsSpan","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":171},{"screenshot":"Timeline_ganttBody_Timeline_row_1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":179},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":313},{"screenshot":"Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":313}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":2311} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/report.md new file mode 100644 index 00000000..8e64fa2d --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/report.md @@ -0,0 +1,457 @@ + +# SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment() + +### undefined + +--- + +There are 4 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +``` + +
+ +```tsx +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 1 + + [Go to next](#screenshot-2) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/SelectionStory_selectedItemsSpan.png
+![](SelectionStory_selectedItemsSpan.png) + +
+
+ +![](SelectionStory_selectedItemsSpan_small.png) + +
+ +```tsx +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +``` + + + + +
+ +### Screenshot 2 + +[Go to previous](#screenshot-1) | [Go to next](#screenshot-3) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1.png
+![](Timeline_ganttBody_Timeline_row_1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_small.png) + +
+ +```tsx +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +``` + + + + +
+ +### Screenshot 3 + +[Go to previous](#screenshot-2) | [Go to next](#screenshot-4) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_small.png) + +
+ + + + +
+ +### Screenshot 4 + +[Go to previous](#screenshot-3) + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment/Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png
+![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1.png) + +
+
+ +![](Timeline_ganttBody_Timeline_row_1_Timeline_item_3_REP1_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/SelectionStory_selectedItemsSpan.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/SelectionStory_selectedItemsSpan.png new file mode 100644 index 00000000..98eb98a3 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/SelectionStory_selectedItemsSpan.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/SelectionStory_selectedItemsSpan_small.png b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/SelectionStory_selectedItemsSpan_small.png new file mode 100644 index 00000000..d6855188 Binary files /dev/null and b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/SelectionStory_selectedItemsSpan_small.png differ diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/recordedTest.json b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/recordedTest.json new file mode 100644 index 00000000..ceb39096 --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"SelectionStory_selectedItemsSpan","sourceFile":"SelectedItemsTestsAreDemo.tsx","sourceLine":163}],"sourceFiles":{"SelectedItemsTestsAreDemo.tsx":"import { Only, Scenario, ScenarioOptions, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Selection, selectionStoryTestIds } from \"../stories/contextMenuAndSelection/ContextMenuAndSelection.stories\";\nimport { someTasks } from \"../stories/sampleData\";\nimport Timeline, { timelineTestids as testids } from \"../../../src/timeline\";\nimport { rightClick } from \"./testUtils\";\n\n/**\n* @author Daniela Buzatu\n*/\nexport class SelectedItemsTestsAreDemo {\n async before() {\n render();\n }\n\n @Scenario(\"WHEN click on a segment, THEN only that segment is selected\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenClickOnASegment() {\n // WHEN left click, THEN element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click again on same element, THEN the same element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n await this.assertOnlyExpectedSegmentsAreSelected([2], true);\n \n // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== \n // GIVEN nothing is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n // WHEN right click, THEN element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"));\n await this.assertOnlyExpectedSegmentsAreSelected([4], true);\n\n // WHEN right click again on another element, THEN the new element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // WHEN right click again on same element, THEN the same element is selected\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"));\n await this.assertOnlyExpectedSegmentsAreSelected([5], true);\n\n // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"), { ctrlKey: true });\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true);\n \n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickAnotherSegment() {\n tad.cc(undefined);\n // WHEN left click again on another element, THEN the new element is selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n }\n\n @Scenario(\"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASegment() {\n // left click + CTRL on another element, THEN the new element is added to selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n tad.demoForEndUserHide();\n\n // WHEN left click + SHIFT on another element, THEN the new element is added to selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN left click + SHIFT on same element, THEN the element is removed from selection\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n // WHEN right click + CTRL on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + CTRL on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_4\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true);\n\n // WHEN right click + SHIFT on another element, THEN the new element is added to selection\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // WHEN right click + SHIFT on same element, THEN the selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_5\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true);\n\n // restore selection for the next scenario\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_0\"));\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLClickOnASelectedSegment() {\n // WHEN left click + CTRL on same element, THEN the element is removed from selection\n tad.cc(\"With CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n }\n\n @Scenario(\"WHEN CTRL + click outside segments, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true}) \n async whenCTRLClickOutside() {\n // When I click outside + Ctrl key, THEN selection doesn't change\n tad.cc(\"Click outside with CTRL Key pressed\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment\n await tad.demoForEndUserHide()\n // WHEN I click outside + Shift key, THEN selection doesn't change\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I right click outside + Ctrl key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // WHEN I click outside + Shift key, THEN selection doesn't change\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"), { shiftKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN click outside segments, THEN the selection becomes empty\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenClickOutside() {\n // WHEN left click on row, THEN no segment is selected\n tad.cc(\"Left click outside any segment\");\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // GIVEN a segment is selected\n tad.demoForEndUserHide();\n rightClick(tad.screenCapturing.getByTestId(testids.item + \"_2\"));\n // WHEN right click on row, THEN no segment is selected\n rightClick(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverTwoSegments() {\n await tad.showSpotlight({ message: \"I drag to select segment 0 and 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n \n @Scenario(\"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenDragASelectionRectangleOverAnotherSegment() {\n await tad.showSpotlight({ message: \"I drag to select segment 3 with left mouse button\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3);\n await this.assertOnlyExpectedSegmentsAreSelected([3]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // GIVEN nothing selected\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n\n await this.dragToSelect(0, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n\n await this.dragToSelect(1, 1, 3, 3, true);\n await this.assertOnlyExpectedSegmentsAreSelected([3], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnotherSegment() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0\", focusOnLastElementCaptured: false });\n await this.dragToSelect(0, 0, 0, 0, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3]);\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() {\n await tad.showSpotlight({ message: \"I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed\", focusOnLastElementCaptured: false });\n await this.dragToSelect(1, 1, 3, 3, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n\n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT\n tad.demoForEndUserHide();\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection\n await this.dragToSelect(0, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected \n await this.dragToSelect(1, 1, 3, 3, false, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // unselect everything\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected\n await this.dragToSelect(0, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true);\n // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected\n await this.dragToSelect(1, 1, 3, 3, true, false, true);\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n\n // Select again the segment 0\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + \"_1\"));\n await this.dragToSelect(0, 0, 0, 0, false, true);\n\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\")\n @ScenarioOptions({linkWithNextScenario: true})\n async whenCTRLDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true});\n await this.assertOnlyExpectedSegmentsAreSelected([0]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button + CTRL works the same\n tad.demoForEndUserHide();\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true });\n await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true });\n await this.assertOnlyExpectedSegmentsAreSelected([0], true);\n tad.demoForEndUserShow();\n }\n\n @Scenario(\"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty\") \n @ScenarioOptions({linkWithNextScenario: true}) \n async whenDragASelectionRectangleOverAnEmptyArea() {\n tad.cc(undefined);\n await tad.showSpotlight({ message: \"I drag to select outside any segments (using left mouse button)\", focusOnLastElementCaptured: false });\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5);\n await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5);\n tad.getObjectViaCheat(Timeline).dragEnd();\n await tad.showSpotlight({ message: \"No segment is selected\", focusOnLastElementCaptured: false });\n await this.assertOnlyExpectedSegmentsAreSelected([]);\n \n //=======HIDDEN TESTS (Not interesting for the user)==========\n // Using right mouse button works the same\n tad.demoForEndUserHide();\n // given a selected segment\n await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + \"_3\"));\n\n let row = tad.screenCapturing.getByTestId(testids.row + \"_0\");\n await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 });\n await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 });\n await tad.fireEventWaitable.mouseUp(row, { button: 2 });\n await this.assertOnlyExpectedSegmentsAreSelected([], true);\n tad.demoForEndUserShow();\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////\n ////// Helper methods\n ////////////////////////////////////////////////////////////////////////////////////////\n\n async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) {\n let startingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + startingRowIndex);\n let startingRowRect = startingRow.getBoundingClientRect();\n let endingRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + endingRowIndex);\n let endingRowRect = endingRow.getBoundingClientRect();\n const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + startingSegmentIndex).getBoundingClientRect();\n const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + \"_\" + endingSegmentIndex).getBoundingClientRect();\n const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x;\n const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y;\n\n // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting\n // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. \n // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the \"cheat\" was needed\n // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events\n if (rightClick) {\n // There was a bug when having a large DPI of the screen e.g. 170\n // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value,\n // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the\n // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem \n await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}});\n } else {\n // 150 is the group offset\n // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow\n tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150);\n await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5);\n tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey });\n }\n }\n\n async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) {\n for (var i = 0; i < someTasks.length; i++) {\n const segment = tad.screenCapturing.getByTestId(testids.item + \"_\" + i);\n if (expectedSelectedSegments.indexOf(i) >= 0) {\n tad.cc(\"Segment \" + i + \" is selected (has resize anchors, brighter color and shadow effect)\");\n // await tad.assertWaitable.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.include(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n } else {\n tad.demoForEndUserHide();\n // await tad.assertWaitable.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n assert.notInclude(Array.from(segment.classList), \"rct9k-items-outer-selected\");\n !demoForEndUserHide && tad.demoForEndUserShow();\n }\n }\n\n assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(\", \"));\n }\n}"},"duration":531} \ No newline at end of file diff --git a/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/report.md b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/report.md new file mode 100644 index 00000000..62131f4b --- /dev/null +++ b/demo-app/public/recordedTests/SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/report.md @@ -0,0 +1,388 @@ + +# SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments() + +### undefined + +--- + +There are 1 screenshots. [Go to first](#screenshot-1) + +## SelectedItemsTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +/* 4*/import { someTasks } from "../stories/sampleData"; +/* 5*/import Timeline, { timelineTestids as testids } from "../../../src/timeline"; +/* 6*/import { rightClick } from "./testUtils"; +/* 7*/ +/* 8*//** +/* 9*/* @author Daniela Buzatu +/* 10*/*/ +/* 11*/export class SelectedItemsTestsAreDemo { +/* 12*/ async before() { +/* 13*/ render(); +/* 14*/ } +/* 15*/ +/* 16*/ @Scenario("WHEN click on a segment, THEN only that segment is selected") +/* 17*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 18*/ async whenClickOnASegment() { +/* 19*/ // WHEN left click, THEN element is selected +/* 20*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 21*/ await this.assertOnlyExpectedSegmentsAreSelected([2]); +/* 22*/ +/* 23*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 24*/ tad.demoForEndUserHide(); +/* 25*/ +/* 26*/ // WHEN left click again on same element, THEN the same element is selected +/* 27*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 28*/ await this.assertOnlyExpectedSegmentsAreSelected([2], true); +/* 29*/ +/* 30*/ // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== +/* 31*/ // GIVEN nothing is selected +/* 32*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/* 33*/ +/* 34*/ // WHEN right click, THEN element is selected +/* 35*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4")); +/* 36*/ await this.assertOnlyExpectedSegmentsAreSelected([4], true); +/* 37*/ +/* 38*/ // WHEN right click again on another element, THEN the new element is selected +/* 39*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 40*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 41*/ +/* 42*/ // WHEN right click again on same element, THEN the same element is selected +/* 43*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5")); +/* 44*/ await this.assertOnlyExpectedSegmentsAreSelected([5], true); +/* 45*/ +/* 46*/ // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change +/* 47*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 48*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2"), { ctrlKey: true }); +/* 49*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_1")); +/* 50*/ await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); +/* 51*/ +/* 52*/ // restore selection for the next scenario +/* 53*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_2")); +/* 54*/ tad.demoForEndUserShow(); +/* 55*/ } +/* 56*/ +/* 57*/ @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") +/* 58*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 59*/ async whenClickAnotherSegment() { +/* 60*/ tad.cc(undefined); +/* 61*/ // WHEN left click again on another element, THEN the new element is selected +/* 62*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/* 63*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/* 64*/ } +/* 65*/ +/* 66*/ @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") +/* 67*/ @ScenarioOptions({linkWithNextScenario: true}) +/* 68*/ async whenCTRLClickOnASegment() { +/* 69*/ // left click + CTRL on another element, THEN the new element is added to selection +/* 70*/ tad.cc("With CTRL Key pressed"); +/* 71*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0"), { ctrlKey: true }); +/* 72*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/* 73*/ +/* 74*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/* 75*/ tad.demoForEndUserHide(); +/* 76*/ +/* 77*/ // WHEN left click + SHIFT on another element, THEN the new element is added to selection +/* 78*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 79*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 80*/ +/* 81*/ // WHEN left click + SHIFT on same element, THEN the element is removed from selection +/* 82*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_4"), { shiftKey: true }); +/* 83*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/* 84*/ +/* 85*/ // WHEN right click + CTRL on another element, THEN the new element is added to selection +/* 86*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 87*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 88*/ +/* 89*/ // WHEN right click + CTRL on same element, THEN the selection doesn't change +/* 90*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_4"), { ctrlKey: true }); +/* 91*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); +/* 92*/ +/* 93*/ // WHEN right click + SHIFT on another element, THEN the new element is added to selection +/* 94*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 95*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/* 96*/ +/* 97*/ // WHEN right click + SHIFT on same element, THEN the selection doesn't change +/* 98*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_5"), { shiftKey: true }); +/* 99*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); +/*100*/ +/*101*/ // restore selection for the next scenario +/*102*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_0")); +/*103*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*104*/ tad.demoForEndUserShow(); +/*105*/ } +/*106*/ +/*107*/ @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") +/*108*/ @ScenarioOptions({linkWithNextScenario: true}) +/*109*/ async whenCTRLClickOnASelectedSegment() { +/*110*/ // WHEN left click + CTRL on same element, THEN the element is removed from selection +/*111*/ tad.cc("With CTRL Key pressed"); +/*112*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3"), { ctrlKey: true }); +/*113*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*114*/ } +/*115*/ +/*116*/ @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") +/*117*/ @ScenarioOptions({linkWithNextScenario: true}) +/*118*/ async whenCTRLClickOutside() { +/*119*/ // When I click outside + Ctrl key, THEN selection doesn't change +/*120*/ tad.cc("Click outside with CTRL Key pressed"); +/*121*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*122*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*123*/ +/*124*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*125*/ // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment +/*126*/ await tad.demoForEndUserHide() +/*127*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*128*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*129*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*130*/ +/*131*/ // WHEN I right click outside + Ctrl key, THEN selection doesn't change +/*132*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { ctrlKey: true }); +/*133*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*134*/ +/*135*/ // WHEN I click outside + Shift key, THEN selection doesn't change +/*136*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1"), { shiftKey: true }); +/*137*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*138*/ tad.demoForEndUserShow(); +/*139*/ } +/*140*/ +/*141*/ @Scenario("WHEN click outside segments, THEN the selection becomes empty") +/*142*/ @ScenarioOptions({linkWithNextScenario: true}) +/*143*/ async whenClickOutside() { +/*144*/ // WHEN left click on row, THEN no segment is selected +/*145*/ tad.cc("Left click outside any segment"); +/*146*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*147*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*148*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*149*/ +/*150*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*151*/ // GIVEN a segment is selected +/*152*/ tad.demoForEndUserHide(); +/*153*/ rightClick(tad.screenCapturing.getByTestId(testids.item + "_2")); +``` + +
+ +```tsx +/*154*/ // WHEN right click on row, THEN no segment is selected +/*155*/ rightClick(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*156*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*157*/ tad.demoForEndUserShow(); +/*158*/ } +/*159*/ +/*160*/ @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") +/*161*/ @ScenarioOptions({linkWithNextScenario: true}) +/*162*/ async whenDragASelectionRectangleOverTwoSegments() { +/*163*/ await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments/SelectionStory_selectedItemsSpan.png
+![](SelectionStory_selectedItemsSpan.png) + +
+
+ +![](SelectionStory_selectedItemsSpan_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*164*/ await this.dragToSelect(0, 1, 3, 3); +/*165*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*166*/ } +/*167*/ +/*168*/ @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") +/*169*/ @ScenarioOptions({linkWithNextScenario: true}) +/*170*/ async whenDragASelectionRectangleOverAnotherSegment() { +/*171*/ await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); +/*172*/ await this.dragToSelect(1, 1, 3, 3); +/*173*/ await this.assertOnlyExpectedSegmentsAreSelected([3]); +/*174*/ +/*175*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*176*/ // Using right mouse button works the same +/*177*/ tad.demoForEndUserHide(); +/*178*/ // GIVEN nothing selected +/*179*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*180*/ +/*181*/ await this.dragToSelect(0, 1, 3, 3, true); +/*182*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*183*/ +/*184*/ await this.dragToSelect(1, 1, 3, 3, true); +/*185*/ await this.assertOnlyExpectedSegmentsAreSelected([3], true); +/*186*/ tad.demoForEndUserShow(); +/*187*/ } +/*188*/ +/*189*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") +/*190*/ @ScenarioOptions({linkWithNextScenario: true}) +/*191*/ async whenCTRLDragASelectionRectangleOverAnotherSegment() { +/*192*/ tad.cc(undefined); +/*193*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); +/*194*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*195*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); +/*196*/ } +/*197*/ +/*198*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") +/*199*/ @ScenarioOptions({linkWithNextScenario: true}) +/*200*/ async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { +/*201*/ await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); +/*202*/ await this.dragToSelect(1, 1, 3, 3, false, true); +/*203*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*204*/ +/*205*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*206*/ // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT +/*207*/ tad.demoForEndUserHide(); +/*208*/ // unselect everything +/*209*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*210*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection +/*211*/ await this.dragToSelect(0, 1, 3, 3, true, true); +/*212*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*213*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected +/*214*/ await this.dragToSelect(1, 1, 3, 3, true, true); +/*215*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*216*/ +/*217*/ // unselect everything +/*218*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*219*/ // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*220*/ await this.dragToSelect(0, 1, 3, 3, false, false, true); +/*221*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*222*/ // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected +/*223*/ await this.dragToSelect(1, 1, 3, 3, false, false, true); +/*224*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*225*/ +/*226*/ // unselect everything +/*227*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*228*/ // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected +/*229*/ await this.dragToSelect(0, 1, 3, 3, true, false, true); +/*230*/ await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); +/*231*/ // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected +/*232*/ await this.dragToSelect(1, 1, 3, 3, true, false, true); +/*233*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*234*/ +/*235*/ // Select again the segment 0 +/*236*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.row + "_1")); +/*237*/ await this.dragToSelect(0, 0, 0, 0, false, true); +/*238*/ +/*239*/ tad.demoForEndUserShow(); +/*240*/ } +/*241*/ +/*242*/ @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") +/*243*/ @ScenarioOptions({linkWithNextScenario: true}) +/*244*/ async whenCTRLDragASelectionRectangleOverAnEmptyArea() { +/*245*/ tad.cc(undefined); +/*246*/ await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); +/*247*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*248*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*249*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*250*/ tad.getObjectViaCheat(Timeline).dragEnd({ctrlKey: true}); +/*251*/ await this.assertOnlyExpectedSegmentsAreSelected([0]); +/*252*/ +/*253*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*254*/ // Using right mouse button + CTRL works the same +/*255*/ tad.demoForEndUserHide(); +/*256*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*257*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); +/*258*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); +/*259*/ await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); +/*260*/ await this.assertOnlyExpectedSegmentsAreSelected([0], true); +/*261*/ tad.demoForEndUserShow(); +/*262*/ } +/*263*/ +/*264*/ @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") +/*265*/ @ScenarioOptions({linkWithNextScenario: true}) +/*266*/ async whenDragASelectionRectangleOverAnEmptyArea() { +/*267*/ tad.cc(undefined); +/*268*/ await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); +/*269*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*270*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, 5); +/*271*/ await tad.getObjectViaCheat(Timeline).dragMove(10, 10, 5); +/*272*/ tad.getObjectViaCheat(Timeline).dragEnd(); +/*273*/ await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); +/*274*/ await this.assertOnlyExpectedSegmentsAreSelected([]); +/*275*/ +/*276*/ //=======HIDDEN TESTS (Not interesting for the user)========== +/*277*/ // Using right mouse button works the same +/*278*/ tad.demoForEndUserHide(); +/*279*/ // given a selected segment +/*280*/ await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testids.item + "_3")); +/*281*/ +/*282*/ let row = tad.screenCapturing.getByTestId(testids.row + "_0"); +/*283*/ await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); +/*284*/ await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); +/*285*/ await tad.fireEventWaitable.mouseUp(row, { button: 2 }); +/*286*/ await this.assertOnlyExpectedSegmentsAreSelected([], true); +/*287*/ tad.demoForEndUserShow(); +/*288*/ } +/*289*/ +/*290*/ //////////////////////////////////////////////////////////////////////////////////////// +/*291*/ ////// Helper methods +/*292*/ //////////////////////////////////////////////////////////////////////////////////////// +/*293*/ +/*294*/ async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { +/*295*/ let startingRow = tad.screenCapturing.getByTestId(testids.row + "_" + startingRowIndex); +/*296*/ let startingRowRect = startingRow.getBoundingClientRect(); +/*297*/ let endingRow = tad.screenCapturing.getByTestId(testids.row + "_" + endingRowIndex); +/*298*/ let endingRowRect = endingRow.getBoundingClientRect(); +/*299*/ const startingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); +/*300*/ const endingSegmentRect = tad.screenCapturing.getByTestId(testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); +/*301*/ const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; +/*302*/ const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; +/*303*/ +/*304*/ // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting +/*305*/ // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. +/*306*/ // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed +/*307*/ // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events +/*308*/ if (rightClick) { +/*309*/ // There was a bug when having a large DPI of the screen e.g. 170 +/*310*/ // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, +/*311*/ // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the +/*312*/ // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem +/*313*/ await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); +/*314*/ } else { +/*315*/ // 150 is the group offset +/*316*/ // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow +/*317*/ tad.getObjectViaCheat(Timeline).dragStart(startingRow, startingSegmentRect.x - 150); +/*318*/ await tad.getObjectViaCheat(Timeline).dragMove(deltaX, deltaY - 5, 5); +/*319*/ tad.getObjectViaCheat(Timeline).dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); +/*320*/ } +/*321*/ } +/*322*/ +/*323*/ async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { +/*324*/ for (var i = 0; i < someTasks.length; i++) { +/*325*/ const segment = tad.screenCapturing.getByTestId(testids.item + "_" + i); +/*326*/ if (expectedSelectedSegments.indexOf(i) >= 0) { +/*327*/ tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); +/*328*/ // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*329*/ assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*330*/ } else { +/*331*/ tad.demoForEndUserHide(); +/*332*/ // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*333*/ assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); +/*334*/ !demoForEndUserHide && tad.demoForEndUserShow(); +/*335*/ } +/*336*/ } +/*337*/ +/*338*/ assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); +/*339*/ } +/*340*/} +``` + +
diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/Table_row_0.png b/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/Table_row_0.png new file mode 100644 index 00000000..d4d067a3 Binary files /dev/null and b/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/Table_row_0.png differ diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/Table_row_0_small.png b/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/Table_row_0_small.png new file mode 100644 index 00000000..59690e93 Binary files /dev/null and b/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/Table_row_0_small.png differ diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/recordedTest.json b/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/recordedTest.json new file mode 100644 index 00000000..13c46f25 --- /dev/null +++ b/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Table_row_0","sourceFile":"TableTestsAreDemo.tsx","sourceLine":29}],"sourceFiles":{"TableTestsAreDemo.tsx":"import { Scenario, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Table } from \"fixed-data-table-2\";\nimport { ProvidingCustomTable } from \"../stories/table/Table.stories\";\nimport { DEMO_TABLE_WIDTH, tableTestIds } from \"../stories/table/TableScenarios\";\nimport { TABLE_OFFSET, timelineTestids as testids } from \"../../../src/timeline\";\n\nexport class TableTestsAreDemo {\n async before() {\n render();\n // When pressing run the second time the state of the scrollbars are not reset\n // I thought that render() should reset its state, but it doesn't.\n tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:0});\n // TODO DB By running the tests second time, the SplitPane test fails because we need to reset its position\n // Maybe a general mechanism of test sate reset is needed\n }\n \n @Scenario(\"Both table and gantt diagram have same rows height\")\n async bothTableAndGanttHaveSameRowHeight() {\n // Nu le putem verifica pe toate caci gridul este virtualizat\n for (var i = 0; i < 5; i++) {\n let ganttRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + i);\n let tableCell = tad.screenCapturing.getByTestId(tableTestIds.row + \"_\" + i);\n if (i < 4) { \n tad.cc(\"Table row \" + (i + 1) + \" and gantt row \" + (i + 1) + \" have same height\");\n } else {\n tad.cc(\"And so on... \");\n }\n await tad.assertWaitable.equal(ganttRow.offsetHeight, (tableCell as HTMLElement).offsetHeight);\n }\n }\n\n @Scenario(\"When scrolling in gantt the table is scrolled\")\n async whenScrollInGanttThenTableIsScrolled() {\n // We don't focus on last element captured because its height occupies the entire page\n // And the message appears under the gantt and is hidded by the scroll mechanism \n await tad.showSpotlight({ message: \"Gantt is scrolled => Table is scrolled accordingly\", focusOnLastElementCaptured: false });\n tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:100});\n \n // This is needed in order for the scroll handler to be triggerd before the verification \n await new Promise(r => setTimeout(r, 10));\n\n // We \"cheated\" here because\n // There is no strait forward way to see the scroll position by looking at the html elements\n // Because the table has a special type of scrolling mechanism by absolute positioning (with translate3d) \n // the rows. \n // We could have looked at the position of the first row but it was offseted with the\n // height of the header in order to appear right under it. So we should have placed a data-testid on the header also\n // but being in a third library component this was not simple to implement\n assert.equal((tad.getObjectViaCheat(Table) as Table).props.scrollTop, 100);\n }\n\n @Scenario(\"When scrolling in table the gantt is scrolled\")\n async whenScrollInTableThenGanttIsScrolled() {\n await tad.showSpotlight({ message: \"Table is scrolled => Gantt is scrolled accordingly\", focusOnLastElementCaptured: false });\n (tad.getObjectViaCheat(Table) as Table).scrollActions.scrollToY(300);\n assert.equal(tad.screenCapturing.getByTestId(testids.ganttBody).scrollTop, 300);\n }\n\n @Scenario(\"When drag the split pane the table is resized accordingly\")\n async whenDragTheSplitPaneTheTableIsResizedAccordingly() {\n tad.cc(\"Split pane resizer is dragged\");\n await tad.drag(tad.screenCapturing.getByTestId(testids.splitPaneResizer), { delta: { x: 150, y: 0 }});\n assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150);\n }\n}"},"duration":52,"error":"Error: Uncaught TypeError: Cannot read properties of null (reading 'recomputeGridSize') (http://localhost:3000/@fs/home/poweruser/git/react-timeline-10000/src/timeline.js:433)\n\t at _global.onerror [fn(new Error(err + ' (' + url + ':' + line + ')'));] (http://localhost:3000/node_modules/mocha/browser-entry.js:75:10)"} \ No newline at end of file diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/report.md b/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/report.md new file mode 100644 index 00000000..026b1c91 --- /dev/null +++ b/demo-app/public/recordedTests/TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/report.md @@ -0,0 +1,124 @@ + +# TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight() + +### undefined + +--- + +## The following error was caught while running the test: + +``` +Error: Uncaught TypeError: Cannot read properties of null (reading 'recomputeGridSize') (http://localhost:3000/@fs/home/poweruser/git/react-timeline-10000/src/timeline.js:433) + at _global.onerror [fn(new Error(err + ' (' + url + ':' + line + ')'));] (http://localhost:3000/node_modules/mocha/browser-entry.js:75:10) +``` + +--- + + +There are 1 screenshots. [Go to first](#screenshot-1) + +## TableTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Scenario, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Table } from "fixed-data-table-2"; +/* 4*/import { ProvidingCustomTable } from "../stories/table/Table.stories"; +/* 5*/import { DEMO_TABLE_WIDTH, tableTestIds } from "../stories/table/TableScenarios"; +/* 6*/import { TABLE_OFFSET, timelineTestids as testids } from "../../../src/timeline"; +/* 7*/ +/* 8*/export class TableTestsAreDemo { +/* 9*/ async before() { +/*10*/ render(); +/*11*/ // When pressing run the second time the state of the scrollbars are not reset +/*12*/ // I thought that render() should reset its state, but it doesn't. +/*13*/ tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:0}); +/*14*/ // TODO DB By running the tests second time, the SplitPane test fails because we need to reset its position +/*15*/ // Maybe a general mechanism of test sate reset is needed +/*16*/ } +/*17*/ +/*18*/ @Scenario("Both table and gantt diagram have same rows height") +/*19*/ async bothTableAndGanttHaveSameRowHeight() { +``` + +
+ +```tsx +/*20*/ // Nu le putem verifica pe toate caci gridul este virtualizat +/*21*/ for (var i = 0; i < 5; i++) { +/*22*/ let ganttRow = tad.screenCapturing.getByTestId(testids.row + "_" + i); +/*23*/ let tableCell = tad.screenCapturing.getByTestId(tableTestIds.row + "_" + i); +/*24*/ if (i < 4) { +/*25*/ tad.cc("Table row " + (i + 1) + " and gantt row " + (i + 1) + " have same height"); +/*26*/ } else { +/*27*/ tad.cc("And so on... "); +/*28*/ } +/*29*/ await tad.assertWaitable.equal(ganttRow.offsetHeight, (tableCell as HTMLElement).offsetHeight); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight/Table_row_0.png
+![](Table_row_0.png) + +
+
+ +![](Table_row_0_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*30*/ } +/*31*/ } +/*32*/ +/*33*/ @Scenario("When scrolling in gantt the table is scrolled") +/*34*/ async whenScrollInGanttThenTableIsScrolled() { +/*35*/ // We don't focus on last element captured because its height occupies the entire page +/*36*/ // And the message appears under the gantt and is hidded by the scroll mechanism +/*37*/ await tad.showSpotlight({ message: "Gantt is scrolled => Table is scrolled accordingly", focusOnLastElementCaptured: false }); +/*38*/ tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:100}); +/*39*/ +/*40*/ // This is needed in order for the scroll handler to be triggerd before the verification +/*41*/ await new Promise(r => setTimeout(r, 10)); +/*42*/ +/*43*/ // We "cheated" here because +/*44*/ // There is no strait forward way to see the scroll position by looking at the html elements +/*45*/ // Because the table has a special type of scrolling mechanism by absolute positioning (with translate3d) +/*46*/ // the rows. +/*47*/ // We could have looked at the position of the first row but it was offseted with the +/*48*/ // height of the header in order to appear right under it. So we should have placed a data-testid on the header also +/*49*/ // but being in a third library component this was not simple to implement +/*50*/ assert.equal((tad.getObjectViaCheat(Table) as Table).props.scrollTop, 100); +/*51*/ } +/*52*/ +/*53*/ @Scenario("When scrolling in table the gantt is scrolled") +/*54*/ async whenScrollInTableThenGanttIsScrolled() { +/*55*/ await tad.showSpotlight({ message: "Table is scrolled => Gantt is scrolled accordingly", focusOnLastElementCaptured: false }); +/*56*/ (tad.getObjectViaCheat(Table) as Table).scrollActions.scrollToY(300); +/*57*/ assert.equal(tad.screenCapturing.getByTestId(testids.ganttBody).scrollTop, 300); +/*58*/ } +/*59*/ +/*60*/ @Scenario("When drag the split pane the table is resized accordingly") +/*61*/ async whenDragTheSplitPaneTheTableIsResizedAccordingly() { +/*62*/ tad.cc("Split pane resizer is dragged"); +/*63*/ await tad.drag(tad.screenCapturing.getByTestId(testids.splitPaneResizer), { delta: { x: 150, y: 0 }}); +/*64*/ assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150); +/*65*/ } +/*66*/} +``` + +
diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/Timeline_splitPaneResizer.png b/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/Timeline_splitPaneResizer.png new file mode 100644 index 00000000..e5e3cf71 Binary files /dev/null and b/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/Timeline_splitPaneResizer.png differ diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/Timeline_splitPaneResizer_small.png b/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/Timeline_splitPaneResizer_small.png new file mode 100644 index 00000000..0c17f381 Binary files /dev/null and b/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/Timeline_splitPaneResizer_small.png differ diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/recordedTest.json b/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/recordedTest.json new file mode 100644 index 00000000..9b68372e --- /dev/null +++ b/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Timeline_splitPaneResizer","sourceFile":"TableTestsAreDemo.tsx","sourceLine":63}],"sourceFiles":{"TableTestsAreDemo.tsx":"import { Scenario, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Table } from \"fixed-data-table-2\";\nimport { ProvidingCustomTable } from \"../stories/table/Table.stories\";\nimport { DEMO_TABLE_WIDTH, tableTestIds } from \"../stories/table/TableScenarios\";\nimport { TABLE_OFFSET, timelineTestids as testids } from \"../../../src/timeline\";\n\nexport class TableTestsAreDemo {\n async before() {\n render();\n // When pressing run the second time the state of the scrollbars are not reset\n // I thought that render() should reset its state, but it doesn't.\n tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:0});\n // TODO DB By running the tests second time, the SplitPane test fails because we need to reset its position\n // Maybe a general mechanism of test sate reset is needed\n }\n \n @Scenario(\"Both table and gantt diagram have same rows height\")\n async bothTableAndGanttHaveSameRowHeight() {\n // Nu le putem verifica pe toate caci gridul este virtualizat\n for (var i = 0; i < 5; i++) {\n let ganttRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + i);\n let tableCell = tad.screenCapturing.getByTestId(tableTestIds.row + \"_\" + i);\n if (i < 4) { \n tad.cc(\"Table row \" + (i + 1) + \" and gantt row \" + (i + 1) + \" have same height\");\n } else {\n tad.cc(\"And so on... \");\n }\n await tad.assertWaitable.equal(ganttRow.offsetHeight, (tableCell as HTMLElement).offsetHeight);\n }\n }\n\n @Scenario(\"When scrolling in gantt the table is scrolled\")\n async whenScrollInGanttThenTableIsScrolled() {\n // We don't focus on last element captured because its height occupies the entire page\n // And the message appears under the gantt and is hidded by the scroll mechanism \n await tad.showSpotlight({ message: \"Gantt is scrolled => Table is scrolled accordingly\", focusOnLastElementCaptured: false });\n tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:100});\n \n // This is needed in order for the scroll handler to be triggerd before the verification \n await new Promise(r => setTimeout(r, 10));\n\n // We \"cheated\" here because\n // There is no strait forward way to see the scroll position by looking at the html elements\n // Because the table has a special type of scrolling mechanism by absolute positioning (with translate3d) \n // the rows. \n // We could have looked at the position of the first row but it was offseted with the\n // height of the header in order to appear right under it. So we should have placed a data-testid on the header also\n // but being in a third library component this was not simple to implement\n assert.equal((tad.getObjectViaCheat(Table) as Table).props.scrollTop, 100);\n }\n\n @Scenario(\"When scrolling in table the gantt is scrolled\")\n async whenScrollInTableThenGanttIsScrolled() {\n await tad.showSpotlight({ message: \"Table is scrolled => Gantt is scrolled accordingly\", focusOnLastElementCaptured: false });\n (tad.getObjectViaCheat(Table) as Table).scrollActions.scrollToY(300);\n assert.equal(tad.screenCapturing.getByTestId(testids.ganttBody).scrollTop, 300);\n }\n\n @Scenario(\"When drag the split pane the table is resized accordingly\")\n async whenDragTheSplitPaneTheTableIsResizedAccordingly() {\n tad.cc(\"Split pane resizer is dragged\");\n await tad.drag(tad.screenCapturing.getByTestId(testids.splitPaneResizer), { delta: { x: 150, y: 0 }});\n assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150);\n }\n}"},"duration":1320,"error":"AssertionError: expected 725 to equal 425\n\t at TableTestsAreDemo.whenDragTheSplitPaneTheTableIsResizedAccordingly [assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150);] (http://localhost:3000TableTestsAreDemo.tsx:64:16)"} \ No newline at end of file diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/report.md b/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/report.md new file mode 100644 index 00000000..564bbd35 --- /dev/null +++ b/demo-app/public/recordedTests/TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/report.md @@ -0,0 +1,124 @@ + +# TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly() + +### undefined + +--- + +## The following error was caught while running the test: + +``` +AssertionError: expected 725 to equal 425 + at TableTestsAreDemo.whenDragTheSplitPaneTheTableIsResizedAccordingly [assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150);] (http://localhost:3000TableTestsAreDemo.tsx:64:16) +``` + +--- + + +There are 1 screenshots. [Go to first](#screenshot-1) + +## TableTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Scenario, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Table } from "fixed-data-table-2"; +/* 4*/import { ProvidingCustomTable } from "../stories/table/Table.stories"; +/* 5*/import { DEMO_TABLE_WIDTH, tableTestIds } from "../stories/table/TableScenarios"; +/* 6*/import { TABLE_OFFSET, timelineTestids as testids } from "../../../src/timeline"; +/* 7*/ +/* 8*/export class TableTestsAreDemo { +/* 9*/ async before() { +/*10*/ render(); +/*11*/ // When pressing run the second time the state of the scrollbars are not reset +/*12*/ // I thought that render() should reset its state, but it doesn't. +/*13*/ tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:0}); +/*14*/ // TODO DB By running the tests second time, the SplitPane test fails because we need to reset its position +/*15*/ // Maybe a general mechanism of test sate reset is needed +/*16*/ } +/*17*/ +/*18*/ @Scenario("Both table and gantt diagram have same rows height") +/*19*/ async bothTableAndGanttHaveSameRowHeight() { +/*20*/ // Nu le putem verifica pe toate caci gridul este virtualizat +/*21*/ for (var i = 0; i < 5; i++) { +/*22*/ let ganttRow = tad.screenCapturing.getByTestId(testids.row + "_" + i); +/*23*/ let tableCell = tad.screenCapturing.getByTestId(tableTestIds.row + "_" + i); +/*24*/ if (i < 4) { +/*25*/ tad.cc("Table row " + (i + 1) + " and gantt row " + (i + 1) + " have same height"); +/*26*/ } else { +/*27*/ tad.cc("And so on... "); +/*28*/ } +/*29*/ await tad.assertWaitable.equal(ganttRow.offsetHeight, (tableCell as HTMLElement).offsetHeight); +/*30*/ } +/*31*/ } +/*32*/ +/*33*/ @Scenario("When scrolling in gantt the table is scrolled") +/*34*/ async whenScrollInGanttThenTableIsScrolled() { +/*35*/ // We don't focus on last element captured because its height occupies the entire page +/*36*/ // And the message appears under the gantt and is hidded by the scroll mechanism +/*37*/ await tad.showSpotlight({ message: "Gantt is scrolled => Table is scrolled accordingly", focusOnLastElementCaptured: false }); +/*38*/ tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:100}); +/*39*/ +/*40*/ // This is needed in order for the scroll handler to be triggerd before the verification +/*41*/ await new Promise(r => setTimeout(r, 10)); +/*42*/ +/*43*/ // We "cheated" here because +/*44*/ // There is no strait forward way to see the scroll position by looking at the html elements +/*45*/ // Because the table has a special type of scrolling mechanism by absolute positioning (with translate3d) +/*46*/ // the rows. +/*47*/ // We could have looked at the position of the first row but it was offseted with the +/*48*/ // height of the header in order to appear right under it. So we should have placed a data-testid on the header also +/*49*/ // but being in a third library component this was not simple to implement +/*50*/ assert.equal((tad.getObjectViaCheat(Table) as Table).props.scrollTop, 100); +/*51*/ } +/*52*/ +/*53*/ @Scenario("When scrolling in table the gantt is scrolled") +``` + +
+ +```tsx +/*54*/ async whenScrollInTableThenGanttIsScrolled() { +/*55*/ await tad.showSpotlight({ message: "Table is scrolled => Gantt is scrolled accordingly", focusOnLastElementCaptured: false }); +/*56*/ (tad.getObjectViaCheat(Table) as Table).scrollActions.scrollToY(300); +/*57*/ assert.equal(tad.screenCapturing.getByTestId(testids.ganttBody).scrollTop, 300); +/*58*/ } +/*59*/ +/*60*/ @Scenario("When drag the split pane the table is resized accordingly") +/*61*/ async whenDragTheSplitPaneTheTableIsResizedAccordingly() { +/*62*/ tad.cc("Split pane resizer is dragged"); +/*63*/ await tad.drag(tad.screenCapturing.getByTestId(testids.splitPaneResizer), { delta: { x: 150, y: 0 }}); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly/Timeline_splitPaneResizer.png
+![](Timeline_splitPaneResizer.png) + +
+
+ +![](Timeline_splitPaneResizer_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*64*/ assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150); +/*65*/ } +/*66*/} +``` + +
diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/Table_row_0.png b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/Table_row_0.png new file mode 100644 index 00000000..af8da8e0 Binary files /dev/null and b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/Table_row_0.png differ diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/Table_row_0_small.png b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/Table_row_0_small.png new file mode 100644 index 00000000..18ea2202 Binary files /dev/null and b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/Table_row_0_small.png differ diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/recordedTest.json b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/recordedTest.json new file mode 100644 index 00000000..ecf39cb1 --- /dev/null +++ b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"Table_row_0","sourceFile":"TableTestsAreDemo.tsx","sourceLine":37}],"sourceFiles":{"TableTestsAreDemo.tsx":"import { Scenario, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Table } from \"fixed-data-table-2\";\nimport { ProvidingCustomTable } from \"../stories/table/Table.stories\";\nimport { DEMO_TABLE_WIDTH, tableTestIds } from \"../stories/table/TableScenarios\";\nimport { TABLE_OFFSET, timelineTestids as testids } from \"../../../src/timeline\";\n\nexport class TableTestsAreDemo {\n async before() {\n render();\n // When pressing run the second time the state of the scrollbars are not reset\n // I thought that render() should reset its state, but it doesn't.\n tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:0});\n // TODO DB By running the tests second time, the SplitPane test fails because we need to reset its position\n // Maybe a general mechanism of test sate reset is needed\n }\n \n @Scenario(\"Both table and gantt diagram have same rows height\")\n async bothTableAndGanttHaveSameRowHeight() {\n // Nu le putem verifica pe toate caci gridul este virtualizat\n for (var i = 0; i < 5; i++) {\n let ganttRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + i);\n let tableCell = tad.screenCapturing.getByTestId(tableTestIds.row + \"_\" + i);\n if (i < 4) { \n tad.cc(\"Table row \" + (i + 1) + \" and gantt row \" + (i + 1) + \" have same height\");\n } else {\n tad.cc(\"And so on... \");\n }\n await tad.assertWaitable.equal(ganttRow.offsetHeight, (tableCell as HTMLElement).offsetHeight);\n }\n }\n\n @Scenario(\"When scrolling in gantt the table is scrolled\")\n async whenScrollInGanttThenTableIsScrolled() {\n // We don't focus on last element captured because its height occupies the entire page\n // And the message appears under the gantt and is hidded by the scroll mechanism \n await tad.showSpotlight({ message: \"Gantt is scrolled => Table is scrolled accordingly\", focusOnLastElementCaptured: false });\n tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:100});\n \n // This is needed in order for the scroll handler to be triggerd before the verification \n await new Promise(r => setTimeout(r, 10));\n\n // We \"cheated\" here because\n // There is no strait forward way to see the scroll position by looking at the html elements\n // Because the table has a special type of scrolling mechanism by absolute positioning (with translate3d) \n // the rows. \n // We could have looked at the position of the first row but it was offseted with the\n // height of the header in order to appear right under it. So we should have placed a data-testid on the header also\n // but being in a third library component this was not simple to implement\n assert.equal((tad.getObjectViaCheat(Table) as Table).props.scrollTop, 100);\n }\n\n @Scenario(\"When scrolling in table the gantt is scrolled\")\n async whenScrollInTableThenGanttIsScrolled() {\n await tad.showSpotlight({ message: \"Table is scrolled => Gantt is scrolled accordingly\", focusOnLastElementCaptured: false });\n (tad.getObjectViaCheat(Table) as Table).scrollActions.scrollToY(300);\n assert.equal(tad.screenCapturing.getByTestId(testids.ganttBody).scrollTop, 300);\n }\n\n @Scenario(\"When drag the split pane the table is resized accordingly\")\n async whenDragTheSplitPaneTheTableIsResizedAccordingly() {\n tad.cc(\"Split pane resizer is dragged\");\n await tad.drag(tad.screenCapturing.getByTestId(testids.splitPaneResizer), { delta: { x: 150, y: 0 }});\n assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150);\n }\n}"},"duration":212} \ No newline at end of file diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/report.md b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/report.md new file mode 100644 index 00000000..15387d45 --- /dev/null +++ b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/report.md @@ -0,0 +1,114 @@ + +# TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled() + +### undefined + +--- + +There are 1 screenshots. [Go to first](#screenshot-1) + +## TableTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Scenario, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Table } from "fixed-data-table-2"; +/* 4*/import { ProvidingCustomTable } from "../stories/table/Table.stories"; +/* 5*/import { DEMO_TABLE_WIDTH, tableTestIds } from "../stories/table/TableScenarios"; +/* 6*/import { TABLE_OFFSET, timelineTestids as testids } from "../../../src/timeline"; +/* 7*/ +/* 8*/export class TableTestsAreDemo { +/* 9*/ async before() { +/*10*/ render(); +/*11*/ // When pressing run the second time the state of the scrollbars are not reset +/*12*/ // I thought that render() should reset its state, but it doesn't. +/*13*/ tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:0}); +/*14*/ // TODO DB By running the tests second time, the SplitPane test fails because we need to reset its position +/*15*/ // Maybe a general mechanism of test sate reset is needed +/*16*/ } +/*17*/ +/*18*/ @Scenario("Both table and gantt diagram have same rows height") +/*19*/ async bothTableAndGanttHaveSameRowHeight() { +/*20*/ // Nu le putem verifica pe toate caci gridul este virtualizat +/*21*/ for (var i = 0; i < 5; i++) { +/*22*/ let ganttRow = tad.screenCapturing.getByTestId(testids.row + "_" + i); +/*23*/ let tableCell = tad.screenCapturing.getByTestId(tableTestIds.row + "_" + i); +/*24*/ if (i < 4) { +/*25*/ tad.cc("Table row " + (i + 1) + " and gantt row " + (i + 1) + " have same height"); +/*26*/ } else { +/*27*/ tad.cc("And so on... "); +``` + +
+ +```tsx +/*28*/ } +/*29*/ await tad.assertWaitable.equal(ganttRow.offsetHeight, (tableCell as HTMLElement).offsetHeight); +/*30*/ } +/*31*/ } +/*32*/ +/*33*/ @Scenario("When scrolling in gantt the table is scrolled") +/*34*/ async whenScrollInGanttThenTableIsScrolled() { +/*35*/ // We don't focus on last element captured because its height occupies the entire page +/*36*/ // And the message appears under the gantt and is hidded by the scroll mechanism +/*37*/ await tad.showSpotlight({ message: "Gantt is scrolled => Table is scrolled accordingly", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled/Table_row_0.png
+![](Table_row_0.png) + +
+
+ +![](Table_row_0_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*38*/ tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:100}); +/*39*/ +/*40*/ // This is needed in order for the scroll handler to be triggerd before the verification +/*41*/ await new Promise(r => setTimeout(r, 10)); +/*42*/ +/*43*/ // We "cheated" here because +/*44*/ // There is no strait forward way to see the scroll position by looking at the html elements +/*45*/ // Because the table has a special type of scrolling mechanism by absolute positioning (with translate3d) +/*46*/ // the rows. +/*47*/ // We could have looked at the position of the first row but it was offseted with the +/*48*/ // height of the header in order to appear right under it. So we should have placed a data-testid on the header also +/*49*/ // but being in a third library component this was not simple to implement +/*50*/ assert.equal((tad.getObjectViaCheat(Table) as Table).props.scrollTop, 100); +/*51*/ } +/*52*/ +/*53*/ @Scenario("When scrolling in table the gantt is scrolled") +/*54*/ async whenScrollInTableThenGanttIsScrolled() { +/*55*/ await tad.showSpotlight({ message: "Table is scrolled => Gantt is scrolled accordingly", focusOnLastElementCaptured: false }); +/*56*/ (tad.getObjectViaCheat(Table) as Table).scrollActions.scrollToY(300); +/*57*/ assert.equal(tad.screenCapturing.getByTestId(testids.ganttBody).scrollTop, 300); +/*58*/ } +/*59*/ +/*60*/ @Scenario("When drag the split pane the table is resized accordingly") +/*61*/ async whenDragTheSplitPaneTheTableIsResizedAccordingly() { +/*62*/ tad.cc("Split pane resizer is dragged"); +/*63*/ await tad.drag(tad.screenCapturing.getByTestId(testids.splitPaneResizer), { delta: { x: 150, y: 0 }}); +/*64*/ assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150); +/*65*/ } +/*66*/} +``` + +
diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/_LAP.png b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/_LAP.png new file mode 100644 index 00000000..28618fd0 Binary files /dev/null and b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/_LAP.png differ diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/_LAP_small.png b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/_LAP_small.png new file mode 100644 index 00000000..28618fd0 Binary files /dev/null and b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/_LAP_small.png differ diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/recordedTest.json b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/recordedTest.json new file mode 100644 index 00000000..cee6521c --- /dev/null +++ b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/recordedTest.json @@ -0,0 +1 @@ +{"slides":[{"screenshot":"_LAP","sourceFile":"TableTestsAreDemo.tsx","sourceLine":55}],"sourceFiles":{"TableTestsAreDemo.tsx":"import { Scenario, render, tad } from \"@famiprog-foundation/tests-are-demo\";\nimport { assert } from \"chai\";\nimport { Table } from \"fixed-data-table-2\";\nimport { ProvidingCustomTable } from \"../stories/table/Table.stories\";\nimport { DEMO_TABLE_WIDTH, tableTestIds } from \"../stories/table/TableScenarios\";\nimport { TABLE_OFFSET, timelineTestids as testids } from \"../../../src/timeline\";\n\nexport class TableTestsAreDemo {\n async before() {\n render();\n // When pressing run the second time the state of the scrollbars are not reset\n // I thought that render() should reset its state, but it doesn't.\n tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:0});\n // TODO DB By running the tests second time, the SplitPane test fails because we need to reset its position\n // Maybe a general mechanism of test sate reset is needed\n }\n \n @Scenario(\"Both table and gantt diagram have same rows height\")\n async bothTableAndGanttHaveSameRowHeight() {\n // Nu le putem verifica pe toate caci gridul este virtualizat\n for (var i = 0; i < 5; i++) {\n let ganttRow = tad.screenCapturing.getByTestId(testids.row + \"_\" + i);\n let tableCell = tad.screenCapturing.getByTestId(tableTestIds.row + \"_\" + i);\n if (i < 4) { \n tad.cc(\"Table row \" + (i + 1) + \" and gantt row \" + (i + 1) + \" have same height\");\n } else {\n tad.cc(\"And so on... \");\n }\n await tad.assertWaitable.equal(ganttRow.offsetHeight, (tableCell as HTMLElement).offsetHeight);\n }\n }\n\n @Scenario(\"When scrolling in gantt the table is scrolled\")\n async whenScrollInGanttThenTableIsScrolled() {\n // We don't focus on last element captured because its height occupies the entire page\n // And the message appears under the gantt and is hidded by the scroll mechanism \n await tad.showSpotlight({ message: \"Gantt is scrolled => Table is scrolled accordingly\", focusOnLastElementCaptured: false });\n tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:100});\n \n // This is needed in order for the scroll handler to be triggerd before the verification \n await new Promise(r => setTimeout(r, 10));\n\n // We \"cheated\" here because\n // There is no strait forward way to see the scroll position by looking at the html elements\n // Because the table has a special type of scrolling mechanism by absolute positioning (with translate3d) \n // the rows. \n // We could have looked at the position of the first row but it was offseted with the\n // height of the header in order to appear right under it. So we should have placed a data-testid on the header also\n // but being in a third library component this was not simple to implement\n assert.equal((tad.getObjectViaCheat(Table) as Table).props.scrollTop, 100);\n }\n\n @Scenario(\"When scrolling in table the gantt is scrolled\")\n async whenScrollInTableThenGanttIsScrolled() {\n await tad.showSpotlight({ message: \"Table is scrolled => Gantt is scrolled accordingly\", focusOnLastElementCaptured: false });\n (tad.getObjectViaCheat(Table) as Table).scrollActions.scrollToY(300);\n assert.equal(tad.screenCapturing.getByTestId(testids.ganttBody).scrollTop, 300);\n }\n\n @Scenario(\"When drag the split pane the table is resized accordingly\")\n async whenDragTheSplitPaneTheTableIsResizedAccordingly() {\n tad.cc(\"Split pane resizer is dragged\");\n await tad.drag(tad.screenCapturing.getByTestId(testids.splitPaneResizer), { delta: { x: 150, y: 0 }});\n assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150);\n }\n}"},"duration":192} \ No newline at end of file diff --git a/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/report.md b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/report.md new file mode 100644 index 00000000..4dbe0afd --- /dev/null +++ b/demo-app/public/recordedTests/TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/report.md @@ -0,0 +1,114 @@ + +# TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled() + +### undefined + +--- + +There are 1 screenshots. [Go to first](#screenshot-1) + +## TableTestsAreDemo.tsx + +
Click to expand the hidden lines of code + +```tsx +/* 1*/import { Scenario, render, tad } from "@famiprog-foundation/tests-are-demo"; +/* 2*/import { assert } from "chai"; +/* 3*/import { Table } from "fixed-data-table-2"; +/* 4*/import { ProvidingCustomTable } from "../stories/table/Table.stories"; +/* 5*/import { DEMO_TABLE_WIDTH, tableTestIds } from "../stories/table/TableScenarios"; +/* 6*/import { TABLE_OFFSET, timelineTestids as testids } from "../../../src/timeline"; +/* 7*/ +/* 8*/export class TableTestsAreDemo { +/* 9*/ async before() { +/*10*/ render(); +/*11*/ // When pressing run the second time the state of the scrollbars are not reset +/*12*/ // I thought that render() should reset its state, but it doesn't. +/*13*/ tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:0}); +/*14*/ // TODO DB By running the tests second time, the SplitPane test fails because we need to reset its position +/*15*/ // Maybe a general mechanism of test sate reset is needed +/*16*/ } +/*17*/ +/*18*/ @Scenario("Both table and gantt diagram have same rows height") +/*19*/ async bothTableAndGanttHaveSameRowHeight() { +/*20*/ // Nu le putem verifica pe toate caci gridul este virtualizat +/*21*/ for (var i = 0; i < 5; i++) { +/*22*/ let ganttRow = tad.screenCapturing.getByTestId(testids.row + "_" + i); +/*23*/ let tableCell = tad.screenCapturing.getByTestId(tableTestIds.row + "_" + i); +/*24*/ if (i < 4) { +/*25*/ tad.cc("Table row " + (i + 1) + " and gantt row " + (i + 1) + " have same height"); +/*26*/ } else { +/*27*/ tad.cc("And so on... "); +/*28*/ } +/*29*/ await tad.assertWaitable.equal(ganttRow.offsetHeight, (tableCell as HTMLElement).offsetHeight); +/*30*/ } +/*31*/ } +/*32*/ +/*33*/ @Scenario("When scrolling in gantt the table is scrolled") +/*34*/ async whenScrollInGanttThenTableIsScrolled() { +/*35*/ // We don't focus on last element captured because its height occupies the entire page +/*36*/ // And the message appears under the gantt and is hidded by the scroll mechanism +/*37*/ await tad.showSpotlight({ message: "Gantt is scrolled => Table is scrolled accordingly", focusOnLastElementCaptured: false }); +/*38*/ tad.screenCapturing.getByTestId(testids.ganttBody).scroll({top:100}); +/*39*/ +/*40*/ // This is needed in order for the scroll handler to be triggerd before the verification +/*41*/ await new Promise(r => setTimeout(r, 10)); +/*42*/ +/*43*/ // We "cheated" here because +/*44*/ // There is no strait forward way to see the scroll position by looking at the html elements +/*45*/ // Because the table has a special type of scrolling mechanism by absolute positioning (with translate3d) +``` + +
+ +```tsx +/*46*/ // the rows. +/*47*/ // We could have looked at the position of the first row but it was offseted with the +/*48*/ // height of the header in order to appear right under it. So we should have placed a data-testid on the header also +/*49*/ // but being in a third library component this was not simple to implement +/*50*/ assert.equal((tad.getObjectViaCheat(Table) as Table).props.scrollTop, 100); +/*51*/ } +/*52*/ +/*53*/ @Scenario("When scrolling in table the gantt is scrolled") +/*54*/ async whenScrollInTableThenGanttIsScrolled() { +/*55*/ await tad.showSpotlight({ message: "Table is scrolled => Gantt is scrolled accordingly", focusOnLastElementCaptured: false }); +``` + + + + +
+ +### Screenshot 1 + + + +
Click to expand full image + +TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled/_LAP.png
+![](_LAP.png) + +
+
+ +![](_LAP_small.png) + +
+ +
Click to expand the hidden lines of code + +```tsx +/*56*/ (tad.getObjectViaCheat(Table) as Table).scrollActions.scrollToY(300); +/*57*/ assert.equal(tad.screenCapturing.getByTestId(testids.ganttBody).scrollTop, 300); +/*58*/ } +/*59*/ +/*60*/ @Scenario("When drag the split pane the table is resized accordingly") +/*61*/ async whenDragTheSplitPaneTheTableIsResizedAccordingly() { +/*62*/ tad.cc("Split pane resizer is dragged"); +/*63*/ await tad.drag(tad.screenCapturing.getByTestId(testids.splitPaneResizer), { delta: { x: 150, y: 0 }}); +/*64*/ assert.equal((tad.getObjectViaCheat(Table) as Table).props.width, DEMO_TABLE_WIDTH + TABLE_OFFSET + 150); +/*65*/ } +/*66*/} +``` + +
diff --git a/demo-app/public/recordedTests/recordedTestsIndex.json b/demo-app/public/recordedTests/recordedTestsIndex.json new file mode 100644 index 00000000..bf37837a --- /dev/null +++ b/demo-app/public/recordedTests/recordedTestsIndex.json @@ -0,0 +1 @@ +["DragToCreateTestsAreDemo/whenClickMenuButton","DragToCreateTestsAreDemo/whenClickAddMenuEntry","DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickCancel","DragToCreateTestsAreDemo/givenDragToCreateModeWhenClickAndDrag","DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenRightClick","DragToCreateTestsAreDemo/givenDragToCreateModeInProgressWhenMouseUp","DragToCreateTestsAreDemo/whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot","SelectedItemsTestsAreDemo/whenClickOnASegment","SelectedItemsTestsAreDemo/whenClickAnotherSegment","SelectedItemsTestsAreDemo/whenCTRLClickOnASegment","SelectedItemsTestsAreDemo/whenCTRLClickOnASelectedSegment","SelectedItemsTestsAreDemo/whenCTRLClickOutside","SelectedItemsTestsAreDemo/whenClickOutside","SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverTwoSegments","SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnotherSegment","SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnotherSegment","SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAlreadySelectedSegment","SelectedItemsTestsAreDemo/whenCTRLDragASelectionRectangleOverAnEmptyArea","SelectedItemsTestsAreDemo/whenDragASelectionRectangleOverAnEmptyArea","ContextMenuTestsAreDemo/whenRightClickOnARow","ContextMenuTestsAreDemo/whenClickAnAction","ContextMenuTestsAreDemo/whenRightClickOnASegment","ContextMenuTestsAreDemo/whenCTRLRightClickOnAnotherSegment","ContextMenuTestsAreDemo/whenClickTheHamburgerButton","TableTestsAreDemo/bothTableAndGanttHaveSameRowHeight","TableTestsAreDemo/whenScrollInGanttThenTableIsScrolled","TableTestsAreDemo/whenScrollInTableThenGanttIsScrolled","TableTestsAreDemo/whenDragTheSplitPaneTheTableIsResizedAccordingly","DynamicConfigurationTestsAreDemo/whenStartEndDateChanges","BackgroundLayersTestsAreDemo/highlightedIntervalsAreDisplayed"] \ No newline at end of file diff --git a/demo-app/public/recordedTests/testClassDescriptors.json b/demo-app/public/recordedTests/testClassDescriptors.json new file mode 100644 index 00000000..e1a07265 --- /dev/null +++ b/demo-app/public/recordedTests/testClassDescriptors.json @@ -0,0 +1 @@ +[{"name":"DragToCreateTestsAreDemo","functions":[{"functionName":"whenClickMenuButton","scenario":"WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry","comments":[]},{"functionName":"whenClickAddMenuEntry","scenario":"WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears","comments":[]},{"functionName":"givenDragToCreateModeWhenClickCancel","scenario":"GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled","comments":[]},{"functionName":"givenDragToCreateModeWhenClickAndDrag","scenario":"GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears","comments":[]},{"functionName":"givenDragToCreateModeInProgressWhenRightClick","scenario":"GIVEN drag to create in progress, WHEN right click, THEN cancel","comments":[]},{"functionName":"givenDragToCreateModeInProgressWhenMouseUp","scenario":"GIVEN drag to create in progress, WHEN mouse up, THEN handler is called","comments":[]},{"functionName":"whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot","scenario":"WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created","comments":[]}],"hooks":["before"]},{"name":"SelectedItemsTestsAreDemo","functions":[{"functionName":"whenClickOnASegment","scenario":"WHEN click on a segment, THEN only that segment is selected","comments":[]},{"functionName":"whenClickAnotherSegment","scenario":"WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)","comments":[]},{"functionName":"whenCTRLClickOnASegment","scenario":"WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected","comments":[]},{"functionName":"whenCTRLClickOnASelectedSegment","scenario":"WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected","comments":[]},{"functionName":"whenCTRLClickOutside","scenario":"WHEN CTRL + click outside segments, THEN the selection doesn't change","comments":[]},{"functionName":"whenClickOutside","scenario":"WHEN click outside segments, THEN the selection becomes empty","comments":[]},{"functionName":"whenDragASelectionRectangleOverTwoSegments","scenario":"WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected","comments":[]},{"functionName":"whenDragASelectionRectangleOverAnotherSegment","scenario":"WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more","comments":[]},{"functionName":"whenCTRLDragASelectionRectangleOverAnotherSegment","scenario":"WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected","comments":[]},{"functionName":"whenCTRLDragASelectionRectangleOverAlreadySelectedSegment","scenario":"WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected","comments":[]},{"functionName":"whenCTRLDragASelectionRectangleOverAnEmptyArea","scenario":"WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change","comments":[]},{"functionName":"whenDragASelectionRectangleOverAnEmptyArea","scenario":"WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty","comments":[]}],"hooks":["before"]},{"name":"ContextMenuTestsAreDemo","functions":[{"functionName":"whenRightClickOnARow","scenario":"WHEN I right click on a row, THEN a context menu with one action opens","comments":[]},{"functionName":"whenClickAnAction","scenario":"WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)","comments":[]},{"functionName":"whenRightClickOnASegment","scenario":"WHEN I right click on a segment, THEN a context menu with 3 actions is shown","comments":[]},{"functionName":"whenCTRLRightClickOnAnotherSegment","scenario":"WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown","comments":[]},{"functionName":"whenClickTheHamburgerButton","scenario":"WHEN I click the hamburger button, THEN the context menu is shown besides that button","comments":[]}],"hooks":["before"]},{"name":"TableTestsAreDemo","functions":[{"functionName":"bothTableAndGanttHaveSameRowHeight","scenario":"Both table and gantt diagram have same rows height","comments":[]},{"functionName":"whenScrollInGanttThenTableIsScrolled","scenario":"When scrolling in gantt the table is scrolled","comments":[]},{"functionName":"whenScrollInTableThenGanttIsScrolled","scenario":"When scrolling in table the gantt is scrolled","comments":[]},{"functionName":"whenDragTheSplitPaneTheTableIsResizedAccordingly","scenario":"When drag the split pane the table is resized accordingly","comments":[]}],"hooks":["before"]},{"name":"DynamicConfigurationTestsAreDemo","functions":[{"functionName":"whenStartEndDateChanges","scenario":"WHEN I change the startDate/endDate properties THEN the new interval is displayed","comments":[]}],"hooks":["before"]},{"name":"BackgroundLayersTestsAreDemo","functions":[{"functionName":"highlightedIntervalsAreDisplayed","scenario":"The highlighted intervals are correctly displayed","comments":[]}],"hooks":["before"]}] \ No newline at end of file diff --git a/src/demo.js b/demo-app/src/demo.js similarity index 68% rename from src/demo.js rename to demo-app/src/demo.js index c829b924..4da4c9da 100644 --- a/src/demo.js +++ b/demo-app/src/demo.js @@ -1,20 +1,19 @@ 'use strict'; -import React, {Component} from 'react'; -import moment from 'moment'; +import {Cell} from 'fixed-data-table-2'; +import React, {Fragment} from 'react'; import _ from 'lodash'; +import moment from 'moment'; +import {Component} from 'react'; -import Timeline from './timeline'; -import { - customItemRenderer, - customGroupRenderer, - CustomCellRenderer, - CustomColumnHeaderRenderer -} from './demo/customRenderers'; +import { Timeline, ItemRenderer, ZOOM_IN, ZOOM_OUT } from "@famiprog-foundation/react-gantt"; -import {Layout, Form, InputNumber, Button, DatePicker, Checkbox, Switch, Icon} from 'antd'; +import {Button, Checkbox, DatePicker, Form, InputNumber, Switch} from 'antd'; import 'antd/dist/antd.css'; -import './style.css'; + +import {Table, Column, DataCell} from 'fixed-data-table-2'; +import {CustomItemRenderer} from './demo/customRenderers'; +import {generateRandomRowsAndItems} from './stories/sampleData'; const {TIMELINE_MODES} = Timeline; @@ -22,6 +21,14 @@ const ITEM_DURATIONS = [moment.duration(6, 'hours'), moment.duration(12, 'hours' const COLORS = ['#0099cc', '#f03a36', '#06ad96', '#fce05b', '#dd5900', '#cc6699']; +const headerStyle = { + color: '#000', + fontSize: '12px', + lineHeight: '1', + background: '#CCFFEE', + border: 'none' +}; + // Moment timezones can be enabled using the following // import moment from 'moment-timezone'; // moment.locale('en-au'); @@ -41,11 +48,15 @@ export default class DemoTimeline extends Component { snap: 60, startDate, endDate, + minDate: moment('2018-07-31'), + maxDate: moment('2018-10-30'), message: '', timelineMode: TIMELINE_MODES.SELECT | TIMELINE_MODES.DRAG | TIMELINE_MODES.RESIZE, - multipleColumnsMode: false, + useTable: true, + zoomEnabled: true, useMoment: true }; + this.timelineRef = React.createRef(); this.reRender = this.reRender.bind(this); this.zoomIn = this.zoomIn.bind(this); this.zoomOut = this.zoomOut.bind(this); @@ -54,7 +65,9 @@ export default class DemoTimeline extends Component { this.toggleDraggable = this.toggleDraggable.bind(this); this.toggleResizable = this.toggleResizable.bind(this); this.toggleUseMoment = this.toggleUseMoment.bind(this); - this.toggleMultipleColumnsMode = this.toggleMultipleColumnsMode.bind(this); + this.toggleUseTable = this.toggleUseTable.bind(this); + this.toggleZoomEnabled = this.toggleZoomEnabled.bind(this); + this.scrollToRandomItem = this.scrollToRandomItem.bind(this); } componentWillMount() { @@ -62,71 +75,19 @@ export default class DemoTimeline extends Component { } reRender(useMoment = this.state.useMoment) { - const list = []; - const groups = []; const {snap} = this.state; - - this.key = 0; - for (let i = 0; i < this.state.rows; i++) { - groups.push({id: i, title: `Row ${i}`, description: `Description for row ${i}`}); - for (let j = 0; j < this.state.items_per_row; j++) { - this.key += 1; - const color = COLORS[(i + j) % COLORS.length]; - const duration = ITEM_DURATIONS[Math.floor(Math.random() * ITEM_DURATIONS.length)]; - // let start = last_moment; - let start = moment( - Math.floor( - Math.random() * (this.state.endDate.valueOf() - this.state.startDate.valueOf()) + - this.state.startDate.valueOf() - ) - ); - let end = start.clone().add(duration); - - // Round to the nearest snap distance - const roundedStartSeconds = Math.floor(start.second() / snap) * snap; - const roundedEndSeconds = Math.floor(end.second() / snap) * snap; - start.second(roundedStartSeconds); - end.second(roundedEndSeconds); - - list.push({ - key: this.key, - title: duration.humanize(), - color, - row: i, - start: useMoment ? start : start.valueOf(), - end: useMoment ? end : end.valueOf() - }); - } - } - - const tableColumns = [ - // default renderers - { - width: 100, - headerLabel: 'Title', - labelProperty: 'title' - }, - // custom renderers: react elements - { - width: 250, - cellRenderer: Checkbox, - headerRenderer: ( - - Custom check - - ) - }, - // custom renderers: class component - { - width: 100, - headerRenderer: CustomColumnHeaderRenderer, - cellRenderer: CustomCellRenderer - } - ]; - + const [groups, items] = generateRandomRowsAndItems( + this.state.rows, + this.state.items_per_row, + useMoment, + snap, + this.state.minDate, + this.state.maxDate + ); + // this.state = {selectedItems: [11, 12], groups, items: list}; this.forceUpdate(); - this.setState({items: list, groups, tableColumns, useMoment}); + this.setState({items: items, groups, useMoment}); } handleRowClick = (e, rowNumber, clickedTime, snappedClickedTime) => { @@ -134,14 +95,10 @@ export default class DemoTimeline extends Component { this.setState({selectedItems: [], message}); }; zoomIn() { - let currentMilliseconds = this.state.endDate.diff(this.state.startDate, 'milliseconds'); - let newSec = currentMilliseconds / 2; - this.setState({endDate: this.state.startDate.clone().add(newSec, 'milliseconds')}); + this.timelineRef.current.zoom(ZOOM_IN); } zoomOut() { - let currentMilliseconds = this.state.endDate.diff(this.state.startDate, 'milliseconds'); - let newSec = currentMilliseconds * 2; - this.setState({endDate: this.state.startDate.clone().add(newSec, 'milliseconds')}); + this.timelineRef.current.zoom(ZOOM_OUT); } toggleCustomRenderers(checked) { @@ -167,10 +124,37 @@ export default class DemoTimeline extends Component { const {useMoment} = this.state; this.reRender(!useMoment); } - toggleMultipleColumnsMode() { - const {multipleColumnsMode} = this.state; - this.setState({multipleColumnsMode: !multipleColumnsMode}); + + toggleUseTable() { + const {useTable} = this.state; + this.setState({useTable: !useTable}); } + + toggleZoomEnabled() { + const {zoomEnabled} = this.state; + if (!zoomEnabled) { + // Here, we could directly set the `zoomEnabled` to `true`. + // We set it to a function only to demonstration purposes. + this.setState({zoomEnabled: () => true}); + } else { + this.setState({zoomEnabled: false}); + } + } + + scrollToRandomItem() { + const { items } = this.state; + if (!items || items.length === 0) { + this.setState({ message: 'No items to scroll to.' }); + return; + } + + const randomIndex = Math.floor(Math.random() * items.length); + const randomItem = items[randomIndex]; + + this.timelineRef.current.scrollToItem(randomItem.key); + this.setState({ message: `Scrolled to item: ${randomItem.key} (${randomItem.title || 'No title'})` }); + } + handleItemClick = (e, key) => { const message = `Item Click ${key}`; const {selectedItems} = this.state; @@ -178,12 +162,11 @@ export default class DemoTimeline extends Component { let newSelection = selectedItems.slice(); // If the item is already selected, then unselected - const idx = selectedItems.indexOf(key); - if (idx > -1) { - // Splice modifies in place and returns removed elements - newSelection.splice(idx, 1); + const isSelected = selectedItems.find(item => item == key); + if (isSelected) { + newSelection = newSelection.filter(item => item != key); } else { - newSelection.push(Number(key)); + newSelection.push(key); } this.setState({selectedItems: newSelection, message}); @@ -286,22 +269,26 @@ export default class DemoTimeline extends Component { snap, startDate, endDate, + minDate, + maxDate, items, groups, message, useCustomRenderers, timelineMode, useMoment, - multipleColumnsMode, - tableColumns + useTable, + zoomEnabled } = this.state; const rangeValue = [startDate, endDate]; + const minMaxRangeValue = [minDate, maxDate]; const selectable = (TIMELINE_MODES.SELECT & timelineMode) === TIMELINE_MODES.SELECT; const draggable = (TIMELINE_MODES.DRAG & timelineMode) === TIMELINE_MODES.DRAG; const resizeable = (TIMELINE_MODES.RESIZE & timelineMode) === TIMELINE_MODES.RESIZE; const rowLayers = []; + for (let i = 0; i < rows; i += 1) { if (i % 5 === 0 && i !== 0) { continue; @@ -333,7 +320,6 @@ export default class DemoTimeline extends Component { curDate.add(bandDuration, 'days'); } } - return (
@@ -357,6 +343,16 @@ export default class DemoTimeline extends Component { }} /> + + { + this.setState({minDate: e[0], maxDate: e[1]}, () => this.reRender()); + }} + /> + +
Debug: @@ -403,13 +409,53 @@ export default class DemoTimeline extends Component {
+ Title} + cell={({rowIndex}) => {rowIndex < groups.length ? groups[rowIndex].title : ''}} + /> + + Custom check + + } + cell={({rowIndex}) => ( + {rowIndex < groups.length ? Checkbox : ''} + )} + /> + Description} + cell={({rowIndex}) => ( + {rowIndex < groups.length ? groups[rowIndex].description : ''} + )} + /> + + ) : ( + undefined + ) + } rowLayers={rowLayers} selectedItems={selectedItems} timelineMode={timelineMode} @@ -421,9 +467,7 @@ export default class DemoTimeline extends Component { onRowClick={this.handleRowClick} onRowContextClick={this.handleRowContextClick} onRowDoubleClick={this.handleRowDoubleClick} - itemRenderer={useCustomRenderers ? customItemRenderer : undefined} - groupRenderer={useCustomRenderers ? customGroupRenderer : undefined} - groupTitleRenderer={useCustomRenderers ? () =>
Group title
: undefined} + itemRenderer={useCustomRenderers ? CustomItemRenderer : ItemRenderer} />
); diff --git a/demo-app/src/demo/customRenderers.js b/demo-app/src/demo/customRenderers.js new file mode 100644 index 00000000..ae901525 --- /dev/null +++ b/demo-app/src/demo/customRenderers.js @@ -0,0 +1,25 @@ +import React from 'react'; +import { ItemRenderer } from '@famiprog-foundation/react-gantt'; + +export class CustomItemRenderer extends ItemRenderer { + getBackgroundGradient() { + return this.getColor(); + } + + getStyle() { + let style = super.getStyle(); + if (this.props.row % 5 === 0) { + style.border = '1px solid black'; + } + return style; + } + + getTitle() { + return `${this.props.item.start.format('HH:mm')} - ${this.props.item.end.format('HH:mm')}`; + } +} +export class CustomCellRenderer extends React.Component { + render() { + return {this.props.group.description}; + } +} diff --git a/demo-app/src/demo_index.js b/demo-app/src/demo_index.js new file mode 100644 index 00000000..52cb5b44 --- /dev/null +++ b/demo-app/src/demo_index.js @@ -0,0 +1,39 @@ +'use strict'; + +import React from 'react'; +import ReactDOM from 'react-dom'; + +import './stories/storybook.css'; +import '@famiprog-foundation/react-gantt/style.css'; + +import DemoTimeline from './demo'; +import {TestsAreDemoAppWrapper} from '@famiprog-foundation/tests-are-demo'; +import {tad} from '@famiprog-foundation/tests-are-demo'; +import {DragToCreateTestsAreDemo} from './testsAreDemo/DragToCreateTestsAreDemo'; +import {TableTestsAreDemo} from './testsAreDemo/TableTestsAreDemo'; +import {SelectedItemsTestsAreDemo} from './testsAreDemo/SelectedItemsTestsAreDemo'; +import {ContextMenuTestsAreDemo} from './testsAreDemo/ContextMenuTestsAreDemo'; +import {DynamicConfigurationTestsAreDemo} from './testsAreDemo/DynamicConfigurationTestsAreDemo'; +import { BackgroundLayersTestsAreDemo } from './testsAreDemo/BackgroundLayersTestsAreDemo'; +import { DisplayItemOnSeparateRowIfOverlapTestsAreDemo } from './testsAreDemo/DisplayItemOnSeparateRowIfOverlapTestsAreDemo'; +import { ZoomTestsAreDemo } from './testsAreDemo/ZoomTestsAreDemo'; + +ReactDOM.render( + } + importTestsCallback={() => { + tad.addTests( + DragToCreateTestsAreDemo, + SelectedItemsTestsAreDemo, + ContextMenuTestsAreDemo, + TableTestsAreDemo, + DynamicConfigurationTestsAreDemo, + BackgroundLayersTestsAreDemo, + DisplayItemOnSeparateRowIfOverlapTestsAreDemo, + ZoomTestsAreDemo + ); + }} + />, + document.getElementById('root') +); diff --git a/demo-app/src/stories/ApiDoc.stories.mdx b/demo-app/src/stories/ApiDoc.stories.mdx new file mode 100644 index 00000000..da292f7f --- /dev/null +++ b/demo-app/src/stories/ApiDoc.stories.mdx @@ -0,0 +1,24 @@ +import { Meta } from '@storybook/addon-docs'; + +{/* "Canvas" tab is not needed, show only "Docs" tab */} + + +{/* We use parent.window because we are already inside an iframe.*/} + \ No newline at end of file diff --git a/demo-app/src/stories/DemoTimeline.stories.mdx b/demo-app/src/stories/DemoTimeline.stories.mdx new file mode 100644 index 00000000..5599b674 --- /dev/null +++ b/demo-app/src/stories/DemoTimeline.stories.mdx @@ -0,0 +1,22 @@ +import { Canvas, Meta, Story, ArgsTable, Description } from '@storybook/addon-docs'; +import moment from 'moment'; +import DemoTimeline from '../demo'; +import { Timeline } from '@famiprog-foundation/react-gantt'; + +{/* "Docs" tab is not needed, show only "Canvas" tab */} + + + + + + + \ No newline at end of file diff --git a/demo-app/src/stories/StorybookUtils.js b/demo-app/src/stories/StorybookUtils.js new file mode 100644 index 00000000..85029440 --- /dev/null +++ b/demo-app/src/stories/StorybookUtils.js @@ -0,0 +1,22 @@ +/** + * It returns an URI to API Doc story. + * Furthermore, it receives a subpath to reference a component/method from + * API documentation. + * + * @param {string} subpath + */ +export const encodeApiDocURIForSubpath = subpath => { + return '?path=/docs/api-doc--page&subpath=' + encodeURIComponent(subpath); +}; + +export const parametersDocPage = { + viewMode: 'docs', + previewTabs: { + 'storybook/docs/panel': { + hidden: false + }, + canvas: { + hidden: true + } + } +}; diff --git a/src/stories/Timeline.stories.jsx b/demo-app/src/stories/Timeline.stories.jsx similarity index 96% rename from src/stories/Timeline.stories.jsx rename to demo-app/src/stories/Timeline.stories.jsx index b7502b1e..831be01b 100644 --- a/src/stories/Timeline.stories.jsx +++ b/demo-app/src/stories/Timeline.stories.jsx @@ -2,11 +2,11 @@ import React from 'react'; import moment from 'moment'; import DemoTimeline from '../demo'; -import Timeline from '../timeline'; -import {Alert} from 'antd'; +import { Timeline } from '@famiprog-foundation/react-gantt'; +import {Alert, notification} from 'antd'; export default { - title: 'Timeline' + title: 'Internal/Timeline' }; export const OriginalDemo = () => ; diff --git a/demo-app/src/stories/TimelineScenarios.ts b/demo-app/src/stories/TimelineScenarios.ts new file mode 100644 index 00000000..5f5814e3 --- /dev/null +++ b/demo-app/src/stories/TimelineScenarios.ts @@ -0,0 +1,15 @@ +export const timelineScenarios = { + rendererForGroups: 'RENDERER for rows (groups)', + rendererForItems: 'RENDERER for segments (items)', + whenMouseMovesThenRedBar: + 'WHEN the mouse moves THEN the red bar moves also (with snapping) AND the its date is displayed', + propertyItemRendererDefaultProps: 'PROPERTY itemRendererDefaultProps', + propertyItemRenderer: 'PROPERTY itemRenderer', + whenClickOrDragToSelectThenItemsSelected: "WHEN click or drag to select THEN items are selected/deselected", + propertyRowClassName: 'PROPERTY rowClassName', + propertyRowEvenClassName: 'PROPERTY rowEvenClassName', + propertyRowOddClassName: 'PROPERTY rowOddClassName', + propertyMinDate: 'PROPERTY minDate', + propertyMaxDate: 'PROPERTY maxDate', + propertyShowZoomShortcuts: 'PROPERTY showZoomShortcuts', +}; diff --git a/demo-app/src/stories/backgroundLayer/BackgroundLayer.stories.mdx b/demo-app/src/stories/backgroundLayer/BackgroundLayer.stories.mdx new file mode 100644 index 00000000..f8b45870 --- /dev/null +++ b/demo-app/src/stories/backgroundLayer/BackgroundLayer.stories.mdx @@ -0,0 +1,31 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import {Timeline, BackgroundLayer, HighlightedInterval, Marker} from '@famiprog-foundation/react-gantt'; + + + +## Background layer + +A background layer contains 2 types of elements: +* markers (a vertical line), +* and highlight intervals (a rectangle spanning from top to bottom). + +You can add as many such items as you wish. Additionnaly, there are properties that generate: + +* a marker for the current date/time, +* and intervals for weekends. + +## `Timeline` + + + +## `BackgroundLayer` + + + +## `HighlightedInterval` + + + +## `Marker` + + \ No newline at end of file diff --git a/demo-app/src/stories/backgroundLayer/BackgroundLayer.stories.tsx b/demo-app/src/stories/backgroundLayer/BackgroundLayer.stories.tsx new file mode 100644 index 00000000..564ead8e --- /dev/null +++ b/demo-app/src/stories/backgroundLayer/BackgroundLayer.stories.tsx @@ -0,0 +1,94 @@ +import React from 'react'; +import { Timeline, BackgroundLayer, HighlightedInterval, Marker, Item } from '@famiprog-foundation/react-gantt'; +import { startOfCurrentMonth, endOfCurrentMonth, dateAndHourOfCurrentMonth, manyHumanResources, dateAndHourOfMonth, d } from '../sampleData'; +import { backgroundLayerScenarios } from './BackgroundLayerScenarios'; +import { Table, Column, DataCell} from 'fixed-data-table-2'; +import moment from 'moment'; + +export default { + title: 'Features/Background Layer', + includeStories: /^[A-Z]/ +}; + +export const month = moment("2023 11", "YYYY MM"); + +const tasks: Item[] = [ + {key: 11, row: 1, title: 'Task JD1', start: dateAndHourOfMonth(month, 20, 8), end: dateAndHourOfMonth(month, 28, 11)}, + {key: 12, row: 3, title: 'Task KP1', start: dateAndHourOfMonth(month, 3, 0), end: dateAndHourOfMonth(month, 6, 23)}, + {key: 13, row: 3, title: 'Task KP2', start: dateAndHourOfMonth(month, 11, 18), end: dateAndHourOfMonth(month, 18, 19)} +]; + +export const Main = () => { + return ( + + Title} + cell={({rowIndex}) => {rowIndex < manyHumanResources.length ? manyHumanResources[rowIndex].title : ""}}/> + } + backgroundLayer={ + , + , + + ]} + markers={[ + , + + ]} + />} + /> + ); +}; + +Main.parameters = { + scenarios: [ + backgroundLayerScenarios.verticalGrid, + backgroundLayerScenarios.nowMarker, + backgroundLayerScenarios.highlightWeekends, + backgroundLayerScenarios.markers, + backgroundLayerScenarios.highlightedIntervals + ] +} + +export const CustomClassNamesAndStyles = () => { + return ( + + Title} + cell={({rowIndex}) => {rowIndex < manyHumanResources.length ? manyHumanResources[rowIndex].title : ""}}/> + } + backgroundLayer={ + , + + ]} + markers={[ + , + + ]} + />} + /> + ); +}; + +CustomClassNamesAndStyles.parameters = { + scenarios: [ + backgroundLayerScenarios.verticalGridClassName, + backgroundLayerScenarios.nowMarkerClassName, + backgroundLayerScenarios.highlightWeekendsClassName, + backgroundLayerScenarios.classNameForMarker, + backgroundLayerScenarios.highlightedIntervalClassName + ] +} \ No newline at end of file diff --git a/demo-app/src/stories/backgroundLayer/BackgroundLayerScenarios.js b/demo-app/src/stories/backgroundLayer/BackgroundLayerScenarios.js new file mode 100644 index 00000000..96218ce8 --- /dev/null +++ b/demo-app/src/stories/backgroundLayer/BackgroundLayerScenarios.js @@ -0,0 +1,17 @@ +export const backgroundLayerScenarios = { + // BackgroundLayer + highlightWeekends: 'PROPERTY highlightWeekends', + highlightWeekendsClassName: 'PROPERTY highlightWeekendsClassName', + nowMarker: 'PROPERTY nowMarker', + nowMarkerClassName: 'PROPERTY nowMarkerClassName', + verticalGrid: 'PROPERTY verticalGrid', + verticalGridClassName: 'PROPERTY verticalGridClassName', + markers: 'PROPERTY markers', + highlightedIntervals: 'PROPERTY highlightedIntervals', + + // HighlightedInterval + highlightedIntervalClassName: 'PROPERTY className FOR HighlightedInterval', + + // Marker + classNameForMarker: 'PROPERTY className FOR Marker' +}; diff --git a/demo-app/src/stories/basic/Basic.stories.mdx b/demo-app/src/stories/basic/Basic.stories.mdx new file mode 100644 index 00000000..5bdafe1f --- /dev/null +++ b/demo-app/src/stories/basic/Basic.stories.mdx @@ -0,0 +1,76 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import { Timeline } from '@famiprog-foundation/react-gantt'; +import { encodeApiDocURIForSubpath, parametersDocPage } from '../StorybookUtils'; + + + +## Parent component + +`Timeline` is meant to have a parent w/ `display: flex`. This way, it's height adapts to the one of the parent. + +## `Timeline`: mandatory props + + + +## About moment.js + +The `Timeline` was originally designed to handle date/times w/ [Moment.js](https://momentjs.com/), +a popular lib. However there are 2 drawbacks. + +**#1**: even the authors/maintainers of Moment.js don't +quite [recommend](https://momentjs.com/docs/) it any more for use with new projects. The major +complaint seems to be the mutability of "moment" objects. + +**#2**: "moment" objects are not friendly with +[Redux](https://redux.js.org/), a popular framework for state management. Many folks use Redux for +state management. And not being able to store the state that feeds the `Timeline` is a big drawback, since +additional conversions are necessary. + +The property `useMoment` to the rescue: + + + +## Extending `Timeline` / overriding date handling + +The default start/end fields for an **item** (segment) and for a **row layer** are `start` and `end`. Every date manipulation (read or write) is done exclusively via these functions +(the links point to the [API Doc](?path=/docs/api-doc--page)). + +* Timeline.getStartDate() +* Timeline.getEndDate() +* Timeline.getStartFromItem(item) +* Timeline.getEndFromItem(item) +* Timeline.setStartToItem(item, newDateAsMoment) +* Timeline.setEndToItem(item, newDateAsMoment) +* Timeline.getStartFromRowLayer(layer) +* Timeline.getEndFromRowLayer(layer) +* Timeline.setStartToRowLayer(layer, newDateAsMoment) +* Timeline.setEndToRowLayer(layer, newDateAsMoment) +* utils: convertDateToMoment(date, useMoment) +* utils: convertMomentToDateType(dateAsMoment, useMoment) + +If you create your **own subclass of `Timeline`**, you may override these functions. Some possible scenarios: +* the start/end fields are named differently for all the objects; +* or maybe depending of the type of object, some are called in a way, and others in another way; +* or for some objects such fields are calculated; +* or the data type is not timestamp or moment, and an additional conversion is needed. + +The scenarios above are examples for the case you are constrained to adapt the `Timeline` to the shape of the data. However, this is something that you should avoid. By default, +try to shape the data according to the defaults that `Timeline` expects. + +**IMPORTANT**: if you extend `Timeline` and manipulate dates, please use always use the functions above. E.g. + +```js +// bad +const start = item.start; + +// good +const start = this.getStartFromItem(item); +``` + +## Providing a table associated with the gantt + +**IMPORTANT**: By default the gantt diagram displayes without any table associated. + +If you want to display a table (like in the majority of our examples) you should set the table property: + + \ No newline at end of file diff --git a/demo-app/src/stories/basic/Basic.stories.tsx b/demo-app/src/stories/basic/Basic.stories.tsx new file mode 100644 index 00000000..38b1c354 --- /dev/null +++ b/demo-app/src/stories/basic/Basic.stories.tsx @@ -0,0 +1,139 @@ +import React from 'react'; +import { Timeline, Group, Item } from '@famiprog-foundation/react-gantt'; + +import { timelineScenarios } from '../TimelineScenarios'; +import { d, someHumanResources, someTasks } from '../sampleData'; +import { ComponentStory } from '@storybook/react'; +import { Table, Column, DataCell } from 'fixed-data-table-2'; + +export default { + title: 'Features/Basic' +}; + +export const Main = () => { + // the rows (aka groups) + // id is mandatory; should: be numeric, start from 0, have consecutive values + const humanResources: Group[] = [...someHumanResources, { id: 4, title: 'George Walsh' }]; + + // the segments + // key is mandatory; row should point to the "id" of a row/group + const tasks: Item[] = [ + ...someTasks, // we split this array in 2 parts for illustration purposes, i.e. to capture the data shape in the storybook + { key: 11, row: 4, title: 'Task GW1', start: d('2018-09-20 7:00'), end: d('2018-09-20 8:00') }, + { key: 12, row: 4, title: 'Task GW2', start: d('2018-09-20 17:00'), end: d('2018-09-20 19:00') } + ]; + + // NOTE: for DRY purposes, we store the sample data (e.g. humanResources, segments) in sampleData.ts. + // If you look at this function from within Storybook, you don't see easily sampleData.ts. + // That's why we added some additional records here, so that the shape of data is clear. + + return ( + <> + {/* This is a trivial example to illustrate how Timeline "glues" to its "flex" parent. Notes: */} + {/* 1/ In other stories we don't have this, because we have a Storybook decorator that wraps w/ a div + CSS class. */} + {/* 2/ You'll probably have a better flex-box layout, i.e. not hardcoded. 3/ Use CSS classes and not styles. */} +
+ + Title} + cell={({rowIndex}) => {rowIndex < humanResources.length ? humanResources[rowIndex].title : ""}}/> + } + /> +
+ + ); +}; + +Main.parameters = { + scenarios: [ + timelineScenarios.rendererForGroups, + timelineScenarios.rendererForItems, + timelineScenarios.whenMouseMovesThenRedBar + ] +}; + +export const AlternativeRowColoring: ComponentStory = () => { + + return ( + <> + {/* This is an example to illustrate how you can customize your gantt to customize the row coloring by setting 'rowClassName', 'rowEvenClassName' and 'rowClassOddName' + + And defining your custom classes in your css file: + + .story-custom-row { + border: 1px solid #94b9cf!important; + border-top: 0 !important; + } + + .story-custom-row-even { + background-color: #DBE8F0 !important; + } + + .story-custom-row-odd { + background-color: #f4f7f8 !important; + } + + */} +
+ + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> + }/> +
+ + ); +}; + +AlternativeRowColoring.parameters = { + scenarios: [ + timelineScenarios.propertyRowClassName, + timelineScenarios.propertyRowEvenClassName, + timelineScenarios.propertyRowOddClassName + ] +}; + +export const HorizontalScroll = () => { +const tasks: Item[] = [ + ...someTasks, // Tasks that are outside the display interval + { key: 11, row: 4, title: 'Task GW1', start: d('2018-09-19 7:00'), end: d('2018-09-19 8:00') }, + { key: 12, row: 4, title: 'Task GW2', start: d('2018-09-19 17:00'), end: d('2018-09-19 19:00') }, + { key: 14, row: 1, title: 'Task GW3', start: d('2018-09-21 12:00'), end: d('2018-09-21 14:00') }, + { key: 15, row: 1, title: 'Task GW4', start: d('2018-09-21 15:00'), end: d('2018-09-21 17:00') }, + { key: 16, row: 1, title: 'Task GW5', start: d('2018-09-19 12:00'), end: d('2018-09-19 14:00') }, + { key: 17, row: 1, title: 'Task GW6', start: d('2018-09-19 9:00'), end: d('2018-09-19 12:00') }, + ]; + + return ( + <> + {/* This is a trivial example to illustrate how Timeline "glues" to its "flex" parent. Notes: */} + {/* 1/ In other stories we don't have this, because we have a Storybook decorator that wraps w/ a div + CSS class. */} + {/* 2/ You'll probably have a better flex-box layout, i.e. not hardcoded. 3/ Use CSS classes and not styles. */} +
+ + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> + } + /> +
+ + ); +}; + +HorizontalScroll.parameters = { + scenarios: [ + timelineScenarios.propertyMinDate, + timelineScenarios.propertyMaxDate + ] +}; \ No newline at end of file diff --git a/demo-app/src/stories/contextMenuAndSelection/ContextMenuAndSelection.stories.mdx b/demo-app/src/stories/contextMenuAndSelection/ContextMenuAndSelection.stories.mdx new file mode 100644 index 00000000..d5679464 --- /dev/null +++ b/demo-app/src/stories/contextMenuAndSelection/ContextMenuAndSelection.stories.mdx @@ -0,0 +1,23 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import { Timeline } from '@famiprog-foundation/react-gantt'; +import { encodeApiDocURIForSubpath, parametersDocPage } from '../StorybookUtils'; + + + +## Context Menu +In order for a context menu to be displayed when right clicking the gantt, some actions should be provided by setting onContextMenuShow. The action descriptors (IGanttAction) return by this handler describe the actions that will fill in the context menu. + +### Timeline + + +By default the context menu is closed after the you click a context menu entry (i.e after IGanttAction.run(param) is called). To avoid this you should set param.dontCloseContextMenuAfterRunAutomatically to true. You can close the context menu afterwards by manually calling closeContextMenu() + +## Selection +Segments can be selected by clicking on them or by dragging to select them. +Right click can be also used instead of left click. +Multiple selection is available by keeping CTRL or SHIFT key pressed. + +Selection change listener can by added by setting the onSelectionChange property. + +### Timeline + diff --git a/demo-app/src/stories/contextMenuAndSelection/ContextMenuAndSelection.stories.tsx b/demo-app/src/stories/contextMenuAndSelection/ContextMenuAndSelection.stories.tsx new file mode 100644 index 00000000..80968740 --- /dev/null +++ b/demo-app/src/stories/contextMenuAndSelection/ContextMenuAndSelection.stories.tsx @@ -0,0 +1,145 @@ +import { createTestids } from '@famiprog-foundation/tests-are-demo'; +import { Alert } from 'antd'; +import moment from 'moment'; +import { useState } from 'react'; +import { Button, Icon, Menu } from 'semantic-ui-react'; +import { Timeline, IGanttAction, IGanttOnContextMenuShowParam, Item } from '@famiprog-foundation/react-gantt'; +import { d, someHumanResources, someTasks } from '../sampleData'; +import { contextMenuScenarios, selectionScenarios } from './ContextMenuAndSelectionScenarios'; +import { Table, Column, DataCell } from 'fixed-data-table-2'; + +export default { + title: 'Features/Context Menu And Selection', + includeStories: /^[A-Z]/ +}; + +export const addTaskActionLabel = "Add task for "; +export const addTaskActionIcon = "plus"; +export const addTaskNotPossibleAction = "Add task: not possible. Please right click over a row with a person."; +export const editActionLabel = "Edit"; +export const deleteActionLabel = "Delete"; +export const deleteActionIcon = "trash"; +export const deleteActionIconColor = "red"; + +export const ContextMenu = () => { + const [tasks, setTasks] = useState([...someTasks]); + const [segmentHeight, setSegmentHeight] = useState(40); + return ( + <> + Add task action is provided only for empty selection. It also has a different label depending on which row is displayed}/> +
+ { + const actions: IGanttAction[] = [ + { + icon: "edit", + label: editActionLabel, + isVisible: param => param.selection.length == 1, + run: param => { + param.dontCloseContextMenuAfterRunAutomatically = true; + // This timeout is just for exemplify a delayed closing of the CM + setTimeout(() => { + param.closeContextMenu(); + const selectedTask = tasks.find((task) => task.key == param.selection[0]); + // This timeout for the menu to actual close before the prompt is shown + setTimeout(() => { + // TODO CS: se pare ca nu e o idee buna sa folosim prompt, fiindca blocheaza testul + // si nu putem simula scrierea. + // let newTitle = prompt("Task new title:", selectedTask.title); + let newTitle; + newTitle && setTasks(tasks.map((task) => task == selectedTask ? { ...task, title: newTitle } : task)); + }, 10); + }, 10); + } + }, + { + isVisible: param => param.selection.length > 0 , + /** This is a trivial example for customizing the content of an action renderer + * but this content can be replaced according to application needs with a more complex one: + * e.g. maybe containing a color picker (for an action that changes the color of a segment)*/ + renderInMenu: (param) => { + return { + setTasks(tasks.filter(task => !param.selection.includes(task.key))); + param.closeContextMenu(); + }}> + {deleteActionLabel} + + + } + } + ]; + // We can filter the actions that will be displayed directly here in the actions provider + if (contextMenuShowParam.actionParam.row < someHumanResources.length) { + actions.splice(0, 0, { + icon: , + label: param => addTaskActionLabel + someHumanResources[param.row].title, + run: param => { + let end = moment(param.time); + end.hours(end.hours() + 3); + const maxKey = tasks.reduce((maxKey, task) => maxKey > (task.key as number) ? maxKey : (task.key as number), 0); + setTasks([...tasks, { key: maxKey + 1, row: someHumanResources[param.row].id, title: 'NEW TASK', start: param.time, end: end}]); + } + }); + } else { + actions.splice(0, 0, { icon: addTaskActionIcon, label: () => addTaskNotPossibleAction}); + } + + return actions; + }} + table={ + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> +
} + /> +
+ ); +}; + +ContextMenu.parameters = { + scenarios: [ + ...Object.keys(contextMenuScenarios).map(key => contextMenuScenarios[key]) + ] +}; + +export const selectionStoryTestIds = createTestids('SelectionStory', { + selectedItemsSpan: '' +}); + +export const Selection = () => { + const [selectedItems, setSelectedItems] = useState<(number|string)[]>([]); + const [isSelectionForced, setIsSelectionForced] = useState(false); + return ( + <> + + + (The user cannot change the selection via interaction) + + Selected segments: {selectedItems.sort().join(", ")}}/> + {/* This is an example illustrates: + 1.adding onSelectionChange handler + 2.setting selectedItems property */} +
+ setSelectedItems(selectedItems)} + table={ + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> +
}/> +
+ + ); + }; + + Selection.parameters = { + scenarios: [ + ...Object.keys(selectionScenarios).map(key => selectionScenarios[key]) + ] +}; \ No newline at end of file diff --git a/demo-app/src/stories/contextMenuAndSelection/ContextMenuAndSelectionScenarios.ts b/demo-app/src/stories/contextMenuAndSelection/ContextMenuAndSelectionScenarios.ts new file mode 100644 index 00000000..b45b8ff7 --- /dev/null +++ b/demo-app/src/stories/contextMenuAndSelection/ContextMenuAndSelectionScenarios.ts @@ -0,0 +1,12 @@ +export const contextMenuScenarios = { + whenRightClickThenContextMenu: 'WHEN right click on gantt, THEN a context menu is shown containing actions (each having a label and an icon)', + whenClickActionThenRunAndCloseMenu: 'WHEN click an action, THEN a specific action is run and the context menu is closed', + propertyOnContextMenuShow: 'PROPERTY onContextMenuShow', + propertyDontCloseContextMenuAfterRunAutomatically: 'PROPERTY IActionParamForRun.dontCloseContextMenuAfterRunAutomatically' +}; + +export const selectionScenarios = { + whenClickOrDragToSelectThenItemsSelected: "WHEN click or drag to select THEN items are selected/deselected", + propertyOnSelectionChange: "PROPERTY onSelectionChange", + propertySelectedItems: "PROPERTY selectedItems" +} \ No newline at end of file diff --git a/demo-app/src/stories/custom/Custom.stories.mdx b/demo-app/src/stories/custom/Custom.stories.mdx new file mode 100644 index 00000000..e4148c98 --- /dev/null +++ b/demo-app/src/stories/custom/Custom.stories.mdx @@ -0,0 +1,14 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import { Timeline, ItemRenderer } from '@famiprog-foundation/react-gantt'; +import { encodeApiDocURIForSubpath, parametersDocPage } from '../StorybookUtils'; + + + +## Custom Timeline + +### Menu: + * We can override the Timeline.renderMenuButton() for change the default menu. + +## `Timeline` + + diff --git a/demo-app/src/stories/custom/Custom.stories.tsx b/demo-app/src/stories/custom/Custom.stories.tsx new file mode 100644 index 00000000..e800cb5d --- /dev/null +++ b/demo-app/src/stories/custom/Custom.stories.tsx @@ -0,0 +1,39 @@ +import { useEffect, useRef, useState } from "react"; +import { Segment } from "semantic-ui-react"; +import { d, someHumanResources, someTasks } from "../sampleData"; +import { CustomTimeline } from "./CustomTimeline"; +import { customTimelineScenarios } from "./CustomTimelineScenarios"; +import { ItemRenderer } from '@famiprog-foundation/react-gantt'; +import { Table, Column, DataCell} from 'fixed-data-table-2'; + +export default { + title: 'Features/Custom' +}; + +export const CustomMenuButtonRenderer = () => { + + const divRef = useRef(); + const [value, setValue] = useState(0); + // after first render when the div dom element is created for re-render + useEffect(() => { !value && setValue(value => value + 1) }); + + return (<> + +
+
+ + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> + } + toolbarDomElement={divRef.current} itemRenderer={ItemRenderer}/> + ); + +}; + +CustomMenuButtonRenderer.parameters = { + scenarios: Object.keys(customTimelineScenarios).map(key => customTimelineScenarios[key]) +}; diff --git a/demo-app/src/stories/custom/CustomTimeline.js b/demo-app/src/stories/custom/CustomTimeline.js new file mode 100644 index 00000000..9bfddf4a --- /dev/null +++ b/demo-app/src/stories/custom/CustomTimeline.js @@ -0,0 +1,19 @@ +import PropTypes from 'prop-types'; +import { Timeline } from '@famiprog-foundation/react-gantt'; +import ReactDOM from 'react-dom'; + +export class CustomTimeline extends Timeline { + static propTypes = { + ...Timeline.propTypes, + /** + * @type { JSX.Element } + */ + toolbarDomElement: PropTypes.object.isRequired + }; + + renderMenuButton() { + return this.props.toolbarDomElement + ? ReactDOM.createPortal(super.renderMenuButton(), this.props.toolbarDomElement) + : super.renderMenuButton(); + } +} diff --git a/demo-app/src/stories/custom/CustomTimelineScenarios.ts b/demo-app/src/stories/custom/CustomTimelineScenarios.ts new file mode 100644 index 00000000..2f312e05 --- /dev/null +++ b/demo-app/src/stories/custom/CustomTimelineScenarios.ts @@ -0,0 +1,4 @@ +export const customTimelineScenarios = { + renderCustomMenuButton: 'RENDERE for custom menu button', + rendererMenuButton: 'RENDERER for extern menu button' +}; diff --git a/demo-app/src/stories/displayItemOnSeparateRowIfOverlap/CustomTimeline.js b/demo-app/src/stories/displayItemOnSeparateRowIfOverlap/CustomTimeline.js new file mode 100644 index 00000000..5284c1ba --- /dev/null +++ b/demo-app/src/stories/displayItemOnSeparateRowIfOverlap/CustomTimeline.js @@ -0,0 +1,17 @@ +import PropTypes from 'prop-types'; +import Timeline, { DEFAULT_ROW_CLASS } from '../../../../src/timeline'; + +export class CustomTimeline extends Timeline { + + static propTypes = { + ...Timeline.propTypes, + /** + * @type { number } + */ + selectedIndex: PropTypes.number + }; + + getRowClassName(rowIndex) { + return this.props.selectedIndex == rowIndex ? DEFAULT_ROW_CLASS + ' selected-row' : super.getRowClassName(rowIndex); + } +} diff --git a/demo-app/src/stories/displayItemOnSeparateRowIfOverlap/DisplayItemOnSeparateRowIfOverlap.stories.mdx b/demo-app/src/stories/displayItemOnSeparateRowIfOverlap/DisplayItemOnSeparateRowIfOverlap.stories.mdx new file mode 100644 index 00000000..a563cec7 --- /dev/null +++ b/demo-app/src/stories/displayItemOnSeparateRowIfOverlap/DisplayItemOnSeparateRowIfOverlap.stories.mdx @@ -0,0 +1,16 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import Timeline from '../../../../src/timeline'; +import Column from '../../../../src/timeline'; +import { encodeApiDocURIForSubpath, parametersDocPage } from '../StorybookUtils'; + + + +## Display item on separate rows if ovelap + +If some items are overlapping, the gantt diagram doesn't display them overlapped. It puts them one beneath the other. + +This can be changed by setting the `displayItemOnSeparateRowIfOverlap` to `true` +or to a function that decides (given an item) whether it allows to be displayed on a new row in case of overlapping or it should be displayed on the first row no matter the overlapping with other segments. + +## `Timeline` + \ No newline at end of file diff --git a/demo-app/src/stories/displayItemOnSeparateRowIfOverlap/DisplayItemOnSeparateRowIfOverlap.stories.tsx b/demo-app/src/stories/displayItemOnSeparateRowIfOverlap/DisplayItemOnSeparateRowIfOverlap.stories.tsx new file mode 100644 index 00000000..d9938d83 --- /dev/null +++ b/demo-app/src/stories/displayItemOnSeparateRowIfOverlap/DisplayItemOnSeparateRowIfOverlap.stories.tsx @@ -0,0 +1,97 @@ +import { createTestids } from '@famiprog-foundation/tests-are-demo'; +import { Column, DataCell, Table } from 'fixed-data-table-2'; +import { useState } from "react"; +import { Dropdown, Form, FormField } from "semantic-ui-react"; +import Timeline, { DEFAULT_ROW_CLASS } from '../../../../src/timeline'; +import { Item } from '../../../../src/types'; +import { someHumanResources, someTasks2 } from "../sampleData"; +import { CustomTimeline } from './CustomTimeline'; +import moment from 'moment'; + +export default { + title: "Features/Display item on separate rows if overlap", + includeStories: /^[A-Z][a-z].*/ +} + +export const displayItemOnSeparateRowIfOverlapStoryTestIds = createTestids('DisplayItemOnSeparateRowIfOverlapStory', { + displayItemOnSeparateRowDropdown: '' +}); + +export const TRUE = "True"; +export const FALSE = "False"; +export const ONLY_FOR_SELECTED = "Only for selected rows"; + +export var selectedRow, setSelectedRow; + +export const Main = () => { + const tasks: Item[] = [ + ...someTasks2, + { key: 11, row: 1, title: 'Task AR4', start: moment('2018-09-20 10:00'), end: moment('2018-09-20 11:00') }, + { key: 12, row: 2, title: 'Task MD6', start: moment('2018-09-20 07:30'), end: moment('2018-09-20 15:00') } + ]; + const [displayItemOnSeparateRowIfOverlap, setDisplayItemOnSeparateRowIfOverlap] = useState boolean)>(true); + [selectedRow, setSelectedRow] = useState(-1); + const [displayIntervalStart, displayIntervalEnd] = [moment('2018-09-20'), moment('2018-09-21')] + // Smaller segments are staying on top of the bigger ones + const zIndexFunction = (item: Item) => { + return Math.floor((displayIntervalEnd.valueOf() - displayIntervalStart.valueOf()) / ((item.end.valueOf() as number) - (item.start.valueOf() as number))); + } + + var displayItemOnSeparateRowOnlyForSelectedRow = () => { + return (item, rowIndex) => { + if (rowIndex == (selectedRow)) { + return true; + } else { + return false; + } + } + } + const onRowClick = (event, rowIndex) => { + setSelectedRow(Number(rowIndex)); + if (typeof displayItemOnSeparateRowIfOverlap === 'function') { + setDisplayItemOnSeparateRowIfOverlap(() => displayItemOnSeparateRowOnlyForSelectedRow()); + } + } + + return ( + <> +
+
+ + + { + setDisplayItemOnSeparateRowIfOverlap(value == 'onlyForSelectedRow' ? () => displayItemOnSeparateRowOnlyForSelectedRow() : value === 'true'); + }} + value={typeof displayItemOnSeparateRowIfOverlap === 'function' ? 'onlyForSelectedRow' : displayItemOnSeparateRowIfOverlap + ''} + data-testid={displayItemOnSeparateRowIfOverlapStoryTestIds.displayItemOnSeparateRowDropdown} + /> + +
+
+ rowIndex == selectedRow ? DEFAULT_ROW_CLASS + " selected-row" : undefined}> + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> + } + /> + + ); + }; \ No newline at end of file diff --git a/demo-app/src/stories/dragToCreate/DragToCreate.stories.mdx b/demo-app/src/stories/dragToCreate/DragToCreate.stories.mdx new file mode 100644 index 00000000..2b3ae4d2 --- /dev/null +++ b/demo-app/src/stories/dragToCreate/DragToCreate.stories.mdx @@ -0,0 +1,20 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import { Timeline, ItemRenderer } from '@famiprog-foundation/react-gantt'; +import { encodeApiDocURIForSubpath, parametersDocPage } from '../StorybookUtils'; + + + +## Drag to create + +Drag to create mechanism requires the property Timeline.onDragToCreateEnded to be set. +## Entering the drag to create mode + + It exists 2 ways for entering in ** Drag to create mode ** : + * ** The default one **: by clicking on "Drag to create" menu entry. + In this case you can exit either by pressing the `Cancel` button displayed in the opened popup or by simply clicking the gantt diagram. + After you finish creating a segment, it automatically exits the drag to create mode + * By setting Timeline.forceDragToCreateMode to true. Setting it to false it exists the drag to create mode. If this property is set, the default mechanism doesn't work anymore (so there will be no "Drag to create" menu entry, no popup and the drag to create mode will remain active when clicking on gantt diagram) + +## `Timeline` + + diff --git a/demo-app/src/stories/dragToCreate/DragToCreate.stories.tsx b/demo-app/src/stories/dragToCreate/DragToCreate.stories.tsx new file mode 100644 index 00000000..fdb40b4f --- /dev/null +++ b/demo-app/src/stories/dragToCreate/DragToCreate.stories.tsx @@ -0,0 +1,71 @@ +import React, { useState } from 'react'; +import { Timeline, DragToCreateParam, Item } from '@famiprog-foundation/react-gantt'; +import { d, someHumanResources, someTasks } from '../sampleData'; +import { dragToCreateScenarios } from './DragToCreateScenarios'; +import { Form, Radio } from 'semantic-ui-react'; +import { createTestids } from '@famiprog-foundation/tests-are-demo'; +import { Table, Column, DataCell} from 'fixed-data-table-2'; + +export default { + title: 'Features/Drag to create', + includeStories: /^[A-Z]/ +}; + +export const dragToCreateStoriesTestIds = createTestids('DragToCreateStory', {forceDragToCreateModeTrueRadio:'', forceDragToCreateModeFalseRadio:''}); + +export const Main = () => { + let groups = [...someHumanResources, { id: 4, title: 'Andy' }]; + const [forceDragToCreateMode, setForceDragToCreateMode] = useState(); + const [tasks, setTasks] = useState([...someTasks]); + const handleRadioChange = (e, { value }) => setForceDragToCreateMode(value); + return <> +
+ + + + + + + + + +
+ + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> + } + onDragToCreateEnded={(param: DragToCreateParam) => { + if (groups[param.groupIndex]) { + const task = { + key: param.itemIndex, + row: param.groupIndex, title: 'Task ' + groups[param.groupIndex].title + param.itemIndex, + start: param.itemStart, + end: param.itemEnd || param.itemStart + } + setTasks([...tasks, task]); + } + }} /> + +}; + +Main.parameters = { + scenarios: Object.keys(dragToCreateScenarios).map(key => dragToCreateScenarios[key]) +}; diff --git a/demo-app/src/stories/dragToCreate/DragToCreateScenarios.ts b/demo-app/src/stories/dragToCreate/DragToCreateScenarios.ts new file mode 100644 index 00000000..cf2062da --- /dev/null +++ b/demo-app/src/stories/dragToCreate/DragToCreateScenarios.ts @@ -0,0 +1,9 @@ +export const dragToCreateScenarios = { + whenClickMenuButton: "WHEN click on the menu button, THEN the menu opens", + whenClickAddMenuEntry: "WHEN click on the 'Add (drag to create)' menu entry, THEN the Gantt goes into the 'drag to create mode'", + givenDragToCreateModeWhenClickCancelFromMenu: "GIVEN drag to create mode, WHEN click on cancel (from the menu), THEN mode is cancelled", + givenDragToCreateModeWhenClickCancelFromPopup: "GIVEN drag to create mode, WHEN click on cancel (from the popup), THEN mode is cancelled", + givenDragToCreateModeWhenClickAndDrag: "GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears", + givenDragToCreateModeInProgressWhenRightClick: "GIVEN drag to create in progress, WHEN right click, THEN cancel", + givenDragToCreateModeInProgressWhenMouseUp: "GIVEN drag to create in progress, WHEN mouse up, THEN handler is called" +}; diff --git a/demo-app/src/stories/dynamicConfiguration/DynamicConfiguration.stories.mdx b/demo-app/src/stories/dynamicConfiguration/DynamicConfiguration.stories.mdx new file mode 100644 index 00000000..ea491103 --- /dev/null +++ b/demo-app/src/stories/dynamicConfiguration/DynamicConfiguration.stories.mdx @@ -0,0 +1,9 @@ +import { Meta } from '@storybook/addon-docs'; + + + +## Dynamic configuration changes + +This story shows how Gantt diagram responds to dynamic configuration changes. + +Some examples of properties that can change dynamically are: `startDate`, `endDate` diff --git a/demo-app/src/stories/dynamicConfiguration/DynamicConfiguration.stories.tsx b/demo-app/src/stories/dynamicConfiguration/DynamicConfiguration.stories.tsx new file mode 100644 index 00000000..67c79fc4 --- /dev/null +++ b/demo-app/src/stories/dynamicConfiguration/DynamicConfiguration.stories.tsx @@ -0,0 +1,56 @@ +import { Table, Column, DataCell} from 'fixed-data-table-2'; +import { generateRandomRowsAndItems, lotsOfGroups, lotsOfItems } from "../sampleData"; +import { Group, Item, Timeline } from '@famiprog-foundation/react-gantt'; +import { Button } from 'semantic-ui-react'; +import { useState } from 'react'; +import moment from 'moment'; +import { createTestids } from '@famiprog-foundation/tests-are-demo'; +import { generateRandomRow } from '../sampleData'; + +export default { + title: 'Features/Dynamic Configuration', + includeStories: /^[A-Z]/ +}; + +export const testIds = createTestids('DynamicConfigurationStory', { + changeDisplayIntervalButton: '', + changeVerticalScrollPosition: '' +}); + +export const Main = () => { + const [hoursAddition, setHoursAddition] = useState(0); + const [verticalScrollPosition, setVerticalScrollPosition] = useState(0); + const [rowsAndItems, setRowsAndItems] = useState<[Group[], Item[]]>([lotsOfGroups, lotsOfItems]); + return <> +
+ + + + +
+ + Title} + cell={({rowIndex}) => {rowIndex < rowsAndItems[0].length ? rowsAndItems[0][rowIndex].title : ""}}/> + }> + + +} \ No newline at end of file diff --git a/demo-app/src/stories/itemRenderer/ItemRenderer.stories.mdx b/demo-app/src/stories/itemRenderer/ItemRenderer.stories.mdx new file mode 100644 index 00000000..b5a618f0 --- /dev/null +++ b/demo-app/src/stories/itemRenderer/ItemRenderer.stories.mdx @@ -0,0 +1,27 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import { Timeline, ItemRenderer } from '@famiprog-foundation/react-gantt'; +import { encodeApiDocURIForSubpath, parametersDocPage } from '../StorybookUtils'; + + + +## `Timeline` + + + +## `ItemRenderer` + +For each item, an `ItemRenderer` component is rendered. It has the following interesting props: + + + +## Extending/overriding `ItemRenderer` + +If you create your **own subclass of `ItemRenderer`**, you may override its functions (see ItemRenderer API Doc). Some possible scenarios: +* the fields are named differently for all the items; +* or the background of the items should be a solid color, not be a gradient; +* or maybe depending on the type of item, some should use a gradient, and some should not; +* or the title of item is based on multiple fiels, i.e. the duration of the item should be shown in the title; +* or maybe some items need different style or class name depending on the type of item. + +The scenarios above are examples for the case you are constrained to adapt the `ItemRenderer` to the shape of the data. However, this is something that you should avoid. By default, +try to shape the data according to the properties that `ItemRenderer` expects. \ No newline at end of file diff --git a/demo-app/src/stories/itemRenderer/ItemRenderer.stories.tsx b/demo-app/src/stories/itemRenderer/ItemRenderer.stories.tsx new file mode 100644 index 00000000..d7e4497b --- /dev/null +++ b/demo-app/src/stories/itemRenderer/ItemRenderer.stories.tsx @@ -0,0 +1,240 @@ +import {Alert} from 'antd'; +import React from 'react'; +import { Timeline, Item, ItemRenderer } from '@famiprog-foundation/react-gantt'; +import {d, someHumanResources, someTasks} from '../sampleData'; +import {itemRendererScenarios} from './ItemRendererScenarios'; +import {timelineScenarios} from '../TimelineScenarios'; +import { ComponentStory } from '@storybook/react'; +import { Table, Column, DataCell} from 'fixed-data-table-2'; + +export default { + title: 'Features/Item Renderer' +}; + +export const Main = () => { + const tasks: Item[] = [ + ...someTasks, + { + key: 11, + row: 3, + title: 'With style', + start: d('2018-09-20 7:00'), + end: d('2018-09-20 8:00'), + style: { + opacity: 0.5, + border: '2px blue solid', + borderRadius: '7px' + } + }, + { + key: 12, + row: 3, + title: 'With class', + start: d('2018-09-20 9:00'), + end: d('2018-09-20 10:00'), + className: 'story-custom-item-class' + }, + { + key: 13, + row: 3, + title: 'With color and tooltip', + start: d('2018-09-20 10:30'), + end: d('2018-09-20 12:45'), + color: '#FFA215', + tooltip: 'I am tooltip' + }, + { + key: 14, + row: 3, + title: 'With gradient, but w/o glow', + start: d('2018-09-20 13:00'), + end: d('2018-09-20 15:25'), + color: 'red', + gradientStop: 10, + gradientBrightness: 0.7, + gradientReverseDirection: true, + glowOnHover: false + } + ]; + return ( + <> + + The last row has items w/ props that are rendered by ItemRenderer. + + } + /> + + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> + }/> + + ); +}; + +Main.parameters = { + scenarios: [ + itemRendererScenarios.title, + itemRendererScenarios.tooltip, + itemRendererScenarios.glowOnHover, + itemRendererScenarios.color, + itemRendererScenarios.gradientBrightness, + itemRendererScenarios.gradientStop, + itemRendererScenarios.gradientReverseDirection, + itemRendererScenarios.className, + itemRendererScenarios.style + ] +}; + +export const DefaultPropsForItemRenderer = () => { + return ( + <> + + All the ItemRenderers have the same (default) props. + + } + /> + + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> + } + itemRendererDefaultProps={{ + className: 'story-custom-item-class', + color: 'red' + }} + /> + + ); +}; + +DefaultPropsForItemRenderer.parameters = { + scenarios: [timelineScenarios.propertyItemRendererDefaultProps] +}; + +type CustomTask = Item & { + type?: string, + spentHours?: number, + allTestsPassed?: boolean +} + +export const CustomItemRenderer = () => { + const tasks: CustomTask[] = [...someTasks]; + tasks[0].type = 'analysis'; + tasks[0].spentHours = 24; + tasks[3].type = 'analysis'; + tasks[3].spentHours = 4; + + tasks[1].type = 'development'; + tasks[2].type = 'testing'; + tasks[2].allTestsPassed = true; + tasks[4].type = 'testing'; + tasks[4].allTestsPassed = false; + + // custom item renderer that delegates to other renders based on the type of task + class CustomItemRenderer extends ItemRenderer { + render() { + const {type}: CustomTask = this.props.item; + if (!type) { + return super.render(); + } + if (type === 'analysis') { + return ; + } else if (type === 'development') { + return ; + } else { + return ; + } + } + } + + class AnalysisItemRenderer extends ItemRenderer { + // we override the actual renderer of the title + getTitle() { + return ( + <> + [A] {super.getTitle()} {(this.props.item as CustomTask).spentHours} + + ); + } + + // text color depending data in the item + getTextColor() { + const { spentHours } = this.props.item as CustomTask; + return (spentHours && spentHours > 10) ? 'yellow' : 'black'; + } + } + + class DevelopmentItemRenderer extends ItemRenderer { + // override to return a solid color + getBackgroundGradient() { + return this.getColor(); + } + + getClassName() { + return super.getClassName() + ' story-custom-item-class'; + } + } + + class TestingItemRenderer extends ItemRenderer { + getColor() { + return (this.props.item as CustomTask).allTestsPassed ? 'green' : 'red'; + } + + getStyle() { + return { + ...super.getStyle(), + borderRadius: '8px' + }; + } + + getHeight() { + return '20px'; + } + } + + return ( + <> + + We have different custom item renderers, based on the "task type". They can modify the known props, based on + logic specific to each item. And they can also process new props, unknown to ItemRenderer. + + } + /> + + Title} + cell={({rowIndex}) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}}/> + } + itemRenderer={CustomItemRenderer} + /> + + ); +}; + +CustomItemRenderer.parameters = { + scenarios: [timelineScenarios.propertyItemRenderer] +}; diff --git a/demo-app/src/stories/itemRenderer/ItemRendererScenarios.ts b/demo-app/src/stories/itemRenderer/ItemRendererScenarios.ts new file mode 100644 index 00000000..3fc49b51 --- /dev/null +++ b/demo-app/src/stories/itemRenderer/ItemRendererScenarios.ts @@ -0,0 +1,12 @@ +export const itemRendererScenarios = { + title: 'PROPERTY title', + tooltip: 'PROPERTY tooltip', + height: 'PROPERTY height', + glowOnHover: 'PROPERTY glowOnHover', + color: 'PROPERTY color', + gradientBrightness: 'PROPERTY gradientBrightness', + gradientStop: 'PROPERTY gradientStop', + gradientReverseDirection: 'PROPERTY gradientReverseDirection', + style: 'PROPERTY style', + className: 'PROPERTY className' +}; diff --git a/demo-app/src/stories/sampleData.ts b/demo-app/src/stories/sampleData.ts new file mode 100644 index 00000000..163bb55b --- /dev/null +++ b/demo-app/src/stories/sampleData.ts @@ -0,0 +1,150 @@ +import moment, { Moment } from 'moment'; +import { Group, Item } from '@famiprog-foundation/react-gantt'; + +//////////////////////////////////////////////////////// +// utility functions used for hardcoding our sample data +//////////////////////////////////////////////////////// +export const d = (str: moment.MomentInput) => moment(str).valueOf(); + +export const endOfCurrentMonth = () => d(moment().endOf('month')); + +export const startOfCurrentMonth = () => d(moment().startOf('month')); + +export const dateAndHourOfCurrentMonth = (day, hour = 0) => d(moment().startOf('month').add('days', day-1).add('hours', hour)); + +export const dateAndHourOfMonth = (monthBegining, day, hour = 0) => d(monthBegining.startOf('month').add('days', day-1).add('hours', hour)); + +//////////////////////////////////////////////////////// +// sample data +//////////////////////////////////////////////////////// +export type Employee = Group & { + job?: string, + team?: string +} + +export const someHumanResources: Employee[] = [ + {id: 0, title: 'John Doe', job: 'HR manager', team: 'Team 1'}, + {id: 1, title: 'Alex Randal', job: 'Recruiter', team: 'Team 2'}, + {id: 2, title: 'Mary Danton', job: 'Developer', team: 'Team 3'}, + {id: 3, title: 'Kim Price', job: 'Developer', team: 'Team 3'} +]; + +// 10 rows, so it's easy to remember in stories: new tasks start from 11 +export const someTasks: Item[] = [ + {key: 0, row: 0, title: 'Task JD1', start: d('2018-09-20 8:00'), end: d('2018-09-20 11:00')}, + {key: 1, row: 0, title: 'Task JD2', start: d('2018-09-20 18:00'), end: d('2018-09-20 19:00')}, + {key: 2, row: 0, title: 'Task JD3', start: d('2018-09-20 20:00'), end: d('2018-09-20 21:00')}, + {key: 3, row: 1, title: 'Task AR1', start: d('2018-09-20 7:00'), end: d('2018-09-20 11:30')}, + {key: 4, row: 1, title: 'Task AR2', start: d('2018-09-20 17:00'), end: d('2018-09-20 20:00')}, + {key: 5, row: 1, title: 'Task AR3', start: d('2018-09-20 19:00'), end: d('2018-09-20 20:00')}, + {key: 6, row: 2, title: 'Task MD1', start: d('2018-09-20 8:00'), end: d('2018-09-20 10:00')}, + {key: 7, row: 2, title: 'Task MD2', start: d('2018-09-20 18:00'), end: d('2018-09-20 20:00')}, + {key: 8, row: 2, title: 'Task MD3', start: d('2018-09-20 20:00'), end: d('2018-09-20 21:00')}, + {key: 9, row: 2, title: 'Task MD4', start: d('2018-09-20 5:00'), end: d('2018-09-20 7:00')}, + {key: 10, row: 2, title: 'Task MD5', start: d('2018-09-20 13:00'), end: d('2018-09-20 14:00')}, + {key: 11, row: 2, title: 'Task MD6', start: d('2018-09-20 22:00'), end: d('2018-09-20 24:00')} +]; + +// duplicate from someTasks, changed start/end to moment +export const someTasks2: Item[] = [ + {key: 0, row: 0, title: 'Task JD1', start: moment('2018-09-20 8:00'), end: moment('2018-09-20 11:00')}, + {key: 1, row: 0, title: 'Task JD2', start: moment('2018-09-20 18:00'), end: moment('2018-09-20 19:00')}, + {key: 2, row: 0, title: 'Task JD3', start: moment('2018-09-20 20:00'), end: moment('2018-09-20 21:00')}, + {key: 3, row: 1, title: 'Task AR1', start: moment('2018-09-20 7:00'), end: moment('2018-09-20 11:30')}, + {key: 4, row: 1, title: 'Task AR2', start: moment('2018-09-20 17:00'), end: moment('2018-09-20 20:00')}, + {key: 5, row: 1, title: 'Task AR3', start: moment('2018-09-20 19:00'), end: moment('2018-09-20 20:00')}, + {key: 6, row: 2, title: 'Task MD1', start: moment('2018-09-20 8:00'), end: moment('2018-09-20 10:00')}, + {key: 7, row: 2, title: 'Task MD2', start: moment('2018-09-20 18:00'), end: moment('2018-09-20 20:00')}, + {key: 8, row: 2, title: 'Task MD3', start: moment('2018-09-20 20:00'), end: moment('2018-09-20 21:00')}, + {key: 9, row: 2, title: 'Task MD4', start: moment('2018-09-20 5:00'), end: moment('2018-09-20 7:00')}, + {key: 10, row: 2, title: 'Task MD5', start: moment('2018-09-20 13:00'), end: moment('2018-09-20 14:00')}, + {key: 11, row: 2, title: 'Task MD6', start: moment('2018-09-20 22:00'), end: moment('2018-09-20 24:00')} +]; + +export const manyHumanResources: Employee[] = [...someHumanResources, { id: 4, title: 'George Walsh', job: 'Developer' }, +{ id: 5, title: 'Mary McDonald', job: 'Developer' }, +{ id: 6, title: 'Mary A. McDonald', job: 'Developer'}, +{ id: 7, title: 'John Rider', job: 'Developer'}, +{ id: 8, title: 'Tom Smith', job: 'Developer'}, +{ id: 9, title: 'David Johnson', job: 'Developer'}, +{ id: 10, title: 'James Johnson', job: 'Developer'}, +{ id: 11, title: 'Maria Garcia', job: 'Developer'}, +{ id: 12, title: 'Michael Smith', job: 'Developer'}, +{ id: 13, title: 'David Brown', job: 'Developer'}, +{ id: 14, title: 'Mary B. McDonald', job: 'Developer'}, +{ id: 15, title: 'John B. Rider', job: 'Developer'}, +{ id: 16, title: 'Tom B. Smith', job: 'Developer'}, +{ id: 17, title: 'David B. Johnson', job: 'Developer'}, +{ id: 18, title: 'James B. Johnson', job: 'Developer'}, +{ id: 19, title: 'Maria B. Garcia', job: 'Developer'}, +{ id: 20, title: 'Michael B. Smith', job: 'Developer'}, +{ id: 21, title: 'David B. Brown', job: 'Developer'}, +{ id: 22, title: 'Michael C. Smith', job: 'Developer'}, +{ id: 23, title: 'David C. Brown', job: 'Developer'}, +{ id: 24, title: 'Michael D. Smith', job: 'Developer'}, +{ id: 25, title: 'David D. Brown', job: 'Developer'}, +{ id: 26, title: 'Michael E. Smith', job: 'Developer'}, +{ id: 27, title: 'David E. Brown', job: 'Developer'}]; + +const ITEM_DURATIONS = [moment.duration(6, 'hours'), moment.duration(12, 'hours'), moment.duration(18, 'hours')]; +const COLORS = ['#0099cc', '#f03a36', '#06ad96', '#fce05b', '#dd5900', '#cc6699']; + +export const [lotsOfGroups, lotsOfItems] = generateRandomRowsAndItems(100, 30, true, 60, moment('2018-07-31'), moment('2018-10-30')); + +export function generateRandomRowsAndItems(numberOfRows, numberOfItemsPerRow: number, useMoment: boolean, snap: number, minDate: Moment, maxDate: Moment): [Group[], Item[]] { + const lotsOfGroups:Group[] = []; + const lotsOfItems:Item[] = []; + + if (lotsOfGroups.length == 0) { + for (let i = 0; i < numberOfRows; i++) { + const randomGroupWithItems = generateRandomRow(i, numberOfItemsPerRow, useMoment, snap, minDate, maxDate); + lotsOfGroups.push(randomGroupWithItems[0]); + lotsOfItems.push(...randomGroupWithItems[1]); + } + } + return [lotsOfGroups, lotsOfItems]; +} + +export function generateRandomRow(rowIndex:number, numberOfItemsPerRow: number, useMoment: boolean, snap: number, minDate: Moment, maxDate: Moment): [Group, Item[]] { + const row = {id: rowIndex, title: `Row ${rowIndex}`, description: `Description for row ${rowIndex}`}; + const items = []; + let key = rowIndex * numberOfItemsPerRow - 1; + for (let j = 0; j < numberOfItemsPerRow; j++) { + key += 1; + const colorIndex = (rowIndex + j) % (COLORS.length + 1); + const color = colorIndex != COLORS.length + 1 ? COLORS[colorIndex] : ''; + const gradientStop = Math.random() * 100; + let glowOnHover = false; + let tooltip; + if ((rowIndex + j) % 3 === 0) { + glowOnHover = true; + tooltip = 'Item with key=' + key; + } + const duration = ITEM_DURATIONS[Math.floor(Math.random() * ITEM_DURATIONS.length)]; + let start = moment( + Math.floor( + Math.random() * (maxDate.valueOf() - minDate.valueOf()) + minDate.valueOf() + ) + ); + let end = start.clone().add(duration); + + // Round to the nearest snap distance + const roundedStartSeconds = Math.floor(start.second() / snap) * snap; + const roundedEndSeconds = Math.floor(end.second() / snap) * snap; + start.second(roundedStartSeconds); + end.second(roundedEndSeconds); + + items.push({ + key: key, + title: duration.humanize(), + color, + row: rowIndex, + start: useMoment ? start : start.valueOf(), + end: useMoment ? end : end.valueOf(), + glowOnHover, + gradientStop, + tooltip + }); + } + return [row, items] +} \ No newline at end of file diff --git a/demo-app/src/stories/scrollbar/Scrollbar.stories.tsx b/demo-app/src/stories/scrollbar/Scrollbar.stories.tsx new file mode 100644 index 00000000..f11a1b2a --- /dev/null +++ b/demo-app/src/stories/scrollbar/Scrollbar.stories.tsx @@ -0,0 +1,133 @@ +import SplitPane from "react-split-pane"; +import { Direction, Scrollbar } from "@famiprog-foundation/react-gantt"; +import { useRef, useState } from "react"; +import { Alert } from "antd"; +import Measure from 'react-measure'; + +export default { + title: 'Components/Scrollbar' +}; + +export const HorizontalScrollBar = () => { + const divContentWidth1 = 700; + const divContentWidth2 = 700; + const totalWidth = 800; + const [divWidth1, setDivWidth1] = useState(totalWidth / 2); + const [divWidth2, setDivWidth2] = useState(0); + const div1 = useRef(); + const div2 = useRef(); + return ( + <> + + Drag the split panes to rezise the colored divs and the coresponding scrollbars + + } + /> +
+ {/** @ts-ignore*/} + { setDivWidth1(width); return true; }} + > +
+
+ Some very very very very very very very very very very very very very very very very very very very long text +
+
+ { + setDivWidth2(contentRect.bounds ? contentRect.bounds.width : 0); + }}> + {({ measureRef }) => { + return ( +
{measureRef(node); div2.current = node;}} style={{overflow:"hidden"}}> +
+ Another very very very very very very very very very very very very very very very very very very very long text +
+
+ ); + }} +
+
+
+
+ {/** @ts-ignore*/} + + div1.current.scrollLeft = scrollPosition}/> + div2.current.scrollLeft = scrollPosition} hasArrows={true}/> + +
+ + ); +} + +export const VerticalScrollBar = () => { + const divContentHeight1 = 500; + const divContentHeight2 = 500; + const totalHeight = 500; + const [divHeight1, setDivHeight1] = useState(totalHeight / 2); + const [divHeight2, setDivHeight2] = useState(0); + const div1 = useRef(); + const div2 = useRef(); + return ( + <> + + Drag the split panes to rezise the colored divs and the coresponding scrollbars + + } + /> +
+
+ {/** @ts-ignore*/} + { setDivHeight1(height); return true; }} + > +
+
+ Some very very very very very very very very very very very very very very very very very very very long text +
+
+ { + setDivHeight2(contentRect.bounds ? contentRect.bounds.height : 0); + }}> + {({ measureRef }) => { + return ( +
{measureRef(node); div2.current = node;}} style={{overflow:"hidden"}}> +
+ Another very very very very very very very very very very very very very very very very very very very long text +
+
+ ); + }} +
+
+
+
+ {/** @ts-ignore*/} + + div1.current.scrollTop = scrollPosition}/> + div2.current.scrollTop = scrollPosition} hasArrows={true}/> + +
+
+ + ); +} \ No newline at end of file diff --git a/demo-app/src/stories/storybook.css b/demo-app/src/stories/storybook.css new file mode 100644 index 00000000..43e07121 --- /dev/null +++ b/demo-app/src/stories/storybook.css @@ -0,0 +1,60 @@ +#root, +/* + For a doc page, the div w/ id="storybook-root" still exists; it has an attribute hidden (which has a selector to make display: none + Hence we want this style NOT to be applied IF id = storybook-root AND has attribute hidden +*/ +#storybook-root:not([hidden]) { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; +} + +.demo { + height: 100%; + display: flex; + gap: 5px; + flex-direction: column; +} + +.story-custom-highlighted-interval-class { + opacity: 0.5 !important; +} + +.story-custom-highlighted-weekends-class { + background: #ceefed !important; +} + +.story-custom-item-class { + opacity: 1; + border: #d47b37 3px solid; + border-radius: 0; +} + +.story-custom-marker-class { + background: #03c61a !important; +} + +.story-custom-now-marker-class { + background: #f28de6 !important; +} + +.story-custom-vertical-grid-class { + border-left: 1px solid #209ad8 !important; +} + +.story-custom-row { + border-bottom: 1px solid #94b9cf !important; +} + +.story-custom-row-even { + background-color: #dbe8f0 !important; +} + +.story-custom-row-odd { + background-color: #f4f7f8 !important; +} + +.selected-row { + background-color: #ffff001f !important; +} diff --git a/demo-app/src/stories/table/Table.stories.mdx b/demo-app/src/stories/table/Table.stories.mdx new file mode 100644 index 00000000..e2b192ad --- /dev/null +++ b/demo-app/src/stories/table/Table.stories.mdx @@ -0,0 +1,28 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import { Timeline } from '@famiprog-foundation/react-gantt'; +import { encodeApiDocURIForSubpath, parametersDocPage } from '../StorybookUtils'; + + + +## Custom table + By default the gantt diagram doesn't have any associated table. + +You can add one table that will be displayed in the left side of the gantt diagram by setting the Timeline.table property. It should be a fixed-data-table component. You can check this page for examples of table customizations. + +It is mandatory to have set a width for this table + +**IMPORTANT:** The cell renderer of your custom table should take in consideration that there could be empty rows (without any data behind) added by gantt just for filling in the remaining empty space + + + +## `onSplitChange` + +The Gantt component is splitted between the table and the actual gantt diagram. +Initialy the size of the split equals to the table width. + +The split works in two modes: +1. Controlled: `onSplitChange` is provided by the user in order to manage the width of the table by itself. +2. Uncontrolled: no `onSplitChange` is provided by the user. Gantt internally changes the width of the table when the split changes + + + diff --git a/demo-app/src/stories/table/Table.stories.tsx b/demo-app/src/stories/table/Table.stories.tsx new file mode 100644 index 00000000..32b88dd8 --- /dev/null +++ b/demo-app/src/stories/table/Table.stories.tsx @@ -0,0 +1,86 @@ +import { ComponentStory } from "@storybook/react"; +import { Fragment, useState } from "react"; +import { Checkbox, Icon } from "semantic-ui-react"; +import { Timeline } from '@famiprog-foundation/react-gantt'; +import { d, manyHumanResources, someTasks } from "../sampleData"; + +import { Column, DataCell, Table } from "fixed-data-table-2"; +import { DEMO_TABLE_WIDTH, tableScenarios, tableTestIds } from "./TableScenarios"; +import { Alert } from "antd"; +export default { + title: 'Features/Table', + component: Timeline +}; + +export const GanttWithoutTable: ComponentStory = () => { + + return ( + + + + ); +} + +GanttWithoutTable.parameters = { + scenarios: [tableScenarios.propertyTable] +} + +var emphasizeStyle = { color: 'red' }; + +const headerStyle = { + color: '#000', + fontSize: '12px', + lineHeight: '1', + background: '#CCFFEE', + border: 'none' +}; + +export const ProvidingCustomTable: ComponentStory = () => { + const [tableWidth, setTableWidth] = useState(DEMO_TABLE_WIDTH); + return ( + + Table width: {tableWidth} }/> + setTableWidth(size)} + table={ {return { "data-testid": tableTestIds.row + "_" + index}} } + > + Title} + cell={({rowIndex}) => + {rowIndex < manyHumanResources.length ? manyHumanResources[rowIndex].title : ""} + } + /> + Custom check} + cell={({rowIndex}) => + {rowIndex < manyHumanResources.length ? : ""} + } + /> + Job} + cell={({rowIndex}) => + {rowIndex < manyHumanResources.length ? manyHumanResources[rowIndex].job : ""} + } + /> +
} + /> +
+ ); +} + +ProvidingCustomTable.parameters = { + scenarios: [...Object.keys(tableScenarios).map(key => tableScenarios[key])] +} \ No newline at end of file diff --git a/demo-app/src/stories/table/TableScenarios.ts b/demo-app/src/stories/table/TableScenarios.ts new file mode 100644 index 00000000..8a8b2d01 --- /dev/null +++ b/demo-app/src/stories/table/TableScenarios.ts @@ -0,0 +1,13 @@ +import { createTestids } from "@famiprog-foundation/tests-are-demo"; + +export const tableScenarios = { + propertyTable: 'PROPERTY table', + propertyOnSplitChange:'PROPERTY onSplitChange' +}; + +// These are needed in TableTestsAreDemo +// Added here because they were needed in TableTestsAreDemo +// And could not be exported directly from table.storie.tsx because +// everything exported there gets in the storybook tree as a story entry +export const tableTestIds = createTestids("Table", {row:""}); +export const DEMO_TABLE_WIDTH = 275; \ No newline at end of file diff --git a/demo-app/src/stories/table/TreeFixedDataTableGantt.stories.tsx b/demo-app/src/stories/table/TreeFixedDataTableGantt.stories.tsx new file mode 100644 index 00000000..940d844a --- /dev/null +++ b/demo-app/src/stories/table/TreeFixedDataTableGantt.stories.tsx @@ -0,0 +1,82 @@ + +import { TreeFixedDataTableRRC } from "@crispico/foundation-react/components/treeFixedDataTable/TreeFixedDataTable"; +import { Main, Task, root } from "@crispico/foundation-react/components/treeFixedDataTable/TreeFixedDataTable.stories"; +import { ReduxReusableComponents } from "@crispico/foundation-react/reduxReusableComponents/ReduxReusableComponents"; +import { Utils } from "@crispico/foundation-react/utils/Utils"; +import { Group, Item, Timeline } from "@famiprog-foundation/react-gantt"; +import { Cell, Column, Table } from 'fixed-data-table-2'; +import { d } from "../sampleData"; +import { Message } from "semantic-ui-react"; + +export default { + title: 'Features/Table', +}; + +export const TreeTable = () => { + // adding an additional task here, so that the shape of the data appears in the Storybook code snippet + // however, subtle detail: don't do this in prod; I mean, don't give a new "root" to the component on each render (which happens here) + // if you'd give "root", or kept "myRoot" in the state, it would've been OK + // however, for the purpose of this demo, being given that the dataset is tiny, we can tolerate this mistake + const myRoot: Task = { + ...root, subtasks: [...root.subtasks, + { + name: "Test", comment: "First testing phase: internal; second one: client/users.", + segments: [{ start: d("2011-01-30"), end: d("2011-03-06"), percentComplete: 10 }], + subtasks: [ + { + name: "Internal tests", comment: "", segments: [ + { start: d("2011-01-30"), end: d("2011-02-2"), percentComplete: 5 }, + { start: d("2011-02-15"), end: d("2011-02-18"), percentComplete: 5 } + ] + }, + { + name: "Tests by users", comment: "", segments: [ + { start: d("2011-02-5"), end: d("2011-02-8"), percentComplete: 0 }, + { start: d("2011-02-10"), end: d("2011-02-12"), percentComplete: 0 }, + { start: d("2011-02-25"), end: d("2011-02-28"), percentComplete: 0 }, + { start: d("2011-03-2"), end: d("2011-03-6"), percentComplete: 0 } + ] + }, + ] + }, + ] + } + + function navigateToTask(itemId: string): Task { + return Utils.navigate(myRoot, itemId, true, Utils.defaultIdSeparator, "subtasks"); + } + + return + The "tree" is not a direct feature of this lib. It's provided by TreeFixedDataTable (from foundation), + which enriches w/ tree logic a Table (from fixed-data-table-2). Of course, TreeFixedDataTable was + developed targeting compatibility w/ the Gantt. + task.subtasks !== undefined} + getChildrenFunction={task => Object.keys(task.subtasks).map(key => { return { localId: key, item: task.subtasks[key] } })} + initialExpandedIds={{ 1: true, 2: true, [`2${Utils.defaultIdSeparator}0`]: true }} + renderMainElementFunction={({ mainChildren, linearizedItems }) => { + const items: Item[] = []; + const groups: Group[] = []; + // using a for (instead of 2 x map()) in order to avoid 2 iterations + linearizedItems.forEach((li, i) => { + groups.push({ id: i }); + // e.g. for task1|/|task1.1 we'll navigate: tasks.subtasks["task1"].subtasks["task1.1."] + const task = navigateToTask(li.itemId); + task.segments.forEach((segment, j) => items.push({ + key: "" + i + "." + j, row: i, start: segment.start, end: segment.end, title: segment.percentComplete + "%", + color: segment.percentComplete == 0 ? "#FA0000" : (segment.percentComplete === 100 ? "#9ACD32" : "#FFA500") + })) + }); + + return + Name} width={400} cell={props => mainChildren[props.rowIndex]} /> + + } /> + }} + renderItemFunction={({ linearizedItem }) => navigateToTask(linearizedItem.itemId).name} + /> + +} \ No newline at end of file diff --git a/demo-app/src/stories/useMoment/UseMoment.stories.jsx b/demo-app/src/stories/useMoment/UseMoment.stories.jsx new file mode 100644 index 00000000..4824fbab --- /dev/null +++ b/demo-app/src/stories/useMoment/UseMoment.stories.jsx @@ -0,0 +1,120 @@ +import React from 'react'; +import moment from 'moment'; +import { Timeline } from '@famiprog-foundation/react-gantt'; + +const TIMELINE_EVENTS = [ + 'onInteraction', + 'onItemClick', + 'onItemDoubleClick', + 'onItemContext', + 'onRowClick', + 'onRowContext', + 'onRowDoubleClick', + 'onItemHover', + 'onItemLeave' +]; + +/** + * We want to hide the events from "Controls" tab. + * However, if the events are not included in Controls they will not be shown in Actions. + * Solution: include the event in controls, but disable it in argTypes. + */ +let argTypes = {}; +TIMELINE_EVENTS.forEach(timelineEvent => { + argTypes[timelineEvent] = { + table: { + disable: true + } + }; +}); + +export default { + title: 'Internal/Use moment', + parameters: { + previewTabs: { + 'storybook/docs/panel': {hidden: true} + }, + viewMode: 'story', + controls: { + disable: true, + include: ['startDate', 'endDate', ...TIMELINE_EVENTS] + }, + actions: { + disable: true + } + }, + argTypes +}; + +const humanResources = [ + {id: 0, title: 'John Doe'}, + {id: 1, title: 'Alex Randal'}, + {id: 2, title: 'Mary Danton'} +]; +const tasksWithMoment = [ + {key: 0, row: 0, title: 'T1', color: 'red', start: moment('2018-09-20 8:00'), end: moment('2018-09-20 9:00')}, + {key: 1, row: 0, title: 'T2', color: 'red', start: moment('2018-09-20 18:00'), end: moment('2018-09-20 19:00')}, + {key: 2, row: 0, title: 'T3', color: 'red', start: moment('2018-09-20 20:00'), end: moment('2018-09-20 21:00')}, + {key: 3, row: 1, title: 'T1', color: 'yellow', start: moment('2018-09-20 7:00'), end: moment('2018-09-20 8:00')}, + {key: 4, row: 1, title: 'T2', color: 'yellow', start: moment('2018-09-20 17:00'), end: moment('2018-09-20 20:00')}, + {key: 5, row: 1, title: 'T3', color: 'yellow', start: moment('2018-09-20 19:00'), end: moment('2018-09-20 20:00')}, + {key: 6, row: 2, title: 'T1', color: 'blue', start: moment('2018-09-20 8:00'), end: moment('2018-09-20 10:00')}, + {key: 7, row: 2, title: 'T2', color: 'blue', start: moment('2018-09-20 18:00'), end: moment('2018-09-20 20:00')}, + {key: 8, row: 2, title: 'T3', color: 'blue', start: moment('2018-09-20 20:00'), end: moment('2018-09-20 21:00')} +]; + +// we convert start and end from the moment object to a raw timestamp (millis) +// reminder: moment.valueOf() returns a raw timestamp (a number of millis) +const tasksWithoutMoment = tasksWithMoment.map(t => { + return {...t, start: t.start.valueOf(), end: t.end.valueOf()}; +}); + +const TimelineWithMomentTemplate = args => { + const {startDate, endDate, ...events} = args; + return ( + + ); +}; + +export const Main = TimelineWithMomentTemplate.bind({}); +Main.args = { + startDate: '2018-09-20', + endDate: '2018-09-21' +}; +Main.parameters = { + controls: { + disable: false + }, + actions: { + disable: false + } +}; + +const TimelineWithoutMomentTemplate = args => { + const {startDateInMillis, endDateInMillis, ...events} = args; + return ( + + ); +}; + +export const WithoutMoment = TimelineWithoutMomentTemplate.bind({}); +WithoutMoment.args = { + startDate: moment('2018-09-20').valueOf(), + endDate: moment('2018-09-21').valueOf() +}; diff --git a/demo-app/src/stories/useMoment/UseMoment.stories.mdx b/demo-app/src/stories/useMoment/UseMoment.stories.mdx new file mode 100644 index 00000000..2b7838f9 --- /dev/null +++ b/demo-app/src/stories/useMoment/UseMoment.stories.mdx @@ -0,0 +1,62 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import { Timeline } from '@famiprog-foundation/react-gantt'; +import {encodeApiDocURIForSubpath} from '../StorybookUtils'; + + + +## Use moment +The Timeline was originally designed to handle date/times w/ [Moment.js](https://momentjs.com/), +a popular lib. However there are 2 drawbacks. **#1**: even the authors/maintainers of Moment.js don't +quite [recomment](https://momentjs.com/docs/) it any more for use with new projects. The major +complain seems to be the mutability of "moment" objects. **#2**: "moment" objects are not friendly with +[Redux](https://redux.js.org/), a popular framework for state management. Many folk use React for +state management. And not being able to store the state that feeds the Timeline is a big drawback, since +additional conversions are necessary. + +The **property ```useMoment```** to the rescue! If ```false```, then you when you "talk" date/times to the Timeline, then you use +plain timestamps (i.e. number of millis, e.g. ```new Date().valueOf()```). And this everywhere where +a date/time is needed (e.g. for an item, for global start/end, etc.). This is the **recommended** way to +go, especially if you use Redux. But be aware that this property is by default ```true```, in order +to maintain backward compatibility. + +NOTE: the Timeline still uses "moment" internally. And this because it was quicker to refactor this way. +This may change in the future, if we find reasons and time to refactor more. + +## Props + + + +Default date fields in an **item**: + +* start - moment object or date in milliseconds(number) - start of an item +* end - moment object or date in milliseconds(number) - end of an item + +Default date fields in a **row layer**: + +* start - moment object or date in milliseconds(number) - start of a row layer +* end - moment object or date in milliseconds(number) - end of a row layer + +> **WARNING!** +> It is **forbidden** to manipulate the dates directly from props. In case you want to modify/override the code +that involve the dates you should read the documentation from [API Doc](?path=/docs/api-doc--page) for the following functions: +* Timeline.getStartDate() +* Timeline.getEndDate() +* Timeline.getStartFromItem(item) +* Timeline.getEndFromItem(item) +* Timeline.setStartToItem(item, newDateAsMoment) +* Timeline.setEndToItem(item, newDateAsMoment) +* Timeline.getStartFromRowLayer(layer) +* Timeline.getEndFromRowLayer(layer) +* Timeline.setStartToRowLayer(layer, newDateAsMoment) +* Timeline.setEndToRowLayer(layer, newDateAsMoment) +* utils: convertDateToMoment(date, useMoment) +* utils: convertMomentToDateType(dateAsMoment, useMoment) \ No newline at end of file diff --git a/demo-app/src/stories/zoom/Zoom.stories.mdx b/demo-app/src/stories/zoom/Zoom.stories.mdx new file mode 100644 index 00000000..f4a8b2c1 --- /dev/null +++ b/demo-app/src/stories/zoom/Zoom.stories.mdx @@ -0,0 +1,15 @@ +import { Meta, ArgsTable } from '@storybook/addon-docs'; +import Timeline from '../../../../src/timeline'; +import ItemRenderer from '../../../../src/components/ItemRenderer'; +import { encodeApiDocURIForSubpath, parametersDocPage } from '../StorybookUtils'; + + + +## Zoom + +Zoom mechanism work on `CTRL + mouse wheel` on gantt table part. +For show the shortcuts in context menu the proprety Timeline.showZommShortcuts to be set. + +## `Timeline` + + diff --git a/demo-app/src/stories/zoom/Zoom.stories.tsx b/demo-app/src/stories/zoom/Zoom.stories.tsx new file mode 100644 index 00000000..09dc51e6 --- /dev/null +++ b/demo-app/src/stories/zoom/Zoom.stories.tsx @@ -0,0 +1,71 @@ +import React, { useState } from 'react'; +import { timelineScenarios } from '../TimelineScenarios'; +import { d, someHumanResources, someTasks } from '../sampleData'; +import { Table, Column, DataCell } from 'fixed-data-table-2'; +import Timeline from '../../../../src/timeline'; +import SplitPane from 'react-split-pane'; +import { Checkbox, Form, Radio } from 'semantic-ui-react'; +import { Zoom } from '@crispico/foundation-react/components/Zoom/Zoom'; +import { createTestids } from '@famiprog-foundation/tests-are-demo'; + +export default { + title: 'Features/Zoom' +}; + +export const zoomStoriesTestIds = createTestids('ZoomStory', {zoomEnabledCheckbox:''}); + +export const Main = () => { + const [zoomEnabled, setZoomEnabled] = useState boolean)>(true); + const handleZoomEnabledChange = (e, { value }) => { + if (zoomEnabled) { + setZoomEnabled(false); + } else { + // Here, we could directly set the `zoomEnabled` to `true`. + // We set it to a function only to demonstration purposes. + setZoomEnabled(() => true); + } + }; + return ( + <> +
+ + + +
+ {/* position: 'relative' was needed because the split pane was overlapping the split pane because of its absolute positioning */} + + + Title} + cell={({ rowIndex }) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}} /> + } + /> + + Title} + cell={({ rowIndex }) => {rowIndex < someHumanResources.length ? someHumanResources[rowIndex].title : ""}} /> + } + /> + + + ); +}; + +Main.parameters = { + scenarios: [ + timelineScenarios.propertyShowZoomShortcuts, + ] +}; diff --git a/demo-app/src/testsAreDemo/BackgroundLayersTestsAreDemo.tsx b/demo-app/src/testsAreDemo/BackgroundLayersTestsAreDemo.tsx new file mode 100644 index 00000000..d30b1016 --- /dev/null +++ b/demo-app/src/testsAreDemo/BackgroundLayersTestsAreDemo.tsx @@ -0,0 +1,63 @@ +import { Only, Scenario, render, tad } from "@famiprog-foundation/tests-are-demo"; +import { Main, month } from "../stories/backgroundLayer/BackgroundLayer.stories"; +import { dateAndHourOfMonth } from "../stories/sampleData"; +import {Timeline, getPixelAtTime, getPixelsFromDuration} from "@famiprog-foundation/react-gantt"; +import moment from "moment"; +import { highlightedIntervalTestIds } from "../../../src/components/HighlightedInterval"; + +export class BackgroundLayersTestsAreDemo { + async before() { + render(
); + } + + @Scenario("The highlighted intervals are correctly displayed") + async highlightedIntervalsAreDisplayed() { + const ganttLeftOffset = tad.getObjectViaCheat(Timeline, 'r9k1').getGanttLeftOffset(); + + var interval = tad.screenCapturing.getByTestId('r9k1_' + highlightedIntervalTestIds.interval + "_0"); + await tad.assertWaitable.exists(interval); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().x - ganttLeftOffset, this.getPixelsAtTime(dateAndHourOfMonth(month, 4)), 1); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfMonth(month, 4), dateAndHourOfMonth(month, 6)), 1); + + interval = tad.screenCapturing.getByTestId('r9k1_' + highlightedIntervalTestIds.interval + "_1"); + await tad.assertWaitable.exists(interval); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().x - ganttLeftOffset, this.getPixelsAtTime(dateAndHourOfMonth(month, 11)), 1); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfMonth(month, 11), dateAndHourOfMonth(month, 13)), 1); + + interval = tad.screenCapturing.getByTestId('r9k1_' + highlightedIntervalTestIds.interval + "_2"); + await tad.assertWaitable.exists(interval); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().x - ganttLeftOffset, this.getPixelsAtTime(dateAndHourOfMonth(month, 18)), 1); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfMonth(month, 18), dateAndHourOfMonth(month, 20)), 1); + + interval = tad.screenCapturing.getByTestId('r9k1_' + highlightedIntervalTestIds.interval + "_3"); + await tad.assertWaitable.exists(interval); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().x - ganttLeftOffset, this.getPixelsAtTime(dateAndHourOfMonth(month, 25)), 1); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfMonth(month, 25), dateAndHourOfMonth(month, 27)), 1); + + interval = tad.screenCapturing.getByTestId('r9k1_' + highlightedIntervalTestIds.interval + "_4"); + await tad.assertWaitable.exists(interval); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().x - ganttLeftOffset, this.getPixelsAtTime(dateAndHourOfMonth(month, 1)), 1); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfMonth(month, 1), dateAndHourOfMonth(month, 2)), 1); + + interval = tad.screenCapturing.getByTestId('r9k1_' + highlightedIntervalTestIds.interval + "_5"); + await tad.assertWaitable.exists(interval); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().x - ganttLeftOffset, this.getPixelsAtTime(dateAndHourOfMonth(month, 15)), 1); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfMonth(month, 15), dateAndHourOfMonth(month, 18)), 1); + + interval = tad.screenCapturing.getByTestId('r9k1_' + highlightedIntervalTestIds.interval + "_6"); + await tad.assertWaitable.exists(interval); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().x - ganttLeftOffset, this.getPixelsAtTime(dateAndHourOfMonth(month, 20, 19)), 1); + await tad.assertWaitable.approximately(interval.getBoundingClientRect().width, this.getPixelsFromDuration(dateAndHourOfMonth(month, 20, 19), dateAndHourOfMonth(month, 21, 10)), 1); + } + + getPixelsAtTime(date) { + const timeline = tad.getObjectViaCheat(Timeline, 'r9k1'); + return getPixelAtTime(moment(date), timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined)); + } + + getPixelsFromDuration(start, end) { + const timeline = tad.getObjectViaCheat(Timeline, 'r9k1'); + return getPixelsFromDuration(moment(end).diff(start, "milliseconds"), timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap()); + + } +} \ No newline at end of file diff --git a/demo-app/src/testsAreDemo/ContextMenuTestsAreDemo.tsx b/demo-app/src/testsAreDemo/ContextMenuTestsAreDemo.tsx new file mode 100644 index 00000000..858dfc8a --- /dev/null +++ b/demo-app/src/testsAreDemo/ContextMenuTestsAreDemo.tsx @@ -0,0 +1,172 @@ +import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +import { contextMenuTestIds, DEFAULT_ROW_TOP_BOTTOM_PADDING } from "@famiprog-foundation/react-gantt"; +import { ContextMenu, addTaskActionIcon, addTaskActionLabel, addTaskNotPossibleAction, deleteActionIcon, deleteActionIconColor, deleteActionLabel, editActionLabel } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +import { someHumanResources, someTasks } from "../stories/sampleData"; +import { Timeline, timelineTestids as testids } from "@famiprog-foundation/react-gantt"; +import { getPixelAtTime, getTimeAtPixel } from "@famiprog-foundation/react-gantt"; +import { rightClick } from "./testUtils"; + +const CLICK_X =30; +export class ContextMenuTestsAreDemo { + + async before() { + render(); + } + + @Scenario("WHEN I right click on a row, THEN a context menu with one action opens") + @ScenarioOptions({ linkWithNextScenario: true }) + async whenRightClickOnARow() { + // WHEN right click on a row + const firstRow = tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_0"); + const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + CLICK_X, clientY: Math.round(firstRow.getBoundingClientRect().y) + 20 }; + await tad.showSpotlight({ message: "I right click on a row", focusOnLastElementCaptured: true }); + rightClick(firstRow, clickPosition); + + // THEN CM is opened at the clicked position + tad.demoForEndUserHide(); + const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + await tad.assertWaitable.exists(popup); + await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), { x: clickPosition.clientX, y: clickPosition.clientY }); + tad.demoForEndUserShow(); + + // AND it has an 'Add task' actions + let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0"); + tad.cc("The context menu contains an 'Add' action"); + await tad.assertWaitable.equal(menuEntry.textContent, addTaskActionLabel + someHumanResources[0].title); + tad.demoForEndUserHideNext(); + await tad.assertWaitable.include(menuEntry.querySelector("i").className, addTaskActionIcon); + } + + @Scenario("WHEN I click on an action, THEN the action is run (w/ or w/o closing the menu)") + @ScenarioOptions({ linkWithNextScenario: true }) + async whenClickAnAction() { + // WHEN I click on "Add" + const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0")); + + // THEN a new task is added + let newSegment = tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_" + someTasks.length); + await tad.assertWaitable.exists(newSegment); + + tad.demoForEndUserHide(); + // AND the CM is closed + await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup)); + + // AND the new task is position correctly on x axes + // Gantt works with times "snapped to grid" so the position for the new task should be snapped to grid + const timeline = tad.getObjectViaCheat(Timeline, 'r9k1'); + const firstRow = tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_0"); + const clickedTime = getTimeAtPixel(CLICK_X, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined), timeline.getTimelineSnap()); + const clickedXSnappedToGrid = getPixelAtTime(clickedTime, timeline.getStartDate(), timeline.getEndDate(), timeline.getTimelineWidth(undefined)) + + timeline.getGanttLeftOffset(); + const expected = Math.round(newSegment.getBoundingClientRect().x); + + // Allow a ±3px tolerance because snap math and browser/device DPI can introduce small rounding offsets. + const acceptableRange = [expected - 3, expected - 2, expected - 1, expected, expected + 1, expected + 2, expected + 3]; + await tad.assertWaitable.include(acceptableRange, Math.round(clickedXSnappedToGrid)); + + // AND is correctly added to the clicked row + await tad.assertWaitable.equal(newSegment.getBoundingClientRect().y, firstRow.getBoundingClientRect().y + DEFAULT_ROW_TOP_BOTTOM_PADDING); + tad.demoForEndUserShow(); + } + + @Scenario("WHEN I right click on a segment, THEN a context menu with 3 actions is shown") + @ScenarioOptions({ linkWithNextScenario: true }) + async whenRightClickOnASegment() { + const segment = tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_0"); + const segmentBoundingRect = segment.getBoundingClientRect(); + + // WHEN right click on a segment + await tad.showSpotlight({ message: "I right click on a segment", focusOnLastElementCaptured: true }); + rightClick(segment, { clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); + + // THEN the CM opens + tad.demoForEndUserHideNext(); + const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + await tad.assertWaitable.exists(popup); + + // AND it has: 'Add', 'Edit' and 'Delete' actions + tad.cc("The context menu contains an 'Add' action"); + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[0].title); + + tad.cc("And an 'Edit' action"); + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); + + tad.cc("And a 'Delete' action"); + let menuEntry = tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2"); + await tad.assertWaitable.equal(menuEntry.textContent, deleteActionLabel); + tad.cc("With a custom red renderer"); + tad.demoForEndUserHideNext(); + await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIcon); + await tad.assertWaitable.include(menuEntry.querySelector("i").className, deleteActionIconColor); + } + + @Scenario("WHEN I CTRL + right click on another segment, THEN a context menu with 2 actions is shown") + @ScenarioOptions({ linkWithNextScenario: true }) + async whenCTRLRightClickOnAnotherSegment() { + const segment = tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_3"); + const segmentBoundingRect = segment.getBoundingClientRect(); + await tad.showSpotlight({ message: "WHEN I CTRL + right click another segment", focusOnLastElementCaptured: true }); + rightClick(segment, { ctrlKey: true, clientX: segmentBoundingRect.x + segmentBoundingRect.width / 2, clientY: segmentBoundingRect.y + segmentBoundingRect.height / 2 }); + + // THEN the CM opens + tad.demoForEndUserHideNext(); + const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + await tad.assertWaitable.exists(popup); + + // AND it has: 'Add' and 'Delete' actions + tad.cc("The context menu contains an 'Add' action"); + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskActionLabel + someHumanResources[1].title); + + tad.cc("And a 'Delete' action"); + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, deleteActionLabel); + } + + @Scenario("WHEN I click the hamburger button, THEN the context menu is shown besides that button") + async whenClickTheHamburgerButton() { + // GIVEN I select one segment + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_1")); + + // WHEN + const menuButton = tad.screenCapturing.getByTestId('r9k1_' + testids.menuButton); + tad.cc("Click on the menu button"); + await tad.userEventWaitable.click(menuButton); + + // THEN the context menu is opened and positioned near the center of the hamburger button"); + tad.demoForEndUserHide(); + const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + await tad.assertWaitable.exists(popup); + const menuButtonCenter = { x: menuButton.getBoundingClientRect().x + menuButton.getBoundingClientRect().width / 2, y: menuButton.getBoundingClientRect().y + menuButton.getBoundingClientRect().height / 2 }; + await this.isPopupPositionedNearPoint(popup.getBoundingClientRect(), menuButtonCenter); + tad.demoForEndUserShow(); + + // AND it has: 'Add task: not possible', 'Edit' adn 'Delete' actions + tad.cc("The context menu contains an 'Add task not possible' action"); + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0").textContent, addTaskNotPossibleAction); + tad.cc("And an 'Edit' action"); + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1").textContent, editActionLabel); + tad.cc("And a 'Delete' action"); + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_2").textContent, deleteActionLabel); + + // WHEN click 'Edit' (dontCloseContextMenuAfterRunAutomatically = true) THEN the CM doesn't close + // We putted this verification at the end of the tests, because else we needed to close the prompt for the next scenarios, and this was not trivial + tad.demoForEndUserHide(); + await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1")); + await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); + tad.demoForEndUserShow(); + } + + async isPopupPositionedNearPoint({ x: popupX, y: popupY, width: popupWidth, height: popupHeight }, { x, y }) { + const popupEndX = Math.round(popupX + popupWidth); + const popupEndY = Math.round(popupY + popupHeight); + popupX = Math.floor(popupX); + popupY = Math.round(popupY); + + // We didn't understood why it is a difference of some decimals (maximum 1 px) between the expected position and the actual position. + // These difference in decimals is not the same every time, is variable regarding the dimension of the window and the dpi of the screen + // So the only thing in common is that the actual value is near the expected one at a maximum 1 px distance (below or above) + await tad.assertWaitable.include([popupX - 1, popupX, popupX + 1, popupEndX - 1, popupEndX, popupEndX + 1], Math.round(x)); + // semantic ui popup is displayed 10 px below or 10 px above the mouse position + await tad.assertWaitable.include([popupY - 11, popupY - 10, popupY - 9, popupEndY + 9, popupEndY + 10, popupEndY + 11], Math.round(y)); + } +} \ No newline at end of file diff --git a/demo-app/src/testsAreDemo/DisplayItemOnSeparateRowIfOverlapTestsAreDemo.tsx b/demo-app/src/testsAreDemo/DisplayItemOnSeparateRowIfOverlapTestsAreDemo.tsx new file mode 100644 index 00000000..01423dac --- /dev/null +++ b/demo-app/src/testsAreDemo/DisplayItemOnSeparateRowIfOverlapTestsAreDemo.tsx @@ -0,0 +1,107 @@ +import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo" +import { FALSE, Main, ONLY_FOR_SELECTED, TRUE, setSelectedRow } from "../stories/displayItemOnSeparateRowIfOverlap/DisplayItemOnSeparateRowIfOverlap.stories"; +import { displayItemOnSeparateRowIfOverlapStoryTestIds } from "../stories/displayItemOnSeparateRowIfOverlap/DisplayItemOnSeparateRowIfOverlap.stories"; +import { DEFAULT_ITEM_HEIGHT, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS, timelineTestids } from "../../../src/timeline"; + +export class DisplayItemOnSeparateRowIfOverlapTestsAreDemo { + + async before() { + render(
); + } + + @Scenario("GIVEN there are some segments (items) for which the periods overlap ...") + async _() { + } + + /** + * This is the default behavior. + * + * @img displayItemOnSeparateRowIfOverlap_dropdown_click_true + */ + @Scenario("..., AND displayItemOnSeparateRowIfOverlap is true, WHEN render, THEN they are drawn on different rows, to avoid overlapping") + async givenTrue() { + // We need to actual click on true, because even if this property is true by default and even if the test passes when on a first run, it will fail if run second time + let dropdown = tad.screenCapturing.getByTestId(displayItemOnSeparateRowIfOverlapStoryTestIds.displayItemOnSeparateRowDropdown); + tad.userEventWaitable.click(dropdown); + tad.userEventWaitable.click(tad.withinCapturing(dropdown).getByRole("option", { name: TRUE })); + + // Rows expand to fit all the segments + let ganttBody = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.ganttBody); + await tad.assertWaitable.equal(tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_0").offsetHeight, DEFAULT_ITEM_HEIGHT + 2 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + await tad.assertWaitable.equal(tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1").offsetHeight, 2 * DEFAULT_ITEM_HEIGHT + 3 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + await tad.assertWaitable.equal(tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_2").offsetHeight, 2 * DEFAULT_ITEM_HEIGHT + 3 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + // Segments that overlapp are positioned on different sub-rows + let item = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1"); + await tad.assertWaitable.equal(tad.withinCapturing(item).getByTestId('r9k1_' + timelineTestids.item + "_3").offsetTop, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + item = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1"); + await tad.assertWaitable.equal(tad.withinCapturing(item).getByTestId('r9k1_' + timelineTestids.item + "_11").offsetTop, DEFAULT_ITEM_HEIGHT + 2 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + item = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1"); + await tad.assertWaitable.equal(tad.withinCapturing(item).getByTestId('r9k1_' + timelineTestids.item + "_4").offsetTop, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + } + + /** + * The z index of the segments can be specified (via a callback), so that we can have a deterministic order on the z/depth axis. If you customize `displayItemOnSeparateRowIfOverlap` then you should also use ???. + * + * It may also be interesting to play w/ transparency (alpha) of your renderers. E.g. it may be interesting for the ones that are rather on top, to be (a bit) transparent. + * + * @img displayItemOnSeparateRowIfOverlap_dropdown_click_false + */ + @Scenario("..., AND displayItemOnSeparateRowIfOverlap is false, WHEN render, THEN they overlap as well") + async givenFalse() { + let dropdown = tad.screenCapturing.getByTestId(displayItemOnSeparateRowIfOverlapStoryTestIds.displayItemOnSeparateRowDropdown); + tad.userEventWaitable.click(dropdown); + tad.userEventWaitable.click(tad.withinCapturing(dropdown).getByRole("option", { name: FALSE })); + + // Rows are short + let ganttBody = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.ganttBody); + await tad.assertWaitable.equal(tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1").offsetHeight, DEFAULT_ITEM_HEIGHT + 2 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + await tad.assertWaitable.equal(tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_2").offsetHeight, DEFAULT_ITEM_HEIGHT + 2 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + // All segments are positioned on the same subrow, even if they overlap + let item = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1"); + await tad.assertWaitable.equal(tad.withinCapturing(item).getByTestId('r9k1_' + timelineTestids.item + "_3").offsetTop, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + item = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1"); + await tad.assertWaitable.equal(tad.withinCapturing(item).getByTestId('r9k1_' + timelineTestids.item + "_11").offsetTop, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + item = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1"); + await tad.assertWaitable.equal(tad.withinCapturing(item).getByTestId('r9k1_' + timelineTestids.item + "_4").offsetTop, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + } + + /** + * An example use case: have something like an expand/collapse for a row. E.g. w/ a +/- button in the table, or expanding the row that is currently selected. + * + * @img displayItemOnSeparateRowIfOverlap_dropdown_click_function + */ + @Scenario("..., AND displayItemOnSeparateRowIfOverlap is a function, THEN it's used to decide about the overlapping behavior") + async givenFunction() { + let dropdown = tad.screenCapturing.getByTestId(displayItemOnSeparateRowIfOverlapStoryTestIds.displayItemOnSeparateRowDropdown); + tad.userEventWaitable.click(dropdown); + tad.userEventWaitable.click(tad.withinCapturing(dropdown).getByRole("option", { name: ONLY_FOR_SELECTED })); + setSelectedRow(1) + + // All rows are short except the one selected + let ganttBody = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.ganttBody); + await tad.assertWaitable.equal(tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_0").offsetHeight, DEFAULT_ITEM_HEIGHT + 2 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + await tad.assertWaitable.equal(tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1").offsetHeight, 2 * DEFAULT_ITEM_HEIGHT + 3 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + await tad.assertWaitable.equal(tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_2").offsetHeight, DEFAULT_ITEM_HEIGHT + 2 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + // Segments that overlapp are positioned on different sub-rows, on the selected row + let row = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1"); + await tad.assertWaitable.equal(tad.withinCapturing(row).getByTestId('r9k1_' + timelineTestids.item + "_3").offsetTop, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + row = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1"); + await tad.assertWaitable.equal(tad.withinCapturing(row).getByTestId('r9k1_' + timelineTestids.item + "_11").offsetTop, DEFAULT_ITEM_HEIGHT + 2 * DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + row = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_1"); + await tad.assertWaitable.equal(tad.withinCapturing(row).getByTestId('r9k1_' + timelineTestids.item + "_4").offsetTop, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + + // And on the same subrow, on the other not selected rows + row = tad.withinCapturing(ganttBody).getByTestId('r9k1_' + timelineTestids.row + "_2"); + await tad.assertWaitable.equal(tad.withinCapturing(row).getByTestId('r9k1_' + timelineTestids.item + "_12").offsetTop, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + await tad.assertWaitable.equal(tad.withinCapturing(row).getByTestId('r9k1_' + timelineTestids.item + "_6").offsetTop, DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS); + } +} diff --git a/demo-app/src/testsAreDemo/DragToCreateTestsAreDemo.tsx b/demo-app/src/testsAreDemo/DragToCreateTestsAreDemo.tsx new file mode 100644 index 00000000..591a5069 --- /dev/null +++ b/demo-app/src/testsAreDemo/DragToCreateTestsAreDemo.tsx @@ -0,0 +1,201 @@ +import { Only, render, Scenario, tad } from "@famiprog-foundation/tests-are-demo"; +import { Main } from "../stories/dragToCreate/DragToCreate.stories"; +import {Timeline, DRAG_TO_CREATE_ACTION_LABEL, DRAG_TO_CREATE_POPUP_CLOSE_TIME, DRAG_TO_CREATE_POPUP_LABEL_2,timelineTestids, contextMenuTestIds } from "@famiprog-foundation/react-gantt"; +import { dragToCreateStoriesTestIds as testIds } from "../stories/dragToCreate/DragToCreate.stories"; +import { someTasks } from "../stories/sampleData"; + +export class DragToCreateTestsAreDemo { + + async before() { + render(
); + } + + @Scenario("WHEN click on the menu button, THEN the menu opens with a 'Drag To Create' menu entry") + async whenClickMenuButton() { + tad.cc("Click on the menu button"); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.menuButton)); + tad.cc("Check if the context menu is open"); + await tad.assertWaitable.exists(tad.screenCapturing.getByTestId(contextMenuTestIds.popup)); + + tad.cc("Check if exist the 'Drag To Create' action"); + await tad.assertWaitable.equal(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0").textContent, DRAG_TO_CREATE_ACTION_LABEL); + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ openedContextMenuCoordinates: undefined }); + } + + @Scenario("WHEN click on the 'Drag To Create' menu entry, THEN the Gantt goes into the 'drag to create mode' and the drag to create popup appears") + async whenClickAddMenuEntry() { + // GIVEN context menu is opened by pressing the hamburger button + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.menuButton)); + + // WHEN + tad.cc("Click 'Drag To Create' menu entry"); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); + + // THEN + await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline, 'r9k1').state.dragToCreateMode, "Drag to create mode should be active"); + + const popup = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.dragToCreatePopup); + tad.cc("Check if drag to create popup exists"); + await tad.assertWaitable.exists(popup); + + // Check the labels + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId('r9k1_' + timelineTestids.dragToCreatePopupLabel + "_1").innerHTML, "Click and drag to create a new segment"); + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId('r9k1_' + timelineTestids.dragToCreatePopupLabel + "_2").textContent, DRAG_TO_CREATE_POPUP_LABEL_2); + await tad.assertWaitable.equal(tad.withinCapturing(popup).getByTestId('r9k1_' + timelineTestids.dragToCreatePopupLabel + "_3").innerHTML, "To cancel you can also click on gantt"); + const cancelButton = tad.withinCapturing(popup).getByTestId('r9k1_' + timelineTestids.dragToCreatePopupCancelButton); + tad.cc("Check if exists 'Cancel' button"); + await tad.assertWaitable.exists(cancelButton); + tad.cc("Check if the cancel button is negative"); + await tad.assertWaitable.include(cancelButton.className, "negative"); + + // Test auto closing of the popup + tad.demoForEndUserHide(); + + // AND the popup closes after DRAG_TO_CREATE_POPUP_CLOSE_TIME + // I tried to test also from time to time that the popup is opened but the setTimeout(time) + // doesn't ensure that exacly `time` has passed, it could have passed a little bit more (and that little bit cause + // inexact test for when the popup is still opened) + await new Promise(resolve => setTimeout(resolve, DRAG_TO_CREATE_POPUP_CLOSE_TIME)); + await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId('r9k1_' + timelineTestids.dragToCreatePopup)); + + // AND still in drag to create mode + await tad.assertWaitable.isTrue(tad.getObjectViaCheat(Timeline, 'r9k1').state.dragToCreateMode); + tad.demoForEndUserShow(); + + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ openedContextMenuCoordinates: undefined }); + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ dragToCreateMode: false }); + } + + @Scenario("GIVEN drag to create mode, WHEN click on cancel, THEN mode is cancelled") + async givenDragToCreateModeWhenClickCancel() { + // GIVEN context menu was opened and 'Drag To Create' was pressed + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.menuButton)); + tad.cc("Click 'Drag To Create' menu entry"); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(contextMenuTestIds.menuItem + "_0")); + + // WHEN + tad.cc("Click on `Cancel 'drag to create' mode` button from the drag to create popup"); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.dragToCreatePopupCancelButton)); + + // THEN + await tad.assertWaitable.isFalse(tad.getObjectViaCheat(Timeline, 'r9k1').state.dragToCreateMode, "Check if the drag to create mode is cancelled"); + + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ openedContextMenuCoordinates: undefined }); + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ dragToCreateMode: false }); + } + + @Scenario("GIVEN drag to create mode, WHEN click and drag, THEN a green selection rectangle appears") + async givenDragToCreateModeWhenClickAndDrag() { + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ dragToCreateMode: true }); + + await startDragKeepInProgress(3, 100); + const selector = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.selector); + const { height } = selector.getBoundingClientRect(); + tad.cc("A green selection rectangle appears on the row"); + await tad.assertWaitable.exists(selector); + let row = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_4"); + await tad.showSpotlight({ message: "On drag to create mode in progress, when we move the mouse to the other row, selection rectangle stays only on the starting row, the mouse position is on the next row", focusOnLastElementCaptured: true }); + await tad.getObjectViaCheat(Timeline, 'r9k1').dragMove(0, height); + tad.cc("The height of the section regtagle isn't changed"); + await tad.assertWaitable.equal(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.selector).getBoundingClientRect().height, height); + row = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_2"); + await tad.showSpotlight({ message: "Move the mouse on previous row", focusOnLastElementCaptured: true }); + await tad.getObjectViaCheat(Timeline, 'r9k1').dragMove(0, -2 * height); + tad.cc("The height of the section regtagle isn't changed"); + await tad.assertWaitable.equal(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.selector).getBoundingClientRect().height, height); + + tad.getObjectViaCheat(Timeline, 'r9k1')._selectBox.end(); + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ dragToCreateMode: false }); + } + + @Scenario("GIVEN drag to create in progress, WHEN right click, THEN cancel") + async givenDragToCreateModeInProgressWhenRightClick() { + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ dragToCreateMode: true }); + + let row = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_3"); + tad.cc("The row don't have the segments"); + await tad.assertWaitable.equal(row.children.length, 0); + await startDragKeepInProgress(3, 100); + row = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_3"); + await tad.showSpotlight({ message: "We perform the right click", focusOnLastElementCaptured: true }); + tad.getObjectViaCheat(Timeline, 'r9k1').rightClick(); + row = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_3"); + tad.cc("The segment wasn't created, the row don't have the segments"); + await tad.assertWaitable.equal(row.children.length, 0); + + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ dragToCreateMode: false }); + } + + @Scenario("GIVEN drag to create in progress, WHEN mouse up, THEN handler is called") + async givenDragToCreateModeInProgressWhenMouseUp() { + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ dragToCreateMode: true }); + + await startDragKeepInProgress(3, 100); + tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_3"); + await tad.showSpotlight({ message: "We perform the mouse up", focusOnLastElementCaptured: true }); + tad.getObjectViaCheat(Timeline, 'r9k1').dragEnd(); + tad.cc("The segment was created"); + await tad.assertWaitable.exists(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.item + "_" + (someTasks.length))); + + tad.getObjectViaCheat(Timeline, 'r9k1').setState({ dragToCreateMode: false }); + } + + @Scenario("WHEN forceDragToCreateMode = true/false, THEN action is not show and segments can/can't be created") + async whenForceDragToCreateModeTrueFalseThenActionIsNotShownAndSegmentsCanBeCreatedOrNot() { + // WHEN forceDragToCreate = true + await tad.cc("WHEN I set forceDragToCreate = true AND I drag to create"); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeTrueRadio)); + + // AND WHEN I drag and move + await startDragKeepInProgress(2, 100); + tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_2"); + + tad.cc("AND I perform"); + const selector = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.selector); + // THEN + tad.cc("THEN the drag to create rectangle appears on the row"); + await tad.assertWaitable.exists(selector); + tad.cc("AND it is green"); + await tad.assertWaitable.include(Array.from(selector.classList), "rct9k-selector-outer-add"); + + // AND WHEN I perform mouse up + await tad.showSpotlight({ message: "AND when I perform the mouse up", focusOnLastElementCaptured: true }); + tad.getObjectViaCheat(Timeline, 'r9k1').dragEnd(); + + // THEN + tad.cc("THEN A segment is created"); + await tad.assertWaitable.exists(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.item + "_" + (someTasks.length + 1))); + + // AND + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.menuButton)); + await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); + + // WHEN forceDragToCreate = false + await tad.cc("WHEN I set forceDragToCreate = false AND I drag and drop"); + // TODO era uitat await; dar crapa in modul "fast"; + // insa de evitat interactiuni de UI inutile. A simula o actiune omeneasca (e.g. apasare pe buton) + // este un efort pentru noi. Ne e mult mai simplu sa apelam o functie care sa faca treaba, decat sa simulam + // actiunea. In cazul asta deci, cred ca era mai bine sa setam acel mod programatic + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.forceDragToCreateModeFalseRadio)); + + // THEN segments are not created at drag + await startDragKeepInProgress(2, 100); + tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_2"); + tad.getObjectViaCheat(Timeline, 'r9k1').dragEnd(); + await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId('r9k1_' + timelineTestids.item + "_" + (someTasks.length + 2))); + + // AND + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.menuButton)); + await tad.assertWaitable.notExists(tad.screenCapturing.queryByTestId(contextMenuTestIds.popup), "AND no 'Drag to create' action is shown"); + } +} + +async function startDragKeepInProgress(rowNumber: number, x: number, xOffset: number = 10) { + // we need to get the row after each showSpotlight because on click next step the lastElementCaptured was lost + let row = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_" + rowNumber); + await tad.showSpotlight({ message: "We perform click for start the drag", focusOnLastElementCaptured: true }); + tad.getObjectViaCheat(Timeline, 'r9k1').dragStart(row, xOffset); + row = tad.screenCapturing.getByTestId('r9k1_' + timelineTestids.row + "_" + rowNumber); + await tad.showSpotlight({ message: "We perform mouse move with " + x + "px on X axis", focusOnLastElementCaptured: true }); + await tad.getObjectViaCheat(Timeline, 'r9k1').dragMove(x, 0); +} diff --git a/demo-app/src/testsAreDemo/DynamicConfigurationTestsAreDemo.tsx b/demo-app/src/testsAreDemo/DynamicConfigurationTestsAreDemo.tsx new file mode 100644 index 00000000..1fbe2340 --- /dev/null +++ b/demo-app/src/testsAreDemo/DynamicConfigurationTestsAreDemo.tsx @@ -0,0 +1,23 @@ +import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +import { Main, testIds } from "../stories/dynamicConfiguration/DynamicConfiguration.stories"; +import { timebarTestIds } from "@famiprog-foundation/react-gantt"; + +/** + * @author Daniela Buzatu + */ +export class DynamicConfigurationTestsAreDemo { + async before() { + render(
); + } + + @Scenario("WHEN I change the startDate/endDate properties THEN the new interval is displayed") + async whenStartEndDateChanges() { + // WHEN I change the start/end date properties by clicking the "Change display interval" button + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(testIds.changeDisplayIntervalButton)); + + // THEN the new interval is displayed + const timebarBottom = tad.screenCapturing.getByTestId('r9k1_' + timebarTestIds.timebarInnerBottom); + await tad.assertWaitable.equal(tad.withinCapturing(timebarBottom).getByTestId('r9k1_' + timebarTestIds.timebarItem + "_" + 0).textContent, "1"); + await tad.assertWaitable.equal(tad.withinCapturing(timebarBottom).getByTestId('r9k1_' + timebarTestIds.timebarItem + "_" + 29).textContent, "30"); + } +} \ No newline at end of file diff --git a/demo-app/src/testsAreDemo/SelectedItemsTestsAreDemo.tsx b/demo-app/src/testsAreDemo/SelectedItemsTestsAreDemo.tsx new file mode 100644 index 00000000..6639e352 --- /dev/null +++ b/demo-app/src/testsAreDemo/SelectedItemsTestsAreDemo.tsx @@ -0,0 +1,340 @@ +import { Only, Scenario, ScenarioOptions, render, tad } from "@famiprog-foundation/tests-are-demo"; +import { assert } from "chai"; +import { Selection, selectionStoryTestIds } from "../stories/contextMenuAndSelection/ContextMenuAndSelection.stories"; +import { someTasks } from "../stories/sampleData"; +import { Timeline, timelineTestids as testids } from "@famiprog-foundation/react-gantt"; +import { rightClick } from "./testUtils"; + +/** +* @author Daniela Buzatu +*/ +export class SelectedItemsTestsAreDemo { + async before() { + render(); + } + + @Scenario("WHEN click on a segment, THEN only that segment is selected") + @ScenarioOptions({linkWithNextScenario: true}) + async whenClickOnASegment() { + // WHEN left click, THEN element is selected + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_2")); + await this.assertOnlyExpectedSegmentsAreSelected([2]); + + //=======HIDDEN TESTS (Not interesting for the user)========== + tad.demoForEndUserHide(); + + // WHEN left click again on same element, THEN the same element is selected + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_2")); + await this.assertOnlyExpectedSegmentsAreSelected([2], true); + + // ==Right click can be used also for selecting segments. It works the same as left click (except that right click on a selected segment doesn't change the selection)== + // GIVEN nothing is selected + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1")); + + // WHEN right click, THEN element is selected + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_4")); + await this.assertOnlyExpectedSegmentsAreSelected([4], true); + + // WHEN right click again on another element, THEN the new element is selected + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_5")); + await this.assertOnlyExpectedSegmentsAreSelected([5], true); + + // WHEN right click again on same element, THEN the same element is selected + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_5")); + await this.assertOnlyExpectedSegmentsAreSelected([5], true); + + // GIVEN many segments are selected, WHEN right click one of them THEN the selection doesn't change + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_1")); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_2"), { ctrlKey: true }); + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_1")); + await this.assertOnlyExpectedSegmentsAreSelected([1, 2], true); + + // restore selection for the next scenario + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_2")); + tad.demoForEndUserShow(); + } + + @Scenario("WHEN click on another segment, THEN only that segment is selected (so the previously selected segment is no more selected)") + @ScenarioOptions({linkWithNextScenario: true}) + async whenClickAnotherSegment() { + tad.cc(undefined); + // WHEN left click again on another element, THEN the new element is selected + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_3")); + await this.assertOnlyExpectedSegmentsAreSelected([3]); + } + + @Scenario("WHEN CTRL + click on a segment, THEN that segment is ADDED to the selection, AND both are now selected") + @ScenarioOptions({linkWithNextScenario: true}) + async whenCTRLClickOnASegment() { + // left click + CTRL on another element, THEN the new element is added to selection + tad.cc("With CTRL Key pressed"); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_0"), { ctrlKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); + + //=======HIDDEN TESTS (Not interesting for the user)========== + tad.demoForEndUserHide(); + + // WHEN left click + SHIFT on another element, THEN the new element is added to selection + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_4"), { shiftKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); + + // WHEN left click + SHIFT on same element, THEN the element is removed from selection + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_4"), { shiftKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); + + // WHEN right click + CTRL on another element, THEN the new element is added to selection + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_4"), { ctrlKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); + + // WHEN right click + CTRL on same element, THEN the selection doesn't change + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_4"), { ctrlKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4], true); + + // WHEN right click + SHIFT on another element, THEN the new element is added to selection + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_5"), { shiftKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); + + // WHEN right click + SHIFT on same element, THEN the selection doesn't change + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_5"), { shiftKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3, 4, 5], true); + + // restore selection for the next scenario + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_0")); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_3"), { ctrlKey: true }); + tad.demoForEndUserShow(); + } + + @Scenario("WHEN CTRL + click on a selected segment, THEN that segment is REMOVED from the selection, AND only one is now selected") + @ScenarioOptions({linkWithNextScenario: true}) + async whenCTRLClickOnASelectedSegment() { + // WHEN left click + CTRL on same element, THEN the element is removed from selection + tad.cc("With CTRL Key pressed"); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_3"), { ctrlKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0]); + } + + @Scenario("WHEN CTRL + click outside segments, THEN the selection doesn't change") + @ScenarioOptions({linkWithNextScenario: true}) + async whenCTRLClickOutside() { + // When I click outside + Ctrl key, THEN selection doesn't change + tad.cc("Click outside with CTRL Key pressed"); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1"), { ctrlKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0]); + + //=======HIDDEN TESTS (Not interesting for the user)========== + // Same as CLICK + CTRL outside any segment works: CLICK + SHIFT, RIGHT CLICK + CTRL, RIGHT CLICK + SHIFT outside any segment + await tad.demoForEndUserHide() + // WHEN I click outside + Shift key, THEN selection doesn't change + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1"), { shiftKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0], true); + + // WHEN I right click outside + Ctrl key, THEN selection doesn't change + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1"), { ctrlKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0], true); + + // WHEN I click outside + Shift key, THEN selection doesn't change + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1"), { shiftKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0], true); + tad.demoForEndUserShow(); + } + + @Scenario("WHEN click outside segments, THEN the selection becomes empty") + @ScenarioOptions({linkWithNextScenario: true}) + async whenClickOutside() { + // WHEN left click on row, THEN no segment is selected + tad.cc("Left click outside any segment"); + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1")); + await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); + await this.assertOnlyExpectedSegmentsAreSelected([]); + + //=======HIDDEN TESTS (Not interesting for the user)========== + // GIVEN a segment is selected + tad.demoForEndUserHide(); + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_2")); + // WHEN right click on row, THEN no segment is selected + rightClick(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1")); + await this.assertOnlyExpectedSegmentsAreSelected([], true); + tad.demoForEndUserShow(); + } + + @Scenario("WHEN drag a selection rectangle over 2 segments, THEN only those 2 segments are selected") + @ScenarioOptions({linkWithNextScenario: true}) + async whenDragASelectionRectangleOverTwoSegments() { + await tad.showSpotlight({ message: "I drag to select segment 0 and 3 with left mouse button", focusOnLastElementCaptured: false }); + await this.dragToSelect(0, 1, 3, 3); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); + } + + @Scenario("WHEN drag a selection rectangle over another segment, THEN only that segment is selected (so the previous 2 segments are not selected any more") + @ScenarioOptions({linkWithNextScenario: true}) + async whenDragASelectionRectangleOverAnotherSegment() { + await tad.showSpotlight({ message: "I drag to select segment 3 with left mouse button", focusOnLastElementCaptured: false }); + await this.dragToSelect(1, 1, 3, 3); + await this.assertOnlyExpectedSegmentsAreSelected([3]); + + //=======HIDDEN TESTS (Not interesting for the user)========== + // Using right mouse button works the same + tad.demoForEndUserHide(); + // GIVEN nothing selected + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1")); + + await this.dragToSelect(0, 1, 3, 3, true); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); + + await this.dragToSelect(1, 1, 3, 3, true); + await this.assertOnlyExpectedSegmentsAreSelected([3], true); + tad.demoForEndUserShow(); + } + + @Scenario("WHEN hold CTRL + drag a selection rectangle over another segment, THEN that segment is ADDED to the selection, AND both are now selected") + @ScenarioOptions({linkWithNextScenario: true}) + async whenCTRLDragASelectionRectangleOverAnotherSegment() { + tad.cc(undefined); + await tad.showSpotlight({ message: "I draw a rectangle containing segment 0", focusOnLastElementCaptured: false }); + await this.dragToSelect(0, 0, 0, 0, false, true); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3]); + } + + @Scenario("WHEN hold CTRL + drag a selection rectangle over an already selected segment, THEN that segment is REMOVED from the selection, AND only one is selected") + @ScenarioOptions({linkWithNextScenario: true}) + async whenCTRLDragASelectionRectangleOverAlreadySelectedSegment() { + await tad.showSpotlight({ message: "I draw a rectangle containing segment 0 with LEFT mouse button and CTRL pressed", focusOnLastElementCaptured: false }); + await this.dragToSelect(1, 1, 3, 3, false, true); + await this.assertOnlyExpectedSegmentsAreSelected([0]); + + //=======HIDDEN TESTS (Not interesting for the user)========== + // Same as LEFT button + CTRL works: LEFT + SHIFT, RIGHT + CTRL, RIGHT + SHIFT + tad.demoForEndUserHide(); + // unselect everything + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1")); + // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are added to selection + await this.dragToSelect(0, 1, 3, 3, true, true); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); + // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and CTRL pressed, THEN segment 3 is unselected + await this.dragToSelect(1, 1, 3, 3, true, true); + await this.assertOnlyExpectedSegmentsAreSelected([0], true); + + // unselect everything + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1")); + // WHEN I draw a rectangle containing segments 0, 3 with LEFT mouse button and SHIFT pressed, THEN segments 0, 3 are selected + await this.dragToSelect(0, 1, 3, 3, false, false, true); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); + // WHEN I draw a rectangle containing segment 3 with LEFT mouse button and SHIFT pressed, THEN segment 3 is unselected + await this.dragToSelect(1, 1, 3, 3, false, false, true); + await this.assertOnlyExpectedSegmentsAreSelected([0], true); + + // unselect everything + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1")); + // WHEN I draw a rectangle containing segments 0, 3 with RIGHT mouse button and SHIFT pressed, THEN segments 0, 3 are selected + await this.dragToSelect(0, 1, 3, 3, true, false, true); + await this.assertOnlyExpectedSegmentsAreSelected([0, 3], true); + // WHEN I draw a rectangle containing segment 3 with RIGHT mouse button and SHIFT pressed, , THEN segment 3 is unselected + await this.dragToSelect(1, 1, 3, 3, true, false, true); + await this.assertOnlyExpectedSegmentsAreSelected([0], true); + + // Select again the segment 0 + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_1")); + await this.dragToSelect(0, 0, 0, 0, false, true); + + tad.demoForEndUserShow(); + } + + @Scenario("WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change") + @ScenarioOptions({linkWithNextScenario: true}) + async whenCTRLDragASelectionRectangleOverAnEmptyArea() { + tad.cc(undefined); + await tad.showSpotlight({ message: "WHEN hold CTRL + drag a selection rectangle over an empty area, THEN the selection doesn't change", focusOnLastElementCaptured: false }); + let startingRow = tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_0"); + tad.getObjectViaCheat(Timeline, 'r9k1').dragStart(startingRow, 5); + await tad.getObjectViaCheat(Timeline, 'r9k1').dragMove(10, 10, 5); + tad.getObjectViaCheat(Timeline, 'r9k1').dragEnd({ctrlKey: true}); + await this.assertOnlyExpectedSegmentsAreSelected([0]); + + //=======HIDDEN TESTS (Not interesting for the user)========== + // Using right mouse button + CTRL works the same + tad.demoForEndUserHide(); + let row = tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_0"); + await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2, ctrlKey: true }); + await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10, ctrlKey: true }); + await tad.fireEventWaitable.mouseUp(row, { button: 2, ctrlKey: true }); + await this.assertOnlyExpectedSegmentsAreSelected([0], true); + tad.demoForEndUserShow(); + } + + @Scenario("WHEN drag a selection rectangle over an empty area, THEN the selection becomes empty") + @ScenarioOptions({linkWithNextScenario: true}) + async whenDragASelectionRectangleOverAnEmptyArea() { + tad.cc(undefined); + await tad.showSpotlight({ message: "I drag to select outside any segments (using left mouse button)", focusOnLastElementCaptured: false }); + let startingRow = tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_0"); + tad.getObjectViaCheat(Timeline, 'r9k1').dragStart(startingRow, 5); + await tad.getObjectViaCheat(Timeline, 'r9k1').dragMove(10, 10, 5); + tad.getObjectViaCheat(Timeline, 'r9k1').dragEnd(); + await tad.showSpotlight({ message: "No segment is selected", focusOnLastElementCaptured: false }); + await this.assertOnlyExpectedSegmentsAreSelected([]); + + //=======HIDDEN TESTS (Not interesting for the user)========== + // Using right mouse button works the same + tad.demoForEndUserHide(); + // given a selected segment + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_3")); + + let row = tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_0"); + await tad.fireEventWaitable.mouseDown(row, { clientX: row.getBoundingClientRect().x + 5, clientY: row.getBoundingClientRect().y + 5, button: 2 }); + await tad.fireEventWaitable.mouseMove(row, { clientX: 10, clientY: 10, pageX: 10 }); + await tad.fireEventWaitable.mouseUp(row, { button: 2 }); + await this.assertOnlyExpectedSegmentsAreSelected([], true); + tad.demoForEndUserShow(); + } + + //////////////////////////////////////////////////////////////////////////////////////// + ////// Helper methods + //////////////////////////////////////////////////////////////////////////////////////// + + async dragToSelect(startingRowIndex, endingRowIndex, startingSegmentIndex, endingSegmentIndex, rightClick?, ctrlKey = false, shiftKey = false) { + let startingRow = tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_" + startingRowIndex); + let startingRowRect = startingRow.getBoundingClientRect(); + let endingRow = tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_" + endingRowIndex); + let endingRowRect = endingRow.getBoundingClientRect(); + const startingSegmentRect = tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_" + startingSegmentIndex).getBoundingClientRect(); + const endingSegmentRect = tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_" + endingSegmentIndex).getBoundingClientRect(); + const deltaX = endingSegmentRect.x + endingSegmentRect.width - startingSegmentRect.x; + const deltaY = endingRowRect.y + endingRowRect.height - startingRowRect.y; + + // The drag to select with right click is not a nativelly supported type of drag. So the timeline uses two implementations for supporting + // 1. Drag to select on left click: based on interact js library triggered by native events dragStart, dragMove, dragEnd. + // These events can not be tested using testing-library (we have tried using fireEvent.mouseDown, mouseOver, and mouseUp, but with no success). That's why the "cheat" was needed + // 2. Drag to select on right click: triggered by mouseDown, mouseMove, mouseUp events + if (rightClick) { + // There was a bug when having a large DPI of the screen e.g. 170 + // Don't know why then the startingRowRect.y was not an integer (e.g. 256.789). Even if the TAD.drag() triggers the mouse event on this y floating value, + // when interactjs library catched this event it sees the Y as an integer (e.g. 256). Because 256.789 was the exact begining of the + // row, when timeline searches the row at position 256 it gets the previous row instead of the correct row. So applying Math.ceil fixed the problem + await tad.drag(startingRow, {from: {x: startingSegmentRect.x, y: Math.ceil(startingRowRect.y)}, to: {x: endingSegmentRect.x + endingSegmentRect.width, y: endingRowRect.y + endingRowRect.height - 5}, options: {button: 2, ctrlKey: ctrlKey, shiftKey: shiftKey}}); + } else { + // 150 is the group offset + // we needed to subtract -5 because else the selection rectangle (that snapps to row) will get till the endingRow + 1, instead endingRow + tad.getObjectViaCheat(Timeline, 'r9k1').dragStart(startingRow, startingSegmentRect.x - 150); + await tad.getObjectViaCheat(Timeline, 'r9k1').dragMove(deltaX, deltaY - 5, 5); + tad.getObjectViaCheat(Timeline, 'r9k1').dragEnd({ ctrlKey: ctrlKey, shiftKey: shiftKey }); + } + } + + async assertOnlyExpectedSegmentsAreSelected(expectedSelectedSegments: number[], demoForEndUserHide?) { + for (var i = 0; i < someTasks.length; i++) { + const segment = tad.screenCapturing.getByTestId('r9k1_' + testids.item + "_" + i); + if (expectedSelectedSegments.indexOf(i) >= 0) { + tad.cc("Segment " + i + " is selected (has resize anchors, brighter color and shadow effect)"); + // await tad.assertWaitable.include(Array.from(segment.classList), "rct9k-items-outer-selected"); + assert.include(Array.from(segment.classList), "rct9k-items-outer-selected"); + } else { + tad.demoForEndUserHide(); + // await tad.assertWaitable.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); + assert.notInclude(Array.from(segment.classList), "rct9k-items-outer-selected"); + !demoForEndUserHide && tad.demoForEndUserShow(); + } + } + + assert.equal(tad.screenCapturing.getByTestId(selectionStoryTestIds.selectedItemsSpan).textContent, expectedSelectedSegments.sort().join(", ")); + } +} \ No newline at end of file diff --git a/demo-app/src/testsAreDemo/TableTestsAreDemo.tsx b/demo-app/src/testsAreDemo/TableTestsAreDemo.tsx new file mode 100644 index 00000000..1152a3a3 --- /dev/null +++ b/demo-app/src/testsAreDemo/TableTestsAreDemo.tsx @@ -0,0 +1,69 @@ +import { Scenario, render, tad } from "@famiprog-foundation/tests-are-demo"; +import { assert } from "chai"; +import { Table } from "fixed-data-table-2"; +import { ProvidingCustomTable } from "../stories/table/Table.stories"; +import { DEMO_TABLE_WIDTH, tableTestIds } from "../stories/table/TableScenarios"; +import { timelineTestids as testids } from "../../../src/timeline"; + +export class TableTestsAreDemo { + async before() { + render(); + // When pressing run the second time the state of the scrollbars are not reset + // I thought that render() should reset its state, but it doesn't. + tad.screenCapturing.getByTestId('r9k1_' + testids.ganttBody).scroll({top:0}); + // TODO DB By running the tests second time, the SplitPane test fails because we need to reset its position + // Maybe a general mechanism of test sate reset is needed + } + + @Scenario("Both table and gantt diagram have same rows height") + async bothTableAndGanttHaveSameRowHeight() { + // Nu le putem verifica pe toate caci gridul este virtualizat + for (var i = 0; i < 5; i++) { + let ganttRow = tad.screenCapturing.getByTestId('r9k1_' + testids.row + "_" + i); + let tableCell = tad.screenCapturing.getByTestId(tableTestIds.row + "_" + i); + if (i < 4) { + tad.cc("Table row " + (i + 1) + " and gantt row " + (i + 1) + " have same height"); + } else { + tad.cc("And so on... "); + } + await tad.assertWaitable.equal(ganttRow.offsetHeight, (tableCell as HTMLElement).offsetHeight); + } + } + + @Scenario("When scrolling in gantt the table is scrolled") + async whenScrollInGanttThenTableIsScrolled() { + // We don't focus on last element captured because its height occupies the entire page + // And the message appears under the gantt and is hidded by the scroll mechanism + await tad.showSpotlight({ message: "Gantt is scrolled => Table is scrolled accordingly", focusOnLastElementCaptured: false }); + tad.screenCapturing.getByTestId('r9k1_' + testids.ganttBody).scroll({top:100}); + + // This is needed in order for the scroll handler to be triggerd before the verification + await new Promise(r => setTimeout(r, 10)); + + // We "cheated" here because + // There is no strait forward way to see the scroll position by looking at the html elements + // Because the table has a special type of scrolling mechanism by absolute positioning (with translate3d) + // the rows. + // We could have looked at the position of the first row but it was offseted with the + // height of the header in order to appear right under it. So we should have placed a data-testid on the header also + // but being in a third library component this was not simple to implement + assert.equal((tad.getObjectViaCheat(Table, 'r9k1') as Table).props.scrollTop, 100); + } + + @Scenario("When scrolling in table the gantt is scrolled") + async whenScrollInTableThenGanttIsScrolled() { + await tad.showSpotlight({ message: "Table is scrolled => Gantt is scrolled accordingly", focusOnLastElementCaptured: false }); + (tad.getObjectViaCheat(Table, 'r9k1')as Table).scrollActions.scrollToY(300); + assert.equal(tad.screenCapturing.getByTestId('r9k1_' + testids.ganttBody).scrollTop, 300); + } + + @Scenario("When drag the split pane the table is resized accordingly") + async whenDragTheSplitPaneTheTableIsResizedAccordingly() { + tad.cc("Split pane resizer is dragged"); + + await tad.drag(tad.screenCapturing.getByTestId(testids.splitPaneResizer), { delta: { x: 150, y: 0 }}); + // We don't understand why there is a difference of some decimals (maximum 1 px) between the expected width and the actual width. + // But this is a problem that was seen before + await tad.assertWaitable.approximately((tad.getObjectViaCheat(Table, 'r9k1')as Table).props.width, DEMO_TABLE_WIDTH + 150, 1); + } +} \ No newline at end of file diff --git a/demo-app/src/testsAreDemo/ZoomTestsAreDemo.tsx b/demo-app/src/testsAreDemo/ZoomTestsAreDemo.tsx new file mode 100644 index 00000000..4cc6cf5c --- /dev/null +++ b/demo-app/src/testsAreDemo/ZoomTestsAreDemo.tsx @@ -0,0 +1,107 @@ +import { Scenario, render, tad } from "@famiprog-foundation/tests-are-demo"; +import moment from "moment"; +import { rightClick } from "./testUtils"; +import { contextMenuTestIds } from "../../../src/components/ContextMenu/ContextMenu"; +import { zoomStoriesTestIds } from "../stories/zoom/Zoom.stories"; +import Timeline, { ZOOM_PERCENT, timelineTestids as testids } from "../../../src/timeline"; +import { Main } from "../stories/zoom/Zoom.stories"; + +export class ZoomTestsAreDemo { + + timeline: Timeline; + + async before() { + render(
); + this.timeline = tad.getObjectViaCheat(Timeline, "2"); + } + + private openContextMenu() { + const firstRow = tad.screenCapturing.getByTestId("2_" + testids.row + "_0"); + const clickPosition = { clientX: Math.round(firstRow.getBoundingClientRect().x) + 40, clientY: Math.round(firstRow.getBoundingClientRect().y) + 40 }; + rightClick(firstRow, clickPosition); + } + + private focusOnTimebar() { + // focus screenCapturing on timeBar + tad.screenCapturing.getByTestId("2_" + testids.timeBar); + } + + private calculateExeptedStartEndDate(start: number | moment.Moment, end: number | moment.Moment, zoomIn: boolean) { + const interval = moment(end).valueOf() - moment(start).valueOf(); + const delta = (Math.floor((this.timeline._gridDomNode as Element).getBoundingClientRect().x + this.timeline._grid.props.width / 2) - this.timeline.getGanttLeftOffset()) / this.timeline._grid.props.width; + let deltaInterval = interval * ZOOM_PERCENT; + if (zoomIn) { + deltaInterval *= -1; + } + let startDate = moment(Math.max((this.timeline.getMinDate() as unknown as moment.Moment).valueOf(), moment(start).valueOf() + delta * deltaInterval)); + let endDate = moment(Math.min((this.timeline.getMaxDate() as unknown as moment.Moment).valueOf(), moment(end).valueOf() - (1 - delta) * deltaInterval)); + return { expetedStartDate: startDate, expetedEndDate: endDate }; + } + + @Scenario("WHEN the gantt was maxim zoom out AND click on zoom out, THEN the startDate and endDate not changed") + async whenMaxZoomOutClickZoomOut() { + this.openContextMenu(); + const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1")); + this.focusOnTimebar(); + await tad.assertWaitable.equal(moment(this.timeline.props.startDate).valueOf(), moment(this.timeline.state.startDate).valueOf()); + await tad.assertWaitable.equal(moment(this.timeline.props.endDate).valueOf(), moment(this.timeline.state.endDate).valueOf()); + } + + @Scenario("When click zoomIn from context menu, THEN zoomed in AND show the message `Zoomed in` with fade effect.") + async whenClickZoomIn() { + this.openContextMenu(); + const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + const { expetedStartDate, expetedEndDate } = this.calculateExeptedStartEndDate(this.timeline.state.startDate, this.timeline.state.endDate, false); + await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_0")); + // need to extract the startDate, endDate after zoom, because the scroll update this values + const { startDate, endDate } = this.timeline.state; + await tad.assertWaitable.exists(tad.screenCapturing.getByTestId("2_" + testids.fadeEffect)); + this.focusOnTimebar(); + await tad.assertWaitable.equal(moment(expetedStartDate).valueOf(), moment(startDate).valueOf()); + await tad.assertWaitable.equal(moment(expetedEndDate).valueOf(), moment(endDate).valueOf()); + } + + @Scenario("When click zoomOut from context menu, THEN zoomed in AND show the message `Zoomed out` with fade effect.") + async whenClickZoomOut() { + this.openContextMenu(); + const popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + const { expetedStartDate, expetedEndDate } = this.calculateExeptedStartEndDate(this.timeline.state.startDate, this.timeline.state.endDate, true); + await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1")); + // need to extract the startDate, endDate after zoom, because the scroll update this values + const { startDate, endDate } = this.timeline.state; + await tad.assertWaitable.exists(tad.screenCapturing.getByTestId("2_" + testids.fadeEffect)); + this.focusOnTimebar(); + await tad.assertWaitable.equal(moment(expetedStartDate).valueOf(), moment(startDate).valueOf()); + await tad.assertWaitable.equal(moment(expetedEndDate).valueOf(), moment(endDate).valueOf()); + } + + @Scenario("When `Zoom enabled` is checked/unchecked AND we click zoomIn/zoomOut from context menu, THEN the gantt zooms/ doesn't zoom in accordingly") + async whenClickZoomEnabled() { + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(zoomStoriesTestIds.zoomEnabledCheckbox)); + this.openContextMenu(); + let popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + let expetedStartDate = this.timeline.state.startDate; + let expetedEndDate = this.timeline.state.endDate; + await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1")); + // need to extract the startDate, endDate after zoom, because the scroll update this values + let { startDate, endDate } = this.timeline.state; + await tad.assertWaitable.exists(tad.screenCapturing.getByTestId("2_" + testids.fadeEffect)); + this.focusOnTimebar(); + await tad.assertWaitable.equal(moment(expetedStartDate).valueOf(), moment(startDate).valueOf()); + await tad.assertWaitable.equal(moment(expetedEndDate).valueOf(), moment(endDate).valueOf()); + + + await tad.userEventWaitable.click(tad.screenCapturing.getByTestId(zoomStoriesTestIds.zoomEnabledCheckbox)); + this.openContextMenu(); + popup = tad.screenCapturing.getByTestId(contextMenuTestIds.popup); + ({ expetedStartDate, expetedEndDate } = this.calculateExeptedStartEndDate(this.timeline.state.startDate, this.timeline.state.endDate, true)); + await tad.userEventWaitable.click(tad.withinCapturing(popup).getByTestId(contextMenuTestIds.menuItem + "_1")); + // need to extract the startDate, endDate after zoom, because the scroll update this values + ({ startDate, endDate } = this.timeline.state); + await tad.assertWaitable.exists(tad.screenCapturing.getByTestId("2_" + testids.fadeEffect)); + this.focusOnTimebar(); + await tad.assertWaitable.equal(moment(expetedStartDate).valueOf(), moment(startDate).valueOf()); + await tad.assertWaitable.equal(moment(expetedEndDate).valueOf(), moment(endDate).valueOf()); + } +} \ No newline at end of file diff --git a/demo-app/src/testsAreDemo/testUtils.ts b/demo-app/src/testsAreDemo/testUtils.ts new file mode 100644 index 00000000..e85ec55a --- /dev/null +++ b/demo-app/src/testsAreDemo/testUtils.ts @@ -0,0 +1,7 @@ +import { fireEvent } from '@testing-library/dom'; + +export const rightClick = (element, options = {}) => { + fireEvent.mouseDown(element, {button: 2, ...options}); + fireEvent.mouseUp(element, {button: 2, ...options}); + fireEvent.contextMenu(element, options); +} \ No newline at end of file diff --git a/demo-app/tsconfig.json b/demo-app/tsconfig.json new file mode 100644 index 00000000..f27cd2ed --- /dev/null +++ b/demo-app/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "include": [ + "src" + ], + "compilerOptions": { + "paths": { + // duplicated in vite.config.js + "@famiprog-foundation/react-gantt": ["../src"], + "@crispico/foundation-react/*": ["../../foundation-jhipster-gwt/foundation-react/src/foundation-react/*"] + } + } +} \ No newline at end of file diff --git a/demo-app/typedoc.json b/demo-app/typedoc.json new file mode 100644 index 00000000..9e3e50d7 --- /dev/null +++ b/demo-app/typedoc.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "entryPoints": ["../src/index.js"], + // W/o this, it will use the tsconfig from the current dir, which point to src from the current dir. + // Hence it will try to operate also on this dir. + "tsconfig": "../tsconfig.json" +} diff --git a/demo-app/vite.config.ts b/demo-app/vite.config.ts new file mode 100644 index 00000000..e1f11fd4 --- /dev/null +++ b/demo-app/vite.config.ts @@ -0,0 +1,77 @@ +import { defineConfig, transformWithEsbuild } from 'vite' +import react from '@vitejs/plugin-react' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + // because some lib was accessing "global" + nodePolyfills({ + protocolImports: true, + }), + // JSX in .js files, part 1 + // Because there is JSX syntax in .js files. Cf. https://stackoverflow.com/a/76726872/306143. The "accepted" answer of the question didn't work + { + name: 'treat-js-files-as-jsx', + async transform(code, id) { + if (!id.match(/src\/.*\.js$/)) return null + + // Use the exposed transform from vite, instead of directly + // transforming with esbuild + return transformWithEsbuild(code, id, { + loader: 'tsx', + jsx: 'automatic', + }) + }, + }, + react({ + // In foundation, we needed this. But here, this is not OK, because there are a lot of files which don't import React. + // Actually this is the recommended way to go, and there is an issue in foundation. + // cf. https://github.com/vitejs/vite/issues/6215#issuecomment-1076980852 + // jsxRuntime: "classic", + babel: { + parserOpts: { + // I didn't know the difference between "decorators" and "decorators-legacy". Hence I have initially chosen "decorators" + // However, I got the error: Using the export keyword between a decorator and a class is not allowed. Please use `export @dec class` instead. + // and cf. https://stackoverflow.com/a/54516632/306143, w/ decorators-legacy it worked + plugins: ['decorators-legacy'] + } + } + }) + ], + // This section is not honored by storybook. See main.js for corresponding configs + server: { + port: 3000, + open: true, + fs: { + // Allow serving files from one level up to the project root + // To avoid: The request url ".../node_modules/semantic-ui-css/themes/default/assets/fonts/icons.ttf" is outside of Vite serving allow list. + allow: ['..'], + }, + }, + resolve: { + alias: { + // duplicated in tsconfig.json + "@famiprog-foundation/react-gantt": "/../src", + // W/ this line, we use foundation as a linked dir. To switch to "use as lib", comment this, and add in package.json, in dependencies: + // "@crispico/foundation-react": "link:../../foundation-jhipster-gwt/foundation-react/dist/foundation-react", + // For the "storybook" script, I think "yarn docs" needs to be removed. There seems to be a dependency issue, which I didn't look into + "@crispico/foundation-react": "/../../foundation-jhipster-gwt/foundation-react/src/foundation-react" + } + }, + // JSX in .js files, part 2 + optimizeDeps: { + // This exclude was needed because working with fixed-data-table-2 as a yarn link (for development purpose) was not working. + // Because of some caching the modifications made in fixed-data-table-2, were not seen when starting the storybook script + exclude: ["fixed-data-table-2"], + force: true, + esbuildOptions: { + loader: { + '.js': 'tsx', + }, + }, + } +}) + +// I don't understand why here it doesn't work. But in foundation (both w/ vite and CRA) it works +// process.env.BROWSER = "chrome" \ No newline at end of file diff --git a/demo-app/yarn.lock b/demo-app/yarn.lock new file mode 100644 index 00000000..e38845b6 --- /dev/null +++ b/demo-app/yarn.lock @@ -0,0 +1,8677 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@ant-design/colors@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" + integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ== + dependencies: + "@ctrl/tinycolor" "^3.4.0" + +"@ant-design/icons-svg@^4.3.0": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz#4b2f65a17d4d32b526baa6414aca2117382bf8da" + integrity sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g== + +"@ant-design/icons@^4.7.0": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.8.1.tgz#44f6c81f609811d68d48a123eb5dcc477f8fbcb7" + integrity sha512-JRAuiqllnMsiZIO8OvBOeFconprC3cnMpJ9MvXrHh+H5co9rlg8/aSHQfLf5jKKe18lUgRaIwC2pz8YxH9VuCA== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-svg" "^4.3.0" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + lodash "^4.17.15" + rc-util "^5.9.4" + +"@ant-design/react-slick@~1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.0.2.tgz#241bb412aeacf7ff5d50c61fa5db66773fde6b56" + integrity sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ== + dependencies: + "@babel/runtime" "^7.10.4" + classnames "^2.2.5" + json2mq "^0.2.0" + resize-observer-polyfill "^1.5.1" + throttle-debounce "^5.0.0" + +"@aw-web-design/x-default-browser@1.4.126": + version "1.4.126" + resolved "https://registry.yarnpkg.com/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz#43e4bd8f0314ed907a8718d7e862a203af79bc16" + integrity sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug== + dependencies: + default-browser-id "3.0.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" + integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== + +"@babel/compat-data@^7.23.5": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.18.9", "@babel/core@^7.20.12", "@babel/core@^7.22.9": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" + integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/core@^7.23.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.22.9", "@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/generator@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== + dependencies: + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-imports@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== + +"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== + dependencies: + "@babel/types" "^7.24.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== + dependencies: + "@babel/types" "^7.24.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-string-parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + +"@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/highlight@^7.24.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + +"@babel/parser@^7.24.0", "@babel/parser@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + +"@babel/plugin-proposal-class-properties@^7.13.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" + integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" + integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-flow-strip-types@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" + integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.22.5" + +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== + dependencies: + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== + dependencies: + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-self@^7.18.6": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz#ca2fdc11bc20d4d46de01137318b13d04e481d8e" + integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-self@^7.23.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.5.tgz#22cc7572947895c8e4cd034462e65d8ecf857756" + integrity sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w== + dependencies: + "@babel/helper-plugin-utils" "^7.24.5" + +"@babel/plugin-transform-react-jsx-source@^7.19.6": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz#49af1615bfdf6ed9d3e9e43e425e0b2b65d15b6c" + integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-source@^7.23.3": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz#a2dedb12b09532846721b5df99e52ef8dc3351d0" + integrity sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.22.9": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" + integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== + dependencies: + "@babel/compat-data" "^7.23.2" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.23.2" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.23.0" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.23.0" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.23.0" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-modules-systemjs" "^7.23.0" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.23.0" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.23.0" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-flow@^7.13.13": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.22.15.tgz#30318deb9b3ebd9f5738e96da03a531e0cd3165d" + integrity sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-flow-strip-types" "^7.22.5" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.13.0": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz#c8de488130b7081f7e1482936ad3de5b018beef4" + integrity sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-typescript" "^7.22.15" + +"@babel/register@^7.13.16": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.15.tgz#c2c294a361d59f5fa7bcc8b97ef7319c32ecaec7" + integrity sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.7", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.4": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@^7.18.9", "@babel/traverse@^7.22.8", "@babel/traverse@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== + dependencies: + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@babel/types@^7.24.0", "@babel/types@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + +"@base2/pretty-print-object@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" + integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA== + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@ctrl/tinycolor@^3.4.0": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" + integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== + +"@discoveryjs/json-ext@^0.5.3": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@fal-works/esbuild-plugin-global-externals@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz#c05ed35ad82df8e6ac616c68b92c2282bd083ba4" + integrity sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ== + +"@floating-ui/core@^1.4.2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c" + integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== + dependencies: + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/dom@^1.5.1": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" + integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== + dependencies: + "@floating-ui/core" "^1.4.2" + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/react-dom@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.2.tgz#fab244d64db08e6bed7be4b5fcce65315ef44d20" + integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== + dependencies: + "@floating-ui/dom" "^1.5.1" + +"@floating-ui/utils@^0.1.3": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" + integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/transform@^29.3.1": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@joshwooding/vite-plugin-react-docgen-typescript@0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.3.0.tgz#67599fca260c2eafdaf234a944f9d471e6d53b08" + integrity sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA== + dependencies: + glob "^7.2.0" + glob-promise "^4.2.0" + magic-string "^0.27.0" + react-docgen-typescript "^2.2.2" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@juggle/resize-observer@^3.3.1": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" + integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== + +"@mdx-js/react@^2.1.5": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3" + integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== + dependencies: + "@types/mdx" "^2.0.0" + "@types/react" ">=16" + +"@ndelangen/get-tarball@^3.0.7": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz#727ff4454e65f34707e742a59e5e6b1f525d8964" + integrity sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA== + dependencies: + gunzip-maybe "^1.4.2" + pump "^3.0.0" + tar-fs "^2.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@radix-ui/number@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.1.tgz#644161a3557f46ed38a042acf4a770e826021674" + integrity sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/primitive@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.1.tgz#e46f9958b35d10e9f6dc71c497305c22e3e55dbd" + integrity sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-arrow@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz#c24f7968996ed934d57fe6cde5d6ec7266e1d25d" + integrity sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-collection@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.3.tgz#9595a66e09026187524a36c6e7e9c7d286469159" + integrity sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + +"@radix-ui/react-compose-refs@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" + integrity sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.1.tgz#fe46e67c96b240de59187dcb7a1a50ce3e2ec00c" + integrity sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-direction@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.1.tgz#9cb61bf2ccf568f3421422d182637b7f47596c9b" + integrity sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-dismissable-layer@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz#883a48f5f938fa679427aa17fcba70c5494c6978" + integrity sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-escape-keydown" "1.0.3" + +"@radix-ui/react-focus-guards@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" + integrity sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-focus-scope@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz#9c2e8d4ed1189a1d419ee61edd5c1828726472f9" + integrity sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-id@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.1.tgz#73cdc181f650e4df24f0b6a5b7aa426b912c88c0" + integrity sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-popper@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.2.tgz#4c0b96fcd188dc1f334e02dba2d538973ad842e9" + integrity sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg== + dependencies: + "@babel/runtime" "^7.13.10" + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-rect" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-portal@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.3.tgz#ffb961244c8ed1b46f039e6c215a6c4d9989bda1" + integrity sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-primitive@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" + integrity sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.2" + +"@radix-ui/react-roving-focus@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz#e90c4a6a5f6ac09d3b8c1f5b5e81aab2f0db1974" + integrity sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-select@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-1.2.2.tgz#caa981fa0d672cf3c1b2a5240135524e69b32181" + integrity sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/number" "1.0.1" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.3" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-visually-hidden" "1.0.3" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-separator@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.0.3.tgz#be5a931a543d5726336b112f465f58585c04c8aa" + integrity sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-slot@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab" + integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + +"@radix-ui/react-toggle-group@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz#f5b5c8c477831b013bec3580c55e20a68179d6ec" + integrity sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-toggle" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-toggle@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz#aecb2945630d1dc5c512997556c57aba894e539e" + integrity sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-toolbar@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz#3211a105567fa016e89921b5b514877f833de559" + integrity sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-separator" "1.0.3" + "@radix-ui/react-toggle-group" "1.0.4" + +"@radix-ui/react-use-callback-ref@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a" + integrity sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-controllable-state@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz#ecd2ced34e6330caf89a82854aa2f77e07440286" + integrity sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-escape-keydown@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz#217b840c250541609c66f67ed7bab2b733620755" + integrity sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-layout-effect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz#be8c7bc809b0c8934acf6657b577daf948a75399" + integrity sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-previous@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz#b595c087b07317a4f143696c6a01de43b0d0ec66" + integrity sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz#fde50b3bb9fd08f4a1cd204572e5943c244fcec2" + integrity sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-use-size@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz#1c5f5fea940a7d7ade77694bb98116fb49f870b2" + integrity sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-visually-hidden@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz#51aed9dd0fe5abcad7dee2a234ad36106a6984ac" + integrity sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f" + integrity sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-1.1.2.tgz#55db1e51d784e034442e9700536faaa6ab63fc71" + integrity sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rollup/plugin-inject@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz#616f3a73fe075765f91c5bec90176608bed277a3" + integrity sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg== + dependencies: + "@rollup/pluginutils" "^5.0.1" + estree-walker "^2.0.2" + magic-string "^0.30.3" + +"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.0.2": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.5.tgz#bbb4c175e19ebfeeb8c132c2eea0ecb89941a66c" + integrity sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rollup/rollup-android-arm-eabi@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d" + integrity sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ== + +"@rollup/rollup-android-arm64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz#5aeef206d65ff4db423f3a93f71af91b28662c5b" + integrity sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw== + +"@rollup/rollup-darwin-arm64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz#6b66aaf003c70454c292cd5f0236ebdc6ffbdf1a" + integrity sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw== + +"@rollup/rollup-darwin-x64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz#f64fc51ed12b19f883131ccbcea59fc68cbd6c0b" + integrity sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz#1a7641111be67c10111f7122d1e375d1226cbf14" + integrity sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A== + +"@rollup/rollup-linux-arm-musleabihf@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz#c93fd632923e0fee25aacd2ae414288d0b7455bb" + integrity sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg== + +"@rollup/rollup-linux-arm64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz#fa531425dd21d058a630947527b4612d9d0b4a4a" + integrity sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A== + +"@rollup/rollup-linux-arm64-musl@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz#8acc16f095ceea5854caf7b07e73f7d1802ac5af" + integrity sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz#94e69a8499b5cf368911b83a44bb230782aeb571" + integrity sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ== + +"@rollup/rollup-linux-riscv64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz#7ef1c781c7e59e85a6ce261cc95d7f1e0b56db0f" + integrity sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg== + +"@rollup/rollup-linux-s390x-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz#f15775841c3232fca9b78cd25a7a0512c694b354" + integrity sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g== + +"@rollup/rollup-linux-x64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz#b521d271798d037ad70c9f85dd97d25f8a52e811" + integrity sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ== + +"@rollup/rollup-linux-x64-musl@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz#9254019cc4baac35800991315d133cc9fd1bf385" + integrity sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q== + +"@rollup/rollup-win32-arm64-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz#27f65a89f6f52ee9426ec11e3571038e4671790f" + integrity sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA== + +"@rollup/rollup-win32-ia32-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz#a2fbf8246ed0bb014f078ca34ae6b377a90cb411" + integrity sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ== + +"@rollup/rollup-win32-x64-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz#5a2d08b81e8064b34242d5cc9973ef8dd1e60503" + integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@storybook/addon-actions@7.5.1", "@storybook/addon-actions@^7.5.0": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-7.5.1.tgz#5d3591f0c63e16cca90a5faddaf05169dbf64f94" + integrity sha512-GieD3ru6EslKvwol1cE4lvszQCLB/AkQdnLofnqy1nnYso+hRxmPAw9/O+pWfpUBFdjXsQ7GX09+wEUpOJzepw== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/theming" "7.5.1" + "@storybook/types" "7.5.1" + dequal "^2.0.2" + lodash "^4.17.21" + polished "^4.2.2" + prop-types "^15.7.2" + react-inspector "^6.0.0" + telejson "^7.2.0" + ts-dedent "^2.0.0" + uuid "^9.0.0" + +"@storybook/addon-backgrounds@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-7.5.1.tgz#0af99c6217e8e406103b4f1f469c05adf41f1257" + integrity sha512-XZoyJw/WoUlVvQHPTbSAZjKy2SEUjaSmAWgcRync25vp+q0obthjx6UnZHEUuH8Ud07HA3FYzlFtMicH5y/OIQ== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/theming" "7.5.1" + "@storybook/types" "7.5.1" + memoizerific "^1.11.3" + ts-dedent "^2.0.0" + +"@storybook/addon-controls@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-7.5.1.tgz#606443cf792d98e8b2d61c94e5ffb359b253c119" + integrity sha512-Xag1e7TZo04LjUenfobkShpKMxTtwa4xM4bXQA8LjaAGZQ7jipbQ4PE73a17K59S2vqq89VAhkuMJWiyaOFqpw== + dependencies: + "@storybook/blocks" "7.5.1" + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/core-common" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/manager-api" "7.5.1" + "@storybook/node-logger" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/theming" "7.5.1" + "@storybook/types" "7.5.1" + lodash "^4.17.21" + ts-dedent "^2.0.0" + +"@storybook/addon-docs@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-7.5.1.tgz#e62765c96ff3d2d97414b69973842fbe93ba9e00" + integrity sha512-+wE67oWIhGK9+kv2sxoY2KDXm3v62RfEgxiksdhtffTP/joOK3p88S0lO+8g0G4xfNGUnBhPtzGMuUxWwaH2Pw== + dependencies: + "@jest/transform" "^29.3.1" + "@mdx-js/react" "^2.1.5" + "@storybook/blocks" "7.5.1" + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/csf-plugin" "7.5.1" + "@storybook/csf-tools" "7.5.1" + "@storybook/global" "^5.0.0" + "@storybook/mdx2-csf" "^1.0.0" + "@storybook/node-logger" "7.5.1" + "@storybook/postinstall" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/react-dom-shim" "7.5.1" + "@storybook/theming" "7.5.1" + "@storybook/types" "7.5.1" + fs-extra "^11.1.0" + remark-external-links "^8.0.0" + remark-slug "^6.0.0" + ts-dedent "^2.0.0" + +"@storybook/addon-essentials@^7.5.0": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-7.5.1.tgz#41bef1d405e5f9797cd5b5fbc7c60f7f48de194a" + integrity sha512-/jaUZXV+mE/2G5PgEpFKm4lFEHluWn6GFR/pg+hphvHOzBGA3Y75JMgUfJ5CDYHB1dAVSf9JrPOd8Eb1tpESfA== + dependencies: + "@storybook/addon-actions" "7.5.1" + "@storybook/addon-backgrounds" "7.5.1" + "@storybook/addon-controls" "7.5.1" + "@storybook/addon-docs" "7.5.1" + "@storybook/addon-highlight" "7.5.1" + "@storybook/addon-measure" "7.5.1" + "@storybook/addon-outline" "7.5.1" + "@storybook/addon-toolbars" "7.5.1" + "@storybook/addon-viewport" "7.5.1" + "@storybook/core-common" "7.5.1" + "@storybook/manager-api" "7.5.1" + "@storybook/node-logger" "7.5.1" + "@storybook/preview-api" "7.5.1" + ts-dedent "^2.0.0" + +"@storybook/addon-highlight@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-7.5.1.tgz#575152b8e54464ef6a29f5f58c19c14bfd45730c" + integrity sha512-js9OV17kpjRowuaGAPfI9aOn/zzt8P589ACZE+/eYBO9jT65CADwAUxg//Uq0/he+Ac9495pcK3BcYyDeym7/g== + dependencies: + "@storybook/core-events" "7.5.1" + "@storybook/global" "^5.0.0" + "@storybook/preview-api" "7.5.1" + +"@storybook/addon-links@^7.5.0": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-7.5.1.tgz#18404cc71d3ceaf5f9e2ce4501a275be11bf6eaa" + integrity sha512-KDiQYAVNXxuVTB3QLFZxHlfT8q4KnlNKY+0OODvgD5o1FqFpIyUiR5mIBL4SZMRj2EtwrR3KmZ2UPccFZdu9vw== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/csf" "^0.1.0" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/router" "7.5.1" + "@storybook/types" "7.5.1" + prop-types "^15.7.2" + ts-dedent "^2.0.0" + +"@storybook/addon-mdx-gfm@^7.5.0": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-mdx-gfm/-/addon-mdx-gfm-7.5.1.tgz#d435d705c205f391fc33532d8edf78126433d580" + integrity sha512-9E/6PVvAD39eYaLXosYmVTRzQ/ob6SZEY1T/f3osr0XndR0KtfytiKp4QIB5p4VeD1XDWWAcMsZpYSrzfw7jVw== + dependencies: + "@storybook/node-logger" "7.5.1" + remark-gfm "^3.0.1" + ts-dedent "^2.0.0" + +"@storybook/addon-measure@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-7.5.1.tgz#bc8d2beedc9f6a1170cd90a013012b89d0971aa5" + integrity sha512-yR6oELJe0UHYxRijd1YMuGaQRlZ3uABjmrXaFCPnd6agahgTwIJLiK4XamtkVur//LaiJMvtmM2XXrkJ1BvNJw== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/types" "7.5.1" + tiny-invariant "^1.3.1" + +"@storybook/addon-outline@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-7.5.1.tgz#f0681fb26ab4811a0351ef360478a04dc1465250" + integrity sha512-IMi5Bo34/Q5YUG5uD8ZUTBwlpGrkDIV+PUgkyNIbmn9OgozoCH80Fs7YlGluRFODQISpHwio9qvSFRGdSNT56A== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/types" "7.5.1" + ts-dedent "^2.0.0" + +"@storybook/addon-storysource@^7.5.0": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-storysource/-/addon-storysource-7.5.1.tgz#f35d1a81d8d2a87c6e52e2779a27625281212acf" + integrity sha512-B+g0n7Ysk1ldeVyey/vfVyGHmcD5p+/49rWMVp39O8xx/nQMYl0UWSHBcqh6AouNx6GVn+J9wmN0LhP2AOFHxA== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/manager-api" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/router" "7.5.1" + "@storybook/source-loader" "7.5.1" + "@storybook/theming" "7.5.1" + estraverse "^5.2.0" + prop-types "^15.7.2" + react-syntax-highlighter "^15.5.0" + tiny-invariant "^1.3.1" + +"@storybook/addon-toolbars@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-7.5.1.tgz#5b224dc042171717f40f255e793e1424e5b0bbd6" + integrity sha512-T88hEEQicV6eCovr5TN2nFgKt7wU0o7pAunP5cU01iiVRj63+oQiVIBB8Xtm4tN+/DsqtyP0BTa6rFwt2ULy8A== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/manager-api" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/theming" "7.5.1" + +"@storybook/addon-viewport@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-7.5.1.tgz#1df1a7b9d9f9243ed5b8de604da667ed62ebf036" + integrity sha512-L57lOGB3LfKgAdLinaZojRQ9W9w2RC0iP9bVaXwrRVeJdpNayfuW4Kh1C8dmacZroB4Zp2U/nEjkSmdcp6uUWg== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/theming" "7.5.1" + memoizerific "^1.11.3" + prop-types "^15.7.2" + +"@storybook/blocks@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-7.5.1.tgz#c215da2e82234a703912410c52334fbade163b48" + integrity sha512-7b69p6kDdgmlejEMM2mW6/Lz4OmU/R3Qr+TpKnPcV5iS7ADxRQEQCTEMoQ5RyLJf0vDRh/7Ljn/RMo8Ux3X7JA== + dependencies: + "@storybook/channels" "7.5.1" + "@storybook/client-logger" "7.5.1" + "@storybook/components" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/csf" "^0.1.0" + "@storybook/docs-tools" "7.5.1" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/theming" "7.5.1" + "@storybook/types" "7.5.1" + "@types/lodash" "^4.14.167" + color-convert "^2.0.1" + dequal "^2.0.2" + lodash "^4.17.21" + markdown-to-jsx "^7.1.8" + memoizerific "^1.11.3" + polished "^4.2.2" + react-colorful "^5.1.2" + telejson "^7.2.0" + tocbot "^4.20.1" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/builder-manager@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/builder-manager/-/builder-manager-7.5.1.tgz#9cf9ee235c1a16677b7cdc34b96e353226be83b8" + integrity sha512-a02kg/DCcYgiTz+7rw4KdvQzif+2lZ+NIFF5U5u8SDoCQuoe3wRT6QBrFYQTxJexA4WfO6cpyRLDJ1rx6NLo8A== + dependencies: + "@fal-works/esbuild-plugin-global-externals" "^2.1.2" + "@storybook/core-common" "7.5.1" + "@storybook/manager" "7.5.1" + "@storybook/node-logger" "7.5.1" + "@types/ejs" "^3.1.1" + "@types/find-cache-dir" "^3.2.1" + "@yarnpkg/esbuild-plugin-pnp" "^3.0.0-rc.10" + browser-assert "^1.2.1" + ejs "^3.1.8" + esbuild "^0.18.0" + esbuild-plugin-alias "^0.2.1" + express "^4.17.3" + find-cache-dir "^3.0.0" + fs-extra "^11.1.0" + process "^0.11.10" + util "^0.12.4" + +"@storybook/builder-vite@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-7.5.1.tgz#c4771d68da5a9c8a4fafd00186326532b6816c8c" + integrity sha512-fsF4LsxroVvjBJoI5AvRA6euhpYrb5euii5kPzrsWXLOn6gDBK0jQ0looep/io7J45MisDjRTPp14A02pi1bkw== + dependencies: + "@storybook/channels" "7.5.1" + "@storybook/client-logger" "7.5.1" + "@storybook/core-common" "7.5.1" + "@storybook/csf-plugin" "7.5.1" + "@storybook/node-logger" "7.5.1" + "@storybook/preview" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/types" "7.5.1" + "@types/find-cache-dir" "^3.2.1" + browser-assert "^1.2.1" + es-module-lexer "^0.9.3" + express "^4.17.3" + find-cache-dir "^3.0.0" + fs-extra "^11.1.0" + magic-string "^0.30.0" + rollup "^2.25.0 || ^3.3.0" + +"@storybook/channels@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-7.5.1.tgz#f850c6da3e2cabe51239499d68a8b3d7eb22c621" + integrity sha512-7hTGHqvtdFTqRx8LuCznOpqPBYfUeMUt/0IIp7SFuZT585yMPxrYoaK//QmLEWnPb80B8HVTSQi7caUkJb32LA== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/global" "^5.0.0" + qs "^6.10.0" + telejson "^7.2.0" + tiny-invariant "^1.3.1" + +"@storybook/cli@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/cli/-/cli-7.5.1.tgz#11df3114fbfadb74c7ea1777b3f79c6a045e9bec" + integrity sha512-qKIJs8gqXTy0eSEbt0OW5nsJqiV/2+N1eWoiBiIxoZ+8b0ACXIAUcE/N6AsEDUqIq8AMK7lebqjEfIAt2Sp7Mg== + dependencies: + "@babel/core" "^7.22.9" + "@babel/preset-env" "^7.22.9" + "@babel/types" "^7.22.5" + "@ndelangen/get-tarball" "^3.0.7" + "@storybook/codemod" "7.5.1" + "@storybook/core-common" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/core-server" "7.5.1" + "@storybook/csf-tools" "7.5.1" + "@storybook/node-logger" "7.5.1" + "@storybook/telemetry" "7.5.1" + "@storybook/types" "7.5.1" + "@types/semver" "^7.3.4" + "@yarnpkg/fslib" "2.10.3" + "@yarnpkg/libzip" "2.3.0" + chalk "^4.1.0" + commander "^6.2.1" + cross-spawn "^7.0.3" + detect-indent "^6.1.0" + envinfo "^7.7.3" + execa "^5.0.0" + express "^4.17.3" + find-up "^5.0.0" + fs-extra "^11.1.0" + get-npm-tarball-url "^2.0.3" + get-port "^5.1.1" + giget "^1.0.0" + globby "^11.0.2" + jscodeshift "^0.14.0" + leven "^3.1.0" + ora "^5.4.1" + prettier "^2.8.0" + prompts "^2.4.0" + puppeteer-core "^2.1.1" + read-pkg-up "^7.0.1" + semver "^7.3.7" + simple-update-notifier "^2.0.0" + strip-json-comments "^3.0.1" + tempy "^1.0.1" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/client-logger@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-7.5.1.tgz#dc4c693900ae1f7ebda9f7faeea46956e70ef184" + integrity sha512-XxbLvg0aQRoBrzxYLcVYCbjDkGbkU8Rfb74XbV2CLiO2bIbFPmA1l1Nwbp+wkCGA+O6Z1zwzSl6wcKKqZ6XZCg== + dependencies: + "@storybook/global" "^5.0.0" + +"@storybook/codemod@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/codemod/-/codemod-7.5.1.tgz#40b7b8ab74945eff7b8206c5944025d82e01cd57" + integrity sha512-PqHGOz/CZnRG9pWgshezCacu524CrXOJrCOwMUP9OMpH0Jk/NhBkHaBZrB8wMjn5hekTj0UmRa/EN8wJm9CCUQ== + dependencies: + "@babel/core" "^7.22.9" + "@babel/preset-env" "^7.22.9" + "@babel/types" "^7.22.5" + "@storybook/csf" "^0.1.0" + "@storybook/csf-tools" "7.5.1" + "@storybook/node-logger" "7.5.1" + "@storybook/types" "7.5.1" + "@types/cross-spawn" "^6.0.2" + cross-spawn "^7.0.3" + globby "^11.0.2" + jscodeshift "^0.14.0" + lodash "^4.17.21" + prettier "^2.8.0" + recast "^0.23.1" + +"@storybook/components@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-7.5.1.tgz#677eae0e7976939434b5c391fe841ced9b66e082" + integrity sha512-fdzzxGBV/Fj9pYwfYL3RZsVUHeBqlfLMBP/L6mPmjaZSwHFqkaRZZUajZc57lCtI+TOy2gY6WH3cPavEtqtgLw== + dependencies: + "@radix-ui/react-select" "^1.2.2" + "@radix-ui/react-toolbar" "^1.0.4" + "@storybook/client-logger" "7.5.1" + "@storybook/csf" "^0.1.0" + "@storybook/global" "^5.0.0" + "@storybook/theming" "7.5.1" + "@storybook/types" "7.5.1" + memoizerific "^1.11.3" + use-resize-observer "^9.1.0" + util-deprecate "^1.0.2" + +"@storybook/core-client@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-7.5.1.tgz#06bc3711767fa131800d1a0827dd120e89019ccd" + integrity sha512-K651UnNKkW8U078CH5rcUqf0siGcfEhwya2yQN5RBb/H78HSLBLdYgzKqxaKtmz+S8DFyWhrgbXZLdBjavozJg== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/preview-api" "7.5.1" + +"@storybook/core-common@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-7.5.1.tgz#ce0b7a3a14c71e3d1b5261395bbea62429d635b2" + integrity sha512-/rQ0/xvxFHSGCgIkK74HrgDMnzfYtDYTCoSod/qCTojfs9aciX+JYgvo5ChPnI/LEKWwxRTkrE7pl2u5+C4XGA== + dependencies: + "@storybook/core-events" "7.5.1" + "@storybook/node-logger" "7.5.1" + "@storybook/types" "7.5.1" + "@types/find-cache-dir" "^3.2.1" + "@types/node" "^18.0.0" + "@types/node-fetch" "^2.6.4" + "@types/pretty-hrtime" "^1.0.0" + chalk "^4.1.0" + esbuild "^0.18.0" + esbuild-register "^3.5.0" + file-system-cache "2.3.0" + find-cache-dir "^3.0.0" + find-up "^5.0.0" + fs-extra "^11.1.0" + glob "^10.0.0" + handlebars "^4.7.7" + lazy-universal-dotenv "^4.0.0" + node-fetch "^2.0.0" + picomatch "^2.3.0" + pkg-dir "^5.0.0" + pretty-hrtime "^1.0.3" + resolve-from "^5.0.0" + ts-dedent "^2.0.0" + +"@storybook/core-events@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-7.5.1.tgz#a6bf057e4605fb8360c76d28a3c36daa676a81a4" + integrity sha512-2eyaUhTfmEEqOEZVoCXVITCBn6N7QuZCG2UNxv0l//ED+7MuMiFhVw7kS7H3WOVk65R7gb8qbKFTNX8HFTgBHg== + dependencies: + ts-dedent "^2.0.0" + +"@storybook/core-server@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-7.5.1.tgz#6fffa20ad2952dcd1fc790ea49e9f8ad615d57e1" + integrity sha512-DD4BXCH91aZJoFuu0cQwG1ZUmE59kG5pazuE3S89zH1GwKS1jWyeAv4EwEfvynT5Ah1ctd8QdCZCSXVzjq0qcw== + dependencies: + "@aw-web-design/x-default-browser" "1.4.126" + "@discoveryjs/json-ext" "^0.5.3" + "@storybook/builder-manager" "7.5.1" + "@storybook/channels" "7.5.1" + "@storybook/core-common" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/csf" "^0.1.0" + "@storybook/csf-tools" "7.5.1" + "@storybook/docs-mdx" "^0.1.0" + "@storybook/global" "^5.0.0" + "@storybook/manager" "7.5.1" + "@storybook/node-logger" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/telemetry" "7.5.1" + "@storybook/types" "7.5.1" + "@types/detect-port" "^1.3.0" + "@types/node" "^18.0.0" + "@types/pretty-hrtime" "^1.0.0" + "@types/semver" "^7.3.4" + better-opn "^3.0.2" + chalk "^4.1.0" + cli-table3 "^0.6.1" + compression "^1.7.4" + detect-port "^1.3.0" + express "^4.17.3" + fs-extra "^11.1.0" + globby "^11.0.2" + ip "^2.0.0" + lodash "^4.17.21" + open "^8.4.0" + pretty-hrtime "^1.0.3" + prompts "^2.4.0" + read-pkg-up "^7.0.1" + semver "^7.3.7" + telejson "^7.2.0" + tiny-invariant "^1.3.1" + ts-dedent "^2.0.0" + util "^0.12.4" + util-deprecate "^1.0.2" + watchpack "^2.2.0" + ws "^8.2.3" + +"@storybook/csf-plugin@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-7.5.1.tgz#c20783772f116005471e21cbc84a3820f2ddfd35" + integrity sha512-jhV2aCZhSIXUiQDcHtuCg3dyYMzjYHTwLb4cJtkNw4sXqQoTGydTSWYwWigcHFfKGoyQp82rSgE1hE4YYx6iew== + dependencies: + "@storybook/csf-tools" "7.5.1" + unplugin "^1.3.1" + +"@storybook/csf-tools@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-7.5.1.tgz#f652a1348f931fb2ad48116b1c7d7540de950d2e" + integrity sha512-YChGbT1/odLS4RLb2HtK7ixM7mH5s7G5nOsWGKXalbza4SFKZIU2UzllEUsA+X8YfxMHnCD5TC3xLfK0ByxmzQ== + dependencies: + "@babel/generator" "^7.22.9" + "@babel/parser" "^7.22.7" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + "@storybook/csf" "^0.1.0" + "@storybook/types" "7.5.1" + fs-extra "^11.1.0" + recast "^0.23.1" + ts-dedent "^2.0.0" + +"@storybook/csf@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" + integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== + dependencies: + lodash "^4.17.15" + +"@storybook/csf@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.1.1.tgz#abccc8c3e49aed0a6a7e87beb0d1c262b1921c06" + integrity sha512-4hE3AlNVxR60Wc5KSC68ASYzUobjPqtSKyhV6G+ge0FIXU55N5nTY7dXGRZHQGDBPq+XqchMkIdlkHPRs8nTHg== + dependencies: + type-fest "^2.19.0" + +"@storybook/docs-mdx@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz#33ba0e39d1461caf048b57db354b2cc410705316" + integrity sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg== + +"@storybook/docs-tools@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/docs-tools/-/docs-tools-7.5.1.tgz#a1266314e64929498d3c41483ac9794cf3707102" + integrity sha512-tDtQGeKU5Kc2XoqZ5vpeGQrOkRg2UoDiSRS6cLy+M/sMB03Annq0ZngnJXaMiv0DLi2zpWSgWqPgYA3TJTZHBw== + dependencies: + "@storybook/core-common" "7.5.1" + "@storybook/preview-api" "7.5.1" + "@storybook/types" "7.5.1" + "@types/doctrine" "^0.0.3" + doctrine "^3.0.0" + lodash "^4.17.21" + +"@storybook/global@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" + integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== + +"@storybook/manager-api@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-7.5.1.tgz#ebc5c0efc3f9c3451882e61b9b982d898a1fc6c9" + integrity sha512-ygwJywluhhE1dpA0jC2D/3NFhMXzFCt+iW4m3cOwexYTuiDWF66AbGOFBx9peE7Wk/Z9doKkf9E3v11enwaidA== + dependencies: + "@storybook/channels" "7.5.1" + "@storybook/client-logger" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/csf" "^0.1.0" + "@storybook/global" "^5.0.0" + "@storybook/router" "7.5.1" + "@storybook/theming" "7.5.1" + "@storybook/types" "7.5.1" + dequal "^2.0.2" + lodash "^4.17.21" + memoizerific "^1.11.3" + semver "^7.3.7" + store2 "^2.14.2" + telejson "^7.2.0" + ts-dedent "^2.0.0" + +"@storybook/manager@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/manager/-/manager-7.5.1.tgz#c8b73b17e10c2c96fbc2ab736abcdc57bb8f4143" + integrity sha512-Jo83sj7KvsZ78vvqjH72ErmQ31Frx6GBLbpeYXZtbAXWl0/LHsxAEVz0Mke+DixzWDyP0/cn+Nw8QUfA+Oz1fg== + +"@storybook/mdx2-csf@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz#97f6df04d0bf616991cc1005a073ac004a7281e5" + integrity sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw== + +"@storybook/node-logger@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-7.5.1.tgz#a2cce2c2122180523cbd5b5727e9e48a8e44b5c2" + integrity sha512-xRMdL5YPe8C9sgJ1R0QD3YbiLjDGrfQk91+GplRD8N9FVCT5dki55Bv5Kp0FpemLYYg6uxAZL5nHmsZHKDKQoA== + +"@storybook/postinstall@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-7.5.1.tgz#956a4e6460f330e0cac51650c38ab25d0d3b2ec0" + integrity sha512-+LFUe2nNbmmLPKNt34RXSSC1r40yGGOoP/qlaPFwNOgQN2AZUrfqk6ZYnw6LjmcuHpQInZ4y4WDgbzg6QQL3+w== + +"@storybook/preview-api@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-7.5.1.tgz#c21697587d7202941e0f90538115d9c3be21f781" + integrity sha512-8xjUbuGmHLmw8tfTUCjXSvMM9r96JaexPFmHdwW6XLe71KKdWp8u96vRDRE5648cd+/of15OjaRtakRKqluA/A== + dependencies: + "@storybook/channels" "7.5.1" + "@storybook/client-logger" "7.5.1" + "@storybook/core-events" "7.5.1" + "@storybook/csf" "^0.1.0" + "@storybook/global" "^5.0.0" + "@storybook/types" "7.5.1" + "@types/qs" "^6.9.5" + dequal "^2.0.2" + lodash "^4.17.21" + memoizerific "^1.11.3" + qs "^6.10.0" + synchronous-promise "^2.0.15" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/preview@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/preview/-/preview-7.5.1.tgz#97d8de1a4780eb7640a0f74d88302871728160b7" + integrity sha512-nfZC103z9Cy27FrJKUr2IjDuVt8Mvn1Z5gZ0TtJihoK7sfLTv29nd/XU9zzrb/epM3o8UEzc63xZZsMaToDbAw== + +"@storybook/react-dom-shim@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-7.5.1.tgz#1dd868782f2ed52828691a221b0f9e99f5427ef8" + integrity sha512-bzTIfLm91O9h3rPYJLtRbmsPARerY3z7MoyvadGp8TikvIvf+WyT/vHujw+20SxnqiZVq5Jv65FFlxc46GGB1Q== + +"@storybook/react-vite@^7.5.0": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/react-vite/-/react-vite-7.5.1.tgz#7460a05845e568c155fced120e56fbca29012fcf" + integrity sha512-996/CtOqTjDWMKBGcHG8pwIVlORnoknLD+OTkPXl+aAl9oM9jUtc7psVKLJKGHSHTlVElM2wMTwIHnJ4yeP7bw== + dependencies: + "@joshwooding/vite-plugin-react-docgen-typescript" "0.3.0" + "@rollup/pluginutils" "^5.0.2" + "@storybook/builder-vite" "7.5.1" + "@storybook/react" "7.5.1" + "@vitejs/plugin-react" "^3.0.1" + magic-string "^0.30.0" + react-docgen "^6.0.2" + +"@storybook/react@7.5.1", "@storybook/react@^7.5.0": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-7.5.1.tgz#56227f2dbb7c3a5fafc7f3e61a3e4268ec1c5fde" + integrity sha512-IG97c30fFSmPyGpJ1awHC/+9XnCTqleeOQwROXjroMHSm8m/JTWpHMVLyM1x7b6VAnBhNHWJ+oXLZe/hXkXfpA== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/core-client" "7.5.1" + "@storybook/docs-tools" "7.5.1" + "@storybook/global" "^5.0.0" + "@storybook/preview-api" "7.5.1" + "@storybook/react-dom-shim" "7.5.1" + "@storybook/types" "7.5.1" + "@types/escodegen" "^0.0.6" + "@types/estree" "^0.0.51" + "@types/node" "^18.0.0" + acorn "^7.4.1" + acorn-jsx "^5.3.1" + acorn-walk "^7.2.0" + escodegen "^2.1.0" + html-tags "^3.1.0" + lodash "^4.17.21" + prop-types "^15.7.2" + react-element-to-jsx-string "^15.0.0" + ts-dedent "^2.0.0" + type-fest "~2.19" + util-deprecate "^1.0.2" + +"@storybook/router@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-7.5.1.tgz#1d09daa1c7414061fe8c47415b7750a874ad1d9b" + integrity sha512-BvKo+IxWwo3dfIG1+vLtZLT4qqkNHL5GTIozTyX04uqt9ByYZL6SJEzxEa1Xn6Qq/fbdQwzCanNHbTlwiTMf7Q== + dependencies: + "@storybook/client-logger" "7.5.1" + memoizerific "^1.11.3" + qs "^6.10.0" + +"@storybook/source-loader@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-7.5.1.tgz#c072ee7d6783bb8eea4be35ada7d483980cc5798" + integrity sha512-bJLhUxOwnlodZVOkOt/2swW1e0qCvJxrPdPNHj/81jh0kSfJnLWH+QnwOgdIwPG4qW73nlH5BuSUAlGMVPpS8w== + dependencies: + "@storybook/csf" "^0.1.0" + "@storybook/types" "7.5.1" + estraverse "^5.2.0" + lodash "^4.17.21" + prettier "^2.8.0" + +"@storybook/telemetry@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/telemetry/-/telemetry-7.5.1.tgz#299bc0c03b1b68a7cd274ff443c7f13783153c87" + integrity sha512-z9PGouNqvZ2F7vD79qDF4PN7iW3kE3MO7YX0iKTmzgLi4ImKuXIJRF04GRH8r+WYghnbomAyA4o6z9YJMdNuVw== + dependencies: + "@storybook/client-logger" "7.5.1" + "@storybook/core-common" "7.5.1" + "@storybook/csf-tools" "7.5.1" + chalk "^4.1.0" + detect-package-manager "^2.0.1" + fetch-retry "^5.0.2" + fs-extra "^11.1.0" + read-pkg-up "^7.0.1" + +"@storybook/theming@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-7.5.1.tgz#b3a78f493d644ac8cba5136e04479a58a9ba5546" + integrity sha512-ETLAOn10hI4Mkmjsr0HGcM6HbzaURrrPBYmfXOrdbrzEVN+AHW4FlvP9d8fYyP1gdjPE1F39XvF0jYgt1zXiHQ== + dependencies: + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@storybook/client-logger" "7.5.1" + "@storybook/global" "^5.0.0" + memoizerific "^1.11.3" + +"@storybook/types@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@storybook/types/-/types-7.5.1.tgz#fa7f5c4ded412c92af9e6bcb238689c1f4f57d2a" + integrity sha512-ZcMSaqFNx1E+G00nRDUi8kKL7gxJVlnCvbKLNj3V85guy4DkIYAZr31yDqze07gDWbjvKoHIp3tKpgE+2i8upQ== + dependencies: + "@storybook/channels" "7.5.1" + "@types/babel__core" "^7.0.0" + "@types/express" "^4.7.0" + file-system-cache "2.3.0" + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.18.0": + version "7.20.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778" + integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.6" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.6.tgz#676f89f67dc8ddaae923f70ebc5f1fa800c031a8" + integrity sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.3.tgz#db9ac539a2fe05cfe9e168b24f360701bde41f5f" + integrity sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.18.0": + version "7.20.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.3.tgz#a971aa47441b28ef17884ff945d0551265a2d058" + integrity sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw== + dependencies: + "@babel/types" "^7.20.7" + +"@types/body-parser@*": + version "1.19.4" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.4.tgz#78ad68f1f79eb851aa3634db0c7f57f6f601b462" + integrity sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.37" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" + integrity sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q== + dependencies: + "@types/node" "*" + +"@types/cross-spawn@^6.0.2": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.4.tgz#e658d29e2308a01f48b7b30fd8cdf07aeb2e5a82" + integrity sha512-GGLpeThc2Bu8FBGmVn76ZU3lix17qZensEI4/MPty0aZpm2CHfgEMis31pf5X5EiudYKcPAsWciAsCALoPo5dw== + dependencies: + "@types/node" "*" + +"@types/debug@^4.0.0": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.10.tgz#f23148a6eb771a34c466a4fc28379d8101e84494" + integrity sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA== + dependencies: + "@types/ms" "*" + +"@types/detect-port@^1.3.0": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/detect-port/-/detect-port-1.3.4.tgz#cd34ab0f26391f5b9c5c9bb4c9e370dfbf9e4d05" + integrity sha512-HveFGabu3IwATqwLelcp6UZ1MIzSFwk+qswC9luzzHufqAwhs22l7KkINDLWRfXxIPTYnSZ1DuQBEgeVPgUOSA== + +"@types/doctrine@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.3.tgz#e892d293c92c9c1d3f9af72c15a554fbc7e0895a" + integrity sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA== + +"@types/doctrine@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.6.tgz#12ede1f7cd3797be5856277c85f031299ccd2641" + integrity sha512-KlEqPtaNBHBJ2/fVA4yLdD0Tc8zw34pKU4K5SHBIEwtLJ8xxumIC1xeG+4S+/9qhVj2MqC7O3Ld8WvDG4HqlgA== + +"@types/ejs@^3.1.1": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.4.tgz#b9919c89767493b6443f85994ae6be6e49011b5c" + integrity sha512-fnM/NjByiWdSRJRrmGxgqOSAnmOnsvX1QcNYk5TVyIIj+7ZqOKMb9gQa4OIl/lil2w/8TiTWV+nz3q8yqxez/w== + +"@types/emscripten@^1.39.6": + version "1.39.9" + resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.39.9.tgz#cbe73a8d153fc714a2e3177fbda2d7332d45efa7" + integrity sha512-ILdWj4XYtNOqxJaW22NEQx2gJsLfV5ncxYhhGX1a1H1lXl2Ta0gUz7QOnOoF1xQbJwWDjImi8gXN9mKdIf6n9g== + +"@types/escodegen@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@types/escodegen/-/escodegen-0.0.6.tgz#5230a9ce796e042cda6f086dbf19f22ea330659c" + integrity sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig== + +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/estree@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd" + integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ== + +"@types/express-serve-static-core@^4.17.33": + version "4.17.39" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz#2107afc0a4b035e6cb00accac3bdf2d76ae408c8" + integrity sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.7.0": + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.20.tgz#e7c9b40276d29e38a4e3564d7a3d65911e2aa433" + integrity sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/find-cache-dir@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz#7b959a4b9643a1e6a1a5fe49032693cc36773501" + integrity sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw== + +"@types/glob@^7.1.3": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915" + integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw== + dependencies: + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.7.tgz#5e9bd7ab4452d5313aeec9d38fbc193a70f8d810" + integrity sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw== + dependencies: + "@types/unist" "^2" + +"@types/http-errors@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.3.tgz#c54e61f79b3947d040f150abd58f71efb422ff62" + integrity sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" + integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== + +"@types/istanbul-lib-report@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1" + integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7" + integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.9": + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" + integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== + +"@types/lodash@^4.14.167": + version "4.14.200" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149" + integrity sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q== + +"@types/mdast@^3.0.0": + version "3.0.14" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.14.tgz#0735473a5b35be032b9f2685b7413cbab1b8a639" + integrity sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw== + dependencies: + "@types/unist" "^2" + +"@types/mdx@^2.0.0": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.9.tgz#80971e367bb884350ab5b2ce8fc06b34960170e7" + integrity sha512-OKMdj17y8Cs+k1r0XFyp59ChSOwf8ODGtMQ4mnpfz5eFDk1aO41yN3pSKGuvVzmWAkFp37seubY1tzOVpwfWwg== + +"@types/mime-types@^2.1.0": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.3.tgz#0688436864f87a0c8e33ca12be60cd791cc24b36" + integrity sha512-bvxCbHeeS7quxS7uOJShyoOQj/BfLabhF6mk9Rmr+2MRfW8W1yxyyL/0GTxLFTHen41GrIw4K3D4DrLouhb8vg== + +"@types/mime@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.3.tgz#886674659ce55fe7c6c06ec5ca7c0eb276a08f91" + integrity sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ== + +"@types/mime@^1": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" + integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/ms@*": + version "0.7.33" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.33.tgz#80bf1da64b15f21fd8c1dc387c31929317d99ee9" + integrity sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ== + +"@types/node-fetch@^2.6.4": + version "2.6.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.7.tgz#a1abe2ce24228b58ad97f99480fdcf9bbc6ab16d" + integrity sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg== + dependencies: + "@types/node" "*" + form-data "^4.0.0" + +"@types/node@*": + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + dependencies: + undici-types "~5.25.1" + +"@types/node@^18.0.0": + version "18.18.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.6.tgz#26da694f75cdb057750f49d099da5e3f3824cb3e" + integrity sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w== + +"@types/normalize-package-data@^2.4.0": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" + integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== + +"@types/pretty-hrtime@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.2.tgz#9b6e102bc2e1eea1c1c7fadf144483ce2687f233" + integrity sha512-vyv9knII8XeW8TnXDcGH7HqG6FeR56ESN6ExM34d/U8Zvs3xuG34euV6CVyB7KEYI7Ts4lQM8b4NL72e7UadnA== + +"@types/prop-types@*": + version "15.7.9" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.9.tgz#b6f785caa7ea1fe4414d9df42ee0ab67f23d8a6d" + integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g== + +"@types/qs@*", "@types/qs@^6.9.5": + version "6.9.9" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" + integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== + +"@types/range-parser@*": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.6.tgz#7cb33992049fd7340d5b10c0098e104184dfcd2a" + integrity sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA== + +"@types/react@17.0.69", "@types/react@>=16": + version "17.0.69" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.69.tgz#245a0cf2f5b0fb1d645691d3083e3c7d4409b98f" + integrity sha512-klEeru//GhiQvXUBayz0Q4l3rKHWsBR/EUOhOeow6hK2jV7MlO44+8yEk6+OtPeOlRfnpUnrLXzGK+iGph5aeg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@^1.20.2": + version "1.20.4" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.4.tgz#d2df996a35695c843dbf180e26bc2c7a0f1a3e12" + integrity sha512-BKGK0T1VgB1zD+PwQR4RRf0ais3NyvH1qjLUrHI5SEiccYaJrhLstLuoXFWJ+2Op9whGizSPUMGPJY/Qtb/A2w== + +"@types/scheduler@*": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.5.tgz#4751153abbf8d6199babb345a52e1eb4167d64af" + integrity sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw== + +"@types/semver@^7.3.12", "@types/semver@^7.3.4": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" + integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== + +"@types/send@*": + version "0.17.3" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" + integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.4" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.4.tgz#44b5895a68ca637f06c229119e1c774ca88f81b2" + integrity sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.9.tgz#72e164381659a49557b0a078b28308f2c6a3e1ce" + integrity sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ== + +"@types/yargs-parser@*": + version "21.0.2" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b" + integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw== + +"@types/yargs@^17.0.8": + version "17.0.29" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.29.tgz#06aabc72497b798c643c812a8b561537fea760cf" + integrity sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@^5.45.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@vitejs/plugin-react@^3.0.1": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz#d1091f535eab8b83d6e74034d01e27d73c773240" + integrity sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g== + dependencies: + "@babel/core" "^7.20.12" + "@babel/plugin-transform-react-jsx-self" "^7.18.6" + "@babel/plugin-transform-react-jsx-source" "^7.19.6" + magic-string "^0.27.0" + react-refresh "^0.14.0" + +"@vitejs/plugin-react@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" + integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== + dependencies: + "@babel/core" "^7.23.5" + "@babel/plugin-transform-react-jsx-self" "^7.23.3" + "@babel/plugin-transform-react-jsx-source" "^7.23.3" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.0" + +"@yarnpkg/esbuild-plugin-pnp@^3.0.0-rc.10": + version "3.0.0-rc.15" + resolved "https://registry.yarnpkg.com/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz#4e40e7d2eb28825c9a35ab9d04c363931d7c0e67" + integrity sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA== + dependencies: + tslib "^2.4.0" + +"@yarnpkg/fslib@2.10.3": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@yarnpkg/fslib/-/fslib-2.10.3.tgz#a8c9893df5d183cf6362680b9f1c6d7504dd5717" + integrity sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A== + dependencies: + "@yarnpkg/libzip" "^2.3.0" + tslib "^1.13.0" + +"@yarnpkg/libzip@2.3.0", "@yarnpkg/libzip@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/libzip/-/libzip-2.3.0.tgz#fe1e762e47669f6e2c960fc118436608d834e3be" + integrity sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg== + dependencies: + "@types/emscripten" "^1.39.6" + tslib "^1.13.0" + +accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.4.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.10.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +address@^1.0.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + +agent-base@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-sequence-parser@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +antd@^4.15.1: + version "4.24.14" + resolved "https://registry.yarnpkg.com/antd/-/antd-4.24.14.tgz#af19c2c1ead71954a00b1e9c2f1ecbc84bd7a20d" + integrity sha512-hY/MPm7XI0G+9MvjhTlbDkA2sf8oHVbhtrT0XRstlm9+fXYGNXz8oEh3d5qiA3/tY5NL2Kh2tF7Guh01hwWJdg== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons" "^4.7.0" + "@ant-design/react-slick" "~1.0.0" + "@babel/runtime" "^7.18.3" + "@ctrl/tinycolor" "^3.4.0" + classnames "^2.2.6" + copy-to-clipboard "^3.2.0" + lodash "^4.17.21" + moment "^2.29.2" + rc-cascader "~3.7.0" + rc-checkbox "~3.0.0" + rc-collapse "~3.4.2" + rc-dialog "~9.0.2" + rc-drawer "~6.3.0" + rc-dropdown "~4.0.0" + rc-field-form "~1.34.0" + rc-image "~5.13.0" + rc-input "~0.1.4" + rc-input-number "~7.3.9" + rc-mentions "~1.13.1" + rc-menu "~9.8.0" + rc-motion "^2.6.1" + rc-notification "~4.6.0" + rc-pagination "~3.2.0" + rc-picker "~2.7.0" + rc-progress "~3.4.1" + rc-rate "~2.9.0" + rc-resize-observer "^1.2.0" + rc-segmented "~2.1.0" + rc-select "~14.1.17" + rc-slider "~10.0.0" + rc-steps "~5.0.0-alpha.2" + rc-switch "~3.2.0" + rc-table "~7.26.0" + rc-tabs "~12.5.6" + rc-textarea "~0.4.5" + rc-tooltip "~5.2.0" + rc-tree "~5.7.0" + rc-tree-select "~5.5.0" + rc-trigger "^5.2.10" + rc-upload "~4.3.0" + rc-util "^5.35.1" + scroll-into-view-if-needed "^2.2.25" + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-root-dir@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118" + integrity sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-hidden@^1.1.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" + integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== + dependencies: + tslib "^2.0.0" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== + dependencies: + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + +ast-types@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.15.2.tgz#39ae4809393c4b16df751ee563411423e85fb49d" + integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== + dependencies: + tslib "^2.0.1" + +ast-types@^0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.16.1.tgz#7a9da1617c9081bc121faafe91711b4c8bb81da2" + integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== + dependencies: + tslib "^2.0.1" + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async-validator@^4.1.0: + version "4.2.5" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" + integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-polyfill-corejs2@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.3" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz#a75fa1b0c3fc5bd6837f9ec465c0f48031b8cab1" + integrity sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.3" + core-js-compat "^3.32.2" + +babel-plugin-polyfill-regenerator@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.3" + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +better-opn@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-3.0.2.tgz#f96f35deaaf8f34144a4102651babcf00d1d8817" + integrity sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== + dependencies: + open "^8.0.4" + +big-integer@^1.6.44: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-assert@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/browser-assert/-/browser-assert-1.2.1.tgz#9aaa5a2a8c74685c2ae05bfe46efd606f068c200" + integrity sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ== + +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + integrity sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ== + dependencies: + pako "~0.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== + dependencies: + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" + +browserslist@^4.22.2: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +"buffer-polyfill@npm:buffer@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.5.0, buffer@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001541: + version "1.0.30001553" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz#e64e7dc8fd4885cd246bb476471420beb5e474b5" + integrity sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A== + +caniuse-lite@^1.0.30001587: + version "1.0.30001620" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz#78bb6f35b8fe315b96b8590597094145d0b146b4" + integrity sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +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" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== + +cli-table3@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-scroll-into-view@^1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43" + integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-to-clipboard@^3.2.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + +core-js-compat@^3.31.0, core-js-compat@^3.32.2: + version "3.33.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.1.tgz#debe80464107d75419e00c2ee29f35982118ff84" + integrity sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ== + dependencies: + browserslist "^4.22.1" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +date-fns@2.x: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +dayjs@1.x: + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + +debug@2.6.9, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +default-browser-id@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defu@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.2.tgz#1217cba167410a1765ba93893c6dbac9ed9d9e5c" + integrity sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ== + +del@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dequal@^2.0.0, dequal@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-indent@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +detect-package-manager@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-package-manager/-/detect-package-manager-2.0.1.tgz#6b182e3ae5e1826752bfef1de9a7b828cffa50d8" + integrity sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A== + dependencies: + execa "^5.1.1" + +detect-port@^1.3.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-align@^1.7.0: + version "1.12.4" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.4.tgz#3503992eb2a7cfcb2ed3b2a6d21e0b9c00d54511" + integrity sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw== + +domain-browser@^4.22.0: + version "4.22.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.22.0.tgz#6ddd34220ec281f9a65d3386d267ddd35c491f9f" + integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw== + +dotenv-expand@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + +dotenv@^16.0.0: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + +duplexify@^3.5.0, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.535: + version "1.4.563" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz#dabb424202754c1fed2d2938ff564b23d3bbf0d3" + integrity sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw== + +electron-to-chromium@^1.4.668: + version "1.4.772" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.772.tgz#7a1efabf86b20e5709736ce64dbc2ce13cb68936" + integrity sha512-jFfEbxR/abTTJA3ci+2ok1NTuOBBtB4jH+UT6PUmRN+DY3WSD4FFRsgoVQ+QNIJ0T7wrXwzsWCI2WKC46b++2A== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +envinfo@^7.7.3: + version "7.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +esbuild-plugin-alias@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz#45a86cb941e20e7c2bc68a2bea53562172494fcb" + integrity sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ== + +esbuild-register@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.5.0.tgz#449613fb29ab94325c722f560f800dd946dc8ea8" + integrity sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A== + dependencies: + debug "^4.3.4" + +esbuild@^0.18.0: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-plugin-storybook@^0.6.15: + version "0.6.15" + resolved "https://registry.yarnpkg.com/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.15.tgz#8a091605b0a90974ec8e62d8112db6c4bd3a6faa" + integrity sha512-lAGqVAJGob47Griu29KXYowI4G7KwMoJDOkEip8ujikuDLxU+oWJ1l0WL6F2oDO4QiyUFXvtDkEkISMOPzo+7w== + dependencies: + "@storybook/csf" "^0.0.1" + "@typescript-eslint/utils" "^5.45.0" + requireindex "^1.1.0" + ts-dedent "^2.2.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^3.3.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@^1.6.6: + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + +fast-glob@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +fetch-retry@^5.0.2: + version "5.0.6" + resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.6.tgz#17d0bc90423405b7a88b74355bf364acd2a7fa56" + integrity sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ== + +file-system-cache@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-2.3.0.tgz#201feaf4c8cd97b9d0d608e96861bb6005f46fe6" + integrity sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ== + dependencies: + fs-extra "11.1.1" + ramda "0.29.0" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.0.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flow-parser@0.*: + version "0.219.3" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.219.3.tgz#f817121332acb168f4a71ba2dfa7bce8c2723aa1" + integrity sha512-dyPC0+TwAcBMQ1IZhSpj91mxZ31AI9FJ3q/ZMt8kdKaITnDCGmyUyWOwUfAKBVLrUTkdaTfpla0muhwOGY+dXw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@11.1.1, fs-extra@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-npm-tarball-url@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/get-npm-tarball-url/-/get-npm-tarball-url-2.0.3.tgz#67dff908d699e9e2182530ae6e939a93e5f8dfdb" + integrity sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-port@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +giget@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/giget/-/giget-1.1.3.tgz#574ed901031eafa732347a7990d84bfa6484c51a" + integrity sha512-zHuCeqtfgqgDwvXlR84UNgnJDuUHQcNI5OqWqFxxuk2BshuKbYhJWdxBsEo4PvKqoGh23lUAIvBNpChMLv7/9Q== + dependencies: + colorette "^2.0.20" + defu "^6.1.2" + https-proxy-agent "^7.0.2" + mri "^1.2.0" + node-fetch-native "^1.4.0" + pathe "^1.1.1" + tar "^6.2.0" + +github-slugger@^1.0.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-promise@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-4.2.2.tgz#15f44bcba0e14219cd93af36da6bb905ff007877" + integrity sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw== + dependencies: + "@types/glob" "^7.1.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^10.0.0: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gunzip-maybe@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz#b913564ae3be0eda6f3de36464837a9cd94b98ac" + integrity sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw== + dependencies: + browserify-zlib "^0.1.4" + is-deflate "^1.0.0" + is-gzip "^1.0.0" + peek-stream "^1.1.0" + pumpify "^1.3.3" + through2 "^2.0.3" + +handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +highlight.js@^10.4.1, highlight.js@~10.7.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-tags@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== + dependencies: + agent-base "5" + debug "4" + +https-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" + integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== + dependencies: + agent-base "^7.0.2" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-deflate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14" + integrity sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + integrity sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ== + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-plain-object@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typed-array@^1.1.3: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isomorphic-timers-promises@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" + integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== + +istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +jackspeak@2.1.1, jackspeak@^2.3.5: + version "2.1.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.1.1.tgz#2a42db4cfbb7e55433c28b6f75d8b796af9669cd" + integrity sha512-juf9stUEwUaILepraGOWIJTLwg48bUnBmRqd2ln2Os1sW987zeoj/hzhbvRB95oMuS2ZTpjULmdwHNX4rzZIZw== + dependencies: + cliui "^8.0.1" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jscodeshift@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.14.0.tgz#7542e6715d6d2e8bde0b4e883f0ccea358b46881" + integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.21.0" + temp "^0.8.4" + write-file-atomic "^2.3.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== + dependencies: + string-convert "^0.2.0" + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +lazy-universal-dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz#0b220c264e89a042a37181a4928cdd298af73422" + integrity sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg== + dependencies: + app-root-dir "^1.0.2" + dotenv "^16.0.0" + dotenv-expand "^10.0.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lowlight@^1.17.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" + integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + +magic-string@^0.30.0, magic-string@^0.30.3: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-or-similar@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" + integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== + +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + +markdown-to-jsx@^7.1.8: + version "7.3.2" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz#f286b4d112dad3028acc1e77dfe1f653b347e131" + integrity sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q== + +marked@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-find-and-replace@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== + dependencies: + "@types/mdast" "^3.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.0.0" + +mdast-util-from-markdown@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-gfm-autolink-literal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== + dependencies: + "@types/mdast" "^3.0.0" + ccount "^2.0.0" + mdast-util-find-and-replace "^2.0.0" + micromark-util-character "^1.0.0" + +mdast-util-gfm-footnote@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + micromark-util-normalize-identifier "^1.0.0" + +mdast-util-gfm-strikethrough@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== + dependencies: + "@types/mdast" "^3.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-task-list-item@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-gfm-autolink-literal "^1.0.0" + mdast-util-gfm-footnote "^1.0.0" + mdast-util-gfm-strikethrough "^1.0.0" + mdast-util-gfm-table "^1.0.0" + mdast-util-gfm-task-list-item "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + +mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" + integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== + +mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memoizerific@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a" + integrity sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog== + dependencies: + map-or-similar "^1.5.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromark-extension-gfm-autolink-literal@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" + integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-extension-gfm-footnote@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" + integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== + dependencies: + micromark-core-commonmark "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-strikethrough@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" + integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" + integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-tagfilter@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" + integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== + dependencies: + micromark-util-types "^1.0.0" + +micromark-extension-gfm-task-list-item@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" + integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" + integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== + dependencies: + micromark-extension-gfm-autolink-literal "^1.0.0" + micromark-extension-gfm-footnote "^1.0.0" + micromark-extension-gfm-strikethrough "^1.0.0" + micromark-extension-gfm-table "^1.0.0" + micromark-extension-gfm-tagfilter "^1.0.0" + micromark-extension-gfm-task-list-item "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-destination@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-label@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-title@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-whitespace@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-chunked@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-classify-character@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-combine-extensions@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-decode-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + +micromark-util-html-tag-name@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== + +micromark-util-normalize-identifier@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-resolve-all@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== + dependencies: + micromark-util-types "^1.0.0" + +micromark-util-sanitize-uri@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-subtokenize@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-util-symbol@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.25, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.0.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +moment@^2.24.0, moment@^2.29.2: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +mri@^1.1.0, mri@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + +node-fetch-native@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.4.0.tgz#fbe8ac033cb6aa44bd106b5e4fd2b6277ba70fa1" + integrity sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA== + +node-fetch@^2.0.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +node-stdlib-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz#5ddcfdf4063b88fb282979a1aa6ddab9728d5e4c" + integrity sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg== + dependencies: + assert "^2.0.0" + browser-resolve "^2.0.0" + browserify-zlib "^0.2.0" + buffer "^5.7.1" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + create-require "^1.1.1" + crypto-browserify "^3.11.0" + domain-browser "^4.22.0" + events "^3.0.0" + https-browserify "^1.0.0" + isomorphic-timers-promises "^1.0.1" + os-browserify "^0.3.0" + path-browserify "^1.0.1" + pkg-dir "^5.0.0" + process "^0.11.10" + punycode "^1.4.1" + querystring-es3 "^0.2.1" + readable-stream "^3.6.0" + stream-browserify "^3.0.0" + stream-http "^3.2.0" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.1" + url "^0.11.0" + util "^0.12.4" + vm-browserify "^1.0.1" + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.4, open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathe@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" + integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +peek-stream@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz#3b35d84b7ccbbd262fff31dc10da56856ead6d67" + integrity sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA== + dependencies: + buffer-from "^1.0.0" + duplexify "^3.5.0" + through2 "^2.0.3" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.4, pirates@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +polished@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/polished/-/polished-4.2.2.tgz#2529bb7c3198945373c52e34618c8fe7b1aa84d1" + integrity sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ== + dependencies: + "@babel/runtime" "^7.17.8" + +postcss@^8.4.38: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +prettier@^2.8.0: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== + +prismjs@^1.27.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +prismjs@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +progress@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +puppeteer-core@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-2.1.1.tgz#e9b3fbc1237b4f66e25999832229e9db3e0b90ed" + integrity sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w== + dependencies: + "@types/mime-types" "^2.1.0" + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^4.0.0" + mime "^2.0.3" + mime-types "^2.1.25" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^6.1.0" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@^6.10.0, qs@^6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +querystring-es3@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +ramda@0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.0.tgz#fbbb67a740a754c8a4cbb41e2a6e0eb8507f55fb" + integrity sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc-align@^4.0.0: + version "4.0.15" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.15.tgz#2bbd665cf85dfd0b0244c5a752b07565e9098577" + integrity sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + dom-align "^1.7.0" + rc-util "^5.26.0" + resize-observer-polyfill "^1.5.1" + +rc-cascader@~3.7.0: + version "3.7.3" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.7.3.tgz#1e2ad238b283f7226ce4c9f3a420a35cb63fcc82" + integrity sha512-KBpT+kzhxDW+hxPiNk4zaKa99+Lie2/8nnI11XF+FIOPl4Bj9VlFZi61GrnWzhLGA7VEN+dTxAkNOjkySDa0dA== + dependencies: + "@babel/runtime" "^7.12.5" + array-tree-filter "^2.1.0" + classnames "^2.3.1" + rc-select "~14.1.0" + rc-tree "~5.7.0" + rc-util "^5.6.1" + +rc-checkbox@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.0.1.tgz#f978771329be339d479cd81465eb2e2f8c82bc87" + integrity sha512-k7nxDWxYF+jDI0ZcCvuvj71xONmWRVe5+1MKcERRR9MRyP3tZ69b+yUCSXXh+sik4/Hc9P5wHr2nnUoGS2zBjA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.3.2" + rc-util "^5.25.2" + +rc-collapse@~3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.4.2.tgz#1310be7ad4cd0dcfc622c45f6c3b5ffdee403ad7" + integrity sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.3.4" + rc-util "^5.2.1" + shallowequal "^1.1.0" + +rc-dialog@~9.0.0, rc-dialog@~9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.0.2.tgz#aadfebdeba145f256c1fac9b9f509f893cdbb5b8" + integrity sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.0.0-8" + classnames "^2.2.6" + rc-motion "^2.3.0" + rc-util "^5.21.0" + +rc-drawer@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-6.3.0.tgz#f8af5fafbab19b83722360dcf93e966d8a2875ad" + integrity sha512-uBZVb3xTAR+dBV53d/bUhTctCw3pwcwJoM7g5aX+7vgwt2zzVzoJ6aqFjYJpBlZ9zp0dVYN8fV+hykFE7c4lig== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.1.1" + classnames "^2.2.6" + rc-motion "^2.6.1" + rc-util "^5.21.2" + +rc-dropdown@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.0.1.tgz#f65d9d3d89750241057db59d5a75e43cd4576b68" + integrity sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.6" + rc-trigger "^5.3.1" + rc-util "^5.17.0" + +rc-field-form@~1.34.0: + version "1.34.2" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.34.2.tgz#8463b79a44842a341899195f364e952c401ab7f1" + integrity sha512-BdciU5C7dBO51/9ZKcMvK2f8zaaO12Lt1eBhlAo8nNv+6htlNcgY9DAkUlZ7gfyWjnCc1Oo4hHIXau1m6tLw1A== + dependencies: + "@babel/runtime" "^7.18.0" + async-validator "^4.1.0" + rc-util "^5.32.2" + +rc-image@~5.13.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.13.0.tgz#1ed9b852a40b5eff34786ba7d2f0e9d26eeab874" + integrity sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/portal" "^1.0.2" + classnames "^2.2.6" + rc-dialog "~9.0.0" + rc-motion "^2.6.2" + rc-util "^5.0.6" + +rc-input-number@~7.3.9: + version "7.3.11" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-7.3.11.tgz#c7089705a220e1a59ba974fabf89693e00dd2442" + integrity sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.23.0" + +rc-input@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-0.1.4.tgz#45cb4ba209ae6cc835a2acb8629d4f8f0cb347e0" + integrity sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.18.1" + +rc-mentions@~1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.13.1.tgz#c884b70e1505a197f1b32a7c6b39090db6992a72" + integrity sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-menu "~9.8.0" + rc-textarea "^0.4.0" + rc-trigger "^5.0.4" + rc-util "^5.22.5" + +rc-menu@~9.8.0: + version "9.8.4" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.8.4.tgz#58bf19d471e3c74ff4bcfdb0f02a3826ebe2553b" + integrity sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.4.3" + rc-overflow "^1.2.8" + rc-trigger "^5.1.2" + rc-util "^5.27.0" + +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.1, rc-motion@^2.6.2: + version "2.9.0" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.9.0.tgz#9e18a1b8d61e528a97369cf9a7601e9b29205710" + integrity sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.21.0" + +rc-notification@~4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-4.6.1.tgz#068e8674f4bd7926a447eca512915d4b41b15c91" + integrity sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.2.0" + rc-util "^5.20.1" + +rc-overflow@^1.0.0, rc-overflow@^1.2.8: + version "1.3.2" + resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.3.2.tgz#72ee49e85a1308d8d4e3bd53285dc1f3e0bcce2c" + integrity sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.37.0" + +rc-pagination@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.2.0.tgz#4f2fdba9fdac0f48e5c9fb1141973818138af7e1" + integrity sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + +rc-picker@~2.7.0: + version "2.7.6" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.7.6.tgz#03d855888d1878d8946bab77a3d24477fd3a0792" + integrity sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + date-fns "2.x" + dayjs "1.x" + moment "^2.24.0" + rc-trigger "^5.0.4" + rc-util "^5.37.0" + shallowequal "^1.1.0" + +rc-progress@~3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.4.2.tgz#f8df9ee95e790490171ab6b31bf07303cdc79980" + integrity sha512-iAGhwWU+tsayP+Jkl9T4+6rHeQTG9kDz8JAHZk4XtQOcYN5fj9H34NXNEdRdZx94VUDHMqCb1yOIvi8eJRh67w== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.16.1" + +rc-rate@~2.9.0: + version "2.9.3" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.9.3.tgz#b30a8043ffcb327bab053cd78508e07015d8a483" + integrity sha512-2THssUSnRhtqIouQIIXqsZGzRczvp4WsH4WvGuhiwm+LG2fVpDUJliP9O1zeDOZvYfBE/Bup4SgHun/eCkbjgQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + +rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz#7bba61e6b3c604834980647cce6451914750d0cc" + integrity sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q== + dependencies: + "@babel/runtime" "^7.20.7" + classnames "^2.2.1" + rc-util "^5.38.0" + resize-observer-polyfill "^1.5.1" + +rc-segmented@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.1.2.tgz#14c9077a1dae9c2ccb2ef5fbc5662c1c48c7ce8e" + integrity sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-motion "^2.4.4" + rc-util "^5.17.0" + +rc-select@~14.1.0, rc-select@~14.1.17: + version "14.1.18" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.1.18.tgz#f1d95233132cda9c1485963254255b83e97a37a9" + integrity sha512-4JgY3oG2Yz68ECMUSCON7mtxuJvCSj+LJpHEg/AONaaVBxIIrmI/ZTuMJkyojall/X50YdBe5oMKqHHPNiPzEg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-overflow "^1.0.0" + rc-trigger "^5.0.4" + rc-util "^5.16.1" + rc-virtual-list "^3.2.0" + +rc-slider@~10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.0.1.tgz#7058c68ff1e1aa4e7c3536e5e10128bdbccb87f9" + integrity sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.18.1" + shallowequal "^1.1.0" + +rc-steps@~5.0.0-alpha.2: + version "5.0.0" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-5.0.0.tgz#2e2403f2dd69eb3966d65f461f7e3a8ee1ef69fe" + integrity sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw== + dependencies: + "@babel/runtime" "^7.16.7" + classnames "^2.2.3" + rc-util "^5.16.1" + +rc-switch@~3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.2.tgz#d001f77f12664d52595b4f6fb425dd9e66fba8e8" + integrity sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.0.1" + +rc-table@~7.26.0: + version "7.26.0" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.26.0.tgz#9d517e7fa512e7571fdcc453eb1bf19edfac6fbc" + integrity sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-resize-observer "^1.1.0" + rc-util "^5.22.5" + shallowequal "^1.1.0" + +rc-tabs@~12.5.6: + version "12.5.10" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-12.5.10.tgz#0e41c723fac66c4f0bcad3271429fff6653b0721" + integrity sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "2.x" + rc-dropdown "~4.0.0" + rc-menu "~9.8.0" + rc-motion "^2.6.2" + rc-resize-observer "^1.0.0" + rc-util "^5.16.0" + +rc-textarea@^0.4.0, rc-textarea@~0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-0.4.7.tgz#627f662d46f99e0059d1c1ebc8db40c65339fe90" + integrity sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.24.4" + shallowequal "^1.1.0" + +rc-tooltip@~5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-5.2.2.tgz#e5cafa8ecebf78108936a0bcb93c150fa81ac93b" + integrity sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "^2.3.1" + rc-trigger "^5.0.0" + +rc-tree-select@~5.5.0: + version "5.5.5" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.5.5.tgz#d28b3b45da1e820cd21762ba0ee93c19429bb369" + integrity sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-select "~14.1.0" + rc-tree "~5.7.0" + rc-util "^5.16.1" + +rc-tree@~5.7.0: + version "5.7.12" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.7.12.tgz#6910e551390963708936c2cbf925f9deff4a6d76" + integrity sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-util "^5.16.1" + rc-virtual-list "^3.5.1" + +rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.10, rc-trigger@^5.3.1: + version "5.3.4" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.3.4.tgz#6b4b26e32825677c837d1eb4d7085035eecf9a61" + integrity sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.6" + rc-align "^4.0.0" + rc-motion "^2.0.0" + rc-util "^5.19.2" + +rc-upload@~4.3.0: + version "4.3.5" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.3.5.tgz#12fc69b2af74d08646a104828831bcaf44076eda" + integrity sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.5" + rc-util "^5.2.0" + +rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.16.0, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.2, rc-util@^5.22.5, rc-util@^5.23.0, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.26.0, rc-util@^5.27.0, rc-util@^5.32.2, rc-util@^5.35.1, rc-util@^5.36.0, rc-util@^5.37.0, rc-util@^5.38.0, rc-util@^5.6.1, rc-util@^5.9.4: + version "5.38.0" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.38.0.tgz#18a3d1c26ba3c43fabfbe6303e825dabd9e5f4f0" + integrity sha512-yV/YBNdFn+edyBpBdCqkPE29Su0jWcHNgwx2dJbRqMrMfrUcMJUjCRV+ZPhcvWyKFJ63GzEerPrz9JIVo0zXmA== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^18.2.0" + +rc-virtual-list@^3.2.0, rc-virtual-list@^3.5.1: + version "3.11.2" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.11.2.tgz#eb859c2257233aff10864f041e5bcc89f7814bb7" + integrity sha512-MTFLL2LOHr3+/+r+WjTIs6j8XmJE6EqdOsJvCH8SWig7qyik3aljCEImUtw5tdWR0tQhXUfbv7P7nZaLY91XPg== + dependencies: + "@babel/runtime" "^7.20.0" + classnames "^2.2.6" + rc-resize-observer "^1.0.0" + rc-util "^5.36.0" + +react-colorful@^5.1.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.6.1.tgz#7dc2aed2d7c72fac89694e834d179e32f3da563b" + integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw== + +react-docgen-typescript@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz#4611055e569edc071204aadb20e1c93e1ab1659c" + integrity sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg== + +react-docgen@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-6.0.4.tgz#85eeebac5fdeb781dbf610fdc429c20a4f06131c" + integrity sha512-gF+p+1ZwC2eO66bt763Tepmh5q9kDiFIrqW3YjUV/a+L96h0m5+/wSFQoOHL2cffyrPMZMxP03IgbggJ11QbOw== + dependencies: + "@babel/core" "^7.18.9" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + "@types/babel__core" "^7.18.0" + "@types/babel__traverse" "^7.18.0" + "@types/doctrine" "^0.0.6" + "@types/resolve" "^1.20.2" + doctrine "^3.0.0" + resolve "^1.22.1" + strip-indent "^4.0.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-element-to-jsx-string@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz#1cafd5b6ad41946ffc8755e254da3fc752a01ac6" + integrity sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ== + dependencies: + "@base2/pretty-print-object" "1.0.1" + is-plain-object "5.0.0" + react-is "18.1.0" + +react-inspector@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-6.0.2.tgz#aa3028803550cb6dbd7344816d5c80bf39d07e9d" + integrity sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ== + +react-is@18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-refresh@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" + integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== + +react-remove-scroll-bar@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" + integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react-syntax-highlighter@^15.5.0: + version "15.5.0" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" + integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.27.0" + refractor "^3.6.0" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recast@^0.21.0: + version "0.21.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" + integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== + dependencies: + ast-types "0.15.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + +recast@^0.23.1: + version "0.23.4" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.4.tgz#ca1bac7bfd3011ea5a28dfecb5df678559fb1ddf" + integrity sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw== + dependencies: + assert "^2.0.0" + ast-types "^0.16.1" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + +refractor@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" + integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.27.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +remark-external-links@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345" + integrity sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA== + dependencies: + extend "^3.0.0" + is-absolute-url "^3.0.0" + mdast-util-definitions "^4.0.0" + space-separated-tokens "^1.0.0" + unist-util-visit "^2.0.0" + +remark-gfm@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-gfm "^2.0.0" + micromark-extension-gfm "^2.0.0" + unified "^10.0.0" + +remark-slug@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.1.0.tgz#0503268d5f0c4ecb1f33315c00465ccdd97923ce" + integrity sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ== + dependencies: + github-slugger "^1.0.0" + mdast-util-to-string "^1.0.0" + unist-util-visit "^2.0.0" + +requireindex@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.22.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +"rollup@^2.25.0 || ^3.3.0": + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== + optionalDependencies: + fsevents "~2.3.2" + +rollup@^4.13.0: + version "4.17.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f" + integrity sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.17.2" + "@rollup/rollup-android-arm64" "4.17.2" + "@rollup/rollup-darwin-arm64" "4.17.2" + "@rollup/rollup-darwin-x64" "4.17.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.17.2" + "@rollup/rollup-linux-arm-musleabihf" "4.17.2" + "@rollup/rollup-linux-arm64-gnu" "4.17.2" + "@rollup/rollup-linux-arm64-musl" "4.17.2" + "@rollup/rollup-linux-powerpc64le-gnu" "4.17.2" + "@rollup/rollup-linux-riscv64-gnu" "4.17.2" + "@rollup/rollup-linux-s390x-gnu" "4.17.2" + "@rollup/rollup-linux-x64-gnu" "4.17.2" + "@rollup/rollup-linux-x64-musl" "4.17.2" + "@rollup/rollup-win32-arm64-msvc" "4.17.2" + "@rollup/rollup-win32-ia32-msvc" "4.17.2" + "@rollup/rollup-win32-x64-msvc" "4.17.2" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +scroll-into-view-if-needed@^2.2.25: + version "2.2.31" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587" + integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA== + dependencies: + compute-scroll-into-view "^1.0.20" + +"semver@2 || 3 || 4 || 5", semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shiki@^0.14.1: + version "0.14.5" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.5.tgz#375dd214e57eccb04f0daf35a32aa615861deb93" + integrity sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw== + dependencies: + ansi-sequence-parser "^1.1.0" + jsonc-parser "^3.2.0" + vscode-oniguruma "^1.7.0" + vscode-textmate "^8.0.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map-support@^0.5.16: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +store2@^2.14.2: + version "2.14.2" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.14.2.tgz#56138d200f9fe5f582ad63bc2704dbc0e4a45068" + integrity sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w== + +storybook@^7.5.0: + version "7.5.1" + resolved "https://registry.yarnpkg.com/storybook/-/storybook-7.5.1.tgz#e7554aa674355fedb1f49f9651f0650b8f9ee13b" + integrity sha512-Wg3j3z5H03PYnEcmlnhf6bls0OtjmsNPsQ93dTV8F4AweqBECwzjf94Wj++NrP3X+WbfMoCbBU6LRFuEyzCCxw== + dependencies: + "@storybook/cli" "7.5.1" + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-http@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" + integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== + dependencies: + min-indent "^1.0.1" + +strip-json-comments@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +synchronous-promise@^2.0.15: + version "2.0.17" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.17.tgz#38901319632f946c982152586f2caf8ddc25c032" + integrity sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g== + +tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +telejson@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-7.2.0.tgz#3994f6c9a8f8d7f2dba9be2c7c5bbb447e876f32" + integrity sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ== + dependencies: + memoizerific "^1.11.3" + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +tempy@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.1.tgz#30fe901fd869cfb36ee2bd999805aa72fbb035de" + integrity sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w== + dependencies: + del "^6.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +throttle-debounce@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz#a17a4039e82a2ed38a5e7268e4132d6960d41933" + integrity sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg== + +through2@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +tiny-invariant@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tocbot@^4.20.1: + version "4.21.2" + resolved "https://registry.yarnpkg.com/tocbot/-/tocbot-4.21.2.tgz#7ae513d73dddb80f126724160bd6f72bf8638edb" + integrity sha512-R5Muhi/TUu4i4snWVrMgNoXyJm2f8sJfdgIkQvqb+cuIXQEIMAiWGWgCgYXHqX4+XiS/Bnm7IYZ9Zy6NVe6lhw== + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + +ts-dedent@^2.0.0, ts-dedent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + +tslib@^1.13.0, tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-fest@^2.19.0, type-fest@~2.19: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typedoc@^0.24.8: + version "0.24.8" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.24.8.tgz#cce9f47ba6a8d52389f5e583716a2b3b4335b63e" + integrity sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w== + dependencies: + lunr "^2.3.9" + marked "^4.3.0" + minimatch "^9.0.0" + shiki "^0.14.1" + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@^10.0.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unplugin@^1.3.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.5.0.tgz#8938ae84defe62afc7757df9ca05d27160f6c20c" + integrity sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A== + dependencies: + acorn "^8.10.0" + chokidar "^3.5.3" + webpack-sources "^3.2.3" + webpack-virtual-modules "^0.5.0" + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +url@^0.11.0: + version "0.11.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" + integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== + dependencies: + punycode "^1.4.1" + qs "^6.11.2" + +use-callback-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" + integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== + dependencies: + tslib "^2.0.0" + +use-resize-observer@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/use-resize-observer/-/use-resize-observer-9.1.0.tgz#14735235cf3268569c1ea468f8a90c5789fc5c6c" + integrity sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow== + dependencies: + "@juggle/resize-observer" "^3.3.1" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.4, util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== + dependencies: + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +vite-plugin-node-polyfills@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.17.0.tgz#1044a4955174ddaeedbc3679b179e1efac9da006" + integrity sha512-iPmPn7376e5u6QvoTSJa16hf5Q0DFwHFXJk2uYpsNlmI3JdPms7hWyh55o+OysJ5jo9J5XPhLC9sMOYifwFd1w== + dependencies: + "@rollup/plugin-inject" "^5.0.5" + buffer-polyfill "npm:buffer@^6.0.3" + node-stdlib-browser "^1.2.0" + process "^0.11.10" + +vite@^5.2.0: + version "5.2.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" + integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== + dependencies: + esbuild "^0.20.1" + postcss "^8.4.38" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +vscode-oniguruma@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== + +vscode-textmate@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" + integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack-virtual-modules@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz#362f14738a56dae107937ab98ea7062e8bdd3b6c" + integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-typed-array@^1.1.11, which-typed-array@^1.1.2: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@^8.2.3: + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== + +xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/docs/date-types.md b/docs/date-types.md deleted file mode 100644 index 1b565a9f..00000000 --- a/docs/date-types.md +++ /dev/null @@ -1,129 +0,0 @@ -# Timeline: Date types - -## Props - -| Name | Type | Default | Description | -| ------------|------------------|---------|---------------------------------------------- | -| useMoment | Boolean | true | If true the dates from props should be moment objects. otherwise they will be dates in milliseconds (numbers) and will be converted internally in moment objects. | -| startDate | Object or number | | The visible start date of the timeline as moment object or in milliseconds | -| endDate | Object or number | | The visible end date of the timeline as moment object or in milliseconds | -| items | Object[] | | Items that will be rendered in the grid | -| rowLayers | Object[] | | List of layers that will be rendered for a row | - -Default date fields in an item: -* start - moment object or date in milliseconds(number) - start of an item -* end - moment object or date in milliseconds(number) - end of an item - -Default date fields in a row layer: -* start - moment object or date in milliseconds(number) - start of a row layer -* end - moment object or date in milliseconds(number) - end of a row layer - -## Functions - -> **WARNING** All operations involving the dates mentioned above should pass through the following functions. It is forbidden to manipulate the dates from props directly. These function can be overriden in order to use other fields or for additional logic. - -### getStartDate() - -It returns the start date of the timeline as moment. - -### getEndDate() - -It returns the end date of the timeline as moment. - -### getStartFromItem(item) - -It returns the start date of an item as moment. - -Params: -| Name | Type | Description | -|-----------|----------|-------------------------------------------------------------| -| item | Object | Item that will be rendered in the grid. | - -### getEndFromItem(item) - -It returns the end date of an item as moment. - -Params: -| Name | Type | Description | -|-----------|----------|-------------------------------------------------------------| -| item | Object | Item that will be rendered in the grid. | - -### setStartToItem(item, newDateAsMoment) - -Sets the start of the item to newDateAsMoment converted to moment or milliseconds depending on props.useMoment. - -Params: -| Name | Type | Description | -|-----------------|----------|-------------------------------------------------------------| -| item | Object | Item that will be rendered in the grid. | -| newDateAsMoment | Object | The new value of the start date as moment. | - -### setEndToItem(item, newDateAsMoment) - -Sets the end of the item to newDateAsMoment converted to moment or milliseconds depending on props.useMoment. - -Params: -| Name | Type | Description | -|-----------------|----------|-------------------------------------------------------------| -| item | Object | Item that will be rendered in the grid. | -| newDateAsMoment | Object | The new value of the end date as moment. | - -### getStartFromRowLayer(layer) - -It returns the start date of a row layer as moment. - -Params: -| Name | Type | Description | -|-----------|----------|-------------------------------------------------------------| -| layer | Object | Row layer that will be rendered in the grid. | - -### getEndFromRowLayer(layer) - -It returns the end date of a row layer as moment. - -Params: -| Name | Type | Description | -|-----------|----------|-------------------------------------------------------------| -| layer | Object | Row layer that will be rendered in the grid. | - -### setStartToRowLayer(layer, newDateAsMoment) - -Sets the start of the layer to newDateAsMoment converted to moment or milliseconds depending on props.useMoment. - -Params: -| Name | Type | Description | -|-----------------|----------|-------------------------------------------------------------| -| layer | Object | Row layer that will be rendered in the grid. | -| newDateAsMoment | Object | The new value of the end date as moment. | - -### setEndToRowLayer(layer, newDateAsMoment) - -Sets the end of the layer to newDateAsMoment converted to moment or milliseconds depending on props.useMoment. - -Params: -| Name | Type | Description | -|-----------------|----------|-------------------------------------------------------------| -| layer | Object | Row layer that will be rendered in the grid. | -| newDateAsMoment | Object | The new value of the end date as moment. | - -## Utils functions - -### convertDateToMoment(date, useMoment) - -Returns the date as moment object. If useMoment is true, the date is already a moment object. This function is used by all getter functions above. - -Params: -| Name | Type | Description | -|------------|------------------|-----------------------------------------------------------------| -| date | Object or number | The date to be converted to moment, it can be already a moment. | -| useMoment | Boolean | Whether the date is already a moment or should be converted. | - -### convertMomentToDateType(dateAsMoment, useMoment) - -Returns the date as moment object if useMoment is true, otherwise returns the date in milliseconds. - -Params: -| Name | Type | Description | -|--------------|---------|-------------------------------------------------------------------------| -| dateAsMoment | Object | The new value of the end date as moment. | -| useMoment | Boolean | Whether the date returned should be a moment object or in milliseconds. | diff --git a/docs/table-columns.md b/docs/table-columns.md deleted file mode 100644 index 1af75950..00000000 --- a/docs/table-columns.md +++ /dev/null @@ -1,69 +0,0 @@ -# Table columns - -Historically, the Timeline only had a single column to the left of the component. Then we improved this, by allowing the possibility to have multiple columns. Hence the left zone can now be regarded also as a table. - -## Props in Timeline - -| Name | Type | Default | Description | -|--------------------|----------|----------------------|---------------------------------------------------| -| groups | object[] | | Rows data | -| groupOffset | number | 150 | Single column mode: the width of the column. Multiple columns mode: the default width of a column (if column.width is not configured). | -| groupRenderer | function | DefaultGroupRenderer | Single column mode: the renderer of a cell. Multiple columns mode: the default renderer of a cell, which may be overridden on a per column basis. | -| groupTitleRenderer | function | | Single mode view: the renderer of a header cell. Multiple columns mode: the default renderer of a header cell, which may be overridden on a per column basis. | -| tableColumns | object[] | [] | The columns that will be rendered using data from groups. | - -## Props for a column (multiple columns mode) -| Name | Type | Description | -|----------------|---------------------|--------------------------------------------------------------------------| -| width | number | The width of the column. | -| labelProperty | string | The key used in the default cell renderer to show the label of the cell. | -| cellRenderer | function or element | Custom cellRenderer. | -| headerLabel | string | The label of the header used in the default header renderer. | -| headerRenderer | function or element | Custom header renderer. | - -## Header renderer - -Single column mode: -* props.groupTitleRenderer is the renderer of the header cell. - -Multiple columns mode: -* props.groupTitleRenderer is the default renderer of a header cell, which may be overridden on a per column basis. The default value of props.groupTitleRenderer is DefaultColumnHeaderRenderer that renders column.headerLabel. -* column.headerRenderer is the custom renderer for a column. It can be a React element or a function/class component. - -### DefaultColumnHeaderRenderer - -Default renderer for column header. - -#### Props - - * props.column - object - The properties of the column - * props.column.headerLabel - string - The header's label - -#### Functions - -* getLabel() - returns the label of the header, by default props.column.headerLabel. - -## Cell renderer - -Single column mode: -* props.groupRenderer is the renderer of a cell. The default value of the renderer is DefaultGroupRenderer that renderers by default the title property from group. - -Multiple columns mode: -* props.groupRenderer is the default renderer of a cell, which may be overridden on a per column basis. The default value of props.groupRenderer is DefaultGroupRenderer that renders column.labelProperty from group. -* column.cellRenderer is the custom renderer for a cell. It can be a React element or a function/class component. - -* props.groupRenderer is the default renderer of a cell, which may be overridden on a per column basis. The default value of props.groupRenderer is DefaultGroupRenderer that renders column.labelProperty from group. - -### DefaultGroupRenderer - -Default group renderer class (cell renderer). - -#### Props - - * props.group - object - The group (row) to be rendered. - * props.group.id - string - The group's id. - * props.labelProperty - The key of the data from group that should be rendered. - -#### Functions - - * getLabel() - returns the label of the cell, by default return props.labelProperty from props.group. \ No newline at end of file diff --git a/package.json b/package.json index 9fd909e9..0d8ae9a1 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,14 @@ { - "name": "react-timeline-9000", - "version": "2.0.0", + "name": "@crispico/react-timeline-10000", + "version": "v2.12.0", "description": "Performance focused timeline for react", "private": false, + "types": "./types/index.d.ts", "scripts": { - "build": "webpack --config webpack.prod.js", - "build_lib": "babel src --out-dir lib --ignore demo*,setupTests.js,*.test.js --copy-files --source-maps inline", - "build_demo": "webpack --config webpack.demo.prod.js", - "start": "webpack-dev-server --open --config webpack.dev.js", - "docs": "esdoc", + "lib-build": "yarn tsc && babel src --out-dir lib -x '.js,.jsx,.mdx,.html,.tsx,.ts' --ignore **/demo.js,**/demo_index.js,**/demo.html,**/demo/,**/setupTests.js,**/*/*.test.js,**/stories/,**/testsAreDemo --copy-files --source-maps inline --no-copy-ignored", "pretty": "prettier --write --tab-width 4 \"src/**/*.js\"", "precommit": "lint-staged", - "storybook": "start-storybook -p 6006", - "build-storybook": "build-storybook" + "tsc": "tsc && cp src/types.d.ts types/types.d.ts" }, "lint-staged": { "src/**/*.{js,jsx,json,css}": [ @@ -20,10 +16,6 @@ "git add" ] }, - "repository": { - "type": "git", - "url": "git+https://github.com/React9k/react-timeline-9000.git" - }, "keywords": [ "react", "timeline" @@ -33,71 +25,67 @@ }, "author": "Leighton Lilford", "license": "MIT", - "bugs": { - "url": "https://github.com/React9k/react-timeline-9000/issues" - }, "files": [ - "dist", - "lib" + "lib", + "types" ], "main": "lib/index.js", - "homepage": "https://github.com/React9k/react-timeline-9000#readme", + "homepage": "https://github.com/flower-platform/react-timeline-10000", "devDependencies": { - "@storybook/addon-actions": "^6.3.11", - "@storybook/addon-essentials": "^6.3.11", - "@storybook/addon-links": "^6.3.11", - "@storybook/react": "^6.3.11", - "antd": "^3.6.5", - "babel-cli": "^6.26.0", - "babel-core": "^6.26.3", - "babel-eslint": "^8.2.5", - "babel-loader": "^7.1.4", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.7.0", - "babel-preset-react": "^6.24.1", - "babel-root-slash-import": "^1.1.0", + "@babel/cli": "^7.0.0", + "@babel/core": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.21.0", + "@babel/preset-env": "^7.23.2", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.2", + "@types/lodash": "^4.17.20", + "babel-loader": "^8.2.5", "chai": "^4.1.2", "core-js": "^2.4.0", "css-loader": "^0.28.11", "enzyme": "^3.3.0", "enzyme-adapter-react-16": "^1.1.1", - "esdoc": "^1.1.0", - "esdoc-ecmascript-proposal-plugin": "^1.0.0", - "esdoc-jsx-plugin": "^1.0.0", - "esdoc-standard-plugin": "^1.0.0", "eslint": "^5.0.1", "eslint-config-prettier": "^2.9.0", "eslint-plugin-babel": "^5.1.0", "eslint-plugin-import": "^2.12.0", "eslint-plugin-prettier": "^2.6.0", "eslint-plugin-react": "^7.10.0", - "html-webpack-plugin": "5.5.0", "husky": "^0.14.3", "ignore-styles": "^5.0.1", "jsdom": "^16.5.0", "lint-staged": "8.2.1", - "mocha": "^5.2.0", "prettier": "^1.13.5", "react": "^17.0.2", "react-dom": "^17.0.2", + "semantic-ui-css": "^2.5.0", + "semantic-ui-react": "^2.1.3", "style-loader": "^0.21.0", "tern": "^0.21.0", - "uglifyjs-webpack-plugin": "^2.2.0", - "webpack": "^5.67.0", - "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.7.3", - "webpack-merge": "^5.8.0" + "ts-loader": "^9.4.2", + "typescript": "~5.3.0" }, "dependencies": { + "@famiprog-foundation/tests-are-demo": "^1.2.1", + "color": "^4.2.3", "core-js": "^2.4.0", + "fixed-data-table-2": "2.0.6", "interactjs": "^1.6.2", "lodash": "^4.17.19", "moment": "^2.22.2", + "pretty-format": "^29.5.0", + "react-split-pane": "^0.1.92", "react-virtualized": "^9.19.1" }, + "dependencies / comments": { + "// pretty-format": "We have a TypeError on build, it is imported from @testing-library/dom but was needed to add it explicitly" + }, "peerDependencies": { "react": "^16.4.1 || ^17.0.0", "react-dom": "^16.4.1 || ^17.0.0" + }, + "resolutions": { + "// @types/react": "Needed, because a lot of packages import this w/ *. And yarn resolves + hoists this as the latest available version.", + "@types/react": "^17.0.0" } } diff --git a/src/components/BackgroundLayer.js b/src/components/BackgroundLayer.js new file mode 100644 index 00000000..0f4cda7b --- /dev/null +++ b/src/components/BackgroundLayer.js @@ -0,0 +1,356 @@ +import React, {Fragment} from 'react'; +import PropTypes from 'prop-types'; +import _ from 'lodash'; +import {convertDateToMoment} from '../utils/timeUtils'; +import {Marker} from './Marker'; +import {HighlightedInterval} from './HighlightedInterval'; +import moment from 'moment'; + +/** + * @extends React.Component + */ +export class BackgroundLayer extends React.Component { + static propTypes = { + /** + * If `true`, it highlights the weekends. + * + * @type { boolean } + */ + highlightWeekends: PropTypes.bool, + + /** + * Custom class name for highlighting the weekends. + * + * NOTE: No need to provide this; because it has a default class. If a custom class is provided, `!important` should be used to override properties from the default class. + * + * @type { string } + */ + highlightWeekendsClassName: PropTypes.string, + + /** + * Custom style for highlighting the weekends. + * + * NOTE: No need to provide this; because it has a default class. + * + * @type { object } + */ + highlightWeekendsStyle: PropTypes.object, + + /** + * If `true`, it draws a marker (vertical line) that indicates the current time. + * + * @type { boolean } + */ + nowMarker: PropTypes.bool, + + /** + * Custom class name for now marker. + * + * NOTE: No need to provide this; because it has a default class. If a custom class is provided, `!important` should be used to override properties from the default class. + * + * @type { string } + */ + nowMarkerClassName: PropTypes.string, + + /** + * Custom style for now marker. + * + * NOTE: No need to provide this; because it has a default class. + * + * @type { object } + */ + nowMarkerStyle: PropTypes.object, + + /** + * If `true`, it draws vertical lines, according to the intervals defined by the bottom `Timebar`. + * + * @type { boolean } + */ + verticalGrid: PropTypes.bool, + + /** + * Custom class name for vertical grid. + * + * NOTE: No need to provide this; because it has a default class. If a custom class is provided, `!important` should be used to override properties from the default class. + * + * @type { string } + */ + verticalGridClassName: PropTypes.string, + + /** + * Custom style for vertical grid. + * + * NOTE: No need to provide this; because it has a default class. + * + * @type { object } + */ + verticalGridStyle: PropTypes.object, + + /** + * @type { Array. } + */ + markers: PropTypes.arrayOf(PropTypes.object), + + /** + * @type { Array. } + */ + highlightedIntervals: PropTypes.arrayOf(PropTypes.object), + + /** + * Internal (passed by parent). Start of the timeline display interval, as date (moment object). + * + * @type { object } + */ + startDateTimeline: PropTypes.object, + + /** + * Internal (passed by parent). End of the timeline display interval, as date (moment object). + * + * @type { object } + */ + endDateTimeline: PropTypes.object, + + /** + * Internal (passed by parent). The height of the background layer. + * + * @type { number } + */ + height: PropTypes.number, + + /** + * Internal (passed by parent). The position of the top edge of background layer. + * + * @type { number } + */ + topOffset: PropTypes.number, + + /** + * Internal (passed by parent). Total width of the timeline. + * + * @type { number } + */ + width: PropTypes.number, + + /** + * Internal (passed by parent). The position of the left edge of background layer. + * + * @type { number } + */ + leftOffset: PropTypes.number, + + /** + * Internal (passed by parent). The vertical lines of the grid are already calculated by `Timerbar`. + * + * @type { Array.} + */ + verticalGridLines: PropTypes.arrayOf(PropTypes.object) + }; + + static defaultProps = { + highlightWeekends: false, + highlightWeekendsClassName: undefined, + highlightWeekendsStyle: undefined, + nowMarker: false, + nowMarkerClassName: undefined, + nowMarkerStyle: undefined, + verticalGrid: false, + verticalGridClassName: undefined, + verticalGridStyle: undefined, + verticalGridLines: [], + markers: [], + highlightedIntervals: [], + height: undefined, + topOffset: undefined, + width: undefined, + leftOffset: undefined, + startDateTimeline: undefined, + endDateTimeline: undefined + }; + + constructor(props) { + super(props); + this.state = {verticalLines: [], shouldUpdate: false, weekends: []}; + this.calculateHorizontalPosition = this.calculateHorizontalPosition.bind(this); + } + + componentDidMount() { + this.calculateHighlightedWeekends(); + } + + componentDidUpdate(prevProps) { + if ( + this.props.height !== prevProps.height || + this.props.width !== prevProps.width || + !this.props.startDateTimeline.isSame(prevProps.startDateTimeline) || + !this.props.endDateTimeline.isSame(prevProps.endDateTimeline) + ) { + this.calculateHighlightedWeekends(); + this.setState({shouldUpdate: true}); + return; + } + if (this.state.shouldUpdate) { + this.setState({shouldUpdate: false}); + } + } + + /** + * It calculates the horizontal position (left and width in pixels) of an element from the time positions (start, end). + * @param { object | number } start + * @param { object | number } end + * @returns { object } left position and width in pixels + */ + calculateHorizontalPosition(start, end) { + const intervalMillis = this.props.endDateTimeline.diff(this.props.startDateTimeline, 'milliseconds'); + const pixelsPerMillis = (this.props.width - this.props.leftOffset) / intervalMillis; + const startAsMoment = convertDateToMoment(start); + const endAsMoment = convertDateToMoment(end); + if (endAsMoment.isBefore(this.props.startDateTimeline) || startAsMoment.isAfter(this.props.endDateTimeline)) { + return {}; + } + + let offset = startAsMoment.diff(this.props.startDateTimeline, 'milliseconds'); + let duration = (endAsMoment <= this.props.endDateTimeline ? endAsMoment : this.props.endDateTimeline).diff( + startAsMoment, + 'milliseconds' + ); + const left = this.props.leftOffset + offset * pixelsPerMillis; + let width = Math.round(duration * pixelsPerMillis); + return {left, width}; + } + + /** + * Calculates the weekend intervals for the timeline displayed interval (`startDateTimeline` - `endDateTimeline`). + */ + calculateHighlightedWeekends() { + let weekends = []; + if (!this.props.highlightWeekends) { + return; + } + + let weekendStartDate = this.props.startDateTimeline.clone().startOf('day'); + let weekendEndDate = null; + // find first weekend day + while (weekendStartDate.isoWeekday() !== 6 && weekendStartDate.isoWeekday() !== 7) { + weekendStartDate = weekendStartDate.add(1, 'days'); + } + + // compute all the weekends in the interval + while (weekendStartDate < this.props.endDateTimeline) { + if (weekendStartDate.isoWeekday() === 7) { + weekendEndDate = weekendStartDate.clone().add(1, 'days'); + } else { + weekendEndDate = weekendStartDate.clone().add(2, 'days'); + } + weekends.push({ + start: weekendStartDate, + end: weekendEndDate, + className: `rct9k-background-layer-highlight-weekends ${this.props.highlightWeekendsClassName}` + }); + + // go to the next weekend + weekendStartDate = weekendEndDate.clone().add(5, 'days'); + } + this.setState({weekends: weekends}); + } + + renderHighlightedWeekends() { + return ( + + {this.props.highlightWeekends && + this.state.weekends.map((weekend, index) => { + return ( + + ); + })} + + ); + } + + renderCustomComponents(components) { + let weekendsCount = this.props.highlightWeekends ? this.state.weekends.length : 0; + return ( + + {components.map((component, index) => { + return React.cloneElement(component, { + key: index, + id: weekendsCount + index, + height: this.props.height, + top: this.props.topOffset, + shouldUpdate: this.state.shouldUpdate, + calculateHorizontalPosition: this.calculateHorizontalPosition + }); + })} + + ); + } + + renderVerticalGrid() { + const {verticalGrid, topOffset, height, leftOffset, width, verticalGridLines, verticalGridClassName} = this.props; + return ( + + {verticalGrid && verticalGridLines && ( +
+ {verticalGridLines.map((verticalLine, index) => { + return ( + + ); + })} +
+ )} +
+ ); + } + + renderNowMarker() { + const {nowMarker, height, topOffset, nowMarkerClassName} = this.props; + const currentDate = moment(); + const overlappsDisplayedInterval = + this.props.startDateTimeline.isSameOrBefore(currentDate) && this.props.endDateTimeline.isSameOrAfter(currentDate); + return ( + + {nowMarker && overlappsDisplayedInterval && ( + + )} + + ); + } + + render() { + return ( +
+
+ {this.renderHighlightedWeekends()} + {this.renderCustomComponents(this.props.highlightedIntervals)} + {this.renderNowMarker()} + {this.renderCustomComponents(this.props.markers)} + {this.renderVerticalGrid()} +
+
+ ); + } +} diff --git a/src/components/ContextMenu/ContextMenu.tsx b/src/components/ContextMenu/ContextMenu.tsx new file mode 100644 index 00000000..4d8357f6 --- /dev/null +++ b/src/components/ContextMenu/ContextMenu.tsx @@ -0,0 +1,120 @@ +import React from 'react'; +import { Menu, Popup, StrictPopupProps } from 'semantic-ui-react'; +import { IAction, IActionParamForRun } from './IAction'; +import { TestsAreDemoCheat, createTestids } from '@famiprog-foundation/tests-are-demo'; +import _ from 'lodash'; + +export type Point = { x: number, y: number }; + +type Position = StrictPopupProps["position"]; + +type IParamsForAction = { + selection: any[]; + position?: Position; + [key: string]: any; +} +interface ContextMenuProps { + actions: IAction[]; + + paramsForAction: IParamsForAction; + /** + * if undefined => the menu is closed else {x, y} position where the menu should open + */ + positionToOpen?: Point; + /** + * Callback for extra actions when the menu is closed + */ + onClose?: () => void; +} + +const testids = createTestids('ContextMenu', { + popup: '', + menuItem: '' +}); +export const contextMenuTestIds = testids; + +export class ContextMenu extends React.Component { + + constructor(props) { + super(props); + this.close = this.close.bind(this); + this.state = { + isOpened: props.positionToOpen ? true : false + } + } + + shouldComponentUpdate(nextProps, nextState) { + return ( + nextProps.positionToOpen !== this.props.positionToOpen || + !_.isEqual(nextProps.actions, this.props.actions) || + !_.isEqual(nextProps.paramsForAction, this.props.paramsForAction) || + nextState.isOpened !== this.state.isOpened + ); + } + + componentDidUpdate(prevProps: Readonly, prevState: Readonly<{}>, snapshot?: any): void { + if (this.props.positionToOpen != prevProps.positionToOpen) { + this.setState({ isOpened: this.props.positionToOpen ? true : false }); + } + } + + close() { + this.setState({ isOpened: false }); + this.props.onClose && this.props.onClose(); + } + + getPopupContext(): HTMLElement { + const x = this.props.positionToOpen?.x; + const y = this.props.positionToOpen?.y; + return { + getBoundingClientRect: () => ({ + left: x, + top: y, + right: x + 1, + bottom: y + 1, + height: 0, + width: 0 + }) + } as HTMLElement; + } + + getVisisbleActions(actions: IAction[]): IAction[] { + return actions.filter(action => action.isVisible ? action.isVisible(this.props.paramsForAction) : true); + } + + render() { + const visibleActions = this.getVisisbleActions(this.props.actions); + return <> + + { + this.close(); + }} open={(this.state.isOpened && visibleActions.length > 0)}> + + {visibleActions.map((action: IAction) => { + const key = (action.key instanceof Function ? action.key({ ...this.props.paramsForAction }) : action.key) || visibleActions.indexOf(action); + return (!action.renderInMenu ? + { + let params: IActionParamForRun = { ...this.props.paramsForAction, closeContextMenu: this.close, eventPoint: { x: event.clientX, y: event.clientY } } + action.run && action.run(params); + if (!params.dontCloseContextMenuAfterRunAutomatically) { + this.close(); + } + }}> + + : React.cloneElement(action.renderInMenu({ ...this.props.paramsForAction, closeContextMenu: this.close }), { key: visibleActions.indexOf(action), "data-testid": testids.menuItem + "_" + key }) + ); + }) + } + + + + } +} diff --git a/src/components/ContextMenu/IAction.ts b/src/components/ContextMenu/IAction.ts new file mode 100644 index 00000000..55bf4341 --- /dev/null +++ b/src/components/ContextMenu/IAction.ts @@ -0,0 +1,58 @@ +import React from "react" +import { IconProps, SemanticShorthandItem } from "semantic-ui-react" +import { Point } from "./ContextMenu" + +// TODO RM34271 let's get rid of IActionParamForRun. It overcomplicates the inheritance. We'll have here closeContextMenu() that won't do anything. +// export interface IActionParam { +// selection: S[] +export interface IActionParam { + selection: any[] +} + +export interface IActionParamForRun extends IActionParam { + closeContextMenu: () => void, + + /** + * By default the context menu closes immediately after the action is run + * If the user wants to avoid the closing of the menu after action runs he needs to set this property to true + * and maybe explicitly call closeContextMenu() when needed + */ + dontCloseContextMenuAfterRunAutomatically?: boolean, + + /** + * It contains the mouse coordinates, obtained from onClick event of an action + */ + eventPoint?: Point +} + +// TODO RM34271 CS: for the moment it's not clear why we need this. It's not used by the lib. And currently, the task of opening +// the context menu belongs to the user. This interface, judging by its name, seems to be needed for the process of opening the CM +/** + * We may add in the future further customization possibilities. E.g. a `render()` function, etc. + */ +export interface IOnContextMenuShowParam { + actionParam: IActionParam +} + +/** + * This is a descriptor passed by the user to define an action entry in the context menu. + * Can have a `run` function that will be called when user will clicks the corresponding menu entry. + * It will receive a parameter containing things like: current selection, a close menu function to be run after clicking the action. + */ +// TODO RM34271 +// export interface IAction { +export interface IAction { + /** + * Should return true of false whether or not the action is visible for the selected items received as parameter + */ + isVisible?: (param: IActionParam) => boolean, + isDisabled?: (param: IActionParam) => boolean, + icon?: SemanticShorthandItem, + label?: string | ((param: IActionParam) => string), + key?: string | ((param: IActionParam) => string), + /** + * Function that will be called when user will click this menu entry. Will receives as parameter the current selected items + */ + run?: (param: IActionParamForRun) => void, + renderInMenu?: (param: IActionParamForRun) => React.ReactElement +} diff --git a/src/components/HighlightedInterval.js b/src/components/HighlightedInterval.js new file mode 100644 index 00000000..8de94cae --- /dev/null +++ b/src/components/HighlightedInterval.js @@ -0,0 +1,136 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {convertDateToMoment} from '../utils/timeUtils'; +import {createTestids} from '@famiprog-foundation/tests-are-demo'; + +const testIds = createTestids('HighlightedInterval', { + interval: '' +}); + +export const highlightedIntervalTestIds = testIds; + +/** + * @extends React.Component + */ +export class HighlightedInterval extends React.Component { + static propTypes = { + /** + * Start of the highlighted interval, as date (numeric/millis or moment object, cf. `Timeline.props.useMoment`). + * + * @type { object | number } + */ + start: PropTypes.oneOfType([PropTypes.object, PropTypes.number]).isRequired, + + /** + * End of the highlighted interval, as date (numeric/millis or moment object, cf. `Timeline.props.useMoment`). + * + * @type { object | number} + */ + end: PropTypes.oneOfType([PropTypes.object, PropTypes.number]).isRequired, + + /** + * Class name used to render the interval. + * + * @type { string } + */ + className: PropTypes.string, + + /** + * Style used to render the interval. + * + * @type { object } + */ + style: PropTypes.object, + + /** + * Internal (passed by parent). The height of the highlighted interval. + * + * @type { number } + */ + height: PropTypes.number, + + /** + * Internal (passed by parent). `HighlightedInterval` uses absolute positioning, thus it needs the `top` property + * to set the top edge if the element. + * + * @type { number } + */ + top: PropTypes.number, + + /** + * Internal (passed by parent). `HighlightedInterval` uses this to set data-testid of the underlying element + * + * @type { number } + */ + id: PropTypes.number, + + /** + * Internal (passed by parent). This function allows the conversion of `start`/`end` (time) properties to pixels. + * + * @type { Function } + */ + calculateHorizontalPosition: PropTypes.func.isRequired, + + /** + * Internal (passed by parent). If true timeline will try to minimize re-renders (e.g: the displayed timeline interval changes). + * + * @type { boolean } + */ + shouldUpdate: PropTypes.bool + }; + + static defaultProps = { + className: '', + style: {}, + height: undefined, + top: undefined, + id: undefined, + calculateHorizontalPosition: () => {}, + shouldUpdate: false + }; + + shouldComponentUpdate(nextProps) { + if ( + nextProps.shouldUpdate || + this.props.height !== nextProps.height || + this.props.top !== nextProps.top || + !convertDateToMoment(this.props.start).isSame(convertDateToMoment(nextProps.start).valueOf()) || + !convertDateToMoment(this.props.end).isSame(convertDateToMoment(nextProps.end)) + ) { + return true; + } + return false; + } + + /** + * @returns { object } style + */ + getStyle() { + const {left, width} = this.props.calculateHorizontalPosition(this.props.start, this.props.end); + return { + ...this.props.style, + left, + width, + top: this.props.top, + height: this.props.height, + display: left != undefined && width ? 'block' : 'none' + }; + } + + /** + * @returns { string } className + */ + getClassName() { + return `rct9k-highlighted-interval ${this.props.className}`; + } + + render() { + return ( +
+ ); + } +} diff --git a/src/components/ItemRenderer.js b/src/components/ItemRenderer.js new file mode 100644 index 00000000..ff8f2711 --- /dev/null +++ b/src/components/ItemRenderer.js @@ -0,0 +1,235 @@ +import Color from 'color'; +import PropTypes from 'prop-types'; +import React from 'react'; +import {Item} from '../utils/itemUtils'; + +const ITEM_RENDERER_CLS = 'rct9k-item-renderer'; +const ITEM_RENDERER_GLOW_CLS = 'rct9k-item-glow'; +const WHITE_COLOR = Color('white'); +/** + * Item (segment) renderer. All the properties of an item are copied as properties of this component. Hence the component + * doesn't use the property `item`. + * + * All the properties have corresponding getter methods. We "OOP-ize" them, for the case where a subclass wants to "override" a property. + * Without this pattern, such an override is not doable in React. + * @extends React.Component + */ +export default class ItemRenderer extends React.Component { + static propTypes = { + /** + * It's passed by the parent. Though not used by this component. It exists because maybe subclasses want to use it. + * @type { Item } + */ + item: PropTypes.object, + + /** + * The title (label) of the segment (item). + * @type { string } + */ + title: PropTypes.string, + + /** + * Tooltip displayed on mouse over the segment (item). + * @type { string } + */ + tooltip: PropTypes.string, + + /** + * The height of the segment (item). + * + * This property is received from the parent and its based on `itemHeight` from `Timeline`. The parent adds a padding + * (@see rct9k-items-inner class) which must be subtracted from `itemHeight` resulting in `height`. + * + * NOTE: If you override the getter, the maximum `height` can be `itemHeight` minus the padding. + * @type { string | number } + */ + height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + + /** + * Used to show a glow effect around the segment (item) when the mouse is moved over the segment (item). + * @type { boolean } + */ + glowOnHover: PropTypes.bool, + + /** + * The renderer uses a **linear gradient** (top to bottom) as a background. The gradient is configured + * using two colors: a base color (`color`) and the base color lightened by a percentage (`gradientBrightness`). + * @type { string } + */ + color: PropTypes.string, + + /** + * A number between 0 and 1; it represents the percentage by which `color` is lightened to obtain the second color used in the gradient. + * @type { number } + */ + gradientBrightness: PropTypes.number, + + /** + * A number between 0 and 100 (percentage from the height of the item) and it represents the point where the first color stops in the gradient. + * @type { number } + */ + gradientStop: PropTypes.number, + + /** + * Default order of the colors in the gradient: lighter color, base color. + * If `true`, the order of the colors will be reversed. + * @type { boolean } + */ + gradientReverseDirection: PropTypes.bool, + + /** + * The style of the segment used to render the segment (item). + * @type { object } + */ + style: PropTypes.object, + + /** + * Class name used to render the segment (item). + * @type { string } + */ + className: PropTypes.string + }; + + static defaultProps = { + color: '#3791D4', + glowOnHover: true, + gradientBrightness: 0.65, + gradientStop: 40, + gradientReverseDirection: false, + title: undefined, + tooltip: undefined, + className: undefined, + style: {}, + item: {} + }; + + /** + * Getter for the corresponding prop, to allow override by subclass. + * @returns { string | JSX.Element } + */ + getTitle() { + return this.props.title; + } + + /** + * Getter for the corresponding prop, to allow override by subclass. + * @returns { string } + */ + getTooltip() { + return this.props.tooltip; + } + + /** + * Getter for the corresponding prop, to allow override by subclass. + * @returns { string | number } + */ + getHeight() { + return this.props.height; + } + + /** + * Getter for the corresponding prop, to allow override by subclass. + * @returns { string } + */ + getColor() { + return this.props.color; + } + + /** + * Getter for the corresponding prop, to allow override by subclass. + * @returns { number } + */ + getGradientBrightness() { + return this.props.gradientBrightness; + } + + /** + * Getter for the corresponding prop, to allow override by subclass. + * @returns { number } + */ + getGradientStop() { + return this.props.gradientStop; + } + + /** + * Getter for the corresponding prop, to allow override by subclass. + * @returns { boolean } + */ + getGradientReverseDirection() { + return this.props.gradientReverseDirection; + } + + /** + * Returns the color of the text. This method returns 'white' when the background is darker, + * otherwise returns black. + * @returns {string} + */ + getTextColor() { + return Color(this.getColor()).isLight() ? 'black' : 'white'; + } + + /** + * Create a linear gradient using the base color (calls getColor()) and a color obtained mixing + * the white whit that color using getGradientBrightness(). The default order of the colors is + * [brighter gradient color, gradient color]; this order can be reversed if getGradientReverseDirection() is true. + * + * By default, the background of an item uses a linear gradient, this method should be overriden if this behaviour is not wanted. + * @returns {string} linear gradient + */ + getBackgroundGradient() { + let colors = [ + Color(this.getColor()) + .mix(WHITE_COLOR, this.getGradientBrightness()) + .hex(), + this.getColor() + ]; + if (this.getGradientReverseDirection()) { + colors.reverse(); + } + + return 'linear-gradient(' + colors[0] + ' ' + this.getGradientStop() + '%, ' + colors[1] + ')'; + } + + /** + * Returns the style of the item. + * @returns { object } + */ + getStyle() { + var style = { + ...this.props.style, + color: this.getTextColor(), + height: this.getHeight(), + background: this.getBackgroundGradient(), + /** + * This was added as a workarround for: a blue line that appeared on top of the segments on Firefox: + * https://redmine.xops-online.com/issues/31861?issue_count=43&issue_position=1&next_issue_id=31842 + */ + backgroundRepeat: 'no-repeat' + }; + return style; + } + + /** + * Returns a css class used to apply glow on item hover. + * @returns { string } + */ + getGlowOnHoverClassName() { + return this.props.glowOnHover ? ITEM_RENDERER_GLOW_CLS : ''; + } + + /** + * Returns the css classes applied on the item. + * @returns { string } + */ + getClassName() { + return ITEM_RENDERER_CLS + ' ' + this.props.className + ' ' + this.getGlowOnHoverClassName(); + } + + render() { + return ( + + {this.getTitle()} + + ); + } +} diff --git a/src/components/ItemRenderer.test.js b/src/components/ItemRenderer.test.js new file mode 100644 index 00000000..70babb12 --- /dev/null +++ b/src/components/ItemRenderer.test.js @@ -0,0 +1,14 @@ +'use strict'; +import React from 'react'; +import {shallow} from 'enzyme'; +import {expect} from 'chai'; + +import ItemRenderer from './ItemRenderer'; + +describe('Item renderer', () => { + it('should render the item', () => { + const item = {title: 'my_test'}; + const component = shallow(); + expect(component.text()).to.contain('my_test'); + }); +}); diff --git a/src/components/Marker.js b/src/components/Marker.js new file mode 100644 index 00000000..e8fbddf9 --- /dev/null +++ b/src/components/Marker.js @@ -0,0 +1,108 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {convertDateToMoment} from '../utils/timeUtils'; + +/** + * A `Marker` is a component draws a vertical line. + * + * @extends React.Component + */ +export class Marker extends React.Component { + static propTypes = { + /** + * The position of the marker, as date (numeric/millis or moment object, cf. `Timeline.props.useMoment`). + * + * @type { object | number } + */ + date: PropTypes.oneOfType([PropTypes.object, PropTypes.number]).isRequired, + + /** + * Class name used to render the marker. + * + * @type { string } + */ + className: PropTypes.string, + + /** + * Style used to render the marker. + * + * @type { object } + */ + style: PropTypes.object, + + /** + * Internal (passed by parent). The height of the marker. + * + * @type { number } + */ + height: PropTypes.number, + + /** + * Internal (passed by parent). `Marker` uses absolute positioning, thus it needs the `top` property + * to set the top edge if the element. + * + * @type { number } + */ + top: PropTypes.number, + + /** + * Internal (passed by parent). This function allows the conversion of `date` (time) property to pixels. + * + * @type { Function } + */ + calculateHorizontalPosition: PropTypes.func.isRequired, + + /** + * Internal (passed by parent). If true timeline will try to minimize re-renders (e.g: the displayed timeline interval changes). + * + * @type { boolean } + */ + shouldUpdate: PropTypes.bool + }; + + static defaultProps = { + className: '', + style: undefined, + height: undefined, + top: undefined, + calculateHorizontalPosition: () => {}, + shouldUpdate: false + }; + + shouldComponentUpdate(nextProps) { + if ( + nextProps.shouldUpdate || + this.props.height !== nextProps.height || + this.props.top !== nextProps.top || + !convertDateToMoment(this.props.date).isSame(convertDateToMoment(nextProps.date).valueOf()) + ) { + return true; + } + return false; + } + + /** + * @returns { object } style + */ + getStyle() { + const {left} = this.props.calculateHorizontalPosition(this.props.date); + return { + ...this.props.style, + top: this.props.top, + height: this.props.height, + left, + display: left ? 'block' : 'none' + }; + } + + /** + * @returns { string } className + */ + getClassName() { + return `rct9k-marker ${this.props.className}`; + } + + render() { + return
; + } +} diff --git a/src/components/Scrollbar.tsx b/src/components/Scrollbar.tsx new file mode 100644 index 00000000..d41d9101 --- /dev/null +++ b/src/components/Scrollbar.tsx @@ -0,0 +1,228 @@ +import React from "react"; +import Measure from 'react-measure'; + +export interface ScrollbarProperties { + /** + * A number which represents the maximum scroll position + */ + minScrollPosition: number; + + /** + * A number which represents the minimum scroll position + */ + maxScrollPosition: number; + + /** + * The number of lines equivalent to one page. + */ + pageSize: number; + + /** + * The initial position of the scroll thumb + */ + scrollPosition?: number; + + /** + * Can be both `Direction.HORIZONTAL`(the default value) or `Direction.VERTICAL` + */ + direction?: Direction; + + /** + * By default Semantic ui hides the increase/decrease arrow buttons of the scrollbars on Webkit based browsers. So it default to false. + * This should be set to true if the scrollbar needs to display the arrow buttons. + */ + hasArrows?: boolean; + + /** + * This handler is called when the scrollbar is scrolled. + * It receives as parameter the current scrollPosition + * This handler can be used for example to synchronize the scrollbar position with a virtual scroll of another component + * + * @param scrollPosition + * @returns + */ + onScroll?: (scrollPosition: number) => void; + + /** + * If the configuration of the scrollbar doesn't require scrolling (i.e. the min-max interval is smaller than the pageSize) + * the Scrollbar component doesn't display nothing. + * + * This handler can be used to detect when the scrollbar is not required to be displayed + * + * @param isScrollbarVisible + * @returns + */ + onVisibilityChange?: (isScrollbarVisible: boolean) => void; +} + +export enum Direction { + HORIZONTAL, + VERTICAL +} + +export const SCROLLBAR_SIZE = 10; +const ROUND_FACTOR = 4; + +export class Scrollbar extends React.Component { + + static defaultProps = { + scrollPosition: 0, + direction: Direction.HORIZONTAL, + hasArrows: false + } + + _outterDiv: HTMLDivElement; + + constructor(props) { + super(props); + this.state = { + scrollbarSize: 0 + }; + } + + /** + * Designed to be call by the parent component + * (for example when parent component whats to implement scroll by touching the scrollable container on the mobile devices) + * + * @param delta + */ + scrollwithDelta(delta: number) { + const unit_per_px = this.props.pageSize / this.state.scrollbarSize; + const pixels_per_unit = this.state.scrollbarSize / this.props.pageSize; + const scrollPositionInPixels = this.props.direction == Direction.HORIZONTAL ? this._outterDiv.scrollLeft : this._outterDiv.scrollTop; + const scrollPosition = this.props.minScrollPosition + unit_per_px * scrollPositionInPixels; + let newScrollPosition = scrollPosition + delta; + if (newScrollPosition < this.props.minScrollPosition) { + newScrollPosition = this.props.minScrollPosition; + } else if (newScrollPosition > this.props.maxScrollPosition) { + newScrollPosition = this.props.maxScrollPosition; + } + + this.setScrollPositionInPx((newScrollPosition - this.props.minScrollPosition) * pixels_per_unit); + } + + componentDidMount(): void { + if (this.props.onVisibilityChange) { + this.props.onVisibilityChange(this.isScrollbarNeeded(this.props)); + } + } + + componentWillReceiveProps(nextProps: Readonly): void { + if (nextProps.onVisibilityChange && this.isScrollbarNeeded(nextProps) != this.isScrollbarNeeded(this.props)) { + nextProps.onVisibilityChange(this.isScrollbarNeeded(nextProps)); + } + + if (nextProps.minScrollPosition != this.props.minScrollPosition || + nextProps.maxScrollPosition != this.props.maxScrollPosition || + nextProps.pageSize != this.props.pageSize || + nextProps.scrollPosition != this.props.scrollPosition) { + this.setScrollPosition(nextProps); + } + } + + componentDidUpdate(prevProps: Readonly, prevState: Readonly<{ scrollbarSize: number; }>, snapshot?: any): void { + if (this.state.scrollbarSize != prevState.scrollbarSize) { + this.setScrollPosition(this.props); + } + } + + setScrollPosition(props: ScrollbarProperties) { + const pixels_per_unit = this.state.scrollbarSize / props.pageSize; + this.setScrollPositionInPx((props.scrollPosition - props.minScrollPosition) * pixels_per_unit); + } + + setScrollPositionInPx(scrollPositionInPixels) { + if (!this._outterDiv) { + return; + } + + // We need this check because else a small flicker appears on the scrollbar when scrolling + // a scrollbar that is "double binded" to a state variable in the parent component (e.g. in gantt) + // It is caused by a small precision lost when converting from pixels to client unit and then back again + const oldScrollPositionInPixels = this.props.direction == Direction.HORIZONTAL ? this._outterDiv.scrollLeft : this._outterDiv.scrollTop; + if (roundDoubleToDecimals(scrollPositionInPixels) == roundDoubleToDecimals(oldScrollPositionInPixels)) { + return; + } + + if (this.props.direction == Direction.HORIZONTAL) { + this._outterDiv.scrollLeft = scrollPositionInPixels; + } else { + this._outterDiv.scrollTop = scrollPositionInPixels; + } + } + + onScroll() { + const unit_per_px = this.props.pageSize / this.state.scrollbarSize; + const scrollPositionInPixels = this.props.direction == Direction.HORIZONTAL ? this._outterDiv.scrollLeft : this._outterDiv.scrollTop; + this.props.onScroll(this.props.minScrollPosition + unit_per_px * scrollPositionInPixels); + } + + getInnerDivSize(): number { + const pixels_per_unit = this.state.scrollbarSize / this.props.pageSize; + return (this.props.maxScrollPosition - this.props.minScrollPosition) * pixels_per_unit; + } + + isScrollbarNeeded(props: ScrollbarProperties): boolean { + return (props.maxScrollPosition - props.minScrollPosition) > props.pageSize; + } + + getOutterDivClassName() { + let className = (this.props.direction == Direction.HORIZONTAL ? "rct9k-horizontal-scrollbar-outter" : "rct9k-vertical-scrollbar-outter"); + return className + (this.props.hasArrows ? " rct9k-scrollbar-with-arrows" : ""); + } + + shouldComponentUpdate(nextProps: Readonly, nextState: Readonly<{ scrollbarSize: number }>) { + const { props, state } = this; + if (nextProps.minScrollPosition !== props.minScrollPosition + || nextProps.maxScrollPosition !== props.maxScrollPosition + || nextProps.pageSize !== props.pageSize + || nextProps.direction !== props.direction + || nextProps.hasArrows !== props.hasArrows) { + return true; + } + if (nextState.scrollbarSize !== state.scrollbarSize) { + return true; + } + return false; + } + + render(): React.ReactNode { + return { + const newSize = contentRect.bounds ? (this.props.direction == Direction.HORIZONTAL ? contentRect.bounds.width : contentRect.bounds.height) : 0; + if (newSize != this.state.scrollbarSize) { + this.setState({ scrollbarSize: newSize }); + } + }}> + {({ measureRef }) => { + return ( + this.isScrollbarNeeded(this.props) ? +
{ + measureRef(node); + this._outterDiv = node; + } + } + onScroll={() => this.onScroll()}> +
+
+
+ : <> + ); + }} +
+ } +} + +const roundDoubleToDecimals = (value: number) => { + if (value == 0) { + return value; + } + let roundFactor = Math.pow(10, ROUND_FACTOR); + return Math.round(value * roundFactor) / roundFactor; +} \ No newline at end of file diff --git a/src/components/body.js b/src/components/body.js index 1527adcb..78d2b51e 100644 --- a/src/components/body.js +++ b/src/components/body.js @@ -6,7 +6,11 @@ import React, {Component} from 'react'; import PropTypes from 'prop-types'; import {Grid} from 'react-virtualized'; +import {timelineTestids} from '../timeline'; +/** + * @extends Component + */ class TimelineBody extends Component { componentDidMount() { this.forceUpdate(); @@ -23,8 +27,8 @@ class TimelineBody extends Component { // prettier-ignore const shallowChange = props.height !== nextProps.height - || props.width !== nextProps.width - || props.rowCount !== nextProps.rowCount; + || props.width !== nextProps.width + || props.rowCount !== nextProps.rowCount; if (props.forceRedrawFunc) { return shallowChange || props.forceRedrawFunc(props, nextProps); @@ -33,11 +37,12 @@ class TimelineBody extends Component { return shallowChange; } render() { - const {width, columnWidth, height, rowHeight, rowCount, columnCount} = this.props; + const {width, columnWidth, height, rowHeight, rowCount, columnCount, onScroll, componentId} = this.props; const {grid_ref_callback, cellRenderer} = this.props; return ( ); } } TimelineBody.propTypes = { + /** + * The total width of the body; mandatory field. + * @type { number } + */ width: PropTypes.number.isRequired, + + /** + * Function that returns the width of each column, mandatory field. + * @type { Function } + */ columnWidth: PropTypes.func.isRequired, + + /** + * The total number of columns, including the timeline (gantt). + * @type { number } + */ columnCount: PropTypes.number, + + /** + * The total height of the body (without timebar), mandatory field. + * @type { number } + */ height: PropTypes.number.isRequired, + + /** + * Function that returns the height for each row, mandatory field. + * @type { Function } + */ rowHeight: PropTypes.func.isRequired, + + /** + * Number of rows in timeline, mandatory field. + * @type { number } + */ rowCount: PropTypes.number.isRequired, + + /** + * @type { Function } + */ grid_ref_callback: PropTypes.func.isRequired, + + /** + * Renderer for each cell of the grid. + * @type { Function } + */ cellRenderer: PropTypes.func.isRequired, + + /** + * As e.g. @see Timeline.props.shallowUpdateCheck + * @type { boolean } + */ shallowUpdateCheck: PropTypes.bool, - forceRedrawFunc: PropTypes.func + + /** + * As e.g. @see Timeline.props.forceRedrawFunc + * @type { Function } + */ + forceRedrawFunc: PropTypes.func, + + /** + * A unique key to identify the component. Only needed when 2 grids are mounted. + * @type { string } + */ + componentId: PropTypes.string }; TimelineBody.defaultProps = { - columnCount: 2, + columnCount: 1, shallowUpdateCheck: false, forceRedrawFunc: null }; diff --git a/src/components/marker.js b/src/components/marker.js deleted file mode 100644 index 64342385..00000000 --- a/src/components/marker.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -const Marker = props => { - const {height, left, top} = props; - return
; -}; - -Marker.propTypes = { - height: PropTypes.number.isRequired, - left: PropTypes.number.isRequired, - top: PropTypes.number.isRequired -}; - -export default Marker; diff --git a/src/components/renderers.js b/src/components/renderers.js deleted file mode 100644 index 72993028..00000000 --- a/src/components/renderers.js +++ /dev/null @@ -1,61 +0,0 @@ -import React from 'react'; - -/** - * Default item renderer class - * @param {object} props - Component props - * @param {object} props.item - The item to be rendered - * @param {string} props.item.title - The item's title - * @param {?...object} props.rest - Any other arguments for the span tag - */ -export const DefaultItemRenderer = props => { - const {item, ...rest} = props; - - return ( - - {item.title} - - ); -}; - -/** - * Default group (row) renderer class - * @param {object} props - Component props - * @param {string} props.labelProperty - The key of the data from group that should be rendered - * @param {object} props.group - The group to be rendered - * @param {string} props.group.id - The group's id - */ -export class DefaultGroupRenderer extends React.Component { - /** - * Returns the label of the cell. - */ - getLabel() { - return this.props.group[this.props.labelProperty]; - } - - render() { - return ( - - {this.getLabel()} - - ); - } -} - -/** - * Default renderer for column header. - * @param {object} props - Component props - * @param {object} props.column - The properties of the column - * @param {string} props.column.headerLabel - The header's label - */ -export class DefaultColumnHeaderRenderer extends React.Component { - /** - * Returns the label of the header. - */ - getLabel() { - return this.props.column ? this.props.column.headerLabel : ''; - } - - render() { - return {this.getLabel()}; - } -} diff --git a/src/components/renderers.test.js b/src/components/renderers.test.js deleted file mode 100644 index 19cca72b..00000000 --- a/src/components/renderers.test.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; -import React from 'react'; -import {shallow, mount} from 'enzyme'; -import {expect} from 'chai'; - -import setup from 'setupTests'; -import {DefaultItemRenderer, DefaultGroupRenderer} from './renderers'; - -describe('Item renderer', () => { - it('should render the item', () => { - const item = {title: 'my_test'}; - const component = shallow(); - expect(component.text()).to.contain('my_test'); - }); -}); -describe('Group renderer', () => { - it('should render the group w/o label property', () => { - const group = {title: 'my_test'}; - const component = shallow(); - expect(component.text()).to.equals(''); - }); - it('should render the group w/ label property', () => { - const group = {title: 'my_test'}; - const component = shallow(); - expect(component.text()).to.equals('my_test'); - }); -}); diff --git a/src/components/selector.js b/src/components/selector.js index 8248a0e9..cd1e1e16 100644 --- a/src/components/selector.js +++ b/src/components/selector.js @@ -1,5 +1,6 @@ 'use strict'; import React from 'react'; +import {timelineTestids} from '../timeline'; /** * Component to show a selection box (like on windows desktop) @@ -21,8 +22,8 @@ export default class SelectBox extends React.Component { start(x, y) { this.startX = x; this.startY = y; - this.curX = 0; - this.curY = 0; + this.curX = x; + this.curY = y; } /** @@ -61,6 +62,14 @@ export default class SelectBox extends React.Component { return toReturn; } + /** + * Check if the selection box is created. + * @return {boolean} + */ + isStart() { + return this.startX != 0 && this.startY != 0 && this.curX != 0 && this.curY != 0; + } + /** * @ignore */ @@ -71,6 +80,12 @@ export default class SelectBox extends React.Component { const width = Math.abs(startX - curX); const height = Math.abs(startY - curY); let style = {left, top, width, height}; - return
; + return ( +
+ ); } } diff --git a/src/components/timebar.js b/src/components/timebar.js index 51e3d925..364f48c9 100644 --- a/src/components/timebar.js +++ b/src/components/timebar.js @@ -5,26 +5,36 @@ import PropTypes from 'prop-types'; import _ from 'lodash'; import moment from 'moment'; import {intToPix} from '../utils/commonUtils'; -import {DefaultColumnHeaderRenderer} from './renderers'; import {timebarFormat as defaultTimebarFormat} from '../consts/timebarConsts'; +import {createTestids} from '@famiprog-foundation/tests-are-demo'; + +export const timebarTestIds = createTestids('Timebar', { + timebarInnerBottom: '', + timebarItem: '' +}); +const testIds = timebarTestIds; +import {timelineTestids as testids} from '../timeline'; /** - * Timebar component - displays the current time on top of the timeline + * Timebar component - displays the current time on top of the timeline. + * @extends React.Component */ export default class Timebar extends React.Component { constructor(props) { super(props); - this.state = {}; + this.state = {topBarComponent: [], bottomBarComponent: [], resolution: {}}; this.guessResolution = this.guessResolution.bind(this); this.renderBar = this.renderBar.bind(this); - this.renderTopBar = this.renderTopBar.bind(this); - this.renderBottomBar = this.renderBottomBar.bind(this); } componentWillMount() { this.guessResolution(); + const bottomBarComponent = this.getBottomBar(); + const topBarComponent = this.getTopBar(); + this.setState({topBarComponent, bottomBarComponent}); } + /** * On new props we check if a resolution is given, and if not we guess one * @param {Object} nextProps Props coming in @@ -37,6 +47,22 @@ export default class Timebar extends React.Component { } } + componentDidUpdate(prevProps) { + if ( + !this.props.start.isSame(prevProps.start) || + !this.props.end.isSame(prevProps.end) || + this.props.timeFormats !== prevProps.timeFormats || + this.props.top_resolution !== prevProps.top_resolution || + this.props.bottom_resolution !== prevProps.bottom_resolution || + this.props.width !== prevProps.width || + this.props.leftOffset !== prevProps.leftOffset + ) { + const bottomBarComponent = this.getBottomBar(); + const topBarComponent = this.getTopBar(); + this.setState({topBarComponent, bottomBarComponent}); + } + } + /** * Attempts to guess the resolution of the top and bottom halves of the timebar based on the viewable date range. * Sets resolution to state. @@ -67,25 +93,30 @@ export default class Timebar extends React.Component { } /** - * Renderer for top bar. + * Calculates the top bar. * @returns {Object} JSX for top menu bar - based of time format & resolution */ - renderTopBar() { + getTopBar() { let res = this.state.resolution.top; return this.renderBar({format: this.props.timeFormats.majorLabels[res], type: res}); } + /** - * Renderer for bottom bar. + * Calculates the bottom bar. * @returns {Object} JSX for bottom menu bar - based of time format & resolution */ - renderBottomBar() { + getBottomBar() { let res = this.state.resolution.bottom; - return this.renderBar({format: this.props.timeFormats.minorLabels[res], type: res}); + const bottomBar = this.renderBar({format: this.props.timeFormats.minorLabels[res], type: res}); + this.props.setVerticalGridLines(bottomBar); + return bottomBar; } + /** * Gets the number of pixels per segment of the timebar section (using the resolution) * @param {moment} date The date being rendered. This is used to figure out how many days are in the month * @param {string} resolutionType Timebar section resolution [Year; Month...] + * @param {number} offset * @returns {number} The number of pixels per segment */ getPixelIncrement(date, resolutionType, offset = 0) { @@ -126,6 +157,7 @@ export default class Timebar extends React.Component { } return Math.min(inc, width); } + /** * Renders an entire segment of the timebar (top or bottom) * @param {string} resolution The resolution to render at [Year; Month...] @@ -197,37 +229,13 @@ export default class Timebar extends React.Component { return timeIncrements; } - /** - * It renders the header of a column in multi columns mode. Default renderer: props.groupTitleRenderer; - * which may be overriden per column: column.headerRender (react element or function). - * @param {object} column - */ - renderColumnHeader(column, index) { - const columnWidth = column.width ? column.width : this.props.groupOffset; - return ( -
- {column.headerRenderer ? ( - React.isValidElement(column.headerRenderer) ? ( - column.headerRenderer - ) : ( - - ) - ) : ( - - )} -
- ); - } - /** * Renders the timebar * @returns {Object} Timebar component */ render() { - const {cursorTime, tableColumns} = this.props; - const topBarComponent = this.renderTopBar(); - const bottomBarComponent = this.renderBottomBar(); - const GroupTitleRenderer = this.props.groupTitleRenderer; + const {cursorTime} = this.props; + const {topBarComponent, bottomBarComponent} = this.state; // Only show the cursor on 1 of the top bar segments // Pick the segment that has the biggest size @@ -237,19 +245,10 @@ export default class Timebar extends React.Component { else if (topBarComponent.length > 0) topBarCursorKey = topBarComponent[0].key; return ( -
- {/* Single column mode */} - {(!tableColumns || tableColumns.length == 0) && ( -
- -
- )} - {/* Multiple columns mode */} - {tableColumns && - tableColumns.length > 0 && - tableColumns.map((column, index) => { - return this.renderColumnHeader(column, index); - })} +
{_.map(topBarComponent, i => { @@ -266,12 +265,18 @@ export default class Timebar extends React.Component { ); })}
-
- {_.map(bottomBarComponent, i => { +
+ {_.map(bottomBarComponent, (i, index) => { let className = 'rct9k-timebar-item'; if (i.isSelected) className += ' rct9k-timebar-item-selected'; return ( - + {i.label} ); @@ -284,22 +289,73 @@ export default class Timebar extends React.Component { } Timebar.propTypes = { + /** + * @type { any } + */ cursorTime: PropTypes.any, - groupTitleRenderer: PropTypes.func, - start: PropTypes.object.isRequired, //moment - end: PropTypes.object.isRequired, //moment + + /** + * Start of the displayed interval, as moment object. + * @type { object } + */ + start: PropTypes.object.isRequired, + + /** + * End of the displayed interval, as moment object. + * @type { object } + */ + end: PropTypes.object.isRequired, + + /** + * Total width of the timeline (gantt), mandatory field. + * @type { number } + */ width: PropTypes.number.isRequired, + + /** + * The left side offset, this offset is subtracted from the total width of the timeline + * to obtain the width of the timebar. + * @type { number } + */ leftOffset: PropTypes.number, + + /** + * The time unit for the top timebar. + * @type { string } + */ top_resolution: PropTypes.string, + + /** + * The time unit for the bottom timebar. + * @type { string } + */ bottom_resolution: PropTypes.string, + + /** + * @type { Array. } + */ selectedRanges: PropTypes.arrayOf(PropTypes.object), // [start: moment ,end: moment (end)] + + /** + * Formats for each time unit (@see defaultTimebarFormat) + * @type { object } + */ timeFormats: PropTypes.object, - tableColumns: PropTypes.arrayOf(PropTypes.object) + + /** + * It's passed by parent. The `vertical grid` uses the same intervals as the bottom timebar, it is redundant to calculated them again. + * This callback passes these intervals to parent. + * @type { Function } + */ + setVerticalGridLines: PropTypes.func }; + Timebar.defaultProps = { selectedRanges: [], - groupTitleRenderer: DefaultColumnHeaderRenderer, leftOffset: 0, timeFormats: defaultTimebarFormat, - tableColumns: [] + top_resolution: undefined, + bottom_resolution: undefined, + leftOffset: undefined, + cursorTime: undefined }; diff --git a/src/demo.html b/src/demo.html deleted file mode 100644 index ddd438fe..00000000 --- a/src/demo.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - React Timeline 9000 - - -
-
- - - diff --git a/src/demo/customRenderers.js b/src/demo/customRenderers.js deleted file mode 100644 index 2f14b86a..00000000 --- a/src/demo/customRenderers.js +++ /dev/null @@ -1,29 +0,0 @@ -import React, {Component} from 'react'; - -export function customItemRenderer(props) { - const {item, ...rest} = props; - const text = `${item.start.format('HH:mm')} - ${item.end.format('HH:mm')}`; - return {text} ; -} - -export function customGroupRenderer(props) { - const {group, ...rest} = props; - - return ( - - Custom {group.title} - - ); -} - -export class CustomCellRenderer extends React.Component { - render() { - return {this.props.group.description}; - } -} - -export class CustomColumnHeaderRenderer extends React.Component { - render() { - return Description; - } -} diff --git a/src/demo_index.js b/src/demo_index.js deleted file mode 100644 index b25e4cf9..00000000 --- a/src/demo_index.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -import React from 'react'; -import ReactDOM from 'react-dom'; - -import DemoTimeline from 'demo'; - -ReactDOM.render(, document.getElementById('root')); diff --git a/src/index.js b/src/index.js index a90752a8..22d9bc94 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,36 @@ +/** + * This file only exports again things already exported from another files. Was needed when using the gantt library in a typescript project. + * Because it can cause cyclic dependencies inside gantt project, do not import any component via index.js inside the gantt project, + * instead import directly from the base file + * (i.e. instead import Column from './index' use import Column from './types') + * + * Problem with cyclic dependencies: RM31442 + */ 'use strict'; -import Timeline from './timeline'; -export default Timeline; +export * from './timeline'; +export {default as Timeline} from './timeline'; +export * from './types'; + +// components +export {default as Timebar} from './components/timebar'; +export * from './components/timebar'; +export {default as TimelineBody} from './components/body'; +export {default as ItemRenderer} from './components/ItemRenderer'; +export {Marker} from './components/Marker'; +export {default as Selectbox} from './components/selector'; +export {BackgroundLayer} from './components/BackgroundLayer'; +export {HighlightedInterval} from './components/HighlightedInterval'; +export {Scrollbar, Direction} from './components/Scrollbar'; +export {ContextMenu} from './components/ContextMenu/ContextMenu'; + +// consts +export {timebarFormat} from './consts/timebarConsts'; + +// utils +export * from './utils/commonUtils'; +export * from './utils/itemUtils'; +export * from './utils/timeUtils'; + +//testids +export {contextMenuTestIds} from './components/ContextMenu/ContextMenu'; diff --git a/src/resources/horizontal-decrement-arrow.png b/src/resources/horizontal-decrement-arrow.png new file mode 100644 index 00000000..791c396d Binary files /dev/null and b/src/resources/horizontal-decrement-arrow.png differ diff --git a/src/resources/horizontal-increment-arrow.png b/src/resources/horizontal-increment-arrow.png new file mode 100644 index 00000000..22d86b39 Binary files /dev/null and b/src/resources/horizontal-increment-arrow.png differ diff --git a/src/resources/vertical-decrement-arrow.png b/src/resources/vertical-decrement-arrow.png new file mode 100644 index 00000000..df271b65 Binary files /dev/null and b/src/resources/vertical-decrement-arrow.png differ diff --git a/src/resources/vertical-increment-arrow.png b/src/resources/vertical-increment-arrow.png new file mode 100644 index 00000000..6d486266 Binary files /dev/null and b/src/resources/vertical-increment-arrow.png differ diff --git a/src/style.css b/src/style.css index 8ee54b23..9d1fa26d 100644 --- a/src/style.css +++ b/src/style.css @@ -1,3 +1,151 @@ +/** + * BackgroundLayer has `position: absolute`, but it is positioned relative to its closest positioned ancestor, if any; + * otherwise, it is positioned relative to the initial containing block. In this case, + * BackgroundLayer did not have any positioned ancestor and it was positioned relative to viewport. + * + * We want to position BackgroundLayer relative to the direct parent. In order to do this, we need to add `position` to the `parent-div`. + * An element with `position: relative` is positioned relative to its normal position in the document flow, but its position can be + * adjusted using the `top`, `bottom` etc. We will not adjust the `top`, `bottom` etc. of `parent-div`, we only want to set a position to it. + */ +.parent-div { + position: relative; +} + +.rct9k-background-layer-wrapper { + position: absolute; + top: 0px; + /* We need this 1px left in order for the background layer to perfectly overlap the ganttBody that has a 1px border left*/ + left: 1px; +} + +/** +* We need this {pointerEvents: "none"} because the background layer is in front of the TimelineBody +*/ +.rct9k-background-layer { + pointer-events: none; + position: relative; +} + +.rct9k-background-layer-highlight-weekends { + background: #fff7ee; + opacity: 1; +} + +.rct9k-background-layer-vertical-grid { + position: absolute; + overflow: hidden; + white-space: nowrap; +} + +.rct9k-background-layer-vertical-line:first-child { + border: 0 !important; +} + +.rct9k-background-layer-vertical-line { + height: 100%; + display: inline-block; + border-left: 1px solid; +} + +/** +* By default semantic ui vertical menu has a width of 15rem. That's why larger content were truncated +* in the context menu +*/ +.rct9k-context-menu { + width: unset !important; + min-width: 15rem; +} + +.rct9k-drag-to-create-popup-buttons-div { + text-align: center; +} + +.rct9k-drag-to-create-popup-buttons-div > button { + margin-top: 5px !important; +} + +.rct9k-drag-to-create-popup-hint-div { + font-style: italic; + font-size: small; +} + +.rct9k-highlighted-interval { + position: absolute; + background: #eeeeff; +} + +.rct9k-horizontal-scrollbar-outter { + overflow-x: scroll; + overflow-y: hidden; + width: 100%; +} + +.rct9k-horizontal-scrollbar-inner { + height: 1px; +} + +.rct9k-horizontal-scrollbar-outter.rct9k-scrollbar-with-arrows::-webkit-scrollbar-button:horizontal:decrement { + background: url(resources/horizontal-decrement-arrow.png), #acacac; + background-repeat: no-repeat, repeat-x; + background-position: 3px 2px, 0 0; +} + +.rct9k-horizontal-scrollbar-outter.rct9k-scrollbar-with-arrows::-webkit-scrollbar-button:horizontal:decrement:hover { + background: url(resources/horizontal-decrement-arrow.png), #919699; + background-repeat: no-repeat, repeat-x; + background-position: 3px 2px, 0 0; +} + +.rct9k-horizontal-scrollbar-outter.rct9k-scrollbar-with-arrows::-webkit-scrollbar-button:horizontal:increment { + background: url(resources/horizontal-increment-arrow.png), #acacac; + background-repeat: no-repeat, repeat-x; + background-position: 5px 2px, 0 0; +} + +.rct9k-horizontal-scrollbar-outter.rct9k-scrollbar-with-arrows::-webkit-scrollbar-button:horizontal:increment:hover { + background: url(resources/horizontal-increment-arrow.png), #919699; + background-repeat: no-repeat, repeat-x; + background-position: 5px 2px, 0 0; +} + +.rct9k-vertical-scrollbar-outter { + overflow-y: scroll; + overflow-x: hidden; + height: 100%; +} + +.rct9k-vertical-scrollbar-inner { + width: 1px; +} + +.rct9k-vertical-scrollbar-outter.rct9k-scrollbar-with-arrows::-webkit-scrollbar-button:vertical:decrement { + background: url(resources/vertical-decrement-arrow.png), #acacac; + background-repeat: no-repeat, repeat-x; + background-position: 2px 4px, 0 0; +} + +.rct9k-vertical-scrollbar-outter.rct9k-scrollbar-with-arrows::-webkit-scrollbar-button:vertical:decrement:hover { + background: url(resources/vertical-decrement-arrow.png), #919699; + background-repeat: no-repeat, repeat-x; + background-position: 2px 4px, 0 0; +} + +.rct9k-vertical-scrollbar-outter.rct9k-scrollbar-with-arrows::-webkit-scrollbar-button:vertical:increment { + background: url(resources/vertical-increment-arrow.png), #acacac; + background-repeat: no-repeat, repeat-x; + background-position: 2px 5px, 0 0; +} + +.rct9k-vertical-scrollbar-outter.rct9k-scrollbar-with-arrows::-webkit-scrollbar-button:vertical:increment:hover { + background: url(resources/vertical-increment-arrow.png), #919699; + background-repeat: no-repeat, repeat-x; + background-position: 2px 5px, 0 0; +} + +.rct9k-timebar-item:first-child { + border: 0 !important; +} + .rct9k-timeline-div { width: 100%; /* if the timeline is in a flex layout, we want it to adapt to the parent */ @@ -17,37 +165,138 @@ .rct9k-items-outer { white-space: nowrap; position: absolute; - display: inline-block; - overflow: hidden; + display: flex; + overflow: visible; z-index: 3; } + +/* Styles that draws the drag achors that appears on selecting an element */ +.rct9k-items-outer-selected:after { + right: -2.5px; + z-index: 1; +} + +.rct9k-items-outer-selected:before { + left: -2.5px; + z-index: 1; +} + +.rct9k-items-outer-selected:before, +.rct9k-items-outer-selected:after { + content: ''; + border: 1px solid white; + height: 6px; + width: 6px; + background-color: black; + top: 50%; + transform: translateY(-50%); + position: absolute; +} + +.rct9k-items-outer-selected .rct9k-items-inner { + filter: brightness(1.15); + box-shadow: 3px 3px 8px -3px black; +} + .rct9k-items-inner { - display: inline-block; - margin: 3px; + display: flex; padding: 3px; + /* this value change the inner item height, see rowItemsRenderer from itemUtils.js:68 */ width: 100%; + white-space: nowrap; + overflow: hidden; } + +.rct9k-marker { + /* + * in some case the marker is displayed under item, layers + * for show on the top of it we set this value to z-index. + * why 999? in semantic-ui have some elements with z-index = 1000 + * the elements what use a dimer https://github.com/Semantic-Org/Semantic-UI-CSS/blob/master/semantic.css#L30941 (e.g. Modal) + */ + z-index: 999; + position: absolute; + margin: 0; + background: #a9a9e6; + width: 2px; + border: 0; +} + .rct9k-marker-overlay { - z-index: 2; height: 475px; position: absolute; width: 2px; background: red; pointer-events: none; } + +.rct9k-background-layer-now-marker { + background: red; + width: 2px; +} + +.rct9k-item-renderer { + opacity: 0.8; + border: darkgrey solid 1px; + border-radius: 3px; +} + .rct9k-item-renderer-inner { pointer-events: none; + align-self: center; +} + +.rct9k-item-glow { + box-shadow: 0; + transition: opacity 0.2s ease-in-out, box-shadow 0.2s ease-in-out; } + +.rct9k-item-glow:hover { + box-shadow: 0 0 12px #2d618c; + opacity: 1 !important; +} + .rct9k-row { /* white-space: nowrap; */ box-sizing: border-box; - border: 1px solid black; - border-top: 0; - border-left: 2px solid black; + border: 1px solid #ccc !important; + border-top: 0 !important; + border-left: 0 !important; } -.rct9k-items-selected { - background-color: magenta; +.rct9k-row-even { + background-color: #f6f7f8; +} + +.rct9k-grid { + border-left: 1px solid #ccc; + border-bottom: 1px solid #ccc; + + /* This was added because we needed to have the highlighted intervals and markers behind the segments, + but in front of the rows (because they are opaque, being colored). + The only way to achive this via css is by having the z-index of the segments > z-index of the highlighted intervals and markers, + and the segments not being in a different stacking context than the highlighted intervals + (for understanding the "stacking context" concept see https://www.joshwcomeau.com/css/stacking-contexts/) + + As stated in the above article, "will-change" creates a stacking context for its children so + even if segments.z-index > highlightedIntervals.z-index, the segments were displayed behind the highlighted intervals + + !!! We need to pay attention for this to not cause any performance issue: + the "will-change: transform;" was set by the virtualized grid component to prevent a performance issue: https://github.com/bvaughn/react-virtualized/blob/e78651c3d844c6f639347d1fb796072783c175d2/CHANGELOG.md?plain=1#L1082 + But strange thing: from our tests this seems to improve the performance of the scroll. + + If we'll have problems in the future the solution to the initial problem will be to refactor the structure of our components (the dom) + so that the highlighted intervals and markers to be children of rct9k-grid (now they are siblings) + */ + will-change: unset !important; +} + +/** + * EM: RM27551 - in Firefox (on some computers), when we click on the body of the timeline, a blue outline is shown around the body. + * After some investigation, it seems that an outline is applied by the browser on `:focus-visible`. + */ +.rct9k-grid:focus-visible { + outline: none !important; } .ReactVirtualized__Grid { @@ -55,53 +304,80 @@ } .ReactVirtualized__Grid__innerScrollContainer:first-child { - border-top: 1px solid black; + border-top: 1px solid #ccc; } /* Timeline groups */ .rct9k-group { text-align: center; box-sizing: border-box; - border: 1px solid black; + border: 1px solid #ccc; border-top: 0; border-right: 0; background-color: white; z-index: 6; } +.rct9k-group { + border-right: 2px solid #ccc; +} + .rct9k-timebar { display: flex; } /* Timeline top timebar */ +.rct9k-timebar { + display: flex; +} + .rct9k-timebar-outer, .rct9k-timebar-group-title { height: 60px; background-color: white; - border: 1px solid black; + border: 1px solid #ccc; box-sizing: border-box; + display: flex; + flex-direction: column; } + .rct9k-timebar-outer { - border-left: none; + border-left: 1px solid #ccc; + background-image: linear-gradient(#fff, #efefef); } + .rct9k-timebar-inner { height: 30px; white-space: nowrap; overflow: hidden; } + .rct9k-timebar-item { text-align: center; display: inline-block; border-left: 1px solid; white-space: nowrap; box-sizing: border-box; + height: 100%; + padding: 5px; +} + +.rct9k-timebar-inner.rct9k-timebar-inner-bottom { + border-top: 1px solid #ccc; } + .rct9k-timebar-item-selected { background-color: lightblue; } .rct9k-timebar-group-title { - border-right: none; + border-right: 2px solid #ccc; +} + +.rct9k-timeline-div { + background-color: #fff; + font-size: 12px; + height: 100%; } /* Multi-select box */ @@ -114,6 +390,10 @@ z-index: 5; } +.rct9k-selector-outer-add { + background-color: #b0e09dab; +} + /* Row layer */ .rct9k-row-layer { pointer-events: none; @@ -124,11 +404,35 @@ #root { width: 100%; height: 100%; -} - -.demo { - height: 100%; display: flex; - gap: 5px; flex-direction: column; } + +.Resizer.vertical { + width: 4px !important; + border-left-width: 1px !important; + border-right-width: 1px !important; +} + +.rct9k-menu-div { + position: absolute; + right: 1px; + top: 1px; +} + +.rct9k-menu.ui.popup { + padding: 0 !important; + margin: 0 !important; +} + +.no-margin { + margin: 0 !important; +} + +.rct9k-timebar-inner.rct9k-timebar-inner-bottom { + border-top: 1px solid #ccc !important; +} + +.rct9k-timebar-item { + border-left-color: #ccc !important; +} diff --git a/src/timeline.js b/src/timeline.js index a0856c9f..f438918b 100644 --- a/src/timeline.js +++ b/src/timeline.js @@ -1,49 +1,117 @@ 'use strict'; -import React from 'react'; +import React, {Fragment} from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; -import {Grid, AutoSizer, defaultCellRangeRenderer} from 'react-virtualized'; +import Measure from 'react-measure'; -import moment from 'moment'; import interact from 'interactjs'; import _ from 'lodash'; +import {Button, Popup} from 'semantic-ui-react'; +import {Group, InteractOption, Item, RowLayer} from './index'; -import {pixToInt, intToPix, sumStyle} from './utils/commonUtils'; +import {TestsAreDemoCheat, createTestids} from '@famiprog-foundation/tests-are-demo'; +import {Marker} from './components/Marker'; +import TimelineBody from './components/body'; +import SelectBox from './components/selector'; +import Timebar from './components/timebar'; +import {intToPix, pixToInt} from './utils/commonUtils'; import { - rowItemsRenderer, - rowLayerRenderer, + adjustRowTopPositionToViewport, + getMaxOverlappingItems, getNearestRowNumber, getNearestRowObject, - getMaxOverlappingItems, + getRowObjectRowNumber, getTrueBottom, getVerticalMarginBorder, - getRowObjectRowNumber + rowItemsRenderer, + rowLayerRenderer } from './utils/itemUtils'; import { - timeSnap, - getTimeAtPixel, + convertDateToMoment, + convertMomentToDateType, + getDurationFromPixels, getPixelAtTime, getSnapPixelFromDelta, + getTimeAtPixel, pixelsPerMillisecond, - convertDateToMoment, - convertMomentToDateType + timeSnap } from './utils/timeUtils'; -import Timebar from './components/timebar'; -import SelectBox from './components/selector'; -import {DefaultGroupRenderer, DefaultItemRenderer} from './components/renderers'; -import TimelineBody from './components/body'; -import Marker from './components/marker'; // startsWith polyfill for IE11 support import 'core-js/fn/string/starts-with'; - -const SINGLE_COLUMN_LABEL_PROPERTY = 'title'; - +import SplitPane, {Size, SplitPaneProps} from 'react-split-pane'; +import 'fixed-data-table-2/dist/fixed-data-table.css'; +import ItemRenderer from './components/ItemRenderer'; +import {SelectionHolder} from './utils/SelectionHolder'; +import {IGanttAction} from './types'; +import {ContextMenu} from './components/ContextMenu/ContextMenu'; +import moment from 'moment'; +import {Direction, SCROLLBAR_SIZE, Scrollbar} from './components/Scrollbar'; + +const testids = createTestids('Timeline', { + menuButton: '', + dragToCreatePopup: '', + dragToCreatePopupCancelButton: '', + dragToCreatePopupLabel: '', + row: ``, + group: ``, + item: '', + selector: '', + table: '', + ganttBody: '', + splitPaneResizer: '', + fadeEffect: '', + timeBar: '' +}); +export const timelineTestids = testids; + +const EMPTY_GROUP_ID_PREFIX = 'empty_'; +// This was added by bogdan. From my understanding it reprezents the table vertical scrollbar width +// If we don't take in consideration this, a horizontal scrollbar appears +export const TABLE_OFFSET = 15; +export const DEFAULT_ITEM_HEIGHT = 30; +export const DEFAULT_ROW_CLASS = 'rct9k-row'; +export const DEFAULT_ROW_EVEN_CLASS = 'rct9k-row-even'; +/** + * Be default we do not use any special css for the odd rows because they are blank by default + * Added for the cases that user wants customize the color of the even rows also + **/ +export const DEFAULT_ROW_ODD_CLASS = ''; +export const DRAG_TO_CREATE_POPUP_CLOSE_TIME = 5000; +export const DRAG_TO_CREATE_POPUP_LABEL_2 = 'Popup will close in a few moments.'; + +const FADE_OPACITY_OFFSET = 0.1; +const FADE_TIMER_INTERVAR = 100; +export const ZOOM_PERCENT = 0.2; +export const ZOOM_IN = 1; +export const ZOOM_OUT = -1; +export const MIN_DISPLAY_TIME = 60000; +export const DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS = 1; +export const DEFAULT_ROW_TOP_BOTTOM_PADDING = 1; + +export const PARENT_ELEMENT = componentId => document.querySelector(`.rct9k-id-${componentId} .parent-div`); + +const TableWithStyle = ({table}) => { + const tableStyle = `.public_fixedDataTableCell_main { + background-color: inherit!important; + } + `; + + return ( +
+ + {React.cloneElement(table)} +
+ ); +}; + +export const DRAG_TO_CREATE_ACTION_LABEL = 'Drag to create'; +export const ZOOM_IN_ACTION_LABEL = 'Zoom in'; +export const ZOOM_OUT_ACTION_LABEL = 'Zoom out'; /** * Timeline class - * @reactProps {!number} items - this is prop1 - * @reactProps {string} prop2 - this is prop2 + * @extends React.Component */ export default class Timeline extends React.Component { /** @@ -56,34 +124,86 @@ export default class Timeline extends React.Component { }); static propTypes = { + /** + * The rows (aka groups) of the Timeline. + * + * `id` is mandatory, it should: be numeric + * + * `title` is used displayed by the default renderer. This is optional, i.e. you may use this and/or other fields, provided + * you have a custom renderer. + * @type { Array. } + */ + groups: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.number.isRequired, + title: PropTypes.string + }) + ).isRequired, + + /** + * The segments (aka items). An item is associated with a row. Hence `row` is mandatory, pointing to an `id` of a row (group). + * + * `key` is also needed and has the React standard meaning. + * + * `start` and `stop` are dates (numeric/millis or moment objects, cf. `useMoment`). + * + * All the props of an item are copied to the props of the item renderer. E.g. `. See its + * doc, to see what props are known/rendered by `ItemRenderer` (such as `title`, `color`, etc.). The item renderer can be + * customized using the `itemRenderer` prop. + * @type { Array. } + */ items: PropTypes.arrayOf( PropTypes.shape({ - key: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, + key: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, + row: PropTypes.number.isRequired, // start and end are not required because getStartFromItem() and getEndFromItem() functions // are being used and they can be overriden to use other fields - start: PropTypes.oneOfType([PropTypes.object, PropTypes.number]), - end: PropTypes.oneOfType([PropTypes.object, PropTypes.number]) + start: PropTypes.oneOfType([PropTypes.number, PropTypes.object]), + end: PropTypes.oneOfType([PropTypes.number, PropTypes.object]) }) ).isRequired, - groups: PropTypes.arrayOf(PropTypes.object).isRequired, - // Single column mode: the width of the column. - // Multiple columns mode: the default width of the columns, which may be overridden on a per column basis. - groupOffset: PropTypes.number.isRequired, - tableColumns: PropTypes.arrayOf( - PropTypes.shape({ - // The default renderer for a cell is props.groupRenderer that renders labelProperty from group. - // The renderer for a column can be overriden using cellRenderer. cellRenderer can be a React element - // or a function or a class component that generates a React element. - labelProperty: PropTypes.string, - cellRenderer: PropTypes.oneOfType([PropTypes.func, PropTypes.element]), - // The default renderer for a header is props.groupTitleRenderer that renders headerLabel. - // The renderer for a header column can be overriden using headerRenderer. headerRenderer can be a React element - // or a function or a class component that generates a React element. - headerLabel: PropTypes.string, - headerRenderer: PropTypes.oneOfType([PropTypes.func, PropTypes.element]), - width: PropTypes.number // width of the column in px - }) - ), + + /** + * By default when the user clicks/drag to select items they gets selected. + * By setting this property the gantt selection mechanism (mentioned above) is disabled, and the selected items are only the ones "dictated" by this property + * @type { Array. } + */ + selectedItems: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.number, PropTypes.string])), + + /** + * The component that is the item (segment) renderer. You can change the default component (i.e. `ItemRenderer`). We + * recommend to create a subclass of it, rather than creating one from scratch. + * @type { Function } + */ + itemRenderer: PropTypes.oneOfType([PropTypes.object, PropTypes.func]), + + /** + * This is used more or less like this: + * + * ```jsx + * + * ``` + * + * This is the way to go if you want to set a property for all segments (items). E.g. `color`. Take a look at the props + * of `ItemRenderer` to see what are the possible options. If you override the item renderer, and it will accept additional + * props, you can of course specify them here. + * @type { object } + */ + itemRendererDefaultProps: PropTypes.object, + + /** + * The height of the items (segments) in pixels, it is used to calculate the height of the row. + * + * Items (segments) that are overlapping are displayed one below the other. In this case, the height of the row will + * be the maximum number of overlapping items (segments) multiplied by `itemHeight`. + * @type { number } + */ + itemHeight: PropTypes.number, + + /** + * List of layers that will be rendered for a row. + * @type { Array. } + */ rowLayers: PropTypes.arrayOf( PropTypes.shape({ // start and end are not required because getStartFromItem() and getEndFromItem() functions @@ -94,64 +214,395 @@ export default class Timeline extends React.Component { style: PropTypes.object.isRequired }) ), - selectedItems: PropTypes.arrayOf(PropTypes.number), - startDate: PropTypes.oneOfType([PropTypes.object, PropTypes.number]).isRequired, - endDate: PropTypes.oneOfType([PropTypes.object, PropTypes.number]).isRequired, + + /** + * The name of the css class that will be applied both for gantt rows and for table rows + * If it is not set it defaults to 'DEFAULT_ROW_CLASS' + * + * Example of usecase: change the default alternative rows coloring by setting 'rowClassName', 'rowEvenClassName' and 'rowOddClassName' + * + * @type {string} + */ + rowClassName: PropTypes.string, + + /** + * The name of the css class that will be applied both for gantt rows and for table rows that have an even row index + * If it is not set it defaults to 'DEFAULT_ROW_EVEN_CLASS' + * + * Example of usecase: change the default alternative rows coloring by setting 'rowClassName', 'rowEvenClassName' and 'rowOddClassName' + * + * @type {string} + */ + + rowEvenClassName: PropTypes.string, + + /** + * The name of the css class that will be applied both for gantt and for table rows that have an odd row index + * If it is not set it defaults to 'DEFAULT_ROW_ODD_CLASS' + * + * Example of usecase: change the default alternative rows coloring by setting 'rowClassName', 'rowEvenClassName' and 'rowOddClassName' + * + * @type {string} + */ + rowOddClassName: PropTypes.string, + + /** + * The start of the displayed interval, as date (numeric/millis or moment object, cf. `useMoment`). + * + * This is only an initial value, because the display interval can change by horizontally srolling the diagram + * @type {number | object} + */ + startDate: PropTypes.oneOfType([PropTypes.number, PropTypes.object]).isRequired, + + /** + * End of the displayed interval, as date (numeric/millis or moment object, cf. `useMoment`). + * + * This is only an initial value, because the display interval can change by horizontally srolling the diagram + * @type { number | object } + */ + endDate: PropTypes.oneOfType([PropTypes.number, PropTypes.object]).isRequired, + + /** + * The minimum start of the display interval that can be reached by horizontally scrolling the gantt diagram + * If not provided, the `startDate` will also be the the minimum. So no scroll will be possible beyond `startDate` + * + * @type { number | object } + */ + minDate: PropTypes.oneOfType([PropTypes.number, PropTypes.object]), + + /** + * The maximum end of the display interval that can be reached by horizontally scrolling the gantt diagram. + * If not provided, the `endDate` will also be the the maximum. So no scroll will be possible beyond `endDate` + * + * @type { number | object } + */ + maxDate: PropTypes.oneOfType([PropTypes.number, PropTypes.object]), + + /** + * Can be used to programatically change the vertical scroll position of the diagram + * + * @type { number } + */ + verticalScrollPosition: PropTypes.number, + + /** If `false`, then when you "talk" dates/times to the Timeline, then you use + * plain timestamps (i.e. number of millis, e.g. `new Date().valueOf()`). And this everywhere where + * a date/time is needed (e.g. for an item, for global start/end, etc.). This is the **recommended** (and the default) way to go, especially if you use Redux. + * + * NOTE 1: the Timeline still uses "moment" internally. And this because it was quicker to refactor this way. + * This may change in the future, if we find reasons and time to refactor more. + * + * NOTE 2: The upstream repo, had this `true` by default, in order to maintain backward compatibility. But we discovered that w/ `false`, the component + * actually works both w/ timestamps AND moment objects. And this is because we convert using `moment(date)`, which works in the 2 cases. Obviously it's + * not a good idea to mix the date types, one of the reasons being that maybe in the future moment won't be used internally any more. + * + * @type { boolean } + */ + useMoment: PropTypes.bool, + + /** + * The table component for displaying the groups. It appears in the left side of the gantt. + * By setting the table component you can customize its look and feel as you like. + * + * + * Empty rows can be added at the bottom of the table to fill in the remaining empty space. + * So the cell renderers of your table should take in consideration those possible empty rows (without any data behind) + * + * @type { JSX.element} + */ + table: PropTypes.object, + + /** + * @type { number } + */ snap: PropTypes.number, //like snapMinutes, but for seconds; couldn't get it any lower because the pixels are not calculated correctly + + /** + * @type { number } + */ snapMinutes: PropTypes.number, + + /** + * Shows the cursor time in the timebar and a red marker in the grid indicating the cursor time. + * @type { boolean } + */ showCursorTime: PropTypes.bool, + + /** + * The format of the cursor time displayed in the timebar. + * @type { string } + */ cursorTimeFormat: PropTypes.string, - componentId: PropTypes.string, // A unique key to identify the component. Only needed when 2 grids are mounted - itemHeight: PropTypes.number, + + /** + * A unique key to identify the component. Only needed when 2 grids are mounted. + * @type { string } + */ + componentId: PropTypes.string, + + /** + * @type { number } + */ timelineMode: PropTypes.number, + + /** + * @type { object } + */ timebarFormat: PropTypes.object, - onItemClick: PropTypes.func, - onItemDoubleClick: PropTypes.func, - onItemContext: PropTypes.func, - onInteraction: PropTypes.func, - onRowClick: PropTypes.func, - onRowContext: PropTypes.func, - onRowDoubleClick: PropTypes.func, - onItemHover: PropTypes.func, - onItemLeave: PropTypes.func, - itemRenderer: PropTypes.func, - // Single column mode: the renderer of a cell. - // Multiple columns mode: the default renderer of a cell, which may be overridden on a per column basis. - groupRenderer: PropTypes.func, - // Single column mode: the renderer of the header cell. - // Multiple columns mode: the default renderer of a header cell, which may be overridden on a per column basis. - groupTitleRenderer: PropTypes.func, - shallowUpdateCheck: PropTypes.bool, - forceRedrawFunc: PropTypes.func, + + /** + * @type { string } + */ bottomResolution: PropTypes.string, + + /** + * @type { string } + */ topResolution: PropTypes.string, + + /** + * If true timeline will try to minimize re-renders . Set to false if items don't show up/update on prop change. + * @type { boolean } + */ + shallowUpdateCheck: PropTypes.bool, + + /** + * Function called when shallowUpdateCheck==true. If returns true the timeline will be redrawn. + * If false the library will decide if redrawing is required. + * @type { Function } + */ + forceRedrawFunc: PropTypes.func, + + /** + * @type { InteractOption } + */ interactOptions: PropTypes.shape({ draggable: PropTypes.object, pointerEvents: PropTypes.object, // TODO: this doesn't seem used; originally it was w/ "required"; I removed this to avoid warnings in console resizable: PropTypes.object }), - useMoment: PropTypes.bool // Whether the timeline should receive dates as moment object or in milliseconds. + + /** + * @type { Function } + */ + onItemClick: PropTypes.func, + + /** + * @type { Function } + */ + onItemDoubleClick: PropTypes.func, + + /** + * @type { Function } + */ + onItemContextClick: PropTypes.func, + + /** + * @type { Function } + */ + onInteraction: PropTypes.func, + + /** + * @type { Function } + */ + onRowClick: PropTypes.func, + + /** + * @type { Function } + */ + onRowContextClick: PropTypes.func, + + /** + * @type { Function } + */ + onRowDoubleClick: PropTypes.func, + + /** + * @type { Function } + */ + onItemHover: PropTypes.func, + + /** + * @type { Function } + */ + onItemLeave: PropTypes.func, + + /** + * This property should be used like this: + * + * ```jsx + * ... /> + * ``` + * @type { JSX.Element } + */ + backgroundLayer: PropTypes.object, + + /** + * Gantt has a default enable/disable drag to create mechanism implemented via a "Drag to create" context menu action. + * If this property is set, this default mechanism is disabled and the application can enter/exit the dragToCreateMode by setting this property to true/false + * + * @type { undefined | boolean} + */ + forceDragToCreateMode: PropTypes.bool, + + /** + * Function called when getDragToCreateMode == true on dragstart + * @param { DragToCreateParam } param + * @type { Function } + */ + onDragToCreateStarted: PropTypes.func, + + /** + * Function called when getDragToCreateMode == true on dragend + * @param { DragToCreateParam } param + * @type { Function } + */ + onDragToCreateEnded: PropTypes.func, + + /** + * Function called everytime the segments selection changes. + * It receives as parameter the indexes of the selected items. + * + * @type {(selectedItems: (number | string)[]) => void} + */ + onSelectionChange: PropTypes.func, + + /** + * Should provide actions that will fill the right click context menu. + * If no actions are provided the context menu will not show + * + * @type {(param: IGanttOnContextMenuShowParam) => IGanttAction[]} + */ + onContextMenuShow: PropTypes.func, + + /** + * This is default size for split when have table props and the split isn't controlled + * + * @type { Size } + */ + splitPaneSizeInitial: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + + /** + * If this handler is provided, it will be called when the table is resized + * by dragging the split bar between the table and the gantt. + * + * @type {(splitSize: number) => void} + */ + onSplitChange: PropTypes.func, + + /** + * The split pane props to override props + * + * @type { Partial } + */ + splitPaneProps: PropTypes.object, + + /** + * This property controls if one segment (item) whose period overlaps another segment (item)'s period + * is displayed on a separate subrow or it displayes on the same subrow, overlapping the other segment + * + * In case of overlapping segments displayed on separate subrows, the main row expands its height to include all the subrows + * + * @default true + * @type { boolean | (item: Item, rowIndex: number) => boolean } + */ + displayItemOnSeparateRowIfOverlap: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]), + + /** + * The vertical gap between overlapping items displayed on separate subrows in case `displayItemOnSeparateRowIfOverlap == true` + * + * @default 1 + * @type { number } + */ + verticalGapBetweenOverlappingItems: PropTypes.number, + + /** + * The top and down empty space inside a row + * + * @default 1 + * @type { number } + */ + rowTopBottomPadding: PropTypes.number, + + /** + * The segments with bigger index are staying in front of the ones with smaller index. + * To not show the segment in front of the now marker, cursor time + * please do not return a number greater than 998 @see rct9k-marker style + * + * @type {(item: Item) => number} + */ + zIndexFunction: PropTypes.func, + + /** + * If this property is provided with true, then in context menu displays the shortcut for zoom in and zoom out. + * + * @type { undefined | boolean} + */ + showZoomShortcuts: PropTypes.bool, + + /** + * + * @type {boolean | (() => boolean)} + */ + zoomEnabled: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]) }; static defaultProps = { rowLayers: [], - groupOffset: 150, - itemHeight: 40, + itemHeight: DEFAULT_ITEM_HEIGHT, snapMinutes: 15, cursorTimeFormat: 'D MMM YYYY HH:mm', componentId: 'r9k1', showCursorTime: true, - groupRenderer: DefaultGroupRenderer, - itemRenderer: DefaultItemRenderer, + itemRenderer: ItemRenderer, timelineMode: Timeline.TIMELINE_MODES.SELECT | Timeline.TIMELINE_MODES.DRAG | Timeline.TIMELINE_MODES.RESIZE, - shallowUpdateCheck: false, + // in rtl9k + // shallowUpdateCheck: false, + shallowUpdateCheck: true, forceRedrawFunc: null, onItemHover() {}, onItemLeave() {}, interactOptions: {}, - useMoment: true, - tableColumns: [] + rowClassName: DEFAULT_ROW_CLASS, + rowEvenClassName: DEFAULT_ROW_EVEN_CLASS, + rowOddClassName: DEFAULT_ROW_ODD_CLASS, + // in rtl9k: + // useMoment: true, + useMoment: false, + minDate: undefined, + maxDate: undefined, + verticalScrollPosition: 0, + selectedItems: undefined, + snap: 1, + timebarFormat: undefined, + bottomResolution: undefined, + topResolution: undefined, + onItemClick() {}, + onItemDoubleClick() {}, + onItemContextClick() {}, + onRowClick() {}, + onRowContextClick() {}, + onRowDoubleClick() {}, + onInteraction() {}, + itemRendererDefaultProps: {}, + backgroundLayer: null, + forceDragToCreateMode: undefined, + onDragToCreateStarted: undefined, + onDragToCreateEnded: undefined, + onContextMenuShow: undefined, + onSelectionChange() {}, + splitPaneSizeInitial: undefined, + onSplitChange: undefined, + splitPaneProps: undefined, + displayItemOnSeparateRowIfOverlap: true, + verticalGapBetweenOverlappingItems: DEFAULT_VERTICAL_GAP_BETWEEN_OVERLAPPING_ITEMS, + rowTopBottomPadding: DEFAULT_ROW_TOP_BOTTOM_PADDING, + zIndexFunction() { + return 3; + }, + showZoomShortcuts: false, + zoomEnabled: true }; /** @@ -181,10 +632,48 @@ export default class Timeline extends React.Component { */ static no_op = () => {}; + /** + * Fade timer + */ + fadeTimer = undefined; + + getInitialTableWidth(props) { + props = props ? props : this.props; + return (props.table ? props.table.props.width : 0) + TABLE_OFFSET; + } + constructor(props) { super(props); this.selecting = false; - this.state = {selection: [], cursorTime: null}; + this.state = { + selection: [], + cursorTime: null, + groups: this.props.groups, + verticalGridLines: [], + screenHeight: 0, + gridWidth: 0, + splitSize: 0, + dragToCreateMode: false, + dragToCreatePopupClosed: false, + openMenu: false, + dragCancel: false, + rightClickDraggingState: undefined, + tableScrollTop: 0, + // We didn't find a way to set the scroll position of the gantt/table that avoids calling back the scroll handlers. + // That's why we mark those cases in order to skip the logic from the scroll handlers + avoidCallingTableScrollHandlers: false, + avoidCallingGanttScrollHandlers: false, + openedContextMenuCoordinates: undefined, + openedContextMenuRow: undefined, + openedContextMenuTime: undefined, + startDate: this.props.startDate, + endDate: this.props.endDate, + hasHorizontalScrollbar: false, + touchPositionX: undefined, + fadeEffectOpen: false, + fadeEffectContent: undefined, + fadeEffectOpacity: 0 + }; // These functions need to be bound because they are passed as parameters. // getStartFromItem and getEndFromItem are used in rowItemsRenderer function @@ -200,6 +689,7 @@ export default class Timeline extends React.Component { this.cellRenderer = this.cellRenderer.bind(this); this.rowHeight = this.rowHeight.bind(this); + this.tableRowHeight = this.tableRowHeight.bind(this); this.setTimeMap = this.setTimeMap.bind(this); this.getItem = this.getItem.bind(this); this.changeGroup = this.changeGroup.bind(this); @@ -209,28 +699,125 @@ export default class Timeline extends React.Component { this.itemFromElement = this.itemFromElement.bind(this); this.updateDimensions = this.updateDimensions.bind(this); this.grid_ref_callback = this.grid_ref_callback.bind(this); + this.table_ref_callback = this.table_ref_callback.bind(this); + this.horizontalScroll_ref_callback = this.horizontalScroll_ref_callback.bind(this); this.select_ref_callback = this.select_ref_callback.bind(this); + this.selectionHolder_ref_callback = this.selectionHolder_ref_callback.bind(this); + this.menuButton_ref_callback = this.menuButton_ref_callback.bind(this); this.throttledMouseMoveFunc = _.throttle(this.throttledMouseMoveFunc.bind(this), 20); this.mouseMoveFunc = this.mouseMoveFunc.bind(this); + this.mouseDownFunc = this.mouseDownFunc.bind(this); + this.mouseUpFunc = this.mouseUpFunc.bind(this); + this.onTouchStart = this.onTouchStart.bind(this); + this.onTouchMove = this.onTouchMove.bind(this); + this.onTouchEnd = this.onTouchEnd.bind(this); this.getCursor = this.getCursor.bind(this); + this.setVerticalGridLines = this.setVerticalGridLines.bind(this); + this.handleScrollTable = this.handleScrollTable.bind(this); + this.handleScrollGantt = this.handleScrollGantt.bind(this); + this.onSplitChange = this.onSplitChange.bind(this); + this.selectionChangedHandler = this.selectionChangedHandler.bind(this); + this.getRowClassName = this.getRowClassName.bind(this); + this.wheelHandler = this.wheelHandler.bind(this); + this.startFadeOutEffect = this.startFadeOutEffect.bind(this); + this.lastMouseOverItem = undefined; + this.lastMouseOutEvent = undefined; const canSelect = Timeline.isBitSet(Timeline.TIMELINE_MODES.SELECT, this.props.timelineMode); const canDrag = Timeline.isBitSet(Timeline.TIMELINE_MODES.DRAG, this.props.timelineMode); const canResize = Timeline.isBitSet(Timeline.TIMELINE_MODES.RESIZE, this.props.timelineMode); this.setUpDragging(canSelect, canDrag, canResize); + const that = this; + this.DRAG_TO_CREATE_ACTION = { + label: DRAG_TO_CREATE_ACTION_LABEL, + run: param => { + that.setDragToCreateMode(true); + param.closeContextMenu(); + } + }; + this.ZOOM_IN_ACTION = { + label: ZOOM_IN_ACTION_LABEL, + icon: 'zoom-in', + run: param => { + let event = new MouseEvent('wheel', { + ctrlKey: true, + clientX: that._gridDomNode.getBoundingClientRect().x + that._grid.props.width / 2, + bubbles: true, + cancelable: true + }); + event.deltaY = -1; + that._gridDomNode.dispatchEvent(event); + param.closeContextMenu(); + that.startFadeOutEffect('Zoomed in'); + } + }; + this.ZOOM_OUT_ACTION = { + label: ZOOM_OUT_ACTION_LABEL, + icon: 'zoom-out', + run: param => { + let event = new MouseEvent('wheel', { + ctrlKey: true, + clientX: that._gridDomNode.getBoundingClientRect().x + that._grid.props.width / 2, + bubbles: true, + cancelable: true + }); + event.deltaY = 1; + that._gridDomNode.dispatchEvent(event); + param.closeContextMenu(); + that.startFadeOutEffect('Zoomed out'); + } + }; } componentDidMount() { window.addEventListener('resize', this.updateDimensions); + window.addEventListener('wheel', this.wheelHandler, {passive: false}); + + // calculate the initial split size + if (this.props.table) { + let splitSize = 0; + // if the default size is specified in % calculate the width + if (typeof this.props.splitPaneSizeInitial == 'string') { + // width from screen + const width = PARENT_ELEMENT(this.props.componentId).getBoundingClientRect().width; + splitSize = (width * parseInt(this.props.splitPaneSizeInitial.replace('%', ''))) / 100; + } else { + splitSize = this.props.splitPaneSizeInitial || this.props.table.props.width; + } + this.setState({splitSize: splitSize}); + } } componentWillReceiveProps(nextProps) { - this.setTimeMap( - nextProps.items, - convertDateToMoment(nextProps.startDate, nextProps.useMoment), - convertDateToMoment(nextProps.endDate, nextProps.useMoment), - nextProps.useMoment - ); + if (this.props.verticalScrollPosition != nextProps.verticalScrollPosition) { + this.verticalScrollTo(nextProps.verticalScrollPosition); + } + + if ( + convertDateToMoment(this.props.startDate, this.props.useMoment).valueOf() != + convertDateToMoment(nextProps.startDate, nextProps.useMoment).valueOf() || + convertDateToMoment(this.props.endDate, this.props.useMoment).valueOf() != + convertDateToMoment(nextProps.endDate, nextProps.useMoment).valueOf() + ) { + // If the externally controlled start/end changed, + // The setTimeMap will also be called but later in componentDidUpdate based on state start/end dates + // This avoids calling setTimeMap with stale start/end state values + this.setState({startDate: nextProps.startDate, endDate: nextProps.endDate}); + } else if ( + nextProps.useMoment !== this.props.useMoment || + nextProps.displayItemOnSeparateRowIfOverlap !== this.props.displayItemOnSeparateRowIfOverlap || + nextProps.items !== this.props.items + ) { + this.setTimeMap( + nextProps.items, + convertDateToMoment(this.state.startDate, nextProps.useMoment), + convertDateToMoment(this.state.endDate, nextProps.useMoment), + nextProps.useMoment, + nextProps.displayItemOnSeparateRowIfOverlap + ); + } + this.fillInTimelineWithEmptyRows(nextProps.groups); + // @TODO // investigate if we need this, only added to refresh the grid // when double click -> add an item @@ -242,6 +829,7 @@ export default class Timeline extends React.Component { if (this._selectRectangleInteractable) this._selectRectangleInteractable.unset(); window.removeEventListener('resize', this.updateDimensions); + window.removeEventListener('wheel', this.wheelHandler); } componentDidUpdate(prevProps, prevState) { @@ -255,79 +843,214 @@ export default class Timeline extends React.Component { const canResize = Timeline.isBitSet(Timeline.TIMELINE_MODES.RESIZE, timelineMode); this.setUpDragging(canSelect, canDrag, canResize); } + + if ( + convertDateToMoment(prevState.startDate, prevProps.useMoment).valueOf() != + convertDateToMoment(this.state.startDate, this.props.useMoment).valueOf() || + convertDateToMoment(prevState.endDate, prevProps.useMoment).valueOf() != + convertDateToMoment(this.state.endDate, this.props.useMoment).valueOf() + ) { + this.setTimeMap( + this.props.items, + convertDateToMoment(this.state.startDate, this.props.useMoment), + convertDateToMoment(this.state.endDate, this.props.useMoment), + this.props.useMoment + ); + this.refreshGrid(); + } + + if (prevState.hasHorizontalScrollbar != this.state.hasHorizontalScrollbar) { + this.fillInTimelineWithEmptyRows(this.props.groups); + this.refreshGrid(); + } + } + + isTouchDevice() { + return 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; + } + + wheelHandler(e) { + let zoomEnabled = + (typeof this.props.zoomEnabled === `function` && this.props.zoomEnabled()) || this.props.zoomEnabled; + if (e.ctrlKey && zoomEnabled) { + let target = e.target; + while (target) { + if (target.className.includes(`rct9k-grid rct9k-grid-id-${this.props.componentId}`)) { + break; + } + target = target.parentElement; + } + if (!target) { + return; + } + e.preventDefault(); + e.stopPropagation(); + + const interval = this.getEndDate().valueOf() - this.getStartDate().valueOf(); + const delta = (e.clientX - this.getGanttLeftOffset()) / this._grid.props.width; + let deltaInterval = interval * ZOOM_PERCENT; + if (e.deltaY > 0) { + deltaInterval *= -1; + } + this.zoomInternal(deltaInterval, delta); + this.throttledMouseMoveFunc(e); + } + } + + zoomInternal(deltaInterval, anchor) { + const minDate = this.getMinDate().valueOf(); + const maxDate = this.getMaxDate().valueOf(); + + const startDate = Math.max(this.getStartDate().valueOf() + anchor * deltaInterval, minDate); + const endDate = Math.min(this.getEndDate().valueOf() - (1 - anchor) * deltaInterval, maxDate); + + if (endDate - startDate < MIN_DISPLAY_TIME) { + return; + } + + this.setState({ + startDate: this.props.useMoment ? moment(startDate) : startDate, + endDate: this.props.useMoment ? moment(endDate) : endDate + }); + } + + /** + * Public API method. + * @param {number} direction Must be either `ZOOM_IN` or `ZOOM_OUT` constants + * @param {?number} anchor Value between 0 and 1 representing the zoom anchor + * (0 = left edge, 0.5 = center, 1 = right edge). + */ + zoom(direction, anchor = 0.5) { + if (direction !== ZOOM_IN && direction !== ZOOM_OUT) { + console.warn(`Timeline.zoom: 'direction' parameter must be either ZOOM_IN or ZOOM_OUT. Received: ${direction}`); + return; + } + if (typeof anchor !== 'number' || anchor < 0 || anchor > 1) { + console.warn(`Timeline.zoom: 'anchor' parameter must be a number between 0 and 1. Received: ${anchor}`); + return; + } + const interval = this.getEndDate().valueOf() - this.getStartDate().valueOf(); + const deltaInterval = interval * ZOOM_PERCENT * direction; + this.zoomInternal(deltaInterval, anchor); } /** - * It returns the start date of the timeline as moment. - * @returns startDate as moment + * + * @return boolean + */ + getDragToCreateMode() { + return this.props.forceDragToCreateMode == undefined + ? this.state.dragToCreateMode + : this.props.forceDragToCreateMode; + } + + /** + * Start of the displayed interval (as moment object). + * + * @return {moment} */ getStartDate() { - return convertDateToMoment(this.props.startDate, this.props.useMoment); + return convertDateToMoment(this.state.startDate, this.props.useMoment); } /** - * It returns the end date of the timeline as moment. - * @returns endDate as moment + * End of the displayed interval (as moment object). + * + * @return {moment} */ getEndDate() { - return convertDateToMoment(this.props.endDate, this.props.useMoment); + return convertDateToMoment(this.state.endDate, this.props.useMoment); + } + + /** + * Min of the displayed interval (as moment object) + * + * @returns {moment} + */ + getMinDate() { + if (this.props.minDate) { + return convertDateToMoment(this.props.minDate, this.props.useMoment); + } else { + return convertDateToMoment(this.props.startDate, this.props.useMoment); + } + } + + /** + * Max of the displayed interval (as moment object) + * + * @returns {moment} + */ + getMaxDate() { + if (this.props.maxDate) { + return convertDateToMoment(this.props.maxDate, this.props.useMoment); + } else { + return convertDateToMoment(this.props.endDate, this.props.useMoment); + } } /** - * It returns the start of the item as moment. - * @param {object} item Item that is displayed in the grid. - * @param {useMoment} useMoment This parameter is necessary because this method is also called when - * the component receives new props. Default value: this.props.useMoment. - * @returns start of the item as moment + * Start of the segment (item). + * + * @param {Item} item The segment (item). + * @param {boolean} useMoment This parameter is necessary because this method is also called when + * the component receives new props. Default value: `this.props.useMoment`. + * @return {moment} */ getStartFromItem(item, useMoment = this.props.useMoment) { return convertDateToMoment(item.start, useMoment); } /** - * It assigns newDateAsMoment to the start of the item, but first it converts newDateAsMoment - * to moment or milliseconds according to useMoment. - * @param {object} item Item that is displayed in the grid. + * It assigns `newDateAsMoment` to the start of the segment (item), but first it converts it + * to moment or number/milliseconds according to `useMoment`. + * + * @param {Item} item The segment (item). * @param {moment} newDateAsMoment + * @return {void} */ setStartToItem(item, newDateAsMoment) { item.start = convertMomentToDateType(newDateAsMoment, this.props.useMoment); } /** - * It returns the end of the item as moment. - * @param {object} item Item that is displayed in the grid. - * @param {useMoment} useMoment This parameter is necessary because this method is also called when - * the component receives new props. Default value: this.props.useMoment. - * @returns end of the item as moment. + * End of the segment (item). + * + * @param {Item} item The segment (item). + * @param {boolean} useMoment This parameter is necessary because this method is also called when + * the component receives new props. Default value: `this.props.useMoment`. + * @return {moment} */ getEndFromItem(item, useMoment = this.props.useMoment) { return convertDateToMoment(item.end, useMoment); } /** - * It assigns newDateAsMoment to the end of the item, but first it converts newDateAsMoment - * to moment or milliseconds according to useMoment. - * @param {object} item Item that is displayed in the grid. + * It assigns `newDateAsMoment` to the end of the segment (item), but first it converts it + * to moment or number/milliseconds according to `useMoment`. + * + * @param {Item} item The segment (item). * @param {moment} newDateAsMoment + * @return {void} */ setEndToItem(item, newDateAsMoment) { item.end = convertMomentToDateType(newDateAsMoment, this.props.useMoment); } /** - * It returns the start of the layer as moment. - * @param {object} layer - * @returns the start of the rowLayer as moment. + * Start of the layer as a moment object. + * + * @param {RowLayer} layer + * @return {moment} */ getStartFromRowLayer(layer) { return convertDateToMoment(layer.start, this.props.useMoment); } /** - * It assigns newDateAsMoment to the start of the layer, but first it converts newDateAsMoment - * to moment or milliseconds according to useMoment. - * @param {object} layer Item that is displayed in the grid. + * It assigns `newDateAsMoment` to the start of the segment (item), but first it converts it + * to moment or number/milliseconds according to `useMoment`. + * + * @param {RowLayer} layer * @param {moment} newDateAsMoment */ setStartToRowLayer(layer, newDateAsMoment) { @@ -335,24 +1058,40 @@ export default class Timeline extends React.Component { } /** - * It returns the end of the layer as moment. - * @param {object} layer - * @returns the end of the layer as moment. + * End of the layer as a moment object. + * + * @param {RowLayer} layer + * @return {moment} */ getEndFromRowLayer(layer) { return convertDateToMoment(layer.end, this.props.useMoment); } /** - * It assigns newDateAsMoment to the end of the layer, but first it converts newDateAsMoment - * to moment or milliseconds according to useMoment. - * @param {object} layer Item that is displayed in the grid. + * It assigns `newDateAsMoment` to the end of the segment (item), but first it converts it + * to moment or number/milliseconds according to `useMoment`. + * + * @param {RowLayer} layer * @param {moment} newDateAsMoment */ setEndToRowLayer(layer, newDateAsMoment) { layer.end = convertMomentToDateType(newDateAsMoment, this.props.useMoment); } + /** + * Before the gantt leftOffset was considered to be: PARENT_ELEMENT.getBoundingClientRect().left + * But there was a bug found in tests: The segments are in fact positioned (in the html page) relative to the interior of the react virtualized grid + * that is smaller than the .parent-div with 1px (Because of a 1px left border of the grid) + * + * So the left offset of the gantt (needed when converting the position in pixels in time) should take in consideration + * that 1px left border of the gantt grid + * + * @return {number} + */ + getGanttLeftOffset() { + return PARENT_ELEMENT(this.props.componentId).getBoundingClientRect().left + 1; + } + /** * Re-renders the grid when the window or container is resized */ @@ -360,26 +1099,35 @@ export default class Timeline extends React.Component { clearTimeout(this.resizeTimeout); this.resizeTimeout = setTimeout(() => { this.forceUpdate(); - this._grid.recomputeGridSize(); + // Grid may be null as forces a remount of the grid on window resize. + if (this._grid) { + this._grid.recomputeGridSize(); + } }, 100); } /** * Sets the internal maps used by the component for looking up item & row data - * @param {Object[]} items The items to be displayed in the grid + * @param {Item[]} items The items to be displayed in the grid * @param {moment} startDate The visible start date of the timeline * @param {moment} endDate The visible end date of the timeline * @param {boolean} useMoment This parameter is necessary because this method is also called when * the component receives new props. */ - setTimeMap(items, startDate, endDate, useMoment) { + setTimeMap(items, startDate, endDate, useMoment, displayItemOnSeparateRowIfOverlap) { if (!startDate || !endDate) { startDate = this.getStartDate(); endDate = this.getEndDate(); } - this.itemRowMap = {}; // timeline elements (key) => (rowNo). - this.rowItemMap = {}; // (rowNo) => timeline elements - this.rowHeightCache = {}; // (rowNo) => max number of stacked items + + displayItemOnSeparateRowIfOverlap = + displayItemOnSeparateRowIfOverlap == undefined + ? this.props.displayItemOnSeparateRowIfOverlap + : displayItemOnSeparateRowIfOverlap; + + this.itemRowMap = {}; // timeline elements (key) => (rowId). + this.rowItemMap = {}; // (rowId) => timeline elements + this.rowHeightCache = {}; // (rowId) => max number of stacked items let visibleItems = _.filter(items, i => { return this.getEndFromItem(i, useMoment) > startDate && this.getStartFromItem(i, useMoment) < endDate; }); @@ -391,13 +1139,81 @@ export default class Timeline extends React.Component { this.itemRowMap[item.key] = rowInt; this.rowItemMap[rowInt].push(item); }); + }); + + let maxVisibleItems = _.filter(items, i => { + return ( + this.getEndFromItem(i, useMoment) > this.getMinDate() && this.getStartFromItem(i, useMoment) < this.getMaxDate() + ); + }); + let maxVisibleItemsRows = _.groupBy(maxVisibleItems, 'row'); + _.forEach(maxVisibleItemsRows, (maxVisibleItems, row) => { + const rowInt = parseInt(row); this.rowHeightCache[rowInt] = getMaxOverlappingItems( - visibleItems, + maxVisibleItems, this.getStartFromItem, this.getEndFromItem, - useMoment + useMoment, + displayItemOnSeparateRowIfOverlap, + rowInt ); }); + + if (this._table) { + this._table.getApi().updateRowHeights(); + } + } + + /** + * Compute the number of rows that fit inside the timeline. If there can fit + * more rows than the model, fill in with empty groups. + * @param {Group[]} groups + */ + fillInTimelineWithEmptyRows(groups) { + // remove empty groups + groups = groups.filter(group => !this.isEmptyGroup(group.id)); + + // get height of the grid (without timebar); + // used to compute the number of rows we need to fill in + if (!this._grid || this._grid.props.height <= 0) { + this.setState({groups: groups}); + return; + } + + // compute the total height of the actual rows; + // if there are items that are overlapping, then the total height of a row is the maximum number + // of items that are overlapping on that row, multiplied by props.itemHeight + let totalItemsHeight = 0; + let that = this; + this.rowIdToRowIndexMap = {}; + _.forEach(groups, (group, index) => { + totalItemsHeight += that.getNonEmptyRowHeight(group.id); + this.rowIdToRowIndexMap[group.id] = index; + }); + let heightToFillIn = this._grid.props.height - totalItemsHeight; + + let fillInGroups = []; + + let groupId = -1; + while (heightToFillIn > 0) { + // create new empty group; + // if the last row would be only partially visible, then we set the height of the row as the remaining + // height (add `rowHeight` in group, which will be used in rowHeight() function) + let emptyGroup = {id: EMPTY_GROUP_ID_PREFIX + groupId}; + if (heightToFillIn < this.props.itemHeight) { + emptyGroup.rowHeight = heightToFillIn; + } + + this.rowIdToRowIndexMap[groupId] = groups.length - 1 - groupId; + fillInGroups.push(emptyGroup); + heightToFillIn -= this.props.itemHeight; + groupId--; + } + this.setState({groups: [...groups, ...fillInGroups]}); + } + + isEmptyGroup(groupId) { + return typeof groupId === 'string' && groupId.startsWith(EMPTY_GROUP_ID_PREFIX); } /** @@ -407,21 +1223,22 @@ export default class Timeline extends React.Component { * @prop {number|string} index The item's index * @prop {number} rowNo The row number the item is in * @prop {number} itemIndex Not really used - gets the index of the item in the row map - * @prop {Object} item The provided item object + * @prop {Item} item The provided item object */ itemFromElement(e) { const index = e.getAttribute('data-item-index'); - const rowNo = this.itemRowMap[index]; - const itemIndex = _.findIndex(this.rowItemMap[rowNo], i => i.key == index); - const item = this.rowItemMap[rowNo][itemIndex]; + const rowId = this.itemRowMap[index]; + const rowNo = this.rowIdToRowIndexMap[rowId]; + const itemIndex = _.findIndex(this.rowItemMap[rowId], i => i.key == index); + const item = this.rowItemMap[rowId][itemIndex]; - return {index, rowNo, itemIndex, item}; + return {index, rowNo, itemIndex, item, rowId}; } /** * Gets an item given its ID * @param {number} id item id - * @return {Object} Item object + * @return {Item} Item object */ getItem(id) { // This is quite stupid and shouldn't really be needed @@ -432,15 +1249,20 @@ export default class Timeline extends React.Component { /** * Move an item from one row to another - * @param {object} item The item object whose groups is to be changed + * @param {Item} item The item object whose groups is to be changed * @param {number} curRow The item's current row index * @param {number} newRow The item's new row index */ changeGroup(item, curRow, newRow) { - item.row = newRow; - this.itemRowMap[item.key] = newRow; - this.rowItemMap[curRow] = this.rowItemMap[curRow].filter(i => i.key !== item.key); - this.rowItemMap[newRow].push(item); + curRowId = this.state.groups[curRow].id; + newRowId = this.state.groups[newRow].id; + if (this.isEmptyGroup(newRowId)) { + return; + } + item.row = newRowId; + this.itemRowMap[item.key] = newRowId; + this.rowItemMap[curRowId] = this.rowItemMap[curRowId].filter(i => i.key !== item.key); + this.rowItemMap[newRowId].push(item); } /** @@ -467,12 +1289,12 @@ export default class Timeline extends React.Component { * @returns {number} The width in pixels */ getTimelineWidth(totalWidth) { - if (totalWidth !== undefined) return totalWidth - this.calculateLeftOffset(); - return this._grid.props.width - this.calculateLeftOffset(); + return totalWidth !== undefined ? totalWidth : this._grid.props.width; } /** * Get the snap in milliseconds from snapMinutes or snap + * @returns { number } */ getTimelineSnap() { if (this.props.snap) { @@ -483,14 +1305,206 @@ export default class Timeline extends React.Component { return 1; } + getRowClassName(rowIndex) { + return ( + this.props.rowClassName + ' ' + (rowIndex % 2 == 0 ? this.props.rowOddClassName : this.props.rowEvenClassName) + ); + } + /** * re-computes the grid's row sizes * @param {Object?} config Config to pass wo react-virtualized's compute func */ refreshGrid = (config = {}) => { - this._grid.recomputeGridSize(config); + // General known problem : + // can not use constructions like this._grid?.recomputeGridSize(config); + // because the generation of the storybook table for component properties documentation fails + if (this._grid) { + this._grid.recomputeGridSize(config); + } + // fill in timeline with empty rows only on resize + if (!_.isEmpty(config)) { + this.fillInTimelineWithEmptyRows(this.state.groups); + } }; + /** + * @param {number} clientX + * @param {number} clientY + */ + // before it was #onDragStartSelect but can not use constructions like this + // because the documnetation fails to be generated + onDragStartSelect(clientX, clientY) { + const nearestRowObject = getNearestRowObject(clientX, clientY); + if (nearestRowObject == null) { + // this happens when you start dragging from e.g. timebar + return; + } + const startY = adjustRowTopPositionToViewport(nearestRowObject, nearestRowObject.getBoundingClientRect().y); + // Add 2 to startY because on some occasions/browsers, when using document.elementsFromPonint(), it will return the wrong row if startY is used. + // Adding 2 to it ensures that the point isn't shared with other row. + this._selectBox.start(clientX, startY + 2); + + if (this.getDragToCreateMode() && this.props.onDragToCreateStarted) { + const groupIndex = Number(getNearestRowNumber(clientX, clientY)); + const itemIndex = Math.max(...Object.keys(this.itemRowMap)) + 1; + const startOffset = clientX - nearestRowObject.getBoundingClientRect().left; + const itemStart = getTimeAtPixel( + startOffset, + this.getStartDate(), + this.getEndDate(), + this.getTimelineWidth(), + this.getTimelineSnap() + ); + this.props.onDragToCreateStarted({groupIndex, itemIndex, itemStart}); + } + } + + /** + * @param {number} clientX + * @param {number} clientY + * @param {number} startXElement + */ + onDragMoveSelect(clientX, clientY, startXElement) { + if (this.state.dragCancel) { + // do nothing if drag is canceled + return; + } + // when selection going up, the bottom start row === top next row of start and getNearestRowObject + // returns both row and we cannot determine which row is needed and we substract this constant from bottom select box + const magicalConstant = 2; + const {startX, startY} = this._selectBox; + const startRowObject = getNearestRowObject(startX, startY); + if (startRowObject == null) { + // this happens when you start dragging from e.g. timebar + return; + } + const startXRowObject = startRowObject.getBoundingClientRect().x + 1; + // select only row without group + if (startXElement < startXRowObject) { + clientX = startXRowObject; + } + const currentRowObject = getNearestRowObject(clientX, clientY); + if (currentRowObject !== undefined && startRowObject !== undefined) { + // only run if you can detect the top row + const startRowNumber = getRowObjectRowNumber(startRowObject); + const currentRowNumber = getRowObjectRowNumber(currentRowObject); + if (startRowNumber <= currentRowNumber) { + // select box for selection going down + // get the first selected rows top + let startTop = startRowObject.getBoundingClientRect().top; + startTop = adjustRowTopPositionToViewport(startRowObject, startTop); + // get the currently selected rows bottom + // if drag to create mode set bottom from the first selected row + const currentBottom = this.getDragToCreateMode() + ? getTrueBottom(startRowObject) + : getTrueBottom(currentRowObject); + // If startTop is used as it is, on some occasions/browsers (usually when we zoom in/out and the values recalculate) we have issues when getNearestRowObject is called. + // It uses document.elementsFromPoint() and it returns the wrong row or 2 rows and can't determine which row is needed. + // For top value we add magical constant and for bottom value we substract it. This way we assure that the point is "more inside" the row and is not shared with other row. + this._selectBox.start(startX, startTop + magicalConstant); + this._selectBox.move(clientX, currentBottom - magicalConstant); + } else { + // select box for selection going up + // get the currently selected rows top + // if drag to create mode keep set top from the first selected row + const currentTop = this.getDragToCreateMode() + ? startRowObject.getBoundingClientRect().top + : currentRowObject.getBoundingClientRect().top; + // get the first selected rows bottom + const startBottom = getTrueBottom(startRowObject); + // the bottom will bleed south unless you counter the margins and boreders from the above rows + this._selectBox.start(startX, startBottom - magicalConstant); + this._selectBox.move(clientX, currentTop + magicalConstant); + } + } + } + + onDragEndSelect(event) { + if (this.state.dragCancel) { + // only reset dragCancel on dragend if drag is canceled + this.setState({dragCancel: false}); + return; + } + + let {top, left, width, height} = this._selectBox.end(); + // Get the start and end row of the selection rectangle + const topRowObject = getNearestRowObject(left, top); + if (topRowObject !== undefined) { + // only confirm the end of a drag if the selection box is valid + const topRowNumber = Number(getNearestRowNumber(left, top)); + const topRowLoc = topRowObject.getBoundingClientRect(); + const rowMarginBorder = getVerticalMarginBorder(topRowObject); + const y = Math.floor(topRowLoc.top - rowMarginBorder) + Math.floor(height - rowMarginBorder); + const bottomRow = Number(getNearestRowNumber(left + width, adjustRowTopPositionToViewport(topRowObject, y))); + // Get the start and end time of the selection rectangle + left = left - topRowLoc.left; + let startOffset = width > 0 ? left : left + width; + let endOffset = width > 0 ? left + width : left; + const startTime = getTimeAtPixel( + startOffset, + this.getStartDate(), + this.getEndDate(), + this.getTimelineWidth(), + this.getTimelineSnap() + ); + const endTime = getTimeAtPixel( + endOffset, + this.getStartDate(), + this.getEndDate(), + this.getTimelineWidth(), + this.getTimelineSnap() + ); + // Get items in these ranges + let selectedItems = []; + for (let r = Math.min(topRowNumber, bottomRow); r <= Math.max(topRowNumber, bottomRow); r++) { + let rowId = this.state.groups[r].id; + selectedItems.push( + ..._.filter(this.rowItemMap[rowId], i => { + return this.getStartFromItem(i).isBefore(endTime) && this.getEndFromItem(i).isAfter(startTime); + }) + ); + } + !this.getDragToCreateMode() && + this.props.onInteraction && + this.props.onInteraction(Timeline.changeTypes.itemsSelected, selectedItems); + + // delegate the selection change to the selection component + !this.getDragToCreateMode() && this._selectionHolder.addRemoveItems(_.map(selectedItems, 'key'), event); + + if (this.getDragToCreateMode() && this.props.onDragToCreateEnded) { + // get avaible itemIndex and call the onDragToCreateEnded + const itemIndex = Math.max(...Object.keys(this.itemRowMap)) + 1; + this.props.onDragToCreateEnded({ + groupIndex: topRowNumber, + itemIndex, + itemStart: startTime, + itemEnd: endTime + }); + this.setDragToCreateMode(false); + } + + if (event.button == 2) { + this.setState({openedContextMenuCoordinates: {x: event.clientX, y: event.clientY}}); + this.setState({openedContextMenuRow: bottomRow}); + this.setState({ + openedContextMenuTime: getTimeAtPixel( + event.clientX - this.getGanttLeftOffset(), + this.getStartDate(), + this.getEndDate(), + this.getTimelineWidth(), + this.getTimelineSnap() + ) + }); + } + } + } + + /** + * @param { boolean } canSelect + * @param { boolean } canDrag + * @param { boolean } canResize + */ setUpDragging(canSelect, canDrag, canResize) { // No need to setUpDragging during SSR if (typeof window === 'undefined') { @@ -498,6 +1512,7 @@ export default class Timeline extends React.Component { } const topDivClassId = `rct9k-id-${this.props.componentId}`; + const selectedItemSelector = '.rct9k-items-outer-selected'; if (this._itemInteractable) this._itemInteractable.unset(); if (this._selectRectangleInteractable) this._selectRectangleInteractable.unset(); @@ -524,7 +1539,7 @@ export default class Timeline extends React.Component { let selections = []; const animatedItems = this.props.onInteraction && - this.props.onInteraction(Timeline.changeTypes.dragStart, null, this.props.selectedItems); + this.props.onInteraction(Timeline.changeTypes.dragStart, null, this._selectionHolder.state.selectedItems); _.forEach(animatedItems, id => { let domItem = this._gridDomNode.querySelector("span[data-item-index='" + id + "'"); @@ -616,9 +1631,14 @@ export default class Timeline extends React.Component { this.setStartToItem(item, newStart); this.setEndToItem(item, newEnd); if (rowChangeDelta < 0) { - item.row = Math.max(0, item.row + rowChangeDelta); + let newRowIndex = Math.max(0, this.rowIdToRowIndexMap[item.row] + rowChangeDelta); + item.row = this.props.groups[newRowIndex].id; } else if (rowChangeDelta > 0) { - item.row = Math.min(this.props.groups.length - 1, item.row + rowChangeDelta); + let newRowIndex = Math.min( + this.props.groups.length - 1, + this.rowIdToRowIndexMap[item.row] + rowChangeDelta + ); + item.row = this.props.groups[newRowIndex].id; } items.push(item); @@ -646,12 +1666,15 @@ export default class Timeline extends React.Component { .resizable({ allowFrom: selectedItemSelector, edges: {left: true, right: true, bottom: false, top: false}, + // the default from lib was 20 but when we have a small item we cannot move it, + // because the size of resize cursor is to big and the move cursor doesn't appear + margin: 2, ...this.props.interactOptions.draggable }) .on('resizestart', e => { const selected = this.props.onInteraction && - this.props.onInteraction(Timeline.changeTypes.resizeStart, null, this.props.selectedItems); + this.props.onInteraction(Timeline.changeTypes.resizeStart, null, this._selectionHolder.state.selectedItems); _.forEach(selected, id => { let domItem = this._gridDomNode.querySelector("span[data-item-index='" + id + "'"); if (domItem) { @@ -708,7 +1731,7 @@ export default class Timeline extends React.Component { // Calculate the default item positions _.forEach(animatedItems, domItem => { let startPixelOffset = pixToInt(domItem.style.left) + dx; - const {item, rowNo} = this.itemFromElement(domItem); + const {item, rowNo, rowId} = this.itemFromElement(domItem); minRowNo = Math.min(minRowNo, rowNo); @@ -738,12 +1761,14 @@ export default class Timeline extends React.Component { // Check row height doesn't need changing let new_row_height = getMaxOverlappingItems( - this.rowItemMap[rowNo], + this.rowItemMap[rowId], this.getStartFromItem, - this.getEndFromItem + this.getEndFromItem, + this.props.displayItemOnSeparateRowIfOverlap, + rowNo ); - if (new_row_height !== this.rowHeightCache[rowNo]) { - this.rowHeightCache[rowNo] = new_row_height; + if (new_row_height !== this.rowHeightCache[rowId]) { + this.rowHeightCache[rowId] = new_row_height; } //Reset styles @@ -763,125 +1788,122 @@ export default class Timeline extends React.Component { this._grid.recomputeGridSize({rowIndex: minRowNo}); }); } - if (canSelect) { this._selectRectangleInteractable .draggable({ enabled: true, - ignoreFrom: '.item_draggable, .rct9k-group' + ignoreFrom: '.item_draggable, .rct9k-group, .rct9k-timebar' }) .styleCursor(false) .on('dragstart', e => { - const nearestRowObject = getNearestRowObject(e.clientX, e.clientY); - - // this._selectBox.start(e.clientX, e.clientY); - // this._selectBox.start(e.clientX, topRowObj.style.top); - this._selectBox.start(e.clientX, nearestRowObject.getBoundingClientRect().y); - // const bottomRow = Number(getNearestRowNumber(left + width, top + height)); + this.onDragStartSelect(e.clientX, e.clientY); }) .on('dragmove', e => { - const magicalConstant = 2; - // @bendog: I added this magical constant to solve the issue of selection bleed, - // I don't understand why it works, but if frequentist statisticians can use imaginary numbers, so can i. - const {startX, startY} = this._selectBox; - const startRowObject = getNearestRowObject(startX, startY); - const {clientX, clientY} = e; - const currentRowObject = getNearestRowObject(clientX, clientY); - if (currentRowObject !== undefined && startRowObject !== undefined) { - // only run if you can detect the top row - const startRowNumber = getRowObjectRowNumber(startRowObject); - const currentRowNumber = getRowObjectRowNumber(currentRowObject); - // const numRows = 1 + Math.abs(startRowNumber - currentRowNumber); - const rowMarginBorder = getVerticalMarginBorder(currentRowObject); - if (startRowNumber <= currentRowNumber) { - // select box for selection going down - // get the first selected rows top - const startTop = Math.ceil(startRowObject.getBoundingClientRect().top + rowMarginBorder); - // get the currently selected rows bottom - const currentBottom = Math.floor(getTrueBottom(currentRowObject) - magicalConstant - rowMarginBorder); - this._selectBox.start(startX, startTop); - this._selectBox.move(clientX, currentBottom); - } else { - // select box for selection going up - // get the currently selected rows top - const currentTop = Math.ceil(currentRowObject.getBoundingClientRect().top + rowMarginBorder); - // get the first selected rows bottom - const startBottom = Math.floor(getTrueBottom(startRowObject) - magicalConstant - rowMarginBorder * 2); - // the bottom will bleed south unless you counter the margins and boreders from the above rows - this._selectBox.start(startX, startBottom); - this._selectBox.move(clientX, currentTop); - } - } + this.onDragMoveSelect(e.clientX, e.clientY, e.page.x); }) .on('dragend', e => { - let {top, left, width, height} = this._selectBox.end(); - //Get the start and end row of the selection rectangle - const topRowObject = getNearestRowObject(left, top); - if (topRowObject !== undefined) { - // only confirm the end of a drag if the selection box is valid - const topRowNumber = Number(getNearestRowNumber(left, top)); - const topRowLoc = topRowObject.getBoundingClientRect(); - const rowMarginBorder = getVerticalMarginBorder(topRowObject); - const bottomRow = Number( - getNearestRowNumber( - left + width, - Math.floor(topRowLoc.top - rowMarginBorder) + Math.floor(height - rowMarginBorder) - ) - ); - //Get the start and end time of the selection rectangle - left = left - topRowLoc.left; - let startOffset = width > 0 ? left : left + width; - let endOffset = width > 0 ? left + width : left; - const startTime = getTimeAtPixel( - startOffset, - this.getStartDate(), - this.getEndDate(), - this.getTimelineWidth(), - this.getTimelineSnap() - ); - const endTime = getTimeAtPixel( - endOffset, - this.getStartDate(), - this.getEndDate(), - this.getTimelineWidth(), - this.getTimelineSnap() - ); - //Get items in these ranges - let selectedItems = []; - for (let r = Math.min(topRowNumber, bottomRow); r <= Math.max(topRowNumber, bottomRow); r++) { - selectedItems.push( - ..._.filter(this.rowItemMap[r], i => { - return this.getStartFromItem(i).isBefore(endTime) && this.getEndFromItem(i).isAfter(startTime); - }) - ); - } - this.props.onInteraction && this.props.onInteraction(Timeline.changeTypes.itemsSelected, selectedItems); - } + this.onDragEndSelect(e); }); } } _handleItemRowEvent = (e, itemCallback, rowCallback) => { - e.preventDefault(); + // First this handler used to be called only on click (no e.preventDefault() was called back then) + // After that, it was modified to be called also on contextMenu and doubleClick, then it was added this e.preventDefault() + // That's why I suspect that it targets only the contextMenu events in order to prevent the browser default context menu to open + // But because this is a legacy code and we don't understand why the exact scope of this preventDefault(), + // We removed it only for the case that we are interested in i.e. 'mouseDown' + if (e.type != 'mousedown') { + e.preventDefault(); + } + // Skip click handler if selecting with selection box if (this.selecting) { return; } - if (e.target.hasAttribute('data-item-index') || e.target.parentElement.hasAttribute('data-item-index')) { - let itemKey = e.target.getAttribute('data-item-index') || e.target.parentElement.getAttribute('data-item-index'); - itemCallback && itemCallback(e, Number(itemKey)); + + if (e.type === 'mouseout') { + // We wait till the next mouseover event to see if the mouseout happened + // because we exit the segment or because we entered on a child element of the same segment + this.lastMouseOutEvent = e; + return; + } + + let row; + let target = e.target; + while (target) { + if (target.hasAttribute('data-item-index')) { + break; + } + target = target.parentElement; + } + + // In case the segment contains children the mouseout/mouseover events are triggered also + // for those children. We want to threat only the mouseover/mouseout events + // from the current segment to other segments or to no segment at all + if (e.type === 'mouseover') { + const currentMouseOverItem = target ? target.getAttribute('data-item-index') : undefined; + if (this.lastMouseOverItem !== currentMouseOverItem) { + if (this.lastMouseOverItem) { + this.props.onItemLeave(this.lastMouseOutEvent, this.lastMouseOverItem); + } + this.lastMouseOverItem = currentMouseOverItem; + // This is a mouseover event on a new segment. Continue the usual processing of this event + } else { + // Avoid processing the current mouseover event + // and the last mouseout event on the same segment + return; + } + } + + if (target) { + row = target.parentElement.getAttribute('data-row-index'); + let itemKey = target.getAttribute('data-item-index'); + itemKey = isNaN(Number(itemKey)) ? itemKey : Number(itemKey); + itemCallback && itemCallback(e, itemKey); + if (e.type == 'mousedown' || (this.isTouchDevice() && e.type == 'tap')) { + // Calculate new selection by delegating to selection component + this._selectionHolder.addRemoveItems([itemKey], e); + } } else { - let row = e.target.getAttribute('data-row-index'); + row = e.target.getAttribute('data-row-index'); let clickedTime = getTimeAtPixel( - e.clientX - this.calculateLeftOffset(), + e.clientX - this.getGanttLeftOffset(), this.getStartDate(), this.getEndDate(), this.getTimelineWidth() ); - //const roundedStartMinutes = Math.round(clickedTime.minute() / this.props.snap) * this.props.snap; // I dont know what this does let snappedClickedTime = timeSnap(clickedTime, this.getTimelineSnap() * 60); rowCallback && rowCallback(e, row, clickedTime, snappedClickedTime); + + if (e.type == 'mousedown' || (this.isTouchDevice() && e.type == 'tap')) { + this._selectionHolder.addRemoveItems([], e); + } + } + + if (e.type == 'contextmenu') { + // right click => open CM + const {clientX, clientY} = e; + this.setState({openedContextMenuCoordinates: {x: clientX, y: clientY}}); + this.setState({openedContextMenuRow: Number(row)}); + this.setState({ + openedContextMenuTime: getTimeAtPixel( + clientX - this.getGanttLeftOffset(), + this.getStartDate(), + this.getEndDate(), + this.getTimelineWidth(), + this.getTimelineSnap() + ) + }); + + if (!this._selectBox.isStart()) { + // If a drag in progress, right click only cancels the current drag but keeps the drag to create mode + this.setDragToCreateMode(false); + } + } else if (e.type == 'click' || (this.isTouchDevice() && e.type == 'tap')) { + this.setState({openedContextMenuCoordinates: undefined}); + this.setDragToCreateMode(false); } }; @@ -890,95 +1912,83 @@ export default class Timeline extends React.Component { */ cellRenderer(width) { /** - * @param {} columnIndex Always 1 * @param {} key Unique key within array of cells * @param {} parent Reference to the parent Grid (instance) * @param {} rowIndex Vertical (row) index of cell * @param {} style Style object to be applied to cell (to position it); */ - const {timelineMode, onItemHover, onItemLeave, rowLayers} = this.props; + const {timelineMode, onItemHover, onItemLeave} = this.props; const canSelect = Timeline.isBitSet(Timeline.TIMELINE_MODES.SELECT, timelineMode); - return ({columnIndex, key, parent, rowIndex, style}) => { - // the items column is the last column in the grid; itemCol is the index of this column - let itemCol = this.props.tableColumns && this.props.tableColumns.length > 0 ? this.props.tableColumns.length : 1; - if (itemCol == columnIndex) { - let itemsInRow = this.rowItemMap[rowIndex]; - const layersInRow = rowLayers.filter(r => r.rowNumber === rowIndex); - let rowHeight = this.props.itemHeight; - if (this.rowHeightCache[rowIndex]) { - rowHeight = rowHeight * this.rowHeightCache[rowIndex]; - } - return ( -
this._handleItemRowEvent(e, Timeline.no_op, this.props.onRowClick)} - onMouseDown={e => (this.selecting = false)} - onMouseMove={e => (this.selecting = true)} - onMouseOver={e => { - this.selecting = false; - return this._handleItemRowEvent(e, onItemHover, null); - }} - onMouseLeave={e => { - this.selecting = false; - return this._handleItemRowEvent(e, onItemLeave, null); - }} - onContextMenu={e => - this._handleItemRowEvent(e, this.props.onItemContextClick, this.props.onRowContextClick) - } - onDoubleClick={e => this._handleItemRowEvent(e, this.props.onItemDoubleClick, this.props.onRowDoubleClick)}> - {rowItemsRenderer( - itemsInRow, - this.getStartDate(), - this.getEndDate(), - width, - this.props.itemHeight, - this.props.itemRenderer, - canSelect ? this.props.selectedItems : [], - this.getStartFromItem, - this.getEndFromItem - )} - {rowLayerRenderer( - layersInRow, - this.getStartDate(), - this.getEndDate(), - width, - rowHeight, - this.getStartFromRowLayer, - this.getEndFromRowLayer - )} -
- ); - } else { - // Single column mode: the renderer of the cell is props.groupRenderer - // with default labelProperty: SINGLE_COLUMN_LABEL_PROPERTY(title). - // - // Multiple columns mode: default renderer - props.groupRenderer with column.labelProperty; - // custom renderer: column.cellRenderer. - let labelProperty = ''; - let ColumnRenderer = this.props.groupRenderer; - if (this.props.tableColumns && this.props.tableColumns.length > 0) { - const column = this.props.tableColumns[columnIndex]; - if (column.cellRenderer) { - ColumnRenderer = column.cellRenderer; - } else { - labelProperty = column.labelProperty; - } - } else { - labelProperty = SINGLE_COLUMN_LABEL_PROPERTY; - } - let group = _.find(this.props.groups, g => g.id == rowIndex); - return ( -
- {React.isValidElement(ColumnRenderer) && ColumnRenderer} - {!React.isValidElement(ColumnRenderer) && ( - - )} -
- ); + return ({key, parent, rowIndex, style}) => { + let rowId = this.state.groups[rowIndex].id; + let itemsInRow = this.rowItemMap[rowId]; + // Previously, `rowLayers` constant was instatiated outside the arrow function. However, I have discovered that when + // the rowLayers were updated, the `rowLayers` constant had the previous value, + // but this.props.rowLayers has the new value. + const layersInRow = this.props.rowLayers.filter(r => r.rowNumber === rowIndex); + let rowHeight = this.props.itemHeight; + if (this.rowHeightCache[rowId]) { + rowHeight = this.getNonEmptyRowHeight(rowId); } + var props = this.props; + return ( +
this._handleItemRowEvent(e, Timeline.no_op, this.props.onRowClick)} + onMouseDown={e => { + this.selecting = false; + this._handleItemRowEvent(e, Timeline.no_op, Timeline.no_op); + }} + onMouseMove={e => (this.selecting = true)} + onMouseOver={e => { + this.selecting = false; + return this._handleItemRowEvent(e, onItemHover, null); + }} + onMouseOut={e => { + this.selecting = false; + return this._handleItemRowEvent(e, onItemLeave, null); + }} + onContextMenu={e => { + this.selecting = false; + this._handleItemRowEvent(e, this.props.onItemContextClick, this.props.onRowContextClick); + }} + onDoubleClick={e => { + this.selecting = false; + this._handleItemRowEvent(e, this.props.onItemDoubleClick, this.props.onRowDoubleClick); + }}> + {rowItemsRenderer( + itemsInRow, + this.getStartDate(), + this.getEndDate(), + width, + this.props.itemHeight, + this.props.itemRenderer, + canSelect ? this._selectionHolder.state.selectedItems : [], + this.props.itemRendererDefaultProps, + this.getStartFromItem, + this.getEndFromItem, + timelineTestids, + this.props.displayItemOnSeparateRowIfOverlap, + this.props.verticalGapBetweenOverlappingItems, + this.props.rowTopBottomPadding, + this.props.zIndexFunction, + rowIndex + )} + {rowLayerRenderer( + layersInRow, + this.getStartDate(), + this.getEndDate(), + width, + rowHeight, + this.getStartFromRowLayer, + this.getEndFromRowLayer + )} +
+ ); }; } @@ -989,11 +1999,48 @@ export default class Timeline extends React.Component { } /** - * Helper for react virtuaized to get the row height given a row index + * Helper for react virtualized to get the row height given a row index. */ rowHeight({index}) { - let rh = this.rowHeightCache[index] ? this.rowHeightCache[index] : 1; - return rh * this.props.itemHeight; + let group = this.state.groups[index]; + // only for empty rows (EMPTY_GROUP_KEY), if the group has a custom row height, + // we will return that height + if (group.rowHeight && this.isEmptyGroup(group.id)) { + return group.rowHeight; + } + return this.getNonEmptyRowHeight(group.id); + } + + getNonEmptyRowHeight(rowId) { + let rh = this.rowHeightCache[rowId] ? this.rowHeightCache[rowId] : 1; + return ( + rh * this.props.itemHeight + + (rh - 1) * this.props.verticalGapBetweenOverlappingItems + + 2 * this.props.rowTopBottomPadding + ); + } + + /** + * The height of the last empty row added to fill in the remaining space is different in gantt and in table because: + * In gantt the computed available space for rows is: + * componentHeight - headerheight + * But in fixed data table the computed available space for the rows is: + * Math.round(componentHeight) - headerheight - 2 * BORDER_HEIGHT (see roughHeights.js) + * + * If we have passed the same row height for table as for gantt a vertical scroll bar appeared (only for scrolling 2 or 3 px overflow) + */ + tableRowHeight(index) { + // This happens when the table having many items(groups) that has been scrolled is reseted to another smaller array. + // Fixed data table triggers a last render of the old items, so it requests the height of the old rows, but those items doesn't exists anymore + if (index >= this.state.groups.length) { + return 0; + } + var tableRowHeight = this.rowHeight({index}); + let group = this.state.groups[index]; + if (group.rowHeight && this.isEmptyGroup(group.id)) { + tableRowHeight = Math.round(tableRowHeight) + (this.state.hasHorizontalScrollbar ? SCROLLBAR_SIZE : 0) - 2; + } + return tableRowHeight; } /** @@ -1005,23 +2052,53 @@ export default class Timeline extends React.Component { this._gridDomNode = ReactDOM.findDOMNode(this._grid); } + table_ref_callback(reactComponent) { + this._table = reactComponent; + } + + horizontalScroll_ref_callback(reactComponent) { + this._horizontalScroll = reactComponent; + } + + /** + * Testing pourpose + * @param {*} splitPane + */ + splitPane_ref_callback(splitPane) { + // We made here a querry to select the child resizer of the split pane and to put the test id on it + // Because if we have putted the testis on parent and querry select in tests + // the focus was putted on the parent split pane and we only needed to drag the resizer of the split pane + if (splitPane) { + ReactDOM.findDOMNode(splitPane) + .querySelector('[role="presentation"]') + .setAttribute('data-testid', testids.splitPaneResizer); + } + } + /** - * Set the select box ref. * @param {Object} reactComponent Selectbox react element */ select_ref_callback(reactComponent) { this._selectBox = reactComponent; } + selectionHolder_ref_callback(reactComponent) { + this._selectionHolder = reactComponent; + } + + menuButton_ref_callback(reactComponent) { + if (reactComponent) { + this._menuButton = reactComponent.ref.current; + } + } + /** * Event handler for onMouseMove. * Only calls back if a new snap time is reached */ throttledMouseMoveFunc(e) { - const {componentId} = this.props; - const leftOffset = document.querySelector(`.rct9k-id-${componentId} .parent-div`).getBoundingClientRect().left; const cursorSnappedTime = getTimeAtPixel( - e.clientX - this.calculateLeftOffset() - leftOffset, + e.clientX - this.getGanttLeftOffset(), this.getStartDate(), this.getEndDate(), this.getTimelineWidth(), @@ -1044,88 +2121,301 @@ export default class Timeline extends React.Component { mouseMoveFunc(e) { e.persist(); this.throttledMouseMoveFunc(e); + + if (this.state.rightClickDraggingState && this.state.rightClickDraggingState != 'move') { + e = this.state.rightClickDraggingState; + this.onDragStartSelect(e.clientX, e.clientY); + this.setState({rightClickDraggingState: 'move'}); + } else if (this.state.rightClickDraggingState == 'move') { + this.onDragMoveSelect(e.clientX, e.clientY, e.pageX); + } + } + + mouseDownFunc(e) { + // Because we wanted the drag to select feature to work similar to the one in Windows Explorer + // We needed it to work also on right click. But the initial implementation of drag to select from the timeline + // is based on interact js that ignores right click drag (this type of drag is not a nativelly supported one). + // We choosed a basic implementation using mouseDown, mouseMove and mouseUp events for implementing the right click drag to select + if (e.button == 0) { + return; + } + // Just as drag to select with left click works, + // Also the drag to select doesn't start on segments (item_draggable), it needds to start on the empty row + + // In some client applications the segments are complex components and can have a complex children hierachy. + // That's why we needed to iterate from bottom to top the parent hierachy + let target = e.target; + while (target && !target.hasAttribute('data-row-index')) { + if ( + (target.classList && target.classList.contains('item_draggable')) || + target.classList.contains('rct9k-timebar') + ) { + return; + } + target = target.parentElement; + } + + this.setState({rightClickDraggingState: e}); + } + + mouseUpFunc(e) { + if (this.state.rightClickDraggingState) { + if (this.state.rightClickDraggingState == 'move') { + this.onDragEndSelect(e); + } + this.setState({rightClickDraggingState: undefined}); + } + } + + /** + * Toghether with `onTouchMove` and `onTouchEnd` implements the horizontal scroll by dragging the gantt diagram on mobile devices + * + * @param {*} e + */ + onTouchStart(e) { + // We need only to threat touch events on TimelineBody and highligted intervals surface, + // but because TimelineBody is based on a third party component adding the handlers + // directly on these components was not possible easily (It needed to extend this Grid adding by adding a wrapper div on which to add the touch handlers) + // so we added the handler on the parent component and check inside of it to exclude other children like the scrollbar, or the timebar + if ( + !this.state.hasHorizontalScrollbar || + e.target.classList.contains('rct9k-horizontal-scrollbar-outter') || + e.target.classList.contains('rct9k-timebar-item') + ) { + return; + } + const touch = e.touches[0]; + this.setState({touchPositionX: touch.clientX}); + } + + /** + * Toghether with `onTouchStart` and `onTouchStart` implements the horizontal scroll by dragging the gantt diagram on mobile devices + * + * @param {*} e + */ + onTouchMove(e) { + if (this.state.touchPositionX != undefined && this._scrollbar != undefined) { + const touch = e.touches[0]; + const deltaX = touch.clientX - this.state.touchPositionX; + this.setState({touchPositionX: touch.clientX}); + this._scrollbar.scrollwithDelta( + getDurationFromPixels(deltaX, this.getStartDate(), this.getEndDate(), this.getTimelineWidth()).asMilliseconds() + ); + } + } + + /** + * Toghether with `onTouchStart` and `onTouchMove` implements the horizontal scroll by dragging the gantt diagram on mobile devices + * + */ + onTouchEnd(e) { + this.state.touchPositionX && this.setState({touchPositionX: undefined}); + } + + /** + * Setter for verticalGridLines (that will be passed to `BackgroundLayer`). + * @param { object } verticalGridLines + */ + setVerticalGridLines(verticalGridLines) { + this.setState({verticalGridLines}); + } + + handleScrollTable = scrollPos => { + if (this.state.avoidCallingTableScrollHandlers) { + this.setState({avoidCallingTableScrollHandlers: false}); + return; + } + this._gridDomNode.scrollTop = scrollPos; + this.setState({avoidCallingGanttScrollHandlers: true}); + return true; + }; + + handleScrollGantt = ({scrollTop}) => { + if (this.state.avoidCallingGanttScrollHandlers) { + this.setState({avoidCallingGanttScrollHandlers: false}); + return; + } + this.setState({tableScrollTop: scrollTop}); + this.setState({avoidCallingTableScrollHandlers: true}); + return true; + }; + + onSplitChange(width) { + if (this.props.onSplitChange) { + this.props.onSplitChange(width); + } else { + this.setState({splitSize: width}); + } + return true; + } + + /** + * Switches the Gantt in the mode: drag to create. Useful when you have an external mechanism that triggers this creation + * mode (e.g. "tool" like button/buttons). + * @param { boolean } dragToCreateMode + */ + setDragToCreateMode(dragToCreateMode) { + this.setState({dragToCreateMode}); + if (dragToCreateMode) { + this.setState({dragToCreatePopupClosed: false}); + setTimeout(() => this.setState({dragToCreatePopupClosed: true}), DRAG_TO_CREATE_POPUP_CLOSE_TIME); + } + } + + /** + * @returns { JSX.Element } + */ + renderMenuButton() { + return ( + { + const {x, y, width, height} = this._menuButton.getBoundingClientRect(); + const openedContextMenuCoordinates = this.state.openedContextMenuCoordinates; + const buttonCenter = {x: x + width / 2, y: y + height / 2}; + if ( + !openedContextMenuCoordinates || + openedContextMenuCoordinates.x != buttonCenter.x || + openedContextMenuCoordinates.y != buttonCenter.y + ) { + this.setState({openedContextMenuCoordinates: buttonCenter}); + } else { + this.setState({openedContextMenuCoordinates: undefined}); + } + this.setState({openedContextMenuRow: undefined}); + this.setState({openedContextMenuTime: undefined}); + }} + ref={this.menuButton_ref_callback}> + }> +
+
+ Click and drag to create a new segment +
+
+
+
+ {DRAG_TO_CREATE_POPUP_LABEL_2} +
+
+ To cancel you can also click on gantt +
+
+
+ ); } /** - * Calculates left offset of the timeline (group lists). If props.tableColumns is defined, - * the left offset is the sum of the widths of all tableColumns; otherwise returns groupOffset. - * @returns left offset + * @returns { JSX.Element } */ - calculateLeftOffset() { - const {tableColumns, groupOffset} = this.props; - if (!tableColumns || tableColumns.length == 0) { - return groupOffset; + renderContextMenu() { + const actionParam = { + selection: this._selectionHolder ? this._selectionHolder.state.selectedItems : [], + row: this.state.openedContextMenuRow, + time: this.state.openedContextMenuTime + }; + let actions = this.props.onContextMenuShow ? this.props.onContextMenuShow({actionParam}) : []; + if (this.props.onDragToCreateEnded && this.props.forceDragToCreateMode == undefined) { + // If the user doesn't forces the enter/exit from dragToCreateMode => + // a default mechanism is implemented via an action that enters the drag to create mode + actions.push(this.DRAG_TO_CREATE_ACTION); + } + if (this.props.showZoomShortcuts) { + actions.push(this.ZOOM_IN_ACTION); + actions.push(this.ZOOM_OUT_ACTION); } + return ( + actions.length > 0 && + this.state.openedContextMenuCoordinates && ( + + ) + ); + } + + /** + * Show a popup with fadeEffectContent, and start the fadeOut + * @param { string | JSX.Element } fadeEffectContent + */ + startFadeOutEffect(fadeEffectContent) { + this.setState({fadeEffectOpen: true, fadeEffectContent, fadeEffectOpacity: 1}); + let that = this; + this.fadeTimer = setInterval(function() { + if (that.state.fadeEffectOpacity > 0) { + that.setState({fadeEffectOpacity: that.state.fadeEffectOpacity - FADE_OPACITY_OFFSET}); + } else { + clearInterval(that.fadeTimer); + } + }, FADE_TIMER_INTERVAR); + } - let totalOffset = 0; - tableColumns.forEach(column => { - totalOffset += column.width ? column.width : groupOffset; + /** + * @returns { JSX.Element } + */ + renderFadeEffect() { + return ( + + {this.state.fadeEffectContent} + + ); + } + + onHorizontalScroll(scrollPosition) { + const displayIntervalInMiliseconds = this.getEndDate().diff(this.getStartDate(), 'milliseconds'); + this.setState({ + startDate: this.props.useMoment ? moment(scrollPosition) : scrollPosition, + endDate: this.props.useMoment + ? moment(scrollPosition + displayIntervalInMiliseconds) + : scrollPosition + displayIntervalInMiliseconds }); - return totalOffset; } - render() { + renderGanttPart({bodyHeight, timebarHeight}) { const { - onInteraction, - groupOffset, showCursorTime, timebarFormat, componentId, - groupTitleRenderer, shallowUpdateCheck, forceRedrawFunc, bottomResolution, topResolution, - tableColumns + backgroundLayer } = this.props; let that = this; - const divCssClass = `rct9k-timeline-div rct9k-id-${componentId}`; let varTimebarProps = {}; if (timebarFormat) varTimebarProps['timeFormats'] = timebarFormat; if (bottomResolution) varTimebarProps['bottom_resolution'] = bottomResolution; if (topResolution) varTimebarProps['top_resolution'] = topResolution; - function getColumnWidth(column) { - return column.width ? column.width : groupOffset; - } - - function columnWidth(width) { - return ({index}) => { - // The width of the first column when tableColumns is not defined is groupOffset. - if (index == 0 && (!that.props.tableColumns || that.props.tableColumns.length == 0)) return groupOffset; - - // The width of the last column is width minus the left offset. - // The left offset is groupOffset when tableColumns is not defined or - // the sum of the widths of all tableColumns. - let leftOffset = groupOffset; - if (that.props.tableColumns && that.props.tableColumns.length > 0) { - if (index < that.props.tableColumns.length) { - return getColumnWidth(that.props.tableColumns[index]); - } else { - leftOffset = 0; - that.props.tableColumns.forEach(column => { - leftOffset += getColumnWidth(column); - }); - } - } - return width - leftOffset; - }; - } - - function calculateHeight(height) { - if (typeof window === 'undefined') { - return 0; - } - // when this function is called for the first time, the timebar is not yet rendered - let timebar = document.querySelector(`.rct9k-id-${componentId} .rct9k-timebar`); - if (!timebar) { - return 0; - } - // substract timebar height from total height - const timebarHeight = timebar.getBoundingClientRect().height; - return Math.max(height - timebarHeight, 0); - } + const divCssClass = `rct9k-timeline-div rct9k-id-${componentId}`; // Markers (only current time marker atm) const markers = []; @@ -1137,47 +2427,343 @@ export default class Timeline extends React.Component { this.getTimelineWidth() ); markers.push({ - left: cursorPix + this.calculateLeftOffset(), + left: cursorPix, key: 1 }); } + + const ganttVerticalScrollbarWidth = + this._gridDomNode && this._gridDomNode.firstChild + ? this._gridDomNode.getBoundingClientRect().width - this._gridDomNode.firstChild.getBoundingClientRect().width + : 0; return ( -
- - {({height, width}) => ( -
- - - {markers.map(m => ( - - ))} - 0 ? tableColumns.length : 1) + 1} - cellRenderer={this.cellRenderer(this.getTimelineWidth(width))} - grid_ref_callback={this.grid_ref_callback} - shallowUpdateCheck={shallowUpdateCheck} - forceRedrawFunc={forceRedrawFunc} - /> -
- )} -
+
+ { + this.setState({gridWidth: contentRect.bounds ? contentRect.bounds.width : 0}); + this.refreshGrid(); + }}> + {({measureRef}) => { + return ( +
{ + if (this._selectBox.isStart()) { + e.preventDefault(); + this.setState({dragCancel: true}); + this._selectBox.end(); + } + }}> +
{ + if (this._selectBox.isStart()) { + // on right click if drag in progress cancel it + e.preventDefault(); + this.setState({dragCancel: true}); + this._selectBox.end(); + } + }} + onTouchStart={this.onTouchStart} + onTouchMove={this.onTouchMove} + onTouchEnd={this.onTouchEnd}> + + + {markers.map(m => ( + { + return {left: m.left}; + }} + className="rct9k-marker-overlay" + /> + ))} + this.state.gridWidth} + height={bodyHeight - (this.state.hasHorizontalScrollbar ? SCROLLBAR_SIZE : 0)} + rowHeight={this.rowHeight} + rowCount={this.state.groups.length} + columnCount={1} + cellRenderer={this.cellRenderer(this.getTimelineWidth(this.state.gridWidth))} + grid_ref_callback={this.grid_ref_callback} + shallowUpdateCheck={shallowUpdateCheck} + forceRedrawFunc={forceRedrawFunc} + onScroll={this.handleScrollGantt} + /> + { + this.onHorizontalScroll(scrollPosition); + }} + onVisibilityChange={isScrollbarVisible => + this.setState({hasHorizontalScrollbar: isScrollbarVisible}) + } + ref={node => (this._scrollbar = node)}> + {this.renderFadeEffect()} + {this.renderContextMenu()} + {backgroundLayer && + React.cloneElement(backgroundLayer, { + startDateTimeline: this.getStartDate(), + // Because the background layers are in front of the gantt TimelineBody + // (because they need to display in front of the colored background of the rows) + // they cover up the vertical scrollbar. So that's why we need to make then stop before the vertical scrollbar + endDateTimeline: this.getEndDate() + .clone() + .add( + -getDurationFromPixels( + ganttVerticalScrollbarWidth, + this.getStartDate(), + this.getEndDate(), + this.state.gridWidth + ), + 'milliseconds' + ), + width: this.state.gridWidth - ganttVerticalScrollbarWidth, + leftOffset: 0, + height: bodyHeight - (this.state.hasHorizontalScrollbar ? SCROLLBAR_SIZE : 0), + topOffset: timebarHeight, + verticalGridLines: this.state.verticalGridLines + })} +
{this.renderMenuButton()}
+
+
+ ); + }} +
); } + + render() { + const {componentId} = this.props; + /** + * @returns { number } height of the timebar + */ + function getTimebarHeight() { + if (typeof window === 'undefined') { + return 0; + } + // when this function is called for the first time, the timebar is not yet rendered + let timebar = document.querySelector(`.rct9k-id-${componentId} .rct9k-timebar`); + if (!timebar) { + return 0; + } + // substract timebar height from total height + return timebar.getBoundingClientRect().height; + } + + /** + * @param { number } height (total height of the timeline) + * @returns { number } height of the timeline w/o timebar + */ + function calculateHeight(height) { + if (typeof window === 'undefined' || height === undefined) { + return 0; + } + + return Math.max(height - getTimebarHeight(), 0); + } + + const lastRow = this.state.groups[this.state.groups.length - 1]; + const hasEmptyRows = lastRow && this.isEmptyGroup(lastRow.id); + { + /* Instead of , in the past was used. However it would round with/height, which generated and endless + scrollbar appear/disappear, depending on the parent, depending on the resolution. */ + } + return ( + // Can not use empty <> instead of because it fails the documentation generation + + + + {this._table && } + { + // Instead of , in the past was used. However it would round with/height, which generated and endless + // scrollbar appear/disappear, depending on the parent, depending on the resolution. + } + { + const dimensions = { + width: contentRect.bounds ? contentRect.bounds.width : 0, + height: contentRect.bounds ? contentRect.bounds.height : 0 + }; + this.setState({screenHeight: dimensions.height}); + this.refreshGrid(dimensions); + }}> + {({measureRef}) => { + const bodyHeight = calculateHeight(this.state.screenHeight); + const timebarHeight = getTimebarHeight(); + return ( +
+ {this.props.table ? ( + + { + let classNameDefinedByUser = + this.props.table !== undefined && + this.props.table.props.rowClassNameGetter !== undefined && + this.props.table.props.rowClassNameGetter(rowIndex); + if (classNameDefinedByUser) { + return classNameDefinedByUser; + } else { + return this.getRowClassName(rowIndex); + } + }, + // Because the content of the empty rows are now significant + // avoid showing vertical scrollbar in case horizontal scrollbar is needed when shrinking the table + showScrollbarY: !hasEmptyRows, + ...(this.props.onSplitChange ? {} : {width: this.state.splitSize}) + })} + /> + {this.renderGanttPart({bodyHeight, timebarHeight})} + + ) : ( + this.renderGanttPart({bodyHeight, timebarHeight}) + )} +
+ ); + }} +
+
+ ); + } + + selectionChangedHandler(selectedItems) { + // This is because the selectedItems are not kept in the state of the gantt but in the selection component + this._grid.forceUpdate(); + this.props.onSelectionChange(selectedItems); + } + + //////////////////////////////////////////////////////////////////////////////////////// + ////// Test functions + //////////////////////////////////////////////////////////////////////////////////////// + + setCursorTime(x) { + const cursorTime = getTimeAtPixel( + x - this.getGanttLeftOffset(), + this.getStartDate(), + this.getEndDate(), + this.getTimelineWidth(), + this.getTimelineSnap() + ); + this.mouse_snapped_time = cursorTime; + this.setState({cursorTime}); + } + + dragStart(element, offsetX) { + const {x, y} = element.getBoundingClientRect(); + this.onDragStartSelect(offsetX + x, y); + this.setCursorTime(offsetX + x); + } + + async dragMove(x, y, delta = 10) { + let deltaX; + for (let i = 0; i < x; i += delta) { + deltaX = Math.min(i + delta, x); + await new Promise(resolve => setTimeout(resolve, delta)); + this.onDragMoveSelect(this._selectBox.startX + deltaX, this._selectBox.startY + y); + this.setCursorTime(this._selectBox.startX + deltaX); + } + } + + dragEnd(event = {}) { + this.onDragEndSelect(event); + } + + rightClick() { + if (this._selectBox.isStart()) { + this.setState({dragCancel: true}); + this._selectBox.end(); + this.dragEnd(); + } + } + + verticalScrollTo(verticalScrollPosition) { + this.setState( + { + tableScrollTop: verticalScrollPosition, + avoidCallingTableScrollHandlers: true, + avoidCallingGanttScrollHandlers: true + }, + () => { + this._grid.scrollToPosition({scrollTop: verticalScrollPosition}); + } + ); + } + + scrollToItem(id) { + const item = this.props.items ? this.props.items.find(item => item.key == id) : undefined; + if (!item) { + return; + } + + // Horizontal scroll so that the item is in the left part of the diagram with a 10% left padding from the display interval + const displayIntervalInMiliseconds = this.getEndDate().diff(this.getStartDate(), 'milliseconds'); + let scrollTime = this.getStartFromItem(item).valueOf() - displayIntervalInMiliseconds * 0.1; + this.setState({startDate: moment(scrollTime), endDate: moment(scrollTime + displayIntervalInMiliseconds)}); + + // Vertical scoll so that the item is on the first row + const rowIndex = this.props.groups ? this.props.groups.findIndex(group => group.id === item.row) : -1; + if (rowIndex >= 0) { + let exactTop = 0; + for (let i = 0; i < rowIndex; i++) { + exactTop += this.tableRowHeight(i); + } + this.verticalScrollTo(exactTop); + } + + this._selectionHolder.setSelection([item.key]); + } } diff --git a/src/types.d.ts b/src/types.d.ts new file mode 100644 index 00000000..30abef82 --- /dev/null +++ b/src/types.d.ts @@ -0,0 +1,64 @@ +import { IAction, IActionParam, IActionParamForRun, IOnContextMenuShowParam } from "./components/ContextMenu/IAction" + +export type Group = { + id: number, + title?: string +} + +export type InteractOption = { + draggable?: object, + pointerEvents?: object, + resizable?: object +} + +export type Item = { + key: number | string, + row: number, + start?: number | object, + end?: number | object, + title?: string, + style?: object, + className?: string, + color?: string, + tooltip?: string, + gradientStop?: number, + gradientBrightness?: number, + gradientReverseDirection?: boolean, + glowOnHover?: boolean +} + +export type RowLayer = { + start?: number | object, + end?: number | object, + rowNumber: number, + style: object +} + +export type DragToCreateParam = { + groupIndex: number, // Index of selected group + itemIndex: number, // Index for new item + itemStart: object, // Start for new item + itemEnd?: object // End for new item +} + +export interface IGanttOnContextMenuShowParam extends IOnContextMenuShowParam { + actionParam: IGanttActionParam +} + +export interface IGanttActionParam extends IActionParam { + row : number; + /** + * numeric/millis or moment object, cf. `timeline.useMoment` + */ + time: number | object; + selection: (number | string)[]; +} + +export interface IGanttActionParamForRun extends IGanttActionParam, IActionParamForRun { +} + +export interface IGanttAction extends IAction { + run?: (param: IGanttActionParamForRun) => void, + label?: string | ((param: IGanttActionParam) => string), + renderInMenu?: (param: IGanttActionParamForRun) => React.ReactElement +} \ No newline at end of file diff --git a/src/types.js b/src/types.js new file mode 100644 index 00000000..6742560a --- /dev/null +++ b/src/types.js @@ -0,0 +1,5 @@ +/** + * This file is empty, but is needed, because we have types.d.ts. And we do import it from other files + * (needed by tsc when it does its thing to generate the .d.ts files). And if we do this, storybook also + * wants to see a "real" file. + */ diff --git a/src/utils/SelectionHolder.ts b/src/utils/SelectionHolder.ts new file mode 100644 index 00000000..967c4c0a --- /dev/null +++ b/src/utils/SelectionHolder.ts @@ -0,0 +1,109 @@ +import React from "react"; + +interface SelectionHolderProps { + + /** + * This property "dictates" the selection. + * I.e. if this property is set, the selection doesn't change anymore when user interaction happens. + */ + selectedItems: (number | string)[]; + + /** + * The host component should listen when the selection changes by passing this property + * (e.g. of usecase: for updating the item renderers). + */ + selectionChangedHandler : (selectedItems: (number | string)[]) => void; +} + +interface SelectionHolderState { + + /** + * If the host components needs access to the selected items it should use this + */ + selectedItems: (number | string)[]; +} + +/** + * This is a helper non-vizual component meant to compute and hold the selection for other host components like: gantt, table, etc + * The host component should call `addRemoveItems` and listen for selection change by setting `selectionChangedHandler` + * + * @author Daniela Buzatu + */ +export class SelectionHolder extends React.Component { + + constructor(props) { + super(props); + this.state = { + selectedItems: [] + }; + } + + componentDidUpdate(prevProps) { + let selectedItems = this.props.selectedItems; + const prevSelectedItems = prevProps.selectedItems; + if (selectedItems && !prevSelectedItems || !selectedItems && prevSelectedItems || selectedItems && prevSelectedItems && selectedItems.toString() !== prevSelectedItems.toString()) { + selectedItems = this.props.selectedItems ? this.props.selectedItems : []; + this.setState({selectedItems: selectedItems}); + // Notify the host component about selection change + if (this.props.selectionChangedHandler) { + this.props.selectionChangedHandler(selectedItems); + } + } + } + + /** + * Should be called by the host component when an item is clicked or right clicked (contextMenu event) or when user clicks outside any selectable items (for reseting the selection), + * or when any other user action intended to select items happens + * (e.g. in gantt: drawing selection rectangle) + * It adds/removes from selection (in case of multiple selection) or set the selection (in case of single selection) + * + * Usually the right click on the host component works just as a left click regarding the selection. So the host component calls should be the same in both click cases + */ + addRemoveItems(itemsKeys: (number | string)[], event: MouseEvent) { + if (this.props.selectedItems) { + return; + } + + if (event.type == "mousedown" && event.button == 2) { + if (itemsKeys.length == 1 && this.state.selectedItems.includes(itemsKeys[0])) { + // right click on a selected item => doesn't change the selection + return; + } + } + + let newSelection; + if (!(event.ctrlKey || event.shiftKey)) { + // Single selection + newSelection = [...itemsKeys]; + } else { + // Multiple selection + const oldSelection = this.state.selectedItems; + newSelection = oldSelection.slice(); + itemsKeys.forEach(function(itemKey) { + const idx = newSelection.indexOf(itemKey); + if (idx > -1) { + // already in selection => remove it + newSelection.splice(idx, 1); + } else { + // not in selection => add it + newSelection.push(itemKey); + } + }); + } + this.setSelection(newSelection); + } + + setSelection(itemsKeys: (number | string)[]) { + this.setState({ selectedItems: itemsKeys }); + + // Notify the host component about selection change + if (this.props.selectionChangedHandler) { + this.props.selectionChangedHandler(itemsKeys); + } + } + + render(): React.ReactNode { + return null; + } + +} diff --git a/src/utils/commonUtils.js b/src/utils/commonUtils.js index 6c587d21..9e776daf 100644 --- a/src/utils/commonUtils.js +++ b/src/utils/commonUtils.js @@ -7,6 +7,7 @@ export function sumStyle(style, diff) { return intToPix(pixToInt(style) + diff); } + /** * Converts a pixel string to an int * @param {string} pix Pixel string @@ -15,6 +16,7 @@ export function sumStyle(style, diff) { export function pixToInt(pix) { return parseInt(pix.replace('px', '')); } + /** * Convert integer to pixel string. * If not an integer the input is returned as is diff --git a/src/utils/itemUtils.js b/src/utils/itemUtils.js index 8960ece6..936734e5 100644 --- a/src/utils/itemUtils.js +++ b/src/utils/itemUtils.js @@ -3,17 +3,19 @@ import React from 'react'; import _ from 'lodash'; import moment from 'moment'; +import {Item, RowLayer} from '../types'; /** * Render all items in a row * @external {moment} http://momentjs.com/ - * @param {Object[]} items List of items to render for this row + * @param {Item[]} items List of items to render for this row * @param {moment} vis_start The visible start of the timeline * @param {moment} vis_end The visible end of the timeline * @param {number} total_width pixel width of the timeline * @param {number} itemHeight The height of the item in px * @param {function} itemRenderer The renderer of the item * @param {Object[]} selectedItems + * @param {Object} itemRendererDefaultProps * @param {function} getStartFromItem Function that returns the start of an item * @param {function} getEndFromItem Function that returns the end of an item */ @@ -25,59 +27,64 @@ export function rowItemsRenderer( itemHeight, itemRenderer, selectedItems = [], + itemRendererDefaultProps, getStartFromItem, - getEndFromItem + getEndFromItem, + timelineTestids, + displayItemOnSeparateRowIfOverlap, + verticalGapBetweenOverlappingItems, + rowTopBottomPadding, + zIndexFunction, + rowIndex ) { const start_end_ms = vis_end.diff(vis_start, 'milliseconds'); const pixels_per_ms = total_width / start_end_ms; - let filtered_items = _.sortBy( - _.filter(items, i => { - // if end not before window && start not after window - return !getEndFromItem(i).isBefore(vis_start) && !getStartFromItem(i).isAfter(vis_end); - }), - i => -getStartFromItem(i).unix() - ); // sorted in reverse order as we iterate over the array backwards + let filtered_items = _.filter(items, i => { + // if end not before window && start not after window + return !getEndFromItem(i).isBefore(vis_start) && !getStartFromItem(i).isAfter(vis_end); + }); let displayItems = []; - let rowOffset = 0; - while (filtered_items.length > 0) { - let lastEnd = null; - for (let i = filtered_items.length - 1; i >= 0; i--) { - if (lastEnd === null || getStartFromItem(filtered_items[i]) >= lastEnd) { - let item = _.clone(filtered_items[i]); - item.rowOffset = rowOffset; - displayItems.push(item); - filtered_items.splice(i, 1); - lastEnd = getEndFromItem(item); - } + positionItemsOnRowAndGetRowHeight( + filtered_items, + rowIndex, + displayItemOnSeparateRowIfOverlap, + getStartFromItem, + getEndFromItem, + (item, rowOffset) => { + item = _.clone(item); + item.rowOffset = rowOffset; + displayItems.push(item); } - rowOffset++; - } + ); return _.map(displayItems, i => { - const {color} = i; const Comp = itemRenderer; - let top = itemHeight * i['rowOffset']; + var displayCurrentItemOnSeparateRow = + typeof displayItemOnSeparateRowIfOverlap === `function` + ? displayItemOnSeparateRowIfOverlap(i, rowIndex) + : displayItemOnSeparateRowIfOverlap; + let top = displayCurrentItemOnSeparateRow + ? rowTopBottomPadding + i['rowOffset'] * (itemHeight + verticalGapBetweenOverlappingItems) + : rowTopBottomPadding; let item_offset_mins = getStartFromItem(i).diff(vis_start, 'milliseconds'); let item_duration_mins = getEndFromItem(i).diff(getStartFromItem(i), 'milliseconds'); let left = Math.round(item_offset_mins * pixels_per_ms); let width = Math.round(item_duration_mins * pixels_per_ms); - let compClassnames = 'rct9k-items-inner'; + let compClassnames = (i.className || itemRendererDefaultProps.className) + ' rct9k-items-inner'; let outerClassnames = 'rct9k-items-outer item_draggable'; - let style = {backgroundColor: color}; - let isSelected = selectedItems.indexOf(Number(i.key)) > -1; - - if (isSelected) { - compClassnames += ' rct9k-items-selected'; + let style = {}; + let isSelected = selectedItems.find(item => item == i.key); + if (isSelected !== undefined) { outerClassnames += ' rct9k-items-outer-selected'; - style = {}; } return ( - + style={{left, width, top, backgroundColor: 'transparent', zIndex: zIndexFunction(i)}}> + ); }); @@ -85,7 +92,7 @@ export function rowItemsRenderer( /** * Render row layers - * @param {Object[]} layers List of layers to render for this row + * @param {RowLayer[]} layers List of layers to render for this row * @param {moment} vis_start The visible start of the timeline * @param {moment} vis_end The visible end of the timeline * @param {number} total_width pixel width of the timeline @@ -104,30 +111,18 @@ export function rowLayerRenderer( ) { const start_end_ms = vis_end.diff(vis_start, 'milliseconds'); const pixels_per_ms = total_width / start_end_ms; - let filtered_items = _.sortBy( - _.filter(layers, i => { - return !getEndFromRowLayer(i).isBefore(vis_start) && !getStartFromRowLayer(i).isAfter(vis_end); - }), - i => -getStartFromRowLayer(i).unix() - ); // sorted in reverse order as we iterate over the array backwards - let displayItems = []; - let rowOffset = 0; - while (filtered_items.length > 0) { - let lastEnd = null; - for (let i = filtered_items.length - 1; i >= 0; i--) { - if (lastEnd === null || getStartFromRowLayer(filtered_items[i]) >= lastEnd) { - let item = _.clone(filtered_items[i]); - item.rowOffset = rowOffset; - displayItems.push(item); - filtered_items.splice(i, 1); - lastEnd = getEndFromRowLayer(item); - } - } - rowOffset++; - } + const displayItems = _.map( + _.sortBy( + _.filter(layers, i => { + return !getEndFromRowLayer(i).isBefore(vis_start) && !getStartFromRowLayer(i).isAfter(vis_end); + }), + i => getStartFromRowLayer(i).unix() + ), + item => _.clone(item) + ); + return _.map(displayItems, i => { const {style, rowNumber} = i; - let top = itemHeight * i['rowOffset']; let item_offset_mins = getStartFromRowLayer(i).diff(vis_start, 'milliseconds'); let item_duration_mins = getEndFromRowLayer(i).diff(getStartFromRowLayer(i), 'milliseconds'); let left = Math.round(item_offset_mins * pixels_per_ms); @@ -140,7 +135,7 @@ export function rowLayerRenderer( key={`r-${rowNumber}-${getStartFromRowLayer(i).unix()}`} data-item-index={i.key} className={outerClassnames} - style={{...style, left, width, top, height}} + style={{...style, left, width, height}} /> ); }); @@ -223,25 +218,93 @@ export function getNearestRowNumber(x, y, topDiv = document) { /** * Use to find the height of a row, given a set of items - * @param {Object[]} items List of items + * @param {Item[]} items List of items * @param {function} getStartFromItem Function that returns the start of an item. * @param {function} getEndFromItem Function that returns the end of an item. * @param {boolean} useMoment This parameter is necessary because this method is also called when * the component receives new props. * @returns {number} Max row height */ -export function getMaxOverlappingItems(items, getStartFromItem, getEndFromItem, useMoment) { - let max = 0; - let sorted_items = _.sortBy(items, i => -getStartFromItem(i, useMoment).unix()); +export function getMaxOverlappingItems( + items, + getStartFromItem, + getEndFromItem, + useMoment, + displayItemOnSeparateRowIfOverlap, + rowIndex +) { + if (displayItemOnSeparateRowIfOverlap == false) { + return 1; + } + + return positionItemsOnRowAndGetRowHeight( + items, + rowIndex, + displayItemOnSeparateRowIfOverlap, + getStartFromItem, + getEndFromItem + ); +} + +/** + * It finds the ancestor with the provided className of the element. + * @param {Object} element the DOM element + * @param {string} className + * @returns {Object} ancestor with className + */ +export function findAncestorWithClassName(element, className) { + while ((element = element.parentNode) && !element.classList.contains(className)); + return element; +} + +/** + * A special case is when we try to select items from a row that is scrolled (not fully visible). + * The `top` position of that row is not visible, so when we move the mouse and try to find the nearest row object + * using the `top` position, it will not find the actual row because at that position the row is not visible. + * In this case we will use the `top` position of the viewport (the container of the rows). + * @param {Object} row the DOM element of the row object + * @param {number} top + */ +export function adjustRowTopPositionToViewport(row, top) { + let viewport = findAncestorWithClassName(row, 'ReactVirtualized__Grid').getBoundingClientRect(); + if (viewport.top > top) { + return viewport.top; + } + return top; +} + +// *************************************************** +// Internal functions +// *************************************************** +function positionItemsOnRowAndGetRowHeight( + items, + rowIndex, + displayItemOnSeparateRowIfOverlap, + getStartFromItem, + getEndFromItem, + positionItemOnRow = () => {} +) { + let rowOffset = 0; + // sorted in reverse order as we iterate over the array backwards + let sorted_items = _.sortBy(items, i => -getStartFromItem(i).unix()); while (sorted_items.length > 0) { let lastEnd = null; for (let i = sorted_items.length - 1; i >= 0; i--) { - if (lastEnd === null || getStartFromItem(sorted_items[i], useMoment) >= lastEnd) { - lastEnd = getEndFromItem(sorted_items[i], useMoment); + var displayCurrentItemOnSeparateRow = + typeof displayItemOnSeparateRowIfOverlap === `function` + ? displayItemOnSeparateRowIfOverlap(sorted_items[i], rowIndex) + : displayItemOnSeparateRowIfOverlap; + if (lastEnd === null || getStartFromItem(sorted_items[i]) >= lastEnd || !displayCurrentItemOnSeparateRow) { + // Update the lastEnd only for the items that are explicitlly requesting to be on a different row in case of overlapping, + // because the others act like they are invisible for overlapping (any other segments can overlap them without further checking) + if (displayCurrentItemOnSeparateRow) { + lastEnd = getEndFromItem(sorted_items[i]); + } + positionItemOnRow(sorted_items[i], rowOffset); sorted_items.splice(i, 1); } } - max++; + rowOffset++; } - return Math.max(max, 1); + return Math.max(rowOffset, 1); } diff --git a/src/utils/timeUtils.js b/src/utils/timeUtils.js index bafcc343..83dff6b8 100644 --- a/src/utils/timeUtils.js +++ b/src/utils/timeUtils.js @@ -58,6 +58,7 @@ export function getTimeAtPixel(pixel_location, vis_start, vis_end, total_width, if (snapMilliseconds !== 0) timeAtPix = timeSnap(timeAtPix, snapMilliseconds); return timeAtPix; } + /** * Get the pixel location at a specific time * @param {objects} time The time (moment) object @@ -70,6 +71,7 @@ export function getPixelAtTime(time, vis_start, vis_end, total_width) { const min_from_start = time.diff(vis_start, 'milliseconds'); return min_from_start * pixelsPerMillisecond(vis_start, vis_end, total_width); } + /** * Returns the duration from the {@link vis_start} * @param {number} pixels @@ -87,7 +89,20 @@ export function getDurationFromPixels(pixels, vis_start, vis_end, total_width) { } /** - * If useMoment is true returns the date, otherwise converts date to moment. + * @param {duration} the duration in milliseconds + * @param {moment} vis_start The visible start of the timeline + * @param {moment} vis_end The visible end of the timeline + * @param {number} total_width The width in pixels of the grid + */ +export function getPixelsFromDuration(duration, vis_start, vis_end, total_width, snapMilliseconds = 0) { + if (snapMilliseconds !== 0) duration = Math.round(duration / snapMilliseconds) * snapMilliseconds; + return duration * pixelsPerMillisecond(vis_start, vis_end, total_width); +} + +/** + * If `useMoment` is `true` then returns `date` as is. Otherwise converts `date` to + * a moment object. + * * @param {moment|number} date * @param {boolean} useMoment * @returns moment @@ -100,10 +115,12 @@ export function convertDateToMoment(date, useMoment) { } /** - * If useMoment is true returns dateAsMoment, otherwise it converts dateAsMoment to milliseconds. - * @param {moment} dateAsMoment moment to be converted - * @param {boolean} useMoment if true return dateAsMoment, otherwise return millis - * @returns a moment object or date in milliseconds + * If `useMoment` is `true` returns `dateAsMoment` as is. Otherwise it converts `dateAsMoment` to + * number/milliseconds. + * + * @param {moment} dateAsMoment + * @param {boolean} useMoment + * @returns a moment object or a number/milliseconds */ export function convertMomentToDateType(dateAsMoment, useMoment) { if (useMoment) { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..4aa5c58d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "include": [ + "src" + ], + "compilerOptions": { + "outDir": "types", + "allowJs": true, + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "experimentalDecorators": true, + "sourceMap": true + } +} \ No newline at end of file diff --git a/webpack.common.js b/webpack.common.js deleted file mode 100644 index 43137103..00000000 --- a/webpack.common.js +++ /dev/null @@ -1,29 +0,0 @@ -const path = require('path'); - -module.exports = { - entry: './src/index.js', - output: { - filename: '[name].bundle.js', - path: path.resolve(__dirname, 'dist') - }, - plugins: [], - module: { - rules: [ - { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }, - {test: /\.css$/, - use: [ - { loader: "style-loader" }, - { loader: "css-loader" } - ]} - ] - }, - resolve: { - modules: [ - path.resolve(__dirname, './node_modules'), - path.resolve(__dirname, './src') - ], -}, - stats: { - colors: true - } -}; diff --git a/webpack.demo.prod.js b/webpack.demo.prod.js deleted file mode 100644 index de7917cf..00000000 --- a/webpack.demo.prod.js +++ /dev/null @@ -1,26 +0,0 @@ -const webpack = require('webpack'); -const merge = require('webpack-merge'); -const common = require('./webpack.common.js'); - -const HtmlWebpackPlugin = require('html-webpack-plugin'); - -module.exports = merge(common, { - entry: './src/demo_index.js', - mode: 'production', - devtool: 'source-map', - plugins: [ - new HtmlWebpackPlugin({ - title: 'React Timeline 9000', - template: 'src/demo.html', - chunksSortMode: 'auto', - inject: 'body', - minify: { - removeComments: false, - collapseWhitespace: false - } - }), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('production') - }) - ] -}); diff --git a/webpack.dev.js b/webpack.dev.js deleted file mode 100644 index 4f736c7d..00000000 --- a/webpack.dev.js +++ /dev/null @@ -1,25 +0,0 @@ -const {merge} = require('webpack-merge'); -const common = require('./webpack.common.js'); - -const HtmlWebpackPlugin = require('html-webpack-plugin'); - -module.exports = merge(common, { - entry: './src/demo_index.js', - mode: 'development', - devtool: 'inline-source-map', - plugins: [ - new HtmlWebpackPlugin({ - title: 'React Timeline 9000', - template: 'src/demo.html', - chunksSortMode: 'auto', - inject: 'body', - minify: { - removeComments: false, - collapseWhitespace: false - } - }) - ], - devServer: { - static: './dist' - } -}); diff --git a/webpack.prod.js b/webpack.prod.js deleted file mode 100644 index 82f6a3ba..00000000 --- a/webpack.prod.js +++ /dev/null @@ -1,18 +0,0 @@ -const webpack = require('webpack'); -const {merge} = require('webpack-merge'); -const common = require('./webpack.common.js'); - -const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); - -module.exports = merge(common, { - mode: 'production', - devtool: 'source-map', - plugins: [ - new UglifyJSPlugin({ - sourceMap: true - }), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('production') - }) - ] -}); diff --git a/yarn.lock b/yarn.lock index 1b5607fb..e421605b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,562 +2,357 @@ # yarn lockfile v1 -"@ant-design/colors@^3.1.0": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-3.2.2.tgz#5ad43d619e911f3488ebac303d606e66a8423903" - integrity sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ== - dependencies: - tinycolor2 "^1.4.1" - -"@ant-design/create-react-context@^0.2.4": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@ant-design/create-react-context/-/create-react-context-0.2.5.tgz#f5f5a9163b4772097712837397ad30e22e79f858" - integrity sha512-1rMAa4qgP2lfl/QBH9i78+Gjxtj9FTMpMyDGZsEBW5Kih72EuUo9958mV8PgpRkh4uwPSQ7vVZWXeyNZXVAFDg== - dependencies: - gud "^1.0.0" - warning "^4.0.3" - -"@ant-design/css-animation@^1.7.2": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@ant-design/css-animation/-/css-animation-1.7.3.tgz#60a1c970014e86b28f940510d69e503e428f1136" - integrity sha512-LrX0OGZtW+W6iLnTAqnTaoIsRelYeuLZWsrmBJFUXDALQphPsN8cE5DCsmoSlL0QYb94BQxINiuS70Ar/8BNgA== - -"@ant-design/icons-react@~2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@ant-design/icons-react/-/icons-react-2.0.1.tgz#17a2513571ab317aca2927e58cea25dd31e536fb" - integrity sha512-r1QfoltMuruJZqdiKcbPim3d8LNsVPB733U0gZEUSxBLuqilwsW28K2rCTWSMTjmFX7Mfpf+v/wdiFe/XCqThw== - dependencies: - "@ant-design/colors" "^3.1.0" - babel-runtime "^6.26.0" - -"@ant-design/icons@~2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-2.1.1.tgz#7b9c08dffd4f5d41db667d9dbe5e0107d0bd9a4a" - integrity sha512-jCH+k2Vjlno4YWl6g535nHR09PwCEmTBKAG6VqF+rhkrSPRLfgpU2maagwbZPLjaHuU5Jd1DFQ2KJpQuI6uG8w== +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/cli@^7.0.0": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.22.9.tgz#501b3614aeda7399371f6d5991404f069b059986" + integrity sha512-nb2O7AThqRo7/E53EGiuAkMaRbb7J5Qp3RvN+dmua1U+kydm0oznkhqbTEG15yk26G/C3yL6OdZjzgl+DMXVVA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + commander "^4.0.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.2.0" + make-dir "^2.1.0" + slash "^2.0.0" + optionalDependencies: + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" + chokidar "^3.4.0" -"@babel/code-frame@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" - integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== +"@babel/code-frame@^7.0.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: - "@babel/highlight" "7.0.0-beta.44" + "@babel/highlight" "^7.22.5" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" - integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" - integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.16.7" - "@babel/parser" "^7.16.12" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.10" - "@babel/types" "^7.16.8" - convert-source-map "^1.7.0" +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + +"@babel/compat-data@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" + integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== + +"@babel/core@^7.0.0": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" + integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/generator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" - integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" -"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" - integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/types" "^7.16.8" - jsesc "^2.5.1" - source-map "^0.5.0" + "@babel/types" "^7.22.5" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.15" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== +"@babel/helper-compilation-targets@^7.22.6": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" - integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" - integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" - integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== +"@babel/helper-define-polyfill-provider@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" - integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== - dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.44" - "@babel/template" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-get-function-arity@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" - integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== - dependencies: - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-member-expression-to-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" - integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/types" "^7.16.7" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" - integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: - "@babel/types" "^7.16.7" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" - integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== - dependencies: - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helpers@^7.12.5", "@babel/helpers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" - integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/highlight@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" - integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7": - version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" - integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - -"@babel/plugin-proposal-async-generator-functions@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" - integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" - integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" - integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-decorators@^7.12.12": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz#922907d2e3e327f5b07d2246bcfc0bd438f360d2" - integrity sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-decorators" "^7.16.7" - -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-default-from@^7.12.1": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.7.tgz#a40ab158ca55627b71c5513f03d3469026a9e929" - integrity sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-default-from" "^7.16.7" - -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" - integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" - -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" - integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" - integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.16.11": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" - integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.10" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" - integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -580,13 +375,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" - integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -594,13 +382,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.7.tgz#fa89cf13b60de2c3f79acdc2b52a21174c6de060" - integrity sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" @@ -608,12 +389,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" - integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -622,19 +417,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" - integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -657,7 +445,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -692,344 +480,484 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== +"@babel/plugin-syntax-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" + integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" - integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" - integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== +"@babel/plugin-transform-block-scoping@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" - integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" - integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" - integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" - integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== +"@babel/plugin-transform-modules-amd@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== +"@babel/plugin-transform-modules-commonjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== +"@babel/plugin-transform-modules-systemjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-flow-strip-types@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" - integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-flow" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" - integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" - integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" - integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== +"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" - integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-umd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-new-target@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== +"@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" - integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" + integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" -"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" - integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" - integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" - integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" - integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-typeof-symbol@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-typescript@^7.16.7": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" - integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-typescript" "^7.16.7" - -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/preset-env@^7.12.11": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== - dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.21.0": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027" + integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" + integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== + dependencies: + "@babel/compat-data" "^7.23.2" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -1039,469 +967,320 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" - semver "^6.3.0" - -"@babel/preset-flow@^7.12.1": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.16.7.tgz#7fd831323ab25eeba6e4b77a589f680e30581cbd" - integrity sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-flow-strip-types" "^7.16.7" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.23.2" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.23.0" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.23.0" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.23.0" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-modules-systemjs" "^7.23.0" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.23.0" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.23.0" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.10": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" - integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" - -"@babel/preset-typescript@^7.12.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" - integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-typescript" "^7.16.7" - -"@babel/register@^7.12.1": - version "7.16.9" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.16.9.tgz#fcfb23cfdd9ad95c9771e58183de83b513857806" - integrity sha512-jJ72wcghdRIlENfvALcyODhNoGE5j75cYHdC+aQMh6cU/P86tiiXTp9XYZct1UxUMo/4+BgQRyNZEGx0KWGS+g== - dependencies: - clone-deep "^4.0.1" - find-cache-dir "^2.0.0" - make-dir "^2.1.0" - pirates "^4.0.0" - source-map-support "^0.5.16" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.8", "@babel/runtime@^7.16.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - lodash "^4.2.0" - -"@babel/template@^7.12.7", "@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" - integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/generator" "7.0.0-beta.44" - "@babel/helper-function-name" "7.0.0-beta.44" - "@babel/helper-split-export-declaration" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - debug "^3.1.0" - globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.2.0" - -"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" - integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.16.10" - "@babel/types" "^7.16.8" +"@babel/preset-react@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" + integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + +"@babel/preset-typescript@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz#c8de488130b7081f7e1482936ad3de5b018beef4" + integrity sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-typescript" "^7.22.15" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.4", "@babel/runtime@^7.10.5", "@babel/runtime@^7.2.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.4": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" - integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== +"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.23.0", "@babel/types@^7.4.4": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: - esutils "^2.0.2" - lodash "^4.2.0" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.2.0", "@babel/types@^7.4.4": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" - integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== +"@babel/types@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" -"@base2/pretty-print-object@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" - integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA== +"@crispico/foundation-gwt-js@^1.4.0": + version "1.4.0" + resolved "http://csp-dev-tools.lan/nexus/repository/npm-public/@crispico/foundation-gwt-js/-/foundation-gwt-js-1.4.0.tgz#f8006fa4bde7b4cd10de2b769c5e98815f35df1c" + integrity sha512-p7j+OxT3dcO6fOxS1ISIvsJuiteIMjkXBrjHetwajUKFoDDsyJ+Pe/Enog3yzLxg/6PcfQ+jNbtheEWK9sI2rQ== -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@famiprog-foundation/scriptable-ui@^2.0.1": + version "2.0.1" + resolved "http://csp-dev-tools.lan/nexus/repository/npm-public/@famiprog-foundation/scriptable-ui/-/scriptable-ui-2.0.1.tgz#ce8e8266db8aeecfcca2f72b8c130032930aa9b1" + integrity sha512-+tqGfKxs9kvlAygrKzOHX5Zb7BeNXJid+JIdyuPD9G7UJqABIm2y9Q32DnJJXA0y51n7oJmF0RiHPX0/ffqwmw== + dependencies: + "@crispico/foundation-gwt-js" "^1.4.0" + "@famiprog-foundation/utils" "^1.0.0" + "@types/react-measure" "^2.0.12" + react-draggable "4.4.6" + react-floater "^0.8.2" + react-measure "^2.5.2" + react-syntax-highlighter "^15.5.0" + +"@famiprog-foundation/tests-are-demo@^1.2.1": + version "1.3.0" + resolved "http://csp-dev-tools.lan/nexus/repository/npm-public/@famiprog-foundation/tests-are-demo/-/tests-are-demo-1.3.0.tgz#942cfb6c27307f41d37bc58d236b341496bb1169" + integrity sha512-ntIuEdNmVbxCExxrNFGiPcywGGnE35K3ex/ftLGGjPJh+Gk7HvnyolMGJux+FMc/fufU+dm9YRwlainq+qs8kg== + dependencies: + "@famiprog-foundation/scriptable-ui" "^2.0.1" + "@famiprog-foundation/utils" "^1.0.0" + "@jridgewell/trace-mapping" "^0.3.19" + "@testing-library/react" "^12.1.2" + "@testing-library/user-event" "^13.2.1" + chai "4.2.0" + chai-subset "1.6.0" + error-stack-parser "^2.1.4" + immer "^10.0.3" + lodash "4.17.15" + mocha "^10.1.0" + puppeteer "^19.6.2" + react-markdown "^8.0.7" + react-split-pane "^0.1.92" + rehype-autolink-headings "^6.1.1" + rehype-raw "^6.1.1" + rehype-slug "^5.1.0" + remark-gfm "^3.0.1" + stack-trace "^1.0.0-pre2" + +"@famiprog-foundation/utils@^1.0.0": + version "1.0.0" + resolved "http://csp-dev-tools.lan/nexus/repository/npm-public/@famiprog-foundation/utils/-/utils-1.0.0.tgz#bba2d4481ccb45c1bdea4cb72e7d924cb37b41c4" + integrity sha512-Z62/zh2PYTRwn2pxY72/FtlOI703abyd8KmqIkmJH59V3AIunQKJafvAppey2Vace3/819xilX05nuKOBe4HNQ== -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== +"@fluentui/react-component-event-listener@~0.63.0": + version "0.63.1" + resolved "https://registry.yarnpkg.com/@fluentui/react-component-event-listener/-/react-component-event-listener-0.63.1.tgz#c2af94893671f1d6bfe2a8a07dcfa2cb01b85f52" + integrity sha512-gSMdOh6tI3IJKZFqxfQwbTpskpME0CvxdxGM2tdglmf6ZPVDi0L4+KKIm+2dN8nzb8Ya1A8ZT+Ddq0KmZtwVQg== dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.3": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" - integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== - -"@emotion/cache@^10.0.27": - version "10.0.29" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0" - integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ== - dependencies: - "@emotion/sheet" "0.9.4" - "@emotion/stylis" "0.8.5" - "@emotion/utils" "0.11.3" - "@emotion/weak-memoize" "0.2.5" - -"@emotion/core@^10.1.1": - version "10.3.1" - resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.3.1.tgz#4021b6d8b33b3304d48b0bb478485e7d7421c69d" - integrity sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/cache" "^10.0.27" - "@emotion/css" "^10.0.27" - "@emotion/serialize" "^0.11.15" - "@emotion/sheet" "0.9.4" - "@emotion/utils" "0.11.3" - -"@emotion/css@^10.0.27": - version "10.0.27" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c" - integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw== - dependencies: - "@emotion/serialize" "^0.11.15" - "@emotion/utils" "0.11.3" - babel-plugin-emotion "^10.0.27" - -"@emotion/hash@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/is-prop-valid@0.8.8", "@emotion/is-prop-valid@^0.8.6": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16": - version "0.11.16" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad" - integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg== - dependencies: - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/unitless" "0.7.5" - "@emotion/utils" "0.11.3" - csstype "^2.5.7" - -"@emotion/sheet@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5" - integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== - -"@emotion/styled-base@^10.3.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.3.0.tgz#9aa2c946100f78b47316e4bc6048321afa6d4e36" - integrity sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/is-prop-valid" "0.8.8" - "@emotion/serialize" "^0.11.15" - "@emotion/utils" "0.11.3" - -"@emotion/styled@^10.0.27": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.3.0.tgz#8ee959bf75730789abb5f67f7c3ded0c30aec876" - integrity sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ== - dependencies: - "@emotion/styled-base" "^10.3.0" - babel-plugin-emotion "^10.0.27" - -"@emotion/stylis@0.8.5": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + "@babel/runtime" "^7.10.4" -"@emotion/unitless@0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@emotion/utils@0.11.3": - version "0.11.3" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924" - integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== - -"@emotion/weak-memoize@0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@fluentui/react-component-ref@~0.63.0": + version "0.63.1" + resolved "https://registry.yarnpkg.com/@fluentui/react-component-ref/-/react-component-ref-0.63.1.tgz#a7778e2a5c724d12e828afd994c93fa2da44f64e" + integrity sha512-8MkXX4+R3i80msdbD4rFpEB4WWq2UDvGwG386g3ckIWbekdvN9z2kWAd9OXhRGqB7QeOsoAGWocp6gAMCivRlw== + dependencies: + "@babel/runtime" "^7.10.4" + react-is "^16.6.3" -"@gar/promisify@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" - integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== +"@gilbarbara/deep-equal@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@gilbarbara/deep-equal/-/deep-equal-0.1.2.tgz#1a106721368dba5e7e9fb7e9a3a6f9efbd8df36d" + integrity sha512-jk+qzItoEb0D0xSSmrKDDzf9sheQj/BAPxlgNxgmOaA3mxpUa6ndJLYGZKsJnIVEQSD8zcTbyILz7I0HcnBCRA== -"@interactjs/types@1.10.11": - version "1.10.11" - resolved "https://registry.yarnpkg.com/@interactjs/types/-/types-1.10.11.tgz#29be25d503f9c7842df062fa3cda5b044a47cf2a" - integrity sha512-YRsVFWjL8Gkkvlx3qnjeaxW4fnibSJ9791g8BA7Pv5ANByI64WmtR1vU7A2rXcrOn8XvyCEfY0ss1s8NhZP+MA== +"@interactjs/types@1.10.17": + version "1.10.17" + resolved "https://registry.yarnpkg.com/@interactjs/types/-/types-1.10.17.tgz#1649de06d9ead790c81ecece76736b852bdfc77e" + integrity sha512-X2JpoM7xUw0p9Me0tMaI0HNfcF/Hd07ZZlzpnpEMpGerUZOLoyeThrV9P+CrBHxZrluWJrigJbcdqXliFd0YMA== -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - 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.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + "@sinclair/typebox" "^0.27.8" -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@mdx-js/loader@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-1.6.22.tgz#d9e8fe7f8185ff13c9c8639c048b123e30d322c4" - integrity sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q== - dependencies: - "@mdx-js/mdx" "1.6.22" - "@mdx-js/react" "1.6.22" - loader-utils "2.0.0" - -"@mdx-js/mdx@1.6.22", "@mdx-js/mdx@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" - integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== - dependencies: - "@babel/core" "7.12.9" - "@babel/plugin-syntax-jsx" "7.12.1" - "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "1.6.22" - babel-plugin-apply-mdx-type-prop "1.6.22" - babel-plugin-extract-import-names "1.6.22" - camelcase-css "2.0.1" - detab "2.0.4" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "10.0.1" - remark-footnotes "2.0.0" - remark-mdx "1.6.22" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" - -"@mdx-js/react@1.6.22", "@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== - -"@mdx-js/util@1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" - integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" -"@npmcli/fs@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.0.tgz#bec1d1b89c170d40e1b73ad6c943b0b75e7d2951" - integrity sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA== +"@jridgewell/trace-mapping@^0.3.19", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@pmmmwh/react-refresh-webpack-plugin@^0.5.1": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz#df0d0d855fc527db48aac93c218a0bf4ada41f99" - integrity sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw== - dependencies: - ansi-html-community "^0.0.8" - common-path-prefix "^3.0.0" - core-js-pure "^3.8.1" - error-stack-parser "^2.0.6" - find-up "^5.0.0" - html-entities "^2.1.0" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - source-map "^0.7.3" +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": + version "2.1.8-no-fsevents.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" + integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== + +"@popperjs/core@^2.11.5", "@popperjs/core@^2.6.0": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0": - version "2.11.2" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.2.tgz#830beaec4b4091a9e9398ac50f865ddea52186b9" - integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA== +"@puppeteer/browsers@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-0.5.0.tgz#1a1ee454b84a986b937ca2d93146f25a3fe8b670" + integrity sha512-Uw6oB7VvmPRLE4iKsjuOh8zgDabhNX67dzo8U/BB0f9527qx+4eeUs+korU98OhG5C4ubg7ufBgVi63XYwS6TQ== + dependencies: + debug "4.3.4" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + yargs "17.7.1" + +"@reduxjs/toolkit@^1.5.1": + version "1.9.7" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.7.tgz#7fc07c0b0ebec52043f8cb43510cf346405f78a6" + integrity sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ== + dependencies: + immer "^9.0.21" + redux "^4.2.1" + redux-thunk "^2.4.2" + reselect "^4.1.8" "@samverschueren/stream-to-observable@^0.3.0": version "0.3.1" @@ -1510,1516 +1289,167 @@ dependencies: any-observable "^0.3.0" -"@storybook/addon-actions@6.4.16", "@storybook/addon-actions@^6.3.11": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.4.16.tgz#318a0060098f81c0287cc9df5d9f3bd92264ec38" - integrity sha512-3rhlyt7QAIdGKDhEP2+KKfO6qFCU0jv9QzEoPj6K0d6tFO0Iia4QdTrks+hksKOjKDO/dCwmgbtk9B+jqAS0Sg== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/theming" "6.4.16" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - polished "^4.0.5" - prop-types "^15.7.2" - react-inspector "^5.1.0" - regenerator-runtime "^0.13.7" - telejson "^5.3.2" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - uuid-browser "^3.1.0" - -"@storybook/addon-backgrounds@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.16.tgz#d91e12612d6e86f125cea7dd69e6d6d659906bb1" - integrity sha512-5zrv7jAaesshViGT90DWtg4F47q3e0AUaCuGB/OcbGaChu5Pl01TqMoXykfquKIAhjLwjkhIq72ctbvgNhhGCw== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/theming" "6.4.16" - core-js "^3.8.2" - global "^4.4.0" - memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/addon-controls@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.4.16.tgz#75dd00c8f17267e9ead370d740b1192e32698494" - integrity sha512-WIGVvVwP7e9ccEjMrHEOZJofbxTyyFzHZfNRfm4Klp1umrzJZOx/LdS2f+YN+Gi7y49ApvHS03UKL1GTOQHupA== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/core-common" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/node-logger" "6.4.16" - "@storybook/store" "6.4.16" - "@storybook/theming" "6.4.16" - core-js "^3.8.2" - lodash "^4.17.21" - ts-dedent "^2.0.0" - -"@storybook/addon-docs@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-6.4.16.tgz#0db0ebc193481f676472ee9bc8edc915c0f76499" - integrity sha512-oC4ui6JEl72r1/Q6shKafVppW/K0ot87NdB+Grx7jtZYfo809HvJ2sNx/12NAwN/5QQLUvkW/qJ28qEo8x0nlg== - dependencies: - "@babel/core" "^7.12.10" - "@babel/generator" "^7.12.11" - "@babel/parser" "^7.12.11" - "@babel/plugin-transform-react-jsx" "^7.12.12" - "@babel/preset-env" "^7.12.11" - "@jest/transform" "^26.6.2" - "@mdx-js/loader" "^1.6.22" - "@mdx-js/mdx" "^1.6.22" - "@mdx-js/react" "^1.6.22" - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/builder-webpack4" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/core" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/csf-tools" "6.4.16" - "@storybook/node-logger" "6.4.16" - "@storybook/postinstall" "6.4.16" - "@storybook/preview-web" "6.4.16" - "@storybook/source-loader" "6.4.16" - "@storybook/store" "6.4.16" - "@storybook/theming" "6.4.16" - acorn "^7.4.1" - acorn-jsx "^5.3.1" - acorn-walk "^7.2.0" - core-js "^3.8.2" - doctrine "^3.0.0" - escodegen "^2.0.0" - fast-deep-equal "^3.1.3" - global "^4.4.0" - html-tags "^3.1.0" - js-string-escape "^1.0.1" - loader-utils "^2.0.0" - lodash "^4.17.21" - nanoid "^3.1.23" - p-limit "^3.1.0" - prettier ">=2.2.1 <=2.3.0" - prop-types "^15.7.2" - react-element-to-jsx-string "^14.3.4" - regenerator-runtime "^0.13.7" - remark-external-links "^8.0.0" - remark-slug "^6.0.0" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/addon-essentials@^6.3.11": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-6.4.16.tgz#02908372dc7be34f4e22cdf15bef268d9726f676" - integrity sha512-qKQR74+96Hj21HWrBj9FfTc8jvQNTOqFLPXsZzZXkxIsH6IcL5xs8KpjdjEWt2RrBiwlpcTSfxHULC1L7cLQDA== - dependencies: - "@storybook/addon-actions" "6.4.16" - "@storybook/addon-backgrounds" "6.4.16" - "@storybook/addon-controls" "6.4.16" - "@storybook/addon-docs" "6.4.16" - "@storybook/addon-measure" "6.4.16" - "@storybook/addon-outline" "6.4.16" - "@storybook/addon-toolbars" "6.4.16" - "@storybook/addon-viewport" "6.4.16" - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/node-logger" "6.4.16" - core-js "^3.8.2" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - -"@storybook/addon-links@^6.3.11": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-6.4.16.tgz#1dc77181bde2d3cb7f5769b713efd4f063861293" - integrity sha512-8Efdl0K1sgFwsjHHoeAgtKIRBvnjsSFPXM9WtrvXgxJVLAqHiFw+cuo591tEprECKSIpJSwyWh4cEfbL7n74Mg== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/router" "6.4.16" - "@types/qs" "^6.9.5" - core-js "^3.8.2" - global "^4.4.0" - prop-types "^15.7.2" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - -"@storybook/addon-measure@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-6.4.16.tgz#6a69d0e71635a25ce45f18ae09c33a928208b6e2" - integrity sha512-hMdFNAXvZkR9VCeqKQO+EE6Tro8bqYsgIUmuOIEwiexjFXJxH/mW4xs6e624TFu4fv96qA7hYAIj0hyKpXa+VA== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - core-js "^3.8.2" - global "^4.4.0" - -"@storybook/addon-outline@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-6.4.16.tgz#d0a674e453e85141063dfeb6c2977be6f58fc926" - integrity sha512-yWj/oJ+nBgjIP6d8PtHJckNXoK3HACpZ+c0cC/3bXtjWH93DxUHIu2Qlt7oyYfzmw3eIHs6Pr063kl/MPsrT2A== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - core-js "^3.8.2" - global "^4.4.0" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - -"@storybook/addon-toolbars@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.4.16.tgz#f63d0977f5466a85f059b2e6fc9457c1db5812c1" - integrity sha512-ySiPdYS8BWl69RkONExRojTnFgjdGk6u9tGweqpfBcqDcej/XsJK+cEYFllXbTHGrYmlRiNyW0Sc5AWsths0lQ== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/theming" "6.4.16" - core-js "^3.8.2" - regenerator-runtime "^0.13.7" - -"@storybook/addon-viewport@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-6.4.16.tgz#ad40846e7241870e0fdcacd9154d4e5e0938b47e" - integrity sha512-p8+LIg3Kfh0vzOmiiIlYMWnXDL3ham3a8BVRb8/GiQ9pmtTe6L2yKY8Ae9CHISpANt2nvirVbQ2Cs1J15FDSYA== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/theming" "6.4.16" - core-js "^3.8.2" - global "^4.4.0" - memoizerific "^1.11.3" - prop-types "^15.7.2" - regenerator-runtime "^0.13.7" - -"@storybook/addons@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.4.16.tgz#9024dcbf586574c142e2567c9e795f5a537e5322" - integrity sha512-/WFlNKohu7ME9Y/LwW8LunlBjjgmeT4uEE+0qXS++csH9RitJNh0SbtaJd7c3QQR0epHyZ4ubp3qRmSt+jdYKg== - dependencies: - "@storybook/api" "6.4.16" - "@storybook/channels" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/router" "6.4.16" - "@storybook/theming" "6.4.16" - "@types/webpack-env" "^1.16.0" - core-js "^3.8.2" - global "^4.4.0" - regenerator-runtime "^0.13.7" - -"@storybook/api@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.4.16.tgz#8ec04b9013a27fc7b2633a5b5794531bebbde51e" - integrity sha512-GQup6tdFHUwUYzn2GmAnL+bN4yMv4fc/V3aGY3njMDteWr6/bsvsTF9VecJEqEEwnr3SKpqRAY79fq8TTFdnzg== - dependencies: - "@storybook/channels" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/router" "6.4.16" - "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.4.16" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" - store2 "^2.12.0" - telejson "^5.3.2" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/builder-webpack4@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.4.16.tgz#36f2a7ce9ae6b57b6da931eacdefe156f7922029" - integrity sha512-tnsOaQM4Iy9L8HJ0ezZNx6NpB7i1/0wgCTsxBDy6R2EKe1W25S19tmgPPQowi0Gv4ffElNucTcPQRI2o5S71bg== - dependencies: - "@babel/core" "^7.12.10" - "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-decorators" "^7.12.12" - "@babel/plugin-proposal-export-default-from" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.7" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.12" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/preset-env" "^7.12.11" - "@babel/preset-react" "^7.12.10" - "@babel/preset-typescript" "^7.12.7" - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/channel-postmessage" "6.4.16" - "@storybook/channels" "6.4.16" - "@storybook/client-api" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/core-common" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/node-logger" "6.4.16" - "@storybook/preview-web" "6.4.16" - "@storybook/router" "6.4.16" - "@storybook/semver" "^7.3.2" - "@storybook/store" "6.4.16" - "@storybook/theming" "6.4.16" - "@storybook/ui" "6.4.16" - "@types/node" "^14.0.10" - "@types/webpack" "^4.41.26" - autoprefixer "^9.8.6" - babel-loader "^8.0.0" - babel-plugin-macros "^2.8.0" - babel-plugin-polyfill-corejs3 "^0.1.0" - case-sensitive-paths-webpack-plugin "^2.3.0" - core-js "^3.8.2" - css-loader "^3.6.0" - file-loader "^6.2.0" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^4.1.6" - glob "^7.1.6" - glob-promise "^3.4.0" - global "^4.4.0" - html-webpack-plugin "^4.0.0" - pnp-webpack-plugin "1.6.4" - postcss "^7.0.36" - postcss-flexbugs-fixes "^4.2.1" - postcss-loader "^4.2.0" - raw-loader "^4.0.2" - stable "^0.1.8" - style-loader "^1.3.0" - terser-webpack-plugin "^4.2.3" - ts-dedent "^2.0.0" - url-loader "^4.1.1" - util-deprecate "^1.0.2" - webpack "4" - webpack-dev-middleware "^3.7.3" - webpack-filter-warnings-plugin "^1.2.1" - webpack-hot-middleware "^2.25.1" - webpack-virtual-modules "^0.2.2" - -"@storybook/channel-postmessage@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.4.16.tgz#e754ce86e81274b7d86f6d9eb6182ba130874392" - integrity sha512-Qy41zV5ECMDauGIYJ40BSAT81ch/XXuexJv0O4aMQ+6Uy518jpECp/AaAOEBllhqbAaGyj3y4I85edcg5rIkYQ== - dependencies: - "@storybook/channels" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/core-events" "6.4.16" - core-js "^3.8.2" - global "^4.4.0" - qs "^6.10.0" - telejson "^5.3.2" - -"@storybook/channel-websocket@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.4.16.tgz#e2c45198572b6cd2492685c309e2441be0f34922" - integrity sha512-+mo32d1em+jtEGWK93OaCn2sMnCK0HDP4FRidTlmJR1UG5riaXNlZhKE5fEp0T9EHmMhgoVWikaG82QECk+alQ== - dependencies: - "@storybook/channels" "6.4.16" - "@storybook/client-logger" "6.4.16" - core-js "^3.8.2" - global "^4.4.0" - telejson "^5.3.2" - -"@storybook/channels@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.4.16.tgz#2bfc0712b544eb9edb571774302543dc83e6c987" - integrity sha512-61F/lNfkkWqg6CnWSYguJ8SgYDbzrPRnfBKWxjXEGf3eQZNT1g+sGpdCtZ77fOL+x8tzXR3DFOwipmC0oMSIRw== - dependencies: - core-js "^3.8.2" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/client-api@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.4.16.tgz#17bacdb284aa1b5e90c5178f51b4c82b1d56a48d" - integrity sha512-beMneHc6MC/rE771F5xXFNv7RGYi+boGbVi+8o88got80a8wE64YfHydPG1FxWcvrI1d0yZj1Nh1cAdz4HswOQ== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/channel-postmessage" "6.4.16" - "@storybook/channels" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/store" "6.4.16" - "@types/qs" "^6.9.5" - "@types/webpack-env" "^1.16.0" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - store2 "^2.12.0" - synchronous-promise "^2.0.15" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/client-logger@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.4.16.tgz#f698897e4ea804fd3cdc56153210f1a67e24ef64" - integrity sha512-+gWlCOGqPPs+J5KRQ5uMFiMhiuCy+h2+ns7gT1APHaXNMTr7EgDXQlGCrIOvuqHAA0YSI3h9YfKfQs5/tWWSXw== - dependencies: - core-js "^3.8.2" - global "^4.4.0" - -"@storybook/components@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.4.16.tgz#f283382dbe945f191e3b7d4e3e4bc7f5376f1e2e" - integrity sha512-UxHupO/CVXY8J7axtI2pLvHaPolL4U6bNO+2sBeGzPKkpb+46duT4LAt5O2Yaz+g9H0t2Ky/1BcqXdngaOf9jA== +"@semantic-ui-react/event-stack@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@semantic-ui-react/event-stack/-/event-stack-3.1.3.tgz#2862d2631d67dd846c705db2fc1ede1c468be3a1" + integrity sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ== dependencies: - "@popperjs/core" "^2.6.0" - "@storybook/client-logger" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/theming" "6.4.16" - "@types/color-convert" "^2.0.0" - "@types/overlayscrollbars" "^1.12.0" - "@types/react-syntax-highlighter" "11.0.5" - color-convert "^2.0.1" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - markdown-to-jsx "^7.1.3" - memoizerific "^1.11.3" - overlayscrollbars "^1.13.1" - polished "^4.0.5" - prop-types "^15.7.2" - react-colorful "^5.1.2" - react-popper-tooltip "^3.1.1" - react-syntax-highlighter "^13.5.3" - react-textarea-autosize "^8.3.0" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/core-client@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.4.16.tgz#4fb0eac55e513964b44d5a12567c3d28054c980f" - integrity sha512-hqPyKLN+5bDE7nqUotE1TkNiXyGx2FgOYY83Sv0fSX/VXNOAhdPKvfVSuZN3XDSObIqumY8qyk8gGmJ161/mOw== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/channel-postmessage" "6.4.16" - "@storybook/channel-websocket" "6.4.16" - "@storybook/client-api" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/preview-web" "6.4.16" - "@storybook/store" "6.4.16" - "@storybook/ui" "6.4.16" - airbnb-js-shims "^2.2.1" - ansi-to-html "^0.6.11" - core-js "^3.8.2" - global "^4.4.0" - lodash "^4.17.21" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - unfetch "^4.2.0" - util-deprecate "^1.0.2" - -"@storybook/core-common@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.4.16.tgz#019c3392d3944721485d78fd1076915785e81922" - integrity sha512-KG8lYoaZ2/ffOQO4Rv/ThWrYWLL73k4nTyjCr6HYyi3TB8ATphu84iwOsWfFTxWsdsvr1c3auhej0TcOcB7i+A== - dependencies: - "@babel/core" "^7.12.10" - "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-decorators" "^7.12.12" - "@babel/plugin-proposal-export-default-from" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.7" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.12" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/preset-env" "^7.12.11" - "@babel/preset-react" "^7.12.10" - "@babel/preset-typescript" "^7.12.7" - "@babel/register" "^7.12.1" - "@storybook/node-logger" "6.4.16" - "@storybook/semver" "^7.3.2" - "@types/node" "^14.0.10" - "@types/pretty-hrtime" "^1.0.0" - babel-loader "^8.0.0" - babel-plugin-macros "^3.0.1" - babel-plugin-polyfill-corejs3 "^0.1.0" - chalk "^4.1.0" - core-js "^3.8.2" - express "^4.17.1" - file-system-cache "^1.0.5" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.0.4" - fs-extra "^9.0.1" - glob "^7.1.6" - handlebars "^4.7.7" - interpret "^2.2.0" - json5 "^2.1.3" - lazy-universal-dotenv "^3.0.1" - picomatch "^2.3.0" - pkg-dir "^5.0.0" - pretty-hrtime "^1.0.3" - resolve-from "^5.0.0" - slash "^3.0.0" - telejson "^5.3.2" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - webpack "4" - -"@storybook/core-events@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.4.16.tgz#f4012df02ea7aaae6717f8597fdfe36bdd1d15cd" - integrity sha512-EP82FP9vYB6POdqj/Hq01O6YJClHV7C7Qf9hCnG8TNjwz1hzsTkkoXKwtSpZ35hGdVExiu62u5bpi/oCa4R7qA== - dependencies: - core-js "^3.8.2" - -"@storybook/core-server@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.4.16.tgz#ffda64488501bce485c46a6f2217fb1cfae8723e" - integrity sha512-bxL0k29PNlk0iZRcaCuIiT9tKY8FAecWe29AISVffHk89ZCjyywi5R9aKp9aQT4J17JGQHeIXabiRvrvjJs+1w== - dependencies: - "@discoveryjs/json-ext" "^0.5.3" - "@storybook/builder-webpack4" "6.4.16" - "@storybook/core-client" "6.4.16" - "@storybook/core-common" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/csf-tools" "6.4.16" - "@storybook/manager-webpack4" "6.4.16" - "@storybook/node-logger" "6.4.16" - "@storybook/semver" "^7.3.2" - "@storybook/store" "6.4.16" - "@types/node" "^14.0.10" - "@types/node-fetch" "^2.5.7" - "@types/pretty-hrtime" "^1.0.0" - "@types/webpack" "^4.41.26" - better-opn "^2.1.1" - boxen "^5.1.2" - chalk "^4.1.0" - cli-table3 "^0.6.1" - commander "^6.2.1" - compression "^1.7.4" - core-js "^3.8.2" - cpy "^8.1.2" - detect-port "^1.3.0" - express "^4.17.1" - file-system-cache "^1.0.5" - fs-extra "^9.0.1" - globby "^11.0.2" - ip "^1.1.5" - lodash "^4.17.21" - node-fetch "^2.6.1" - pretty-hrtime "^1.0.3" - prompts "^2.4.0" - regenerator-runtime "^0.13.7" - serve-favicon "^2.5.0" - slash "^3.0.0" - telejson "^5.3.3" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - watchpack "^2.2.0" - webpack "4" - ws "^8.2.3" - -"@storybook/core@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.4.16.tgz#73ff25c3ba36dcab090d74bd3381456341dfc9f5" - integrity sha512-r07FMb7SaBp3+iPyaPq4fk8aCHxSBli5XbxRy12P/zWOlzpcCXs/VmTSTNCUd8hf6cpowTkYdNzQuwCmL4l8Fg== - dependencies: - "@storybook/core-client" "6.4.16" - "@storybook/core-server" "6.4.16" - -"@storybook/csf-tools@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-6.4.16.tgz#e37f47ff140867151c6de56f7bb26c8fcd5bb3b7" - integrity sha512-bO7sPNLqmXDO/X9vNGGfE0eW2lU6W1uD4MD+6HW7Q0JJD9S6GIB5NzNM2+0ZiDyIauSTJTPSXfqH8ucUb6irAQ== - dependencies: - "@babel/core" "^7.12.10" - "@babel/generator" "^7.12.11" - "@babel/parser" "^7.12.11" - "@babel/plugin-transform-react-jsx" "^7.12.12" - "@babel/preset-env" "^7.12.11" - "@babel/traverse" "^7.12.11" - "@babel/types" "^7.12.11" - "@mdx-js/mdx" "^1.6.22" - "@storybook/csf" "0.0.2--canary.87bc651.0" - core-js "^3.8.2" - fs-extra "^9.0.1" - global "^4.4.0" - js-string-escape "^1.0.1" - lodash "^4.17.21" - prettier ">=2.2.1 <=2.3.0" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - -"@storybook/csf@0.0.2--canary.87bc651.0": - version "0.0.2--canary.87bc651.0" - resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.2--canary.87bc651.0.tgz#c7b99b3a344117ef67b10137b6477a3d2750cf44" - integrity sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw== - dependencies: - lodash "^4.17.15" - -"@storybook/manager-webpack4@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/manager-webpack4/-/manager-webpack4-6.4.16.tgz#a602bc7efd255846e97c3f59f5f6d2a5bb272002" - integrity sha512-XDqFwJk75xviHr7IogMR9i3vLKkJ49x/gfv69UQ54F9x9D8kl8SjDg2aJcSFfgCPFWDt2rijKfX/qbSUasdc1g== - dependencies: - "@babel/core" "^7.12.10" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/preset-react" "^7.12.10" - "@storybook/addons" "6.4.16" - "@storybook/core-client" "6.4.16" - "@storybook/core-common" "6.4.16" - "@storybook/node-logger" "6.4.16" - "@storybook/theming" "6.4.16" - "@storybook/ui" "6.4.16" - "@types/node" "^14.0.10" - "@types/webpack" "^4.41.26" - babel-loader "^8.0.0" - case-sensitive-paths-webpack-plugin "^2.3.0" - chalk "^4.1.0" - core-js "^3.8.2" - css-loader "^3.6.0" - express "^4.17.1" - file-loader "^6.2.0" - file-system-cache "^1.0.5" - find-up "^5.0.0" - fs-extra "^9.0.1" - html-webpack-plugin "^4.0.0" - node-fetch "^2.6.1" - pnp-webpack-plugin "1.6.4" - read-pkg-up "^7.0.1" - regenerator-runtime "^0.13.7" - resolve-from "^5.0.0" - style-loader "^1.3.0" - telejson "^5.3.2" - terser-webpack-plugin "^4.2.3" - ts-dedent "^2.0.0" - url-loader "^4.1.1" - util-deprecate "^1.0.2" - webpack "4" - webpack-dev-middleware "^3.7.3" - webpack-virtual-modules "^0.2.2" - -"@storybook/node-logger@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.4.16.tgz#302a2fb1d6ba0478e8ff66ff32f6c1df15feb4df" - integrity sha512-wfQWOHUQfvbNqciUQ3D5fZtylomZ64spPDns/UzB8fUioAVmX0m6JURosXZvtf/CC8QrzpuHCiVFMMgmccN98Q== - dependencies: - "@types/npmlog" "^4.1.2" - chalk "^4.1.0" - core-js "^3.8.2" - npmlog "^5.0.1" - pretty-hrtime "^1.0.3" - -"@storybook/postinstall@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.4.16.tgz#b5a413c6158b91a8de8e8288f853462c8b34954d" - integrity sha512-LF4kTWI6jDHldYDY8LLsvmQp/Mpf3kO1UQpr0V/Uu93yR3E84EU/0eNREU+LAMzCon4xet5u+gByPONEpxW00A== - dependencies: - core-js "^3.8.2" - -"@storybook/preview-web@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/preview-web/-/preview-web-6.4.16.tgz#7e1241207d7205856b1316bdc1ac8aa91b92ba79" - integrity sha512-MJpxR+ccXkkzxIusfx3zuOJxsm5JkZOpN9DMrCipNrWo3LqPaGGHV+zDVTNXmFXHLD0SHMEIqkmmoTvF0On2zw== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/channel-postmessage" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/store" "6.4.16" - ansi-to-html "^0.6.11" - core-js "^3.8.2" - global "^4.4.0" - lodash "^4.17.21" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - synchronous-promise "^2.0.15" - ts-dedent "^2.0.0" - unfetch "^4.2.0" - util-deprecate "^1.0.2" - -"@storybook/react-docgen-typescript-plugin@1.0.2-canary.253f8c1.0": - version "1.0.2-canary.253f8c1.0" - resolved "https://registry.yarnpkg.com/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.253f8c1.0.tgz#f2da40e6aae4aa586c2fb284a4a1744602c3c7fa" - integrity sha512-mmoRG/rNzAiTbh+vGP8d57dfcR2aP+5/Ll03KKFyfy5FqWFm/Gh7u27ikx1I3LmVMI8n6jh5SdWMkMKon7/tDw== + exenv "^1.2.2" + prop-types "^15.6.2" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@testing-library/dom@^8.0.0": + version "8.20.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== dependencies: - debug "^4.1.1" - endent "^2.0.1" - find-cache-dir "^3.3.1" - flat-cache "^3.0.4" - micromatch "^4.0.2" - react-docgen-typescript "^2.0.0" - tslib "^2.0.0" - -"@storybook/react@^6.3.11": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-6.4.16.tgz#5c2e3b636d20bf7f9b5c1efcc474b1e0d3850bd6" - integrity sha512-lnAabl3wuhXKolq+uY2x7Amb3sl5YPbF3CLNT18TSviw6mABiOCIFZUz2YothvJj/x/lW9aGSFT13vSiIFivAA== - dependencies: - "@babel/preset-flow" "^7.12.1" - "@babel/preset-react" "^7.12.10" - "@pmmmwh/react-refresh-webpack-plugin" "^0.5.1" - "@storybook/addons" "6.4.16" - "@storybook/core" "6.4.16" - "@storybook/core-common" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/node-logger" "6.4.16" - "@storybook/react-docgen-typescript-plugin" "1.0.2-canary.253f8c1.0" - "@storybook/semver" "^7.3.2" - "@storybook/store" "6.4.16" - "@types/webpack-env" "^1.16.0" - babel-plugin-add-react-displayname "^0.0.5" - babel-plugin-named-asset-import "^0.3.1" - babel-plugin-react-docgen "^4.2.1" - core-js "^3.8.2" - global "^4.4.0" - lodash "^4.17.21" - prop-types "^15.7.2" - react-refresh "^0.11.0" - read-pkg-up "^7.0.1" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - webpack "4" - -"@storybook/router@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.4.16.tgz#5de12924c93d3ab12793e705d263e5db2442b5d8" - integrity sha512-b4l5UUMY/29+1ksDQ1V24O9lds01eO0K2nYVBcOt75CnDVQQmm+RNfblP8nSBHkMiGv7gt+AyLhd0L1EQcVZ6g== - dependencies: - "@storybook/client-logger" "6.4.16" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - history "5.0.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - qs "^6.10.0" - react-router "^6.0.0" - react-router-dom "^6.0.0" - ts-dedent "^2.0.0" - -"@storybook/semver@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0" - integrity sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg== - dependencies: - core-js "^3.6.5" - find-up "^4.1.0" - -"@storybook/source-loader@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-6.4.16.tgz#d61e7f2d5150ffffec26630f88faea04e280c3f2" - integrity sha512-YPqdmH5YrcqXaulCSeXUta32m2VgOTudPQTzwqsLxbzZ2Fzl/uBkDDC00qav4G67/J0OP+PedYN09EWRAP/nDA== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - core-js "^3.8.2" - estraverse "^5.2.0" - global "^4.4.0" - loader-utils "^2.0.0" - lodash "^4.17.21" - prettier ">=2.2.1 <=2.3.0" - regenerator-runtime "^0.13.7" - -"@storybook/store@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/store/-/store-6.4.16.tgz#8df671b087fe5626ab19f388539ac0acbf3ec19c" - integrity sha512-UuqdSJorMTw4BuO+B74lfIg2C0TAq00k7ji5jAAlS+EXIvc5j4cVrbirp5gDjTJS8BNwGyDw9uESzOMJNBjjIw== - dependencies: - "@storybook/addons" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/csf" "0.0.2--canary.87bc651.0" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" - slash "^3.0.0" - stable "^0.1.8" - synchronous-promise "^2.0.15" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/theming@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.4.16.tgz#e78cba6e1f3b2764cdd2695b90197a3158900cfa" - integrity sha512-oi7ibqQuzpmfOwaUW6y607UEyik5z6Y2SxM1VqQrI2o84AvSpTGJtpAPxXKULcffdXK+lmP2LWBVYdxkBW1D6g== - dependencies: - "@emotion/core" "^10.1.1" - "@emotion/is-prop-valid" "^0.8.6" - "@emotion/styled" "^10.0.27" - "@storybook/client-logger" "6.4.16" - core-js "^3.8.2" - deep-object-diff "^1.1.0" - emotion-theming "^10.0.27" - global "^4.4.0" - memoizerific "^1.11.3" - polished "^4.0.5" - resolve-from "^5.0.0" - ts-dedent "^2.0.0" - -"@storybook/ui@6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.4.16.tgz#04a44991786c3725d2938da938f2ffe77f177c9c" - integrity sha512-/+qR//RoKQ7ieK99fYJxQteixNu8KdcFEgq1VDNMOAKsp17LSU+3bxKwm3M+dSKDT6t3oOETa3aGEB1B0dcnFg== - dependencies: - "@emotion/core" "^10.1.1" - "@storybook/addons" "6.4.16" - "@storybook/api" "6.4.16" - "@storybook/channels" "6.4.16" - "@storybook/client-logger" "6.4.16" - "@storybook/components" "6.4.16" - "@storybook/core-events" "6.4.16" - "@storybook/router" "6.4.16" - "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.4.16" - copy-to-clipboard "^3.3.1" - core-js "^3.8.2" - core-js-pure "^3.8.2" - downshift "^6.0.15" - emotion-theming "^10.0.27" - fuse.js "^3.6.1" - global "^4.4.0" - lodash "^4.17.21" - markdown-to-jsx "^7.1.3" - memoizerific "^1.11.3" - polished "^4.0.5" - qs "^6.10.0" - react-draggable "^4.4.3" - react-helmet-async "^1.0.7" - react-sizeme "^3.0.1" - regenerator-runtime "^0.13.7" - resolve-from "^5.0.0" - store2 "^2.12.0" - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== +"@testing-library/react@^12.1.2": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b" + integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg== dependencies: - "@types/node" "*" + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.0.0" + "@types/react-dom" "<18.0.0" -"@types/color-convert@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/color-convert/-/color-convert-2.0.0.tgz#8f5ee6b9e863dcbee5703f5a517ffb13d3ea4e22" - integrity sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ== +"@testing-library/user-event@^13.2.1": + version "13.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" + integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== dependencies: - "@types/color-name" "*" + "@babel/runtime" "^7.12.5" -"@types/color-name@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/aria-query@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.2.tgz#6f1225829d89794fd9f891989c9ce667422d7f64" + integrity sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ== -"@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== +"@types/debug@^4.0.0": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" + integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/eslint-scope@^3.7.0": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" - integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.50": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" - integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/glob@*", "@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" + "@types/ms" "*" "@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/html-minifier-terser@^5.0.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" - integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-proxy@^1.17.8": - version "1.17.8" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" - integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== - dependencies: - "@types/node" "*" - -"@types/is-function@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.1.tgz#2d024eace950c836d9e3335a66b97960ae41d022" - integrity sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q== - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "2.3.6" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" + integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== dependencies: - "@types/istanbul-lib-report" "*" + "@types/unist" "^2" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-schema@^7.0.5": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lodash@^4.17.20": + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.20.tgz#1ca77361d7363432d29f5e55950d9ec1e1c6ea93" + integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA== "@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + version "3.0.13" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.13.tgz#b7ba6e52d0faeb9c493e32c205f3831022be4e1b" + integrity sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg== dependencies: - "@types/unist" "*" - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + "@types/unist" "^2" -"@types/node-fetch@^2.5.7": - version "2.5.12" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" - integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== - dependencies: - "@types/node" "*" - form-data "^3.0.0" +"@types/ms@*": + version "0.7.32" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab" + integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== "@types/node@*": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.13.tgz#5ed7ed7c662948335fcad6c412bb42d99ea754e3" - integrity sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw== - -"@types/node@^14.0.10": - version "14.18.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.9.tgz#0e5944eefe2b287391279a19b407aa98bd14436d" - integrity sha512-j11XSuRuAlft6vLDEX4RvhqC0KxNxx6QIyMXNb0vHHSNPXTPeiy3algESWmOOIzEtiEL0qiowPU3ewW9hHVa7Q== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/npmlog@^4.1.2": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.4.tgz#30eb872153c7ead3e8688c476054ddca004115f6" - integrity sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ== - -"@types/overlayscrollbars@^1.12.0": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@types/overlayscrollbars/-/overlayscrollbars-1.12.1.tgz#fb637071b545834fb12aea94ee309a2ff4cdc0a8" - integrity sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + version "20.8.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.6.tgz#0dbd4ebcc82ad0128df05d0e6f57e05359ee47fa" + integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== + dependencies: + undici-types "~5.25.1" -"@types/pretty-hrtime@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" - integrity sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ== +"@types/parse5@^6.0.0": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" + integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== "@types/prop-types@*": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/qs@*", "@types/qs@^6.9.5": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== +"@types/prop-types@^15.0.0": + version "15.7.8" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" + integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-slick@^0.23.4": - version "0.23.8" - resolved "https://registry.yarnpkg.com/@types/react-slick/-/react-slick-0.23.8.tgz#91654e657158da57f082c7b213e20756d3a37502" - integrity sha512-SfzSg++/3uyftVZaCgHpW+2fnJFsyJEQ/YdsuqfOWQ5lqUYV/gY/UwAnkw4qksCj5jalto/T5rKXJ8zeFldQeA== +"@types/react-dom@<18.0.0": + version "17.0.21" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.21.tgz#85d56965483ce4850f5f03f9234e54a1f47786e5" + integrity sha512-3rQEFUNUUz2MYiRwJJj6UekcW7rFLOtmK7ajQP7qJpjNdggInl3I/xM4I3Hq1yYPdCGVMgax1gZsB7BBTtayXg== dependencies: - "@types/react" "*" + "@types/react" "^17" -"@types/react-syntax-highlighter@11.0.5": - version "11.0.5" - resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz#0d546261b4021e1f9d85b50401c0a42acb106087" - integrity sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg== +"@types/react-measure@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@types/react-measure/-/react-measure-2.0.12.tgz#e8ba05057357b9529aa4115064fe7ea77549f54c" + integrity sha512-Y6V11CH6bU7RhqrIdENPwEUZlPXhfXNGylMNnGwq5TAEs2wDoBA3kSVVM/EQ8u72sz5r9ja+7W8M8PIVcS841Q== dependencies: "@types/react" "*" -"@types/react@*": - version "17.0.38" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" - integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== +"@types/react@*", "@types/react@^17", "@types/react@^17.0.0": + version "17.0.68" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.68.tgz#99b17f567e258f5e7be855a281ac67b49a34f9f2" + integrity sha512-y8heXejd/Gi43S28GOqIFmr6BzhLa3anMlPojRu4rHh3MtRrrpB+BtLEcqP3XPO1urXByzBdkOLU7sodYWnpkA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== - "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== - dependencies: - "@types/express" "*" - -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== - dependencies: - "@types/node" "*" - -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== - -"@types/tapable@^1", "@types/tapable@^1.0.5": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" - integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== - -"@types/uglify-js@*": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" - integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== - dependencies: - source-map "^0.6.1" - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== -"@types/webpack-env@^1.16.0": - version "1.16.3" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.3.tgz#b776327a73e561b71e7881d0cd6d34a1424db86a" - integrity sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw== - -"@types/webpack-sources@*": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" - integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.7.3" - -"@types/webpack@^4.41.26", "@types/webpack@^4.41.8": - version "4.41.32" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" - integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== - dependencies: - "@types/node" "*" - "@types/tapable" "^1" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - anymatch "^3.0.0" - source-map "^0.6.0" +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" + integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== -"@types/ws@^8.2.2": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21" - integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg== +"@types/yauzl@^2.9.1": + version "2.10.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691" + integrity sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw== dependencies: "@types/node" "*" -"@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== - -"@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== - dependencies: - "@types/yargs-parser" "*" - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" - integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== - -"@webpack-cli/info@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" - integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" - integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= - abab@^2.0.3, abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-globals@^1.0.4: - version "1.0.9" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" - integrity sha1-VbtemGkVB7dFedBRNBMhfDgMVM8= - dependencies: - acorn "^2.1.0" - acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -3028,88 +1458,42 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: +acorn-jsx@^5.0.0: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1, acorn-walk@^7.2.0: +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@^2.1.0, acorn@^2.4.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" - integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= - acorn@^4.0.9: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= + integrity sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug== -acorn@^6.0.7, acorn@^6.4.1: +acorn@^6.0.7: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.1, acorn@^7.4.1: +acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.5, acorn@^8.4.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - -add-dom-event-listener@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310" - integrity sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw== - dependencies: - object-assign "4.x" +acorn@^8.2.4: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== -address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -airbnb-js-shims@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz#db481102d682b98ed1daa4c5baa697a05ce5c040" - integrity sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ== - dependencies: - array-includes "^3.0.3" - array.prototype.flat "^1.2.1" - array.prototype.flatmap "^1.2.1" - es5-shim "^4.5.13" - es6-shim "^0.35.5" - function.prototype.name "^1.1.0" - globalthis "^1.0.0" - object.entries "^1.1.0" - object.fromentries "^2.0.0 || ^1.0.0" - object.getownpropertydescriptors "^2.0.3" - object.values "^1.1.0" - promise.allsettled "^1.0.0" - promise.prototype.finally "^3.1.0" - string.prototype.matchall "^4.0.0 || ^3.0.1" - string.prototype.padend "^3.0.0" - string.prototype.padstart "^3.0.0" - symbol.prototype.description "^1.0.0" + debug "4" airbnb-prop-types@^2.16.0: version "2.16.0" @@ -3126,31 +1510,12 @@ airbnb-prop-types@^2.16.0: prop-types-exact "^1.2.0" react-is "^16.13.1" -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.1.0, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3160,72 +1525,45 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" - integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -ansi-align@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" + integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-html-community@0.0.8, ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -3241,125 +1579,24 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-to-html@^0.6.11: - version "0.6.15" - resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" - integrity sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ== - dependencies: - entities "^2.0.0" - -antd@^3.6.5: - version "3.26.20" - resolved "https://registry.yarnpkg.com/antd/-/antd-3.26.20.tgz#f3f570efaaa5950a144942f21eb2aaaa088e9407" - integrity sha512-VIous4ofZfxFtd9K1h9MpRX2sDDpj3QcOFi3YgIc9B/uyDli/GlLb8SWKfQfJaMkaxwatIv503dag2Tog+hiEg== - dependencies: - "@ant-design/create-react-context" "^0.2.4" - "@ant-design/icons" "~2.1.1" - "@ant-design/icons-react" "~2.0.1" - "@types/react-slick" "^0.23.4" - array-tree-filter "^2.1.0" - babel-runtime "6.x" - classnames "~2.2.6" - copy-to-clipboard "^3.2.0" - css-animation "^1.5.0" - dom-closest "^0.2.0" - enquire.js "^2.1.6" - is-mobile "^2.1.0" - lodash "^4.17.13" - moment "^2.24.0" - omit.js "^1.0.2" - prop-types "^15.7.2" - raf "^3.4.1" - rc-animate "^2.10.2" - rc-calendar "~9.15.7" - rc-cascader "~0.17.4" - rc-checkbox "~2.1.6" - rc-collapse "~1.11.3" - rc-dialog "~7.6.0" - rc-drawer "~3.1.1" - rc-dropdown "~2.4.1" - rc-editor-mention "^1.1.13" - rc-form "^2.4.10" - rc-input-number "~4.5.0" - rc-mentions "~0.4.0" - rc-menu "~7.5.1" - rc-notification "~3.3.1" - rc-pagination "~1.20.11" - rc-progress "~2.5.0" - rc-rate "~2.5.0" - rc-resize-observer "^0.1.0" - rc-select "~9.2.0" - rc-slider "~8.7.1" - rc-steps "~3.5.0" - rc-switch "~1.9.0" - rc-table "~6.10.5" - rc-tabs "~9.7.0" - rc-time-picker "~3.7.1" - rc-tooltip "~3.7.3" - rc-tree "~2.1.0" - rc-tree-select "~2.9.1" - rc-trigger "^2.6.2" - rc-upload "~2.9.1" - rc-util "^4.16.1" - react-lazy-load "^3.0.13" - react-lifecycles-compat "^3.0.4" - react-slick "~0.25.2" - resize-observer-polyfill "^1.5.1" - shallowequal "^1.1.0" - warning "~4.0.3" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" -app-root-dir@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118" - integrity sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg= - -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3367,19 +1604,24 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - arr-flatten "^1.0.1" + deep-equal "^2.0.5" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -3387,154 +1629,112 @@ arr-flatten@^1.0.1, arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" -array-includes@^3.0.3, array-includes@^3.1.3, array-includes@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" - integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" -array-tree-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" - integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== - -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== dependencies: array-uniq "^1.0.1" -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== array.prototype.filter@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.1.tgz#20688792acdb97a09488eaaee9eebbf3966aae21" - integrity sha512-Dk3Ty7N42Odk7PjU/Ci3zT4pLj20YvuVnneG/58ICM6bt4Ij5kZaJTVQ9TSaWaIECX2sFyz4KItkVZqHNnciqw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.2.tgz#5f90ca6e3d01c31ea8db24c147665541db28bb4c" + integrity sha512-us+UrmGOilqttSOgoWZTpOvHu68vZT2YCjc/H4vhu56vzZpaDFBhB+Se2UwqWzMKbDv7Myq5M5pcZLAtUvTQdQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" array.prototype.find@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.2.tgz#6abbd0c2573925d8094f7d23112306af8c16d534" - integrity sha512-00S1O4ewO95OmmJW7EesWfQlrCrLEL8kZ40w3+GkLX2yTt0m2ggcePPa2uHPJ9KUmJvwRq+lCV9bD8Yim23x/Q== + version "2.2.1" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.2.1.tgz#769b8182a0b535c3d76ac025abab98ba1e12467b" + integrity sha512-I2ri5Z9uMpMvnsNrHre9l3PaX+z9D0/z6F7Yt2u15q7wt0I62g5kX6xUKR1SJiefgG+u2/gJUmM8B47XRvQR6w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" -array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" - integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== +array.prototype.flat@^1.2.3, array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.2.1, array.prototype.flatmap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" - integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.19.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" -array.prototype.map@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.4.tgz#0d97b640cfdd036c1b41cfe706a5e699aa0711f2" - integrity sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA== +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" -arrify@^1.0.1: +arraybuffer.prototype.slice@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== assertion-error@^1.1.0: version "1.1.0" @@ -3544,46 +1744,17 @@ assertion-error@^1.1.0: assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -ast-types@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" - integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== - dependencies: - tslib "^2.0.1" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-each@^1.0.0, async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async-validator@~1.11.3: - version "1.11.5" - resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.11.5.tgz#9d43cf49ef6bb76be5442388d19fb9a6e47597ea" - integrity sha512-XNtCsMAeAH1pdLMEg1z8/Bb3a8cdCbui9QbJATRFHHHW5kT6+NPI3zSVQUXgikTFITzsg+kYY5NTWhM2Orwt9w== - -async@^2.6.2: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== atob@^2.1.2: version "2.1.2" @@ -3593,7 +1764,7 @@ atob@^2.1.2: autoprefixer@^6.3.1: version "6.7.7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= + integrity sha512-WKExI/eSGgGAkWAO+wMVdFObZV7hQen54UpD1kCCTN3tvlL3W1jL4+lPP/M7MwoP7Q4RHzKtO3JQ4HxYEcd+xQ== dependencies: browserslist "^1.7.6" caniuse-db "^1.0.30000634" @@ -3602,871 +1773,94 @@ autoprefixer@^6.3.1: postcss "^5.2.16" postcss-value-parser "^3.2.3" -autoprefixer@^9.8.6: - version "9.8.8" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" - integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - picocolors "^0.2.1" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== dependencies: chalk "^1.1.3" esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.26.0, babel-core@^6.26.3: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-eslint@^8.2.5: - version "8.2.6" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" - integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/traverse" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - eslint-scope "3.7.1" - eslint-visitor-keys "^1.0.0" - -babel-generator@6.11.4: - version "6.11.4" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.11.4.tgz#14f6933abb20c62666d27e3b7b9f5b9dc0712a9a" - integrity sha1-FPaTOrsgxiZm0n47e59bncBxKpo= - dependencies: - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.10.2" - detect-indent "^3.0.1" - lodash "^4.2.0" - source-map "^0.5.0" - -babel-generator@6.26.1, babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" - integrity sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@^7.1.4: - version "7.1.5" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" - integrity sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw== - dependencies: - find-cache-dir "^1.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - -babel-loader@^8.0.0: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" - integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^1.4.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-messages@^6.23.0, babel-messages@^6.8.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-add-react-displayname@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" - integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= - -babel-plugin-apply-mdx-type-prop@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" - integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - "@mdx-js/util" "1.6.22" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-emotion@^10.0.27: - version "10.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz#a1fe3503cff80abfd0bdda14abd2e8e57a79d17d" - integrity sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/serialize" "^0.11.16" - babel-plugin-macros "^2.0.0" - babel-plugin-syntax-jsx "^6.18.0" - convert-source-map "^1.5.0" - escape-string-regexp "^1.0.5" - find-root "^1.1.0" - source-map "^0.5.7" - -babel-plugin-extract-import-names@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" - integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - -babel-plugin-istanbul@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - -babel-plugin-macros@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -babel-plugin-named-asset-import@^0.3.1: - version "0.3.8" - resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" - integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== - -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" - integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.1.5" - core-js-compat "^3.8.1" - -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" - integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.20.0" - -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - -babel-plugin-react-docgen@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz#7cc8e2f94e8dc057a06e953162f0810e4e72257b" - integrity sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ== - dependencies: - ast-types "^0.14.2" - lodash "^4.17.15" - react-docgen "^5.0.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - integrity sha1-TDqyCiryaqIM0lmVw5jE63AxDI0= - -babel-plugin-syntax-jsx@^6.18.0, babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - integrity sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988= - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-react-display-name@^6.23.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" - integrity sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-self@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" - integrity sha1-322AqdomEqEh5t3XVYvL7PBuY24= - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-source@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" - integrity sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY= - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - integrity sha1-hAoCjn30YN/DotKfDA2R9jduZqM= - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-flow@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" - integrity sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0= - dependencies: - babel-plugin-transform-flow-strip-types "^6.22.0" - -babel-preset-react@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" - integrity sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A= - dependencies: - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-react-display-name "^6.23.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - babel-preset-flow "^6.23.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= +babel-loader@^8.2.5: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" -babel-root-slash-import@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-root-slash-import/-/babel-root-slash-import-1.1.0.tgz#27db03489f99669c520a1486dd4ad75d55dad7d8" - integrity sha1-J9sDSJ+ZZpxSChSG3UrXXVXa19g= +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: - babel "^6.1.18" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" -babel-runtime@6.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= +babel-plugin-polyfill-corejs2@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.3" + semver "^6.3.1" -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" -babel-traverse@6.26.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= +babel-plugin-polyfill-corejs3@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz#a75fa1b0c3fc5bd6837f9ec465c0f48031b8cab1" + integrity sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA== dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" + "@babel/helper-define-polyfill-provider" "^0.4.3" + core-js-compat "^3.32.2" -babel-types@^6.10.2, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babel@^6.1.18: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4" - integrity sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ= + "@babel/helper-define-polyfill-provider" "^0.4.2" -babylon@6.18.0, babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - -babylon@7.0.0-beta.44: - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" - integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== +babel-plugin-polyfill-regenerator@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.3" -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= + integrity sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg== balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2: +base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -4484,113 +1878,29 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -batch-processor@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" - integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -better-opn@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-2.1.1.tgz#94a55b4695dc79288f31d7d0e5f658320759f7c6" - integrity sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA== - dependencies: - open "^7.0.3" - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: - file-uri-to-path "1.0.0" - -bluebird@^3.3.5, bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" -body-parser@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" - integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== - dependencies: - bytes "3.1.1" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.6" - raw-body "2.4.2" - type-is "~1.6.18" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -boxen@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== brace-expansion@^1.1.7: version "1.1.11" @@ -4600,16 +1910,14 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" + balanced-match "^1.0.0" -braces@^2.3.1, braces@^2.3.2: +braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -4625,18 +1933,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -4647,202 +1950,46 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: version "1.7.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= + integrity sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw== dependencies: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== +browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== +browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== +buffer@^5.2.1, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" - integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== - -c8@^7.6.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/c8/-/c8-7.11.0.tgz#b3ab4e9e03295a102c47ce11d4ef6d735d9a9ac9" - integrity sha512-XqPyj1uvlHMr+Y1IeRndC2X5P7iJzJlEJwBpCdBbq2JocXOgJfr+JVfJkyNMGROke5LfKrhSFXGFXnwnRJAUJw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@istanbuljs/schema" "^0.1.2" - find-up "^5.0.0" - foreground-child "^2.0.0" - istanbul-lib-coverage "^3.0.1" - istanbul-lib-report "^3.0.0" - istanbul-reports "^3.0.2" - rimraf "^3.0.0" - test-exclude "^6.0.0" - v8-to-istanbul "^8.0.0" - yargs "^16.2.0" - yargs-parser "^20.2.7" - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^15.0.5: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" + base64-js "^1.3.1" + ieee754 "^1.1.13" cache-base@^1.0.1: version "1.0.1" @@ -4867,54 +2014,31 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== dependencies: callsites "^2.0.0" caller-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== dependencies: caller-callsite "^2.0.0" callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@^4.1.1, camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: +camelcase@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -4922,7 +2046,7 @@ camelcase@^6.2.0: caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= + integrity sha512-SBTl70K0PkDUIebbkXrxWqZlHNs0wRgRD6QZ8guctShjbh63gEPfF+Wj0Yw+75f5Y8tSzqAI/NcisYv/cCah2Q== dependencies: browserslist "^1.3.6" caniuse-db "^1.0.30000529" @@ -4930,45 +2054,50 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30001304" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001304.tgz#75c9ee6e6f12418db671881076aa7ed3f9aca04a" - integrity sha512-XaYUy+lxxBglu9XLpm9gGZaoFFUx8L5RaU6yB736SFXYTOnRh488r10Ja7jWK7q6VtiEp1rTqttbygNcSRyLWA== + version "1.0.30001517" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001517.tgz#d2d5c51c414e6bf2dd8d6bf1bf56d42719a7c408" + integrity sha512-4Zqz0VZi9AwF05TyOh+DLABlwBcInExwNbP+ZanivBVztBb5EreEfB56S7XpIrKWiR+x+gg1ov7VAImMKULcew== -caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001286: - version "1.0.30001303" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz#9b168e4f43ccfc372b86f4bc5a551d9b909c95c9" - integrity sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ== +caniuse-lite@^1.0.30001503: + version "1.0.30001517" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8" + integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" +caniuse-lite@^1.0.30001541: + version "1.0.30001549" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz#7d1a3dce7ea78c06ed72c32c2743ea364b3615aa" + integrity sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA== -case-sensitive-paths-webpack-plugin@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" - integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +chai-subset@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/chai-subset/-/chai-subset-1.6.0.tgz#a5d0ca14e329a79596ed70058b6646bd6988cfe9" + integrity sha512-K3d+KmqdS5XKW5DWPd5sgNffL3uxdDe+6GdnJh3AYPhwnBGRY5urfvfcbRtWIvvpz+KxkL9FeBB6MZewLUNwug== -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== +chai@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" chai@^4.1.2: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" - deep-eql "^3.0.1" + deep-eql "^4.1.2" get-func-name "^2.0.0" loupe "^2.3.1" pathval "^1.1.1" @@ -4977,7 +2106,7 @@ chai@^4.1.2: chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -4994,7 +2123,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -5012,6 +2141,11 @@ character-entities@^1.0.0: resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + character-reference-invalid@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" @@ -5025,115 +2159,34 @@ chardet@^0.7.0: check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -cheerio-select@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" - integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== - dependencies: - css-select "^4.1.3" - css-what "^5.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - domutils "^2.7.0" - -cheerio@0.20.0: - version "0.20.0" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" - integrity sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU= - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "~3.8.1" - lodash "^4.1.0" - optionalDependencies: - jsdom "^7.0.2" - -cheerio@0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" - integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash.assignin "^4.0.9" - lodash.bind "^4.1.4" - lodash.defaults "^4.0.1" - lodash.filter "^4.4.0" - lodash.flatten "^4.2.0" - lodash.foreach "^4.3.0" - lodash.map "^4.4.0" - lodash.merge "^4.4.0" - lodash.pick "^4.2.1" - lodash.reduce "^4.4.0" - lodash.reject "^4.4.0" - lodash.some "^4.4.0" - -cheerio@1.0.0-rc.2: - version "1.0.0-rc.2" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" - integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - -cheerio@^1.0.0-rc.3: - version "1.0.0-rc.10" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" - integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== - dependencies: - cheerio-select "^1.5.0" - dom-serializer "^1.3.2" - domhandler "^4.2.0" - htmlparser2 "^6.1.0" - parse5 "^6.0.1" - parse5-htmlparser2-tree-adapter "^6.0.1" - tslib "^2.2.0" - -chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" -chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.2: +cheerio@^1.0.0-rc.3: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@3.5.3, chokidar@^3.4.0: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -5153,34 +2206,18 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chromium-bidi@0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.7.tgz#4c022c2b0fb1d1c9b571fadf373042160e71d236" + integrity sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ== + dependencies: + mitt "3.0.0" ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" @@ -5198,60 +2235,17 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@2.x, classnames@^2.2.0, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -classnames@~2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== - -clean-css@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" - integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== - dependencies: - source-map "~0.6.0" - -clean-css@^5.2.2: - version "5.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.4.tgz#982b058f8581adb2ae062520808fb2429bd487a4" - integrity sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== dependencies: restore-cursor "^2.0.0" -cli-table3@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" - integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== - dependencies: - string-width "^4.2.0" - optionalDependencies: - colors "1.4.0" - cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + integrity sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg== dependencies: slice-ansi "0.0.4" string-width "^1.0.1" @@ -5270,46 +2264,41 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== clsx@^1.0.4, clsx@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== coa@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= + integrity sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ== dependencies: q "^1.1.2" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -5328,20 +2317,10 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-logger@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" - integrity sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg= - -color-logger@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.6.tgz#e56245ef29822657110c7cb75a9cd786cb69ed1b" - integrity sha1-5WJF7ymCJlcRDHy3WpzXhstp7Rs= - color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" @@ -5351,49 +2330,50 @@ color-name@^1.0.0, color-name@~1.1.4: color-string@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= + integrity sha512-sz29j1bmSDfoAxKIEU6zwoIZXN6BrFbAMIhfYCNyiZXBDuU/aiHlN84lp/xDzL2ubyFhLDobHIlU1X70XRrMDA== dependencies: color-name "^1.0.0" -color-support@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" color@^0.11.0: version "0.11.4" resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q= + integrity sha512-Ajpjd8asqZ6EdxQeqGzU5WBhhTfJ/0cA4Wlbre7e5vXfmDSmda7Ov6jeKoru+b0vHcb1CqvuroTHp5zIWzhVMA== dependencies: clone "^1.0.2" color-convert "^1.3.0" color-string "^0.3.0" -colorette@^2.0.10, colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" colormin@^1.0.5: version "1.1.2" resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM= + integrity sha512-XSEQUUQUR/lXqGyddiNH3XYFUPYlYr1vXy9rTFMsSOw+J7Q6EQkdlQIrTlYn4TccpsOaUE1PYQNjBn20gwCdgQ== dependencies: color "^0.11.0" css-color-names "0.0.4" has "^1.0.1" -colors@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= + integrity sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5405,309 +2385,101 @@ comma-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@^2.11.0, commander@^2.14.1, commander@^2.19.0, commander@^2.20.0, commander@^2.9.0: +commander@^2.14.1, commander@^2.19.0, commander@^2.9.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.1.1: +commander@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - -commander@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-classes@1.x, component-classes@^1.2.5, component-classes@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691" - integrity sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE= - dependencies: - component-indexof "0.0.3" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -component-indexof@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24" - integrity sha1-EdCRMSI5648yyPJa6csAL/6NPCQ= - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -compute-scroll-into-view@^1.0.17: - version "1.0.17" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" - integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -console-control-strings@^1.0.0, console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== +convert-source-map@^1.1.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -copy-to-clipboard@^3.2.0, copy-to-clipboard@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" - integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== dependencies: - toggle-selection "^1.0.6" + browserslist "^4.21.9" -core-js-compat@^3.20.0, core-js-compat@^3.20.2, core-js-compat@^3.8.1: - version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" - integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== +core-js-compat@^3.32.2: + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" + integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== dependencies: - browserslist "^4.19.1" - semver "7.0.0" + browserslist "^4.22.1" -core-js-pure@^3.8.1, core-js-pure@^3.8.2: - version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.20.3.tgz#6cc4f36da06c61d95254efc54024fe4797fd5d02" - integrity sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA== - -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.4.0: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: - version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a" - integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== +cosmiconfig@8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" + integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== dependencies: - "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" + js-yaml "^4.1.0" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.10.0" -cp-file@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" - integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== - dependencies: - graceful-fs "^4.1.2" - make-dir "^3.0.0" - nested-error-stacks "^2.0.0" - p-event "^4.1.0" - -cpy@^8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.2.tgz#e339ea54797ad23f8e3919a5cffd37bfc3f25935" - integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg== - dependencies: - arrify "^2.0.1" - cp-file "^7.0.0" - globby "^9.2.0" - has-glob "^1.0.0" - junk "^3.1.0" - nested-error-stacks "^2.1.0" - p-all "^2.1.0" - p-filter "^2.1.0" - p-map "^3.0.0" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== +cosmiconfig@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-react-class@^15.5.3: - version "15.7.0" - resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e" - integrity sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng== - dependencies: - loose-envify "^1.3.1" - object-assign "^4.1.1" +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" @@ -5720,44 +2492,10 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-animation@1.x, css-animation@^1.3.2, css-animation@^1.5.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/css-animation/-/css-animation-1.6.1.tgz#162064a3b0d51f958b7ff37b3d6d4de18e17039e" - integrity sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog== - dependencies: - babel-runtime "6.x" - component-classes "^1.2.5" - css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== css-loader@^0.28.11: version "0.28.11" @@ -5779,46 +2517,17 @@ css-loader@^0.28.11: postcss-value-parser "^3.3.0" source-list-map "^2.0.0" -css-loader@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" - integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^6.3.0" - -css-select@^4.1.3: - version "4.2.1" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" - integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" - css-what "^5.1.0" - domhandler "^4.3.0" - domutils "^2.8.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" nth-check "^2.0.1" -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - css-selector-tokenizer@^0.7.0: version "0.7.3" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" @@ -5827,15 +2536,10 @@ css-selector-tokenizer@^0.7.0: cssesc "^3.0.0" fastparse "^1.1.2" -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== - -css-what@^5.0.1, css-what@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssesc@^3.0.0: version "3.0.0" @@ -5845,7 +2549,7 @@ cssesc@^3.0.0: cssnano@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= + integrity sha512-0o0IMQE0Ezo4b41Yrm8U6Rp9/Ag81vNXY1gZMnT1XhO4DpjEf2utKERqWJbOoz3g1Wdc1d3QSta/cIuJ1wSTEg== dependencies: autoprefixer "^6.3.1" decamelize "^1.1.2" @@ -5883,27 +2587,20 @@ cssnano@^3.10.0: csso@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U= + integrity sha512-FmCI/hmqDeHHLaIQckMhMZneS84yzUZdrWDAvJVVxOwcKE1P1LF9FGmzr1ktIQSxOw6fl3PaQsmfg+GN+VvR3w== dependencies: clap "^1.0.9" source-map "^0.5.3" -cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - 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== -"cssstyle@>= 0.2.29 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" - integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= - dependencies: - cssom "0.3.x" +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" @@ -5912,27 +2609,10 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^2.5.7: - version "2.6.19" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" - integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ== - csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== data-urls@^2.0.0: version "2.0.0" @@ -5948,53 +2628,58 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.7: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" 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" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-eql@^3.0.1: version "3.0.1" @@ -6003,63 +2688,66 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" + type-detect "^4.0.0" + +deep-equal@^2.0.5: + version "2.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" + integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.1" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deep-object-diff@^1.1.0: - version "1.1.7" - resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.7.tgz#348b3246f426427dd633eaa50e1ed1fc2eafc7e4" - integrity sha512-QkgBca0mL08P6HiOjoqvmm6xOAl2W6CT2+34Ljhg0OeFan8cwlcdq8jrLKsBBuUFAZLsN5b6y491KdKEoSo9lg== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +deepmerge-ts@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge-ts/-/deepmerge-ts-4.3.0.tgz#432aff3cd09f947e36cdb3772a43960bf45327fe" + integrity sha512-if3ZYdkD2dClhnXR5reKtG98cwyaRT1NeugQoAPTTfsOpV9kqyeiBF9Qa5RHjemb3KzD5ulqygv6ED3t5j9eJw== -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" @@ -6072,14 +2760,14 @@ define-property@^2.0.2: isobject "^3.0.1" defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" - integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + integrity sha512-7yjqSoVSlJzA4t/VUwazuEagGeANEKB3f/aNI//06pfKgwoCb7f6Q1gETN1sZzYaj6chTQ0AhIwDiPdfOjko4A== dependencies: globby "^6.1.0" is-path-cwd "^1.0.0" @@ -6088,136 +2776,35 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detab@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" - integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== - dependencies: - repeat-string "^1.5.4" - -detect-indent@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" - integrity sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U= - dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== - dependencies: - address "^1.0.1" - debug "^2.6.0" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" +devtools-protocol@0.0.1107588: + version "0.0.1107588" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz#f8cac707840b97cc30b029359341bcbbb0ad8ffa" + integrity sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg== -dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" - integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" + integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== doctrine@^2.1.0: version "2.1.0" @@ -6233,24 +2820,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-align@^1.7.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" - integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg== - -dom-closest@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-closest/-/dom-closest-0.2.0.tgz#ebd9f91d1bf22e8d6f477876bbcd3ec90216c0cf" - integrity sha1-69n5HRvyLo1vR3h2u80+yQIWwM8= - dependencies: - dom-matches ">=1.0.1" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-helpers@^5.1.3: version "5.2.1" @@ -6260,60 +2833,19 @@ dom-helpers@^5.1.3: "@babel/runtime" "^7.8.7" csstype "^3.0.2" -dom-matches@>=1.0.1: +dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-matches/-/dom-matches-2.0.0.tgz#d2728b416a87533980eb089b848d253cf23a758c" - integrity sha1-0nKLQWqHUzmA6wibhI0lPPI6dYw= - -dom-scroll-into-view@1.x, dom-scroll-into-view@^1.2.0, dom-scroll-into-view@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz#e8f36732dd089b0201a88d7815dc3f88e6d66c7e" - integrity sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4= - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@^1.0.1, dom-serializer@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domexception@^2.0.1: version "2.0.1" @@ -6322,142 +2854,36 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -domhandler@2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" - integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= - dependencies: - domelementtype "1" - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" - integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== - dependencies: - domelementtype "^2.2.0" - -domutils@1.5, domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.5.2, domutils@^2.7.0, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - -dotenv@^8.0.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== - -downshift@^6.0.15: - version "6.1.7" - resolved "https://registry.yarnpkg.com/downshift/-/downshift-6.1.7.tgz#fdb4c4e4f1d11587985cd76e21e8b4b3fa72e44c" - integrity sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg== - dependencies: - "@babel/runtime" "^7.14.8" - compute-scroll-into-view "^1.0.17" - prop-types "^15.7.2" - react-is "^17.0.2" - tslib "^2.3.0" - -draft-js@^0.10.0, draft-js@~0.10.0: - version "0.10.5" - resolved "https://registry.yarnpkg.com/draft-js/-/draft-js-0.10.5.tgz#bfa9beb018fe0533dbb08d6675c371a6b08fa742" - integrity sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg== - dependencies: - fbjs "^0.8.15" - immutable "~3.7.4" - object-assign "^4.1.0" - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" + domelementtype "^2.3.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.2.7, electron-to-chromium@^1.4.431: + version "1.4.473" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.473.tgz#4853de13a335c70fe1f9df8d4029be54068767d1" + integrity sha512-aVfC8+440vGfl06l8HKKn8/PD5jRfSnLkTTD65EFvU46igbpQRri1gxSzW9/+TeUlwYzrXk1sw867T96zlyECA== -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47, electron-to-chromium@^1.4.17: - version "1.4.57" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.57.tgz#2b2766df76ac8dbc0a1d41249bc5684a31849892" - integrity sha512-FNC+P5K1n6pF+M0zIK+gFCoXcJhhzDViL3DRIGy2Fv5PohuSES1JHR7T+GlwxSxlzx4yYbsuzCZvHxcBSRCIOw== +electron-to-chromium@^1.4.535: + version "1.4.556" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.556.tgz#97385917eb6ea3ac6a3378cf87bb39ee1db96e76" + integrity sha512-6RPN0hHfzDU8D56E72YkDvnLw5Cj2NMXZGg3UkgyoHxjVhG99KZpsKgBWMmTy0Ei89xwan+rbRsVB9yzATmYzQ== elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= - -element-resize-detector@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.4.tgz#3e6c5982dd77508b5fa7e6d5c02170e26325c9b1" - integrity sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg== - dependencies: - batch-processor "1.0.0" - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" + integrity sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ== emoji-regex@^7.0.1: version "7.0.3" @@ -6474,130 +2900,71 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -emotion-theming@^10.0.27: - version "10.3.0" - resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.3.0.tgz#7f84d7099581d7ffe808aab5cd870e30843db72a" - integrity sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/weak-memoize" "0.2.5" - hoist-non-react-statics "^3.3.0" - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -endent@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/endent/-/endent-2.1.0.tgz#5aaba698fb569e5e18e69e1ff7a28ff35373cd88" - integrity sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w== - dependencies: - dedent "^0.7.0" - fast-json-parse "^1.0.3" - objectorarray "^1.0.5" - enhanced-resolve@^2.2.2: version "2.3.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-2.3.0.tgz#a115c32504b6302e85a76269d7a57ccdd962e359" - integrity sha1-oRXDJQS2MC6Fp2Jp16V8zdli41k= + integrity sha512-n6e4bsCpzsP0OB76X+vEWhySUQI8GHPVFVK+3QkX35tbryy2WoeGeK5kQ+oxzgDVHjIZyz5fyS60Mi3EpQLc0Q== dependencies: graceful-fs "^4.1.2" memory-fs "^0.3.0" object-assign "^4.0.1" tapable "^0.2.3" -enhanced-resolve@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -enhanced-resolve@^5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== +enhanced-resolve@^5.0.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquire.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/enquire.js/-/enquire.js-2.1.6.tgz#3e8780c9b8b835084c3f60e166dbc3c2a3c89814" - integrity sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ= - -entities@1.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" - integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= - -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== enzyme-adapter-react-16@^1.1.1: - version "1.15.6" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz#fd677a658d62661ac5afd7f7f541f141f8085901" - integrity sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g== + version "1.15.7" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.7.tgz#a737e6d8e2c147e9da5acf957755be7634f76201" + integrity sha512-LtjKgvlTc/H7adyQcj+aq0P0H07LDL480WQl1gU512IUyaDo/sbOaNDdZsJXYW2XaoPqrLLE9KbZS+X2z6BASw== dependencies: - enzyme-adapter-utils "^1.14.0" - enzyme-shallow-equal "^1.0.4" + enzyme-adapter-utils "^1.14.1" + enzyme-shallow-equal "^1.0.5" has "^1.0.3" - object.assign "^4.1.2" - object.values "^1.1.2" - prop-types "^15.7.2" + object.assign "^4.1.4" + object.values "^1.1.5" + prop-types "^15.8.1" react-is "^16.13.1" react-test-renderer "^16.0.0-0" semver "^5.7.0" -enzyme-adapter-utils@^1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz#afbb0485e8033aa50c744efb5f5711e64fbf1ad0" - integrity sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg== +enzyme-adapter-utils@^1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz#f30db15dafc22e0ccd44f5acc8d93be29218cdcf" + integrity sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ== dependencies: airbnb-prop-types "^2.16.0" - function.prototype.name "^1.1.3" + function.prototype.name "^1.1.5" has "^1.0.3" - object.assign "^4.1.2" - object.fromentries "^2.0.3" - prop-types "^15.7.2" + object.assign "^4.1.4" + object.fromentries "^2.0.5" + prop-types "^15.8.1" semver "^5.7.1" -enzyme-shallow-equal@^1.0.1, enzyme-shallow-equal@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz#b9256cb25a5f430f9bfe073a84808c1d74fced2e" - integrity sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q== +enzyme-shallow-equal@^1.0.1, enzyme-shallow-equal@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz#5528a897a6ad2bdc417c7221a7db682cd01711ba" + integrity sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg== dependencies: has "^1.0.3" - object-is "^1.1.2" + object-is "^1.1.5" enzyme@^3.3.0: version "3.11.0" @@ -6627,7 +2994,7 @@ enzyme@^3.3.0: rst-selector-parser "^2.2.3" string.prototype.trim "^1.2.1" -errno@^0.1.3, errno@~0.1.7: +errno@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== @@ -6641,62 +3008,93 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -error-stack-parser@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== +error-stack-parser@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== dependencies: - stackframe "^1.1.1" + stackframe "^1.3.4" -es-abstract@^1.19.0, es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" + is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== -es-get-iterator@^1.0.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" is-map "^2.0.2" is-set "^2.0.2" - is-string "^1.0.5" + is-string "^1.0.7" isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -6707,166 +3105,37 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-shim@^4.5.13: - version "4.6.4" - resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.4.tgz#10ce5f06c7bccfdd60b4e08edf95c7e2fbc1dc2a" - integrity sha512-Z0f7OUYZ8JfqT12d3Tgh2ErxIH5Shaz97GE8qyDG9quxb2Hmh2vvFHlOFjx6lzyD0CRgvJfnNYcisjdbRp7MPw== - -es6-shim@^0.35.5: - version "0.35.6" - resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.6.tgz#d10578301a83af2de58b9eadb7c2c9945f7388a0" - integrity sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA== - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escodegen@^1.6.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -esdoc-accessor-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esdoc-accessor-plugin/-/esdoc-accessor-plugin-1.0.0.tgz#791ba4872e6c403515ce749b1348d6f0293ad9eb" - integrity sha1-eRukhy5sQDUVznSbE0jW8Ck62es= - -esdoc-brand-plugin@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esdoc-brand-plugin/-/esdoc-brand-plugin-1.0.1.tgz#7c0e1ae90e84c30b2d3369d3a6449f9dc9f8d511" - integrity sha512-Yv9j3M7qk5PSLmSeD6MbPsfIsEf8K43EdH8qZpE/GZwnJCRVmDPrZJ1cLDj/fPu6P35YqgcEaJK4E2NL/CKA7g== - dependencies: - cheerio "0.22.0" - -esdoc-coverage-plugin@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/esdoc-coverage-plugin/-/esdoc-coverage-plugin-1.1.0.tgz#3869869cd7f87891f972625787695a299aece45c" - integrity sha1-OGmGnNf4eJH5cmJXh2laKZrs5Fw= - -esdoc-ecmascript-proposal-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" - integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= - -esdoc-external-ecmascript-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esdoc-external-ecmascript-plugin/-/esdoc-external-ecmascript-plugin-1.0.0.tgz#78f565d4a0c5185ac63152614dce1fe1a86688db" - integrity sha1-ePVl1KDFGFrGMVJhTc4f4ahmiNs= - dependencies: - fs-extra "1.0.0" - -esdoc-integrate-manual-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esdoc-integrate-manual-plugin/-/esdoc-integrate-manual-plugin-1.0.0.tgz#1854a6aa1c081035d7c8c51e3bdd4fb65aa4711c" - integrity sha1-GFSmqhwIEDXXyMUeO91PtlqkcRw= - -esdoc-integrate-test-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esdoc-integrate-test-plugin/-/esdoc-integrate-test-plugin-1.0.0.tgz#e2d0d00090f7f0c35e5d2f2c033327a79e53e409" - integrity sha1-4tDQAJD38MNeXS8sAzMnp55T5Ak= - -esdoc-jsx-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esdoc-jsx-plugin/-/esdoc-jsx-plugin-1.0.0.tgz#937ef5d7d2de5a17dd20ff7464be4259a78641d1" - integrity sha1-k37119LeWhfdIP90ZL5CWaeGQdE= - -esdoc-lint-plugin@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/esdoc-lint-plugin/-/esdoc-lint-plugin-1.0.2.tgz#4962930c6dc5b25d80cf6eff1b0f3c24609077f7" - integrity sha512-24AYqD2WbZI9We02I7/6dzAa7yUliRTFUaJCZAcYJMQicJT5gUrNFVaI8XmWEN/mhF3szIn1uZBNWeLul4CmNw== - -esdoc-publish-html-plugin@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/esdoc-publish-html-plugin/-/esdoc-publish-html-plugin-1.1.2.tgz#bdece7bc7a0a3e419933503252db7a6772879dab" - integrity sha512-hG1fZmTcEp3P/Hv/qKiMdG1qSp8MjnVZMMkxL5P5ry7I2sX0HQ4P9lt2lms+90Lt0r340HHhSuVx107UL7dphg== - dependencies: - babel-generator "6.11.4" - cheerio "0.22.0" - escape-html "1.0.3" - fs-extra "1.0.0" - ice-cap "0.0.4" - marked "0.3.19" - taffydb "2.7.2" - -esdoc-standard-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esdoc-standard-plugin/-/esdoc-standard-plugin-1.0.0.tgz#661201cac7ef868924902446fdac1527253c5d4d" - integrity sha1-ZhIBysfvhokkkCRG/awVJyU8XU0= - dependencies: - esdoc-accessor-plugin "^1.0.0" - esdoc-brand-plugin "^1.0.0" - esdoc-coverage-plugin "^1.0.0" - esdoc-external-ecmascript-plugin "^1.0.0" - esdoc-integrate-manual-plugin "^1.0.0" - esdoc-integrate-test-plugin "^1.0.0" - esdoc-lint-plugin "^1.0.0" - esdoc-publish-html-plugin "^1.0.0" - esdoc-type-inference-plugin "^1.0.0" - esdoc-undocumented-identifier-plugin "^1.0.0" - esdoc-unexported-identifier-plugin "^1.0.0" - -esdoc-type-inference-plugin@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/esdoc-type-inference-plugin/-/esdoc-type-inference-plugin-1.0.2.tgz#916e3f756de1d81d9c0dbe1c008e8dafd322cfaf" - integrity sha512-tMIcEHNe1uhUGA7lT1UTWc9hs2dzthnTgmqXpmeUhurk7fL2tinvoH+IVvG/sLROzwOGZQS9zW/F9KWnpMzLIQ== - -esdoc-undocumented-identifier-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esdoc-undocumented-identifier-plugin/-/esdoc-undocumented-identifier-plugin-1.0.0.tgz#82e05d371c32d12871140f1d5c81ec99fd9cc2c8" - integrity sha1-guBdNxwy0ShxFA8dXIHsmf2cwsg= - -esdoc-unexported-identifier-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esdoc-unexported-identifier-plugin/-/esdoc-unexported-identifier-plugin-1.0.0.tgz#1f9874c6a7c2bebf9ad397c3ceb75c9c69dabab1" - integrity sha1-H5h0xqfCvr+a05fDzrdcnGnaurE= - -esdoc@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/esdoc/-/esdoc-1.1.0.tgz#07d40ebf791764cd537929c29111e20a857624f3" - integrity sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA== - dependencies: - babel-generator "6.26.1" - babel-traverse "6.26.0" - babylon "6.18.0" - cheerio "1.0.0-rc.2" - color-logger "0.0.6" - escape-html "1.0.3" - fs-extra "5.0.0" - ice-cap "0.0.4" - marked "0.3.19" - minimist "1.2.0" - taffydb "2.7.3" - eslint-config-prettier@^2.9.0: version "2.10.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz#ec07bc1d01f87d09f61d3840d112dc8a9791e30b" @@ -6874,21 +3143,21 @@ eslint-config-prettier@^2.9.0: dependencies: get-stdin "^5.0.1" -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-module-utils@^2.7.2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" - find-up "^2.1.0" eslint-plugin-babel@^5.1.0: version "5.3.1" @@ -6898,23 +3167,25 @@ eslint-plugin-babel@^5.1.0: eslint-rule-composer "^0.3.0" eslint-plugin-import@^2.12.0: - version "2.25.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" - integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA== + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.2" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.0" + is-core-module "^2.11.0" is-glob "^4.0.3" - minimatch "^3.0.4" - object.values "^1.1.5" - resolve "^1.20.0" - tsconfig-paths "^3.12.0" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" eslint-plugin-prettier@^2.6.0: version "2.7.0" @@ -6925,46 +3196,31 @@ eslint-plugin-prettier@^2.6.0: jest-docblock "^21.0.0" eslint-plugin-react@^7.10.0: - version "7.28.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz#8f3ff450677571a659ce76efc6d80b6a525adbdf" - integrity sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw== + version "7.33.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz#6c356fb0862fec2cd1b04426c669ea746e9b6eb3" + integrity sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw== dependencies: - array-includes "^3.1.4" - array.prototype.flatmap "^1.2.5" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.0.4" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.0" - object.values "^1.1.5" - prop-types "^15.7.2" - resolve "^2.0.0-next.3" - semver "^6.3.0" - string.prototype.matchall "^4.0.6" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" eslint-rule-composer@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -7039,7 +3295,7 @@ espree@^5.0.1: esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -7047,20 +3303,20 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -7070,53 +3326,11 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -estree-to-babel@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/estree-to-babel/-/estree-to-babel-3.2.1.tgz#82e78315275c3ca74475fdc8ac1a5103c8a75bf5" - integrity sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg== - dependencies: - "@babel/traverse" "^7.1.6" - "@babel/types" "^7.2.0" - c8 "^7.6.0" - esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -eventlistener@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/eventlistener/-/eventlistener-0.0.1.tgz#ed2baabb852227af2bcf889152c72c63ca532eb8" - integrity sha1-7Suqu4UiJ68rz4iRUscsY8pTLrg= - -events@^3.0.0, events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -7130,32 +3344,15 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" +exenv@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -7165,65 +3362,22 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -express@^4.17.1: - version "4.17.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" - integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.4.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.9.6" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" - setprototypeof "1.2.0" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -7237,13 +3391,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -7258,53 +3405,26 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-parse@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" - integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -7314,25 +3434,13 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastparse@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - fault@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" @@ -7340,42 +3448,17 @@ fault@^1.0.0: dependencies: format "^0.2.0" -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -fbjs@^0.8.15: - version "0.8.18" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.18.tgz#9835e0addb9aca2eff53295cd79ca1cfc7c9662a" - integrity sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA== +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + pend "~1.2.0" figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== dependencies: escape-string-regexp "^1.0.5" object-assign "^4.1.0" @@ -7383,7 +3466,7 @@ figures@^1.7.0: figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== dependencies: escape-string-regexp "^1.0.5" @@ -7394,48 +3477,10 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -file-system-cache@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f" - integrity sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08= - dependencies: - bluebird "^3.3.5" - fs-extra "^0.30.0" - ramda "^0.21.0" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -7449,37 +3494,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - find-cache-dir@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" @@ -7489,26 +3503,15 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - locate-path "^3.0.0" + locate-path "^6.0.0" + path-exists "^4.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -7516,13 +3519,18 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== +fixed-data-table-2@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fixed-data-table-2/-/fixed-data-table-2-2.0.6.tgz#e403c763633416e13371e202a223e490f3460807" + integrity sha512-YDQlq6mv37WYTJOLTqzCyg2///1rD5u4iUXj5vaGq6G93++wtBcoLu8uyUNCiiMxOIa/ezKyc/s1CEJgjhpNpg== dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" + "@reduxjs/toolkit" "^1.5.1" + lodash "^4.17.4" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.4" + react-portal "^4.2.1" + redux "^4.0.1" + reselect "^4.0.0" flat-cache@^2.0.1: version "2.0.1" @@ -7533,103 +3541,37 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== - flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - fn-name@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" - integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= + integrity sha512-oIDB1rXf3BUnn00bh2jVM0byuqr94rBh6g7ZfdKcbmp1we2GQtPzKdloyvBXHs+q3fvxB8EqX5ecFba3RwCSjA== -follow-redirects@^1.0.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -fork-ts-checker-webpack-plugin@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" - integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== - dependencies: - "@babel/code-frame" "^7.5.5" - chalk "^2.4.1" - micromatch "^3.1.10" - minimatch "^3.0.4" - semver "^5.6.0" - tapable "^1.0.0" - worker-rpc "^0.1.0" - -fork-ts-checker-webpack-plugin@^6.0.4: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz#0282b335fa495a97e167f69018f566ea7d2a2b5e" - integrity sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== form-data@^3.0.0: version "3.0.1" @@ -7640,125 +3582,34 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - format@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@1.0.0: +fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - -fs-extra@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" - integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^9.0.0, fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-monkey@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs-readdir-recursive@^1.0.0: +fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.0.0, fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.1.2, fsevents@~2.3.2: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -7768,7 +3619,7 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.0, function.prototype.name@^1.1.2, function.prototype.name@^1.1.3: +function.prototype.name@^1.1.2, function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== @@ -7781,17 +3632,12 @@ function.prototype.name@^1.1.0, function.prototype.name@^1.1.2, function.prototy functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -functions-have-names@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21" - integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA== + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -fuse.js@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.6.1.tgz#7de85fdd6e1b3377c23ce010892656385fd9b10c" - integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw== +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== g-status@^2.0.2: version "2.0.2" @@ -7802,22 +3648,7 @@ g-status@^2.0.2: matcher "^1.0.0" simple-git "^1.85.0" -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -7830,36 +3661,32 @@ get-caller-file@^2.0.5: get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-node-dimensions@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz#fb7b4bb57060fb4247dd51c9d690dfbec56b0823" + integrity sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ== get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stdin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" - integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= + integrity sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA== get-stream@^4.0.0: version "4.1.0" @@ -7868,10 +3695,12 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" get-symbol-description@^1.0.0: version "1.0.0" @@ -7884,71 +3713,24 @@ get-symbol-description@^1.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -github-slugger@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" - integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== -glob-parent@^2.0.0: +github-slugger@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" + integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-promise@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-3.4.0.tgz#b6b8f084504216f702dc2ce8c9bc9ac8866fdb20" - integrity sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw== - dependencies: - "@types/glob" "*" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -7957,59 +3739,34 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -global@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - globals@^11.1.0, globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - -globalthis@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" - integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" -globby@^11.0.1, globby@^11.0.2: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -8017,108 +3774,61 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== - -hammerjs@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" - integrity sha1-BO93hiz/K7edMPdpIJWTAiK/YPE= - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" + get-intrinsic "^1.1.3" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" +graceful-fs@^4.1.2, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-glob@^1.0.0: +has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" - integrity sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc= + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: - is-glob "^3.0.0" + get-intrinsic "^1.1.1" -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" @@ -8127,15 +3837,10 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -8144,7 +3849,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -8153,12 +3858,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -8170,79 +3875,91 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== +hast-util-from-parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" + integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + hastscript "^7.0.0" + property-information "^6.0.0" + vfile "^5.0.0" + vfile-location "^4.0.0" + web-namespaces "^2.0.0" -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" +hast-util-has-property@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz#8ec99c3e8f02626304ee438cdb9f0528b017e083" + integrity sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg== -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== +hast-util-heading-rank@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/hast-util-heading-rank/-/hast-util-heading-rank-2.1.1.tgz#063b43b9cfb56a1a8ded84dd68d8af69e8864545" + integrity sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA== dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" + "@types/hast" "^2.0.0" -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== +hast-util-is-element@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" + integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" hast-util-parse-selector@^2.0.0: version "2.2.5" resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== -hast-util-raw@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" - integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== +hast-util-parse-selector@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" + integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== dependencies: "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" + +hast-util-raw@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" + integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== + dependencies: + "@types/hast" "^2.0.0" + "@types/parse5" "^6.0.0" + hast-util-from-parse5 "^7.0.0" + hast-util-to-parse5 "^7.0.0" + html-void-elements "^2.0.0" parse5 "^6.0.0" - unist-util-position "^3.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== +hast-util-to-parse5@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" + integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz#b008b0a4ea472bf34dd390b7eea1018726ae152a" + integrity sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A== + dependencies: + "@types/hast" "^2.0.0" + +hast-util-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== hastscript@^6.0.0: version "6.0.0" @@ -8255,79 +3972,27 @@ hastscript@^6.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= +hastscript@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" + integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^3.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" -he@^1.2.0: +he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -highlight.js@^10.1.1, highlight.js@~10.7.0: +highlight.js@^10.4.1, highlight.js@~10.7.0: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== -history@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.0.0.tgz#0cabbb6c4bbf835addb874f8259f6d25101efd08" - integrity sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg== - dependencies: - "@babel/runtime" "^7.7.6" - -history@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.2.0.tgz#7cdd31cf9bac3c5d31f09c231c9928fad0007b7c" - integrity sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig== - dependencies: - "@babel/runtime" "^7.7.6" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^2.3.1: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" - integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== - -hoist-non-react-statics@^3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - html-comment-regex@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" @@ -8348,180 +4013,37 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" -html-entities@^2.1.0, html-entities@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" - integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-minifier-terser@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" - integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== - dependencies: - camel-case "^4.1.1" - clean-css "^4.2.3" - commander "^4.1.1" - he "^1.2.0" - param-case "^3.0.3" - relateurl "^0.2.7" - terser "^4.6.3" - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" - integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -html-webpack-plugin@5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -html-webpack-plugin@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" - integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== - dependencies: - "@types/html-minifier-terser" "^5.0.0" - "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.20" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" - -htmlparser2@^3.9.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -htmlparser2@~3.8.1: - version "3.8.3" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" - integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= - dependencies: - domelementtype "1" - domhandler "2.3" - domutils "1.5" - entities "1.0" - readable-stream "1.1" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= +html-void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" + integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" - integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== - -http-proxy-middleware@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz#94d7593790aad6b3de48164f13792262f656c332" - integrity sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g== +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" + "@tootallnate/once" "1" + agent-base "6" + debug "4" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + agent-base "6" + debug "4" husky@^0.14.3: version "0.14.3" @@ -8532,14 +4054,6 @@ husky@^0.14.3: normalize-path "^1.0.0" strip-indent "^2.0.0" -ice-cap@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" - integrity sha1-im0xq0ysjUtW3k+pRt8zUlYbbhg= - dependencies: - cheerio "0.20.0" - color-logger "0.0.3" - iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -8547,76 +4061,52 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg== icss-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" - integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= + integrity sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA== dependencies: postcss "^6.0.1" -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - -ieee754@^1.1.4: +ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - ignore-styles@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ignore-styles/-/ignore-styles-5.0.1.tgz#b49ef2274bdafcd8a4880a966bfe38d1a0bf4671" - integrity sha1-tJ7yJ0va/NikiAqWa/440aC/RnE= + integrity sha512-gQQmIznCETPLEzfg1UH4Cs2oRq+HBPl8quroEUNXT8oybEG7/0lqI3dGgDSRry6B9HcCXw3PVkFFS0FF3CMddg== -ignore@^4.0.3, ignore@^4.0.6: +ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -immutable@^3.7.4: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= +immer@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.3.tgz#a8de42065e964aa3edf6afc282dfc7f7f34ae3c9" + integrity sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A== -immutable@~3.7.4: - version "3.7.6" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" - integrity sha1-E7TTyxK++hVIKib+Gy665kAHHks= +immer@^9.0.21: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== dependencies: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -8624,62 +4114,34 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + integrity sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ== indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" @@ -8705,62 +4167,30 @@ inquirer@^6.2.2: through "^2.3.6" interactjs@^1.6.2: - version "1.10.11" - resolved "https://registry.yarnpkg.com/interactjs/-/interactjs-1.10.11.tgz#0b9eabe37f1f82fff68e22faad51269b8f2038ea" - integrity sha512-VPUWsGAOPmrZe1YF7Fq/4AIBBZ+3FikZRS8bpzT6VsAfUuhxl/CKJY73IAiZHd3fz9p174CXErn0Qs81XEFICA== + version "1.10.17" + resolved "https://registry.yarnpkg.com/interactjs/-/interactjs-1.10.17.tgz#aed66a63020cd092236133f9149e6448dc405d72" + integrity sha512-grjHJgnWkCoQLmAlk2yalNd1r0ztUhXLJNVjSOfWn1wfNNgU2tx1cDEkro9WYerDNC9UG3MZTeD4O6zOM5gbIA== dependencies: - "@interactjs/types" "1.10.11" + "@interactjs/types" "1.10.17" -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -invariant@^2.2.0, invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== dependencies: kind-of "^3.0.2" @@ -8771,7 +4201,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: +is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== @@ -8784,7 +4214,7 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" -is-arguments@^1.0.4, is-arguments@^1.1.0: +is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -8792,10 +4222,24 @@ is-arguments@^1.0.4, is-arguments@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: version "1.0.4" @@ -8804,13 +4248,6 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -8836,10 +4273,10 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^1.0.10: version "1.2.1" @@ -8848,24 +4285,17 @@ is-ci@^1.0.10: dependencies: ci-info "^1.5.0" -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.2.0, is-core-module@^2.8.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== dependencies: kind-of "^3.0.2" @@ -8876,7 +4306,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -8909,37 +4339,12 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-dom@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a" - integrity sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ== - dependencies: - is-object "^1.0.1" - is-window "^1.0.2" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" @@ -8948,57 +4353,28 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.0.0, is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -9011,47 +4387,35 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== -is-map@^2.0.2: +is-lite@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/is-lite/-/is-lite-0.8.2.tgz#26ab98b32aae8cc8b226593b9a641d2bf4bd3b6a" + integrity sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw== + +is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== -is-mobile@^2.1.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.2.2.tgz#f6c9c5d50ee01254ce05e739bdd835f1ed4e9954" - integrity sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg== - -is-negative-zero@^2.0.1: +is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -9060,12 +4424,7 @@ is-number@^7.0.0: is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-observable@^1.1.0: version "1.1.0" @@ -9077,12 +4436,7 @@ is-observable@^1.1.0: is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + integrity sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw== is-path-in-cwd@^1.0.0: version "1.0.1" @@ -9094,34 +4448,24 @@ is-path-in-cwd@^1.0.0: is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + integrity sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g== dependencies: path-is-inside "^1.0.1" -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-obj@^2.0.0: +is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -9130,27 +4474,17 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-potential-custom-element-name@^1.0.0: +is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-promise@^2.1.0: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== -is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0, is-regex@^1.1.2, is-regex@^1.1.4: +is-regex@^1.0.5, is-regex@^1.1.0, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -9161,27 +4495,24 @@ is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0, is-regex@^1.1.2, is-regex@^1. is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-set@^2.0.2: +is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -9193,12 +4524,12 @@ is-string@^1.0.5, is-string@^1.0.7: is-subset@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" - integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= + integrity sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw== is-svg@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= + integrity sha512-Ya1giYJUkcL/94quj0+XGcmts6cETPBW1MiFz1ReJrnDJ680F52qpAEGAEGU0nq96FRGIGPx6Yo1CyPXcOoyGw== dependencies: html-comment-regex "^1.1.0" @@ -9209,59 +4540,47 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-weakref@^1.0.1: +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-window@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" - integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0= +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isarray@^2.0.5: version "2.0.5" @@ -9271,173 +4590,52 @@ isarray@^2.0.5: isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.1, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-reports@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" - integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterate-iterator@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.2.tgz#551b804c9eaa15b847ea6a7cdc2f5bf1ec150f91" - integrity sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw== - -iterate-value@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" - integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== - dependencies: - es-get-iterator "^1.0.2" - iterate-iterator "^1.0.1" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== jest-docblock@^21.0.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== - dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.1.2" - -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-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-worker@^26.5.0, jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^27.4.1: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" - integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" +jquery@x.*: + version "3.7.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.0.tgz#fe2c01a05da500709006d8790fe21c8a39d75612" + integrity sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ== js-base64@^2.1.9: version "2.6.4" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== -js-string-escape@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== + +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + js-yaml@^3.13.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -9449,23 +4647,18 @@ js-yaml@^3.13.0, js-yaml@^3.13.1: js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= + integrity sha512-eIlkGty7HGmntbV6P/ZlAsoncFLGsNoM27lkTzS+oneY/EiNhj+geqD9ezg/ip+SW6Var0BJU2JtV0vEUZpWVQ== dependencies: argparse "^1.0.7" esprima "^2.6.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - jsdom@^16.5.0: - version "16.5.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.0.tgz#9e453505600cc5a70b385750d35256f380730cc4" - integrity sha512-QxZH0nmDTnTTVI0YDm4RUlaUPl5dcyn62G5TMDNfMmTW+J1u1v9gCR8WR+WZ6UghAa7nKJjDOFaI00eMMWvJFQ== + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" - acorn "^8.0.5" + acorn "^8.2.4" acorn-globals "^6.0.0" cssom "^0.4.4" cssstyle "^2.3.0" @@ -9473,12 +4666,13 @@ jsdom@^16.5.0: decimal.js "^10.2.1" domexception "^2.0.1" escodegen "^2.0.0" + form-data "^3.0.0" html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" parse5 "6.0.1" - request "^2.88.2" - request-promise-native "^1.0.9" saxes "^5.0.1" symbol-tree "^3.2.4" tough-cookie "^4.0.0" @@ -9487,36 +4681,10 @@ jsdom@^16.5.0: webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - ws "^7.4.4" + whatwg-url "^8.5.0" + ws "^7.4.6" xml-name-validator "^3.0.0" -jsdom@^7.0.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" - integrity sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4= - dependencies: - abab "^1.0.0" - acorn "^2.4.0" - acorn-globals "^1.0.4" - cssom ">= 0.3.0 < 0.4.0" - cssstyle ">= 0.2.29 < 0.3.0" - escodegen "^1.6.1" - nwmatcher ">= 1.3.7 < 2.0.0" - parse5 "^1.5.1" - request "^2.55.0" - sax "^1.1.4" - symbol-tree ">= 3.1.0 < 4.0.0" - tough-cookie "^2.2.0" - webidl-conversions "^2.0.0" - whatwg-url-compat "~0.6.5" - xml-name-validator ">= 2.0.1 < 3.0.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -9525,9 +4693,9 @@ jsesc@^2.5.1: jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -9542,109 +4710,49 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json2mq@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" - integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo= - dependencies: - string-convert "^0.2.0" - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +json5@^1.0.1, json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.1.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.2.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" - integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== + version "3.3.4" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz#b896535fed5b867650acce5a9bd4135ffc7b3bf9" + integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== dependencies: - array-includes "^3.1.3" - object.assign "^4.1.2" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" -junk@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" - integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== +keyboard-key@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keyboard-key/-/keyboard-key-1.1.0.tgz#6f2e8e37fa11475bb1f1d65d5174f1b35653f5b7" + integrity sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ== kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" @@ -9658,38 +4766,15 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klona@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - -lazy-universal-dotenv@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz#a6c8938414bca426ab8c9463940da451a911db38" - integrity sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ== - dependencies: - "@babel/runtime" "^7.5.0" - app-root-dir "^1.0.2" - core-js "^3.0.4" - dotenv "^8.0.0" - dotenv-expand "^5.1.0" +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -9732,7 +4817,7 @@ lint-staged@8.2.1: listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + integrity sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA== listr-update-renderer@^0.5.0: version "0.5.0" @@ -9773,59 +4858,24 @@ listr@^0.14.2: p-map "^2.0.0" rxjs "^6.3.3" -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - -loader-utils@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^1.0.1" loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -9840,115 +4890,68 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.assignin@^4.0.9: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= - -lodash.bind@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" - integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== -lodash.debounce@^4.0.0, lodash.debounce@^4.0.8: +lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.defaults@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.escape@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" - integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= - -lodash.filter@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= - -lodash.foreach@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - -lodash.map@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.merge@^4.4.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - -lodash.reduce@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" - integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= - -lodash.reject@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" - integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= - -lodash.some@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= - -lodash.throttle@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.1.0, lodash@^4.15.0, lodash@^4.16.5, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.7.0: +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + integrity sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ== dependencies: chalk "^1.0.0" @@ -9962,13 +4965,18 @@ log-symbols@^2.2.0: log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + integrity sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg== dependencies: ansi-escapes "^3.0.0" cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -9976,20 +4984,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4 js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.1.tgz#a2e1192c9f452e4e85089766da10ac8288383947" - integrity sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA== + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowlight@^1.14.0: +lowlight@^1.17.0: version "1.20.0" resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== @@ -10011,14 +5012,12 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== -make-dir@^2.0.0, make-dir@^2.1.0: +make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -10026,51 +5025,29 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-or-similar@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" - integrity sha1-beJlMXSt+12e3DPGnT6Sobdvrwg= + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -markdown-to-jsx@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.1.6.tgz#421487df2a66fe4231d94db653a34da033691e62" - integrity sha512-1wrIGZYwIG2gR3yfRmbr4FlQmhaAKoKTpRo4wur4fp9p0njU1Hi7vR8fj0AUKKIcPduiJmPprzmCB5B/GvlC7g== - -marked@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" - integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== matcher@^1.0.0: version "1.1.1" @@ -10080,150 +5057,430 @@ matcher@^1.0.0: escape-string-regexp "^1.0.4" math-expression-evaluator@^1.2.14: - version "1.3.13" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.3.13.tgz#bcb92f9e5a23ed9e9a4f92ada94f459592a1eca7" - integrity sha512-ebm28Ec6XoChCRcEPXawPJVoLb3xsrH6L814Vy/EE4zusADCVBJwmKCs1EtcYRd5dBzE53g1HuoAf4TUGHD+gg== + version "1.4.0" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz#3d66031117fbb7b9715ea6c9c68c2cd2eebd37e2" + integrity sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw== -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== +mdast-util-definitions@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + +mdast-util-find-and-replace@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== + dependencies: + "@types/mdast" "^3.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.0.0" -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== +mdast-util-from-markdown@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-gfm-autolink-literal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" + "@types/mdast" "^3.0.0" + ccount "^2.0.0" + mdast-util-find-and-replace "^2.0.0" + micromark-util-character "^1.0.0" -mdast-squeeze-paragraphs@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" - integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== +mdast-util-gfm-footnote@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== dependencies: - unist-util-remove "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + micromark-util-normalize-identifier "^1.0.0" -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== +mdast-util-gfm-strikethrough@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== + dependencies: + "@types/mdast" "^3.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-task-list-item@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-gfm-autolink-literal "^1.0.0" + mdast-util-gfm-footnote "^1.0.0" + mdast-util-gfm-strikethrough "^1.0.0" + mdast-util-gfm-table "^1.0.0" + mdast-util-gfm-task-list-item "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== dependencies: - unist-util-visit "^2.0.0" + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" -mdast-util-to-hast@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" - integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== +mdast-util-to-hast@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-definitions "^5.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" + unist-util-generated "^2.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + +mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdast-util-to-string@^1.0.0: + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" + +memory-fs@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" + integrity sha512-QTNXnl79X97kZ9jJk/meJrtDuvgvRakX5LU7HZW1L7MsXHuSTwoMIzN9tOLLH3Xfsj/gbsSqX/ovnsqz246zKQ== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" - integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromark-extension-gfm-autolink-literal@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" + integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= +micromark-extension-gfm-footnote@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" + integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== + dependencies: + micromark-core-commonmark "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-strikethrough@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" + integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +micromark-extension-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" + integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-tagfilter@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" + integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== + dependencies: + micromark-util-types "^1.0.0" + +micromark-extension-gfm-task-list-item@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" + integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" + integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== + dependencies: + micromark-extension-gfm-autolink-literal "^1.0.0" + micromark-extension-gfm-footnote "^1.0.0" + micromark-extension-gfm-strikethrough "^1.0.0" + micromark-extension-gfm-table "^1.0.0" + micromark-extension-gfm-tagfilter "^1.0.0" + micromark-extension-gfm-task-list-item "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-destination@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-label@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-title@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-whitespace@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-chunked@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== + dependencies: + micromark-util-symbol "^1.0.0" -memfs@^3.1.2, memfs@^3.2.2: - version "3.4.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" - integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== +micromark-util-classify-character@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: - fs-monkey "1.0.3" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" -memoizerific@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a" - integrity sha1-fIekZGREwy11Q4VwkF8tvRsagFo= +micromark-util-combine-extensions@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: - map-or-similar "^1.5.0" + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" -memory-fs@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" - integrity sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA= +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" + micromark-util-symbol "^1.0.0" -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= +micromark-util-decode-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== +micromark-util-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + +micromark-util-html-tag-name@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== + +micromark-util-normalize-identifier@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" + micromark-util-symbol "^1.0.0" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +micromark-util-resolve-all@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== + dependencies: + micromark-util-types "^1.0.0" -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micromark-util-subtokenize@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micromark-util-symbol@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== -microevent.ts@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" - integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromark@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -10242,159 +5499,54 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== +micromatch@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" + braces "^3.0.2" + picomatch "^2.3.1" -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.51.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mime-db "1.52.0" mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-store@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mini-store/-/mini-store-2.0.0.tgz#0843c048d6942ce55e3e78b1b67fc063022b5488" - integrity sha512-EG0CuwpQmX+XL4QVS0kxNwHW5ftSbhygu1qxQH0pipugjnPkbvkalCdQbEihMwtQY6d3MTN+MS0q+aurs+RfLQ== +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: - hoist-non-react-statics "^2.3.1" - prop-types "^15.6.0" - react-lifecycles-compat "^3.0.4" - shallowequal "^1.0.2" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + brace-expansion "^2.0.1" -minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mississippi@^3.0.0: +mitt@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" + integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== mixin-deep@^1.2.0: version "1.3.2" @@ -10404,73 +5556,64 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== +mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + minimist "^1.2.6" -mocha@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== +mocha@^10.1.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: + ansi-colors "4.1.1" browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -moment@2.x, moment@^2.22.2, moment@^2.24.0: + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +moment@^2.22.2: version "2.29.4" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== moo@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" - integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== + version "0.5.2" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" + integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" @@ -10482,38 +5625,15 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -mutationobserver-shim@^0.3.2: - version "0.3.7" - resolved "https://registry.yarnpkg.com/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz#8bf633b0c0b0291a1107255ed32c13088a8c5bf3" - integrity sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ== - mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -nan@^2.12.1: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== -nanoid@^3.1.23: - version "3.2.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" - integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== nanomatch@^1.2.9: version "1.2.13" @@ -10535,7 +5655,7 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== nearley@^2.7.10: version "2.20.1" @@ -10547,121 +5667,27 @@ nearley@^2.7.10: railroad-diagrams "^1.0.0" randexp "0.4.6" -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" - integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-dir@^0.1.10: - version "0.1.17" - resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" - integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= - dependencies: - minimatch "^3.0.2" - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-fetch@^2.6.1: +node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" -node-forge@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" +node-releases@^2.0.12, node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== normalize-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" - integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= - -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" + integrity sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -10671,12 +5697,12 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== normalize-url@^1.4.0: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + integrity sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ== dependencies: object-assign "^4.0.1" prepend-http "^1.0.0" @@ -10693,95 +5719,61 @@ npm-path@^2.0.2: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - npm-which@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" - integrity sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo= + integrity sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A== dependencies: commander "^2.9.0" npm-path "^2.0.2" which "^1.2.10" -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - nth-check@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -"nwmatcher@>= 1.3.7 < 2.0.0": - version "1.4.4" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" - integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" - integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.11.0, object-inspect@^1.7.0, object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-inspect@^1.12.3, object-inspect@^1.7.0, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.0.1, object-is@^1.0.2, object-is@^1.1.2: +object-is@^1.0.2, object-is@^1.1.2, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -10789,7 +5781,7 @@ object-is@^1.0.1, object-is@^1.0.2, object-is@^1.1.2: call-bind "^1.0.2" define-properties "^1.1.3" -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -10797,147 +5789,77 @@ object-keys@^1.0.12, object-keys@^1.1.1: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.2, object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== +object.assign@^4.1.0, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" -"object.fromentries@^2.0.0 || ^1.0.0", object.fromentries@^2.0.3, object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== +object.entries@^1.1.1, object.entries@^1.1.2, object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== +object.fromentries@^2.0.5, object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.hasown@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" - integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.2, object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.values@^1.1.1, object.values@^1.1.5, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -objectorarray@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.5.tgz#2c05248bbefabd8f43ad13b41085951aac5e68a5" - integrity sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg== - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -omit.js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-1.0.2.tgz#91a14f0eba84066dfa015bf30e474c47f30bc858" - integrity sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ== - dependencies: - babel-runtime "^6.23.0" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + define-properties "^1.1.4" + es-abstract "^1.20.4" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== dependencies: mimic-fn "^1.0.0" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^7.0.3: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@^8.0.9: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.2: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -10949,96 +5871,30 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= - dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" - -overlayscrollbars@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz#0b840a88737f43a946b9d87875a2f9e421d0338a" - integrity sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ== - -p-all@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0" - integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA== - dependencies: - p-map "^2.0.0" - -p-event@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== - dependencies: - p-timeout "^3.1.0" - -p-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== - dependencies: - p-map "^2.0.0" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-limit@^3.0.2, p-limit@^3.1.0: +p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -11063,67 +5919,11 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.13.1" - -p-timeout@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@^3.0.3, param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -11131,17 +5931,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - parse-entities@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" @@ -11154,20 +5943,10 @@ parse-entities@^2.0.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -11182,142 +5961,82 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5-htmlparser2-tree-adapter@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@6.0.1, parse5@^6.0.0, parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" - integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= - -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== dependencies: - "@types/node" "*" + domhandler "^5.0.2" + parse5 "^7.0.0" -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +parse5@6.0.1, parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: - no-case "^3.0.4" - tslib "^2.0.3" + entities "^4.4.0" pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathval@^1.1.1: +pathval@^1.1.0, pathval@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -11325,12 +6044,12 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0: pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" @@ -11340,48 +6059,22 @@ pify@^4.0.1: pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pirates@^4.0.0, pirates@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - please-upgrade-node@^3.0.2: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -11389,38 +6082,15 @@ please-upgrade-node@^3.0.2: dependencies: semver-compare "^1.0.0" -pnp-webpack-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" - -polished@^4.0.5: - version "4.1.4" - resolved "https://registry.yarnpkg.com/polished/-/polished-4.1.4.tgz#640293ba834109614961a700fdacbb6599fb12d0" - integrity sha512-Nq5Mbza+Auo7N3sQb1QMFaQiDO+4UexWuSGR7Cjb4Sw11SZIJcrrFtiZ+L0jT9MBsUsxDboHVASbCLbE1rnECg== - dependencies: - "@babel/runtime" "^7.16.7" - -portfinder@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== postcss-calc@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= + integrity sha512-iBcptYFq+QUh9gzP7ta2btw50o40s4uLI4UDVgd5yRAZtUDWc5APdl5yQDd2h/TyiZNbJrv0HiYhT102CMgN7Q== dependencies: postcss "^5.0.2" postcss-message-helpers "^2.0.0" @@ -11429,7 +6099,7 @@ postcss-calc@^5.2.0: postcss-colormin@^2.1.8: version "2.2.2" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks= + integrity sha512-XXitQe+jNNPf+vxvQXIQ1+pvdQKWKgkx8zlJNltcMEmLma1ypDRDQwlLt+6cP26fBreihNhZxohh1rcgCH2W5w== dependencies: colormin "^1.0.5" postcss "^5.0.13" @@ -11438,7 +6108,7 @@ postcss-colormin@^2.1.8: postcss-convert-values@^2.3.4: version "2.6.1" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0= + integrity sha512-SE7mf25D3ORUEXpu3WUqQqy0nCbMuM5BEny+ULE/FXdS/0UMA58OdzwvzuHJRpIFlk1uojt16JhaEogtP6W2oA== dependencies: postcss "^5.0.11" postcss-value-parser "^3.1.2" @@ -11446,35 +6116,35 @@ postcss-convert-values@^2.3.4: postcss-discard-comments@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0= + integrity sha512-yGbyBDo5FxsImE90LD8C87vgnNlweQkODMkUZlDVM/CBgLr9C5RasLGJxxh9GjVOBeG8NcCMatoqI1pXg8JNXg== dependencies: postcss "^5.0.14" postcss-discard-duplicates@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= + integrity sha512-+lk5W1uqO8qIUTET+UETgj9GWykLC3LOldr7EehmymV0Wu36kyoHimC4cILrAAYpHQ+fr4ypKcWcVNaGzm0reA== dependencies: postcss "^5.0.4" postcss-discard-empty@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= + integrity sha512-IBFoyrwk52dhF+5z/ZAbzq5Jy7Wq0aLUsOn69JNS+7YeuyHaNzJwBIYE0QlUH/p5d3L+OON72Fsexyb7OK/3og== dependencies: postcss "^5.0.14" postcss-discard-overridden@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg= + integrity sha512-IyKoDL8QNObOiUc6eBw8kMxBHCfxUaERYTUe2QF8k7j/xiirayDzzkmlR6lMQjrAM1p1DDRTvWrS7Aa8lp6/uA== dependencies: postcss "^5.0.16" postcss-discard-unused@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM= + integrity sha512-nCbFNfqYAbKCw9J6PSJubpN9asnrwVLkRDFc4KCwyUEdOtM5XDE/eTW3OpqHrYY1L4fZxgan7LLRAAYYBzwzrg== dependencies: postcss "^5.0.14" uniqs "^2.0.0" @@ -11486,28 +6156,10 @@ postcss-filter-plugins@^2.0.0: dependencies: postcss "^5.0.4" -postcss-flexbugs-fixes@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" - integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== - dependencies: - postcss "^7.0.26" - -postcss-loader@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.3.0.tgz#2c4de9657cd4f07af5ab42bd60a673004da1b8cc" - integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.4" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - semver "^7.3.4" - postcss-merge-idents@^2.1.5: version "2.1.7" resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA= + integrity sha512-9DHmfCZ7/hNHhIKnNkz4CU0ejtGen5BbTRJc13Z2uHfCedeCUsK2WEQoAJRBL+phs68iWK6Qf8Jze71anuysWA== dependencies: has "^1.0.1" postcss "^5.0.10" @@ -11516,14 +6168,14 @@ postcss-merge-idents@^2.1.5: postcss-merge-longhand@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg= + integrity sha512-ma7YvxjdLQdifnc1HFsW/AW6fVfubGyR+X4bE3FOSdBVMY9bZjKVdklHT+odknKBB7FSCfKIHC3yHK7RUAqRPg== dependencies: postcss "^5.0.4" postcss-merge-rules@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE= + integrity sha512-Wgg2FS6W3AYBl+5L9poL6ZUISi5YzL+sDCJfM7zNw/Q1qsyVQXXZ2cbVui6mu2cYJpt1hOKCGj1xA4mq/obz/Q== dependencies: browserslist "^1.5.2" caniuse-api "^1.5.2" @@ -11534,12 +6186,12 @@ postcss-merge-rules@^2.0.3: postcss-message-helpers@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= + integrity sha512-tPLZzVAiIJp46TBbpXtrUAKqedXSyW5xDEo1sikrfEfnTs+49SBZR/xDdqCiJvSSbtr615xDsaMF3RrxS2jZlA== postcss-minify-font-values@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k= + integrity sha512-vFSPzrJhNe6/8McOLU13XIsERohBJiIFFuC1PolgajOZdRWqRgKITP/A4Z/n4GQhEmtbxmO9NDw3QLaFfE1dFQ== dependencies: object-assign "^4.0.1" postcss "^5.0.4" @@ -11548,7 +6200,7 @@ postcss-minify-font-values@^1.0.2: postcss-minify-gradients@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE= + integrity sha512-DZhT0OE+RbVqVyGsTIKx84rU/5cury1jmwPa19bViqYPQu499ZU831yMzzsyC8EhiZVd73+h5Z9xb/DdaBpw7Q== dependencies: postcss "^5.0.12" postcss-value-parser "^3.3.0" @@ -11556,7 +6208,7 @@ postcss-minify-gradients@^1.0.1: postcss-minify-params@^1.0.4: version "1.2.2" resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM= + integrity sha512-hhJdMVgP8vasrHbkKAk+ab28vEmPYgyuDzRl31V3BEB3QOR3L5TTIVEWLDNnZZ3+fiTi9d6Ker8GM8S1h8p2Ow== dependencies: alphanum-sort "^1.0.1" postcss "^5.0.2" @@ -11566,7 +6218,7 @@ postcss-minify-params@^1.0.4: postcss-minify-selectors@^2.0.4: version "2.1.1" resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8= + integrity sha512-e13vxPBSo3ZaPne43KVgM+UETkx3Bs4/Qvm6yXI9HQpQp4nyb7HZ0gKpkF+Wn2x+/dbQ+swNpCdZSbMOT7+TIA== dependencies: alphanum-sort "^1.0.2" has "^1.0.1" @@ -11580,74 +6232,41 @@ postcss-modules-extract-imports@^1.2.0: dependencies: postcss "^6.0.1" -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - postcss-modules-local-by-default@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + integrity sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA== dependencies: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - postcss-modules-scope@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + integrity sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw== dependencies: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - postcss-modules-values@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + integrity sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA== dependencies: icss-replace-symbols "^1.1.0" postcss "^6.0.1" -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - postcss-normalize-charset@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= + integrity sha512-RKgjEks83l8w4yEhztOwNZ+nLSrJ+NvPNhpS+mVDzoaiRHZQVoG7NF2TP5qjwnaN9YswUhj6m1E0S0Z+WDCgEQ== dependencies: postcss "^5.0.5" postcss-normalize-url@^3.0.7: version "3.0.8" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= + integrity sha512-WqtWG6GV2nELsQEFES0RzfL2ebVwmGl/M8VmMbshKto/UClBo+mznX8Zi4/hkThdqx7ijwv+O8HWPdpK7nH/Ig== dependencies: is-absolute-url "^2.0.0" normalize-url "^1.4.0" @@ -11657,7 +6276,7 @@ postcss-normalize-url@^3.0.7: postcss-ordered-values@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= + integrity sha512-5RB1IUZhkxDCfa5fx/ogp/A82mtq+r7USqS+7zt0e428HJ7+BHCxyeY39ClmkkUtxdOd3mk8gD6d9bjH2BECMg== dependencies: postcss "^5.0.4" postcss-value-parser "^3.0.1" @@ -11665,7 +6284,7 @@ postcss-ordered-values@^2.1.0: postcss-reduce-idents@^2.2.2: version "2.4.0" resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= + integrity sha512-0+Ow9e8JLtffjumJJFPqvN4qAvokVbdQPnijUDSOX8tfTwrILLP4ETvrZcXZxAtpFLh/U0c+q8oRMJLr1Kiu4w== dependencies: postcss "^5.0.4" postcss-value-parser "^3.0.2" @@ -11673,14 +6292,14 @@ postcss-reduce-idents@^2.2.2: postcss-reduce-initial@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= + integrity sha512-jJFrV1vWOPCQsIVitawGesRgMgunbclERQ/IRGW7r93uHrVzNQQmHQ7znsOIjJPZ4yWMzs5A8NFhp3AkPHPbDA== dependencies: postcss "^5.0.4" postcss-reduce-transforms@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= + integrity sha512-lGgRqnSuAR5i5uUg1TA33r9UngfTadWxOyL2qx1KuPoCQzfmtaHjp9PuwX7yVyRxG3BWBzeFUaS5uV9eVgnEgQ== dependencies: has "^1.0.1" postcss "^5.0.8" @@ -11689,24 +6308,16 @@ postcss-reduce-transforms@^1.0.3: postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= + integrity sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA== dependencies: flatten "^1.0.2" indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.9" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" - integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - postcss-svgo@^2.1.1: version "2.1.6" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= + integrity sha512-y5AdQdgBoF4rbpdbeWAJuxE953g/ylRfVNp6mvAi61VCN/Y25Tu9p5mh3CyI42WbTRIiwR9a1GdFtmDnNPeskQ== dependencies: is-svg "^2.0.0" postcss "^5.0.14" @@ -11716,7 +6327,7 @@ postcss-svgo@^2.1.1: postcss-unique-selectors@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0= + integrity sha512-WZX8r1M0+IyljoJOJleg3kYm10hxNYF9scqAT7v/xeSX1IdehutOM85SNO0gP9K+bgs86XERr7Ud5u3ch4+D8g== dependencies: alphanum-sort "^1.0.1" postcss "^5.0.4" @@ -11727,15 +6338,10 @@ postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - postcss-zindex@^2.0.1: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= + integrity sha512-uhRZ2hRgj0lorxm9cr62B01YzpUe63h0RXMXQ4gWW3oa2rpJh+FJAiEAytaFCPU/VgaBS+uW2SJ1XKyDNz1h4w== dependencies: has "^1.0.1" postcss "^5.0.4" @@ -11760,131 +6366,59 @@ postcss@^6.0.1: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -"prettier@>=2.2.1 <=2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" - integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== + integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== prettier@^1.13.5: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -pretty-error@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" - integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: - lodash "^4.17.20" - renderkid "^2.0.4" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== +pretty-format@^29.5.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-hrtime@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= - -prismjs@^1.21.0: - version "1.26.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.26.0.tgz#16881b594828bb6b45296083a8cbab46b0accd47" - integrity sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ== + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" -prismjs@~1.25.0: - version "1.25.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" - integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg== +prismjs@^1.27.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +prismjs@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@^2.0.0: +progress@2.0.3, progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise.allsettled@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.5.tgz#2443f3d4b2aa8dfa560f6ac2aa6c4ea999d75f53" - integrity sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ== - dependencies: - array.prototype.map "^1.0.4" - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - iterate-value "^1.0.2" - -promise.prototype.finally@^3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz#d3186e58fcf4df1682a150f934ccc27b7893389c" - integrity sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prompts@^2.4.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - prop-types-exact@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" @@ -11894,7 +6428,7 @@ prop-types-exact@^1.2.0: object.assign "^4.1.0" reflect.ownkeys "^0.2.0" -prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.0.0, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -11908,56 +6442,33 @@ property-expr@^1.5.0: resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== -property-information@^5.0.0, property-information@^5.3.0: +property-information@^5.0.0: version "5.6.0" resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== dependencies: xtend "^4.0.0" -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" +property-information@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" + integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== + +proxy-from-env@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -11966,605 +6477,84 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.9.6: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== - -qs@^6.10.0: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -raf@^3.4.0, raf@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - -railroad-diagrams@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" - integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= - -ramda@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" - integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= - -randexp@0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" - integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== - dependencies: - discontinuous-range "1.0.0" - ret "~0.1.10" - -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" - integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== - dependencies: - bytes "3.1.1" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-loader@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" - integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -rc-align@^2.4.0, rc-align@^2.4.1: - version "2.4.5" - resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-2.4.5.tgz#c941a586f59d1017f23a428f0b468663fb7102ab" - integrity sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw== - dependencies: - babel-runtime "^6.26.0" - dom-align "^1.7.0" - prop-types "^15.5.8" - rc-util "^4.0.4" - -rc-animate@2.x, rc-animate@^2.10.1, rc-animate@^2.10.2, rc-animate@^2.3.0, rc-animate@^2.6.0, rc-animate@^2.8.2: - version "2.11.1" - resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-2.11.1.tgz#2666eeb6f1f2a495a13b2af09e236712278fdb2c" - integrity sha512-1NyuCGFJG/0Y+9RKh5y/i/AalUCA51opyyS/jO2seELpgymZm2u9QV3xwODwEuzkmeQ1BDPxMLmYLcTJedPlkQ== - dependencies: - babel-runtime "6.x" - classnames "^2.2.6" - css-animation "^1.3.2" - prop-types "15.x" - raf "^3.4.0" - rc-util "^4.15.3" - react-lifecycles-compat "^3.0.4" - -rc-animate@^3.0.0-rc.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-3.1.1.tgz#defdd863f56816c222534e4dc68feddecd081386" - integrity sha512-8wg2Zg3EETy0k/9kYuis30NJNQg1D6/WSQwnCiz6SvyxQXNet/rVraRz3bPngwY6rcU2nlRvoShiYOorXyF7Sg== - dependencies: - "@ant-design/css-animation" "^1.7.2" - classnames "^2.2.6" - raf "^3.4.0" - rc-util "^4.15.3" - -rc-calendar@~9.15.7: - version "9.15.11" - resolved "https://registry.yarnpkg.com/rc-calendar/-/rc-calendar-9.15.11.tgz#ce1e5ea8e4d77435be66a8c77db12f1f0f9a345f" - integrity sha512-qv0VXfAAnysMWJigxaP6se4bJHvr17D9qsLbi8BOpdgEocsS0RkgY1IUiFaOVYKJDy/EyLC447O02sV/y5YYBg== - dependencies: - babel-runtime "6.x" - classnames "2.x" - moment "2.x" - prop-types "^15.5.8" - rc-trigger "^2.2.0" - rc-util "^4.1.1" - react-lifecycles-compat "^3.0.4" - -rc-cascader@~0.17.4: - version "0.17.5" - resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-0.17.5.tgz#4fde91d23b7608c420263c38eee9c0687f80f7dc" - integrity sha512-WYMVcxU0+Lj+xLr4YYH0+yXODumvNXDcVEs5i7L1mtpWwYkubPV/zbQpn+jGKFCIW/hOhjkU4J1db8/P/UKE7A== - dependencies: - array-tree-filter "^2.1.0" - prop-types "^15.5.8" - rc-trigger "^2.2.0" - rc-util "^4.0.4" - react-lifecycles-compat "^3.0.4" - shallow-equal "^1.0.0" - warning "^4.0.1" - -rc-checkbox@~2.1.6: - version "2.1.8" - resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.1.8.tgz#eedd9ef9c2f3af5b3b8e5cde5254aa89ad1a880a" - integrity sha512-6qOgh0/by0nVNASx6LZnhRTy17Etcgav+IrI7kL9V9kcDZ/g7K14JFlqrtJ3NjDq/Kyn+BPI1st1XvbkhfaJeg== - dependencies: - babel-runtime "^6.23.0" - classnames "2.x" - prop-types "15.x" - react-lifecycles-compat "^3.0.4" - -rc-collapse@~1.11.3: - version "1.11.8" - resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-1.11.8.tgz#66a40089d469519e9424009ab1c927e214041d80" - integrity sha512-8EhfPyScTYljkbRuIoHniSwZagD5UPpZ3CToYgoNYWC85L2qCbPYF7+OaC713FOrIkp6NbfNqXsITNxmDAmxog== - dependencies: - classnames "2.x" - css-animation "1.x" - prop-types "^15.5.6" - rc-animate "2.x" - react-is "^16.7.0" - react-lifecycles-compat "^3.0.4" - shallowequal "^1.1.0" - -rc-dialog@~7.6.0: - version "7.6.1" - resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-7.6.1.tgz#11545ccc0b945934fa76079726e0d853e52d705f" - integrity sha512-KUKf+2eZ4YL+lnXMG3hR4ZtIhC9glfH27NtTVz3gcoDIPAf3uUvaXVRNoDCiSi+OGKLyIb/b6EoidFh6nQC5Wg== - dependencies: - babel-runtime "6.x" - rc-animate "2.x" - rc-util "^4.16.1" - -rc-drawer@~3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-3.1.3.tgz#cbcb04d4c07f0b66f2ece11d847f4a1bd80ea0b7" - integrity sha512-2z+RdxmzXyZde/1OhVMfDR1e/GBswFeWSZ7FS3Fdd0qhgVdpV1wSzILzzxRaT481ItB5hOV+e8pZT07vdJE8kg== - dependencies: - classnames "^2.2.6" - rc-util "^4.16.1" - react-lifecycles-compat "^3.0.4" - -rc-dropdown@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-2.4.1.tgz#aaef6eb3a5152cdd9982895c2a78d9b5f046cdec" - integrity sha512-p0XYn0wrOpAZ2fUGE6YJ6U8JBNc5ASijznZ6dkojdaEfQJAeZtV9KMEewhxkVlxGSbbdXe10ptjBlTEW9vEwEg== - dependencies: - babel-runtime "^6.26.0" - classnames "^2.2.6" - prop-types "^15.5.8" - rc-trigger "^2.5.1" - react-lifecycles-compat "^3.0.2" - -rc-editor-core@~0.8.3: - version "0.8.10" - resolved "https://registry.yarnpkg.com/rc-editor-core/-/rc-editor-core-0.8.10.tgz#6f215bc5df9c33ffa9f6c5b30ca73a7dabe8ab7c" - integrity sha512-T3aHpeMCIYA1sdAI7ynHHjXy5fqp83uPlD68ovZ0oClTSc3tbHmyCxXlA+Ti4YgmcpCYv7avF6a+TIbAka53kw== - dependencies: - babel-runtime "^6.26.0" - classnames "^2.2.5" - draft-js "^0.10.0" - immutable "^3.7.4" - lodash "^4.16.5" - prop-types "^15.5.8" - setimmediate "^1.0.5" - -rc-editor-mention@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/rc-editor-mention/-/rc-editor-mention-1.1.13.tgz#9f1cab1065f86b01523840321790c2ab12ac5e8b" - integrity sha512-3AOmGir91Fi2ogfRRaXLtqlNuIwQpvla7oUnGHS1+3eo7b+fUp5IlKcagqtwUBB5oDNofoySXkLBxzWvSYNp/Q== - dependencies: - babel-runtime "^6.23.0" - classnames "^2.2.5" - dom-scroll-into-view "^1.2.0" - draft-js "~0.10.0" - immutable "~3.7.4" - prop-types "^15.5.8" - rc-animate "^2.3.0" - rc-editor-core "~0.8.3" - -rc-form@^2.4.10: - version "2.4.12" - resolved "https://registry.yarnpkg.com/rc-form/-/rc-form-2.4.12.tgz#4ee8711e90a2584baa7ac276de96bee0d9b0f5f1" - integrity sha512-sHfyWRrnjCHkeCYfYAGop2GQBUC6CKMPcJF9h/gL/vTmZB/RN6fNOGKjXrXjFbwFwKXUWBoPtIDDDmXQW9xNdw== - dependencies: - async-validator "~1.11.3" - babel-runtime "6.x" - create-react-class "^15.5.3" - dom-scroll-into-view "1.x" - hoist-non-react-statics "^3.3.0" - lodash "^4.17.4" - rc-util "^4.15.3" - react-is "^16.13.1" - warning "^4.0.3" - -rc-hammerjs@~0.6.0: - version "0.6.10" - resolved "https://registry.yarnpkg.com/rc-hammerjs/-/rc-hammerjs-0.6.10.tgz#1831a3bd8f2199700bfcc5ad6b20a35630aeb5e0" - integrity sha512-Vgh9qIudyN5CHRop4M+v+xUniQBFWXKrsJxQRVtJOi2xgRrCeI52/bkpaL5HWwUhqTK9Ayq0n7lYTItT6ld5rg== - dependencies: - babel-runtime "6.x" - hammerjs "^2.0.8" - prop-types "^15.5.9" - -rc-input-number@~4.5.0: - version "4.5.9" - resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-4.5.9.tgz#1cbf735e24fe23c4eb9a4301031720b95f2a3e3d" - integrity sha512-wAT4EBpLDW4+27c935k4F1JLk+gnhyGBkpzBmtkNvIHLG8yTndZSJ2bFfSYfkA6C82IxmAztXs3ffCeUd/rkbg== - dependencies: - babel-runtime "6.x" - classnames "^2.2.0" - prop-types "^15.5.7" - rc-util "^4.5.1" - rmc-feedback "^2.0.0" - -rc-mentions@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-0.4.2.tgz#c18ab701efb9e4b75b3851a0c0d2dd698640e246" - integrity sha512-DTZurQzacLXOfVuiHydGzqkq7cFMHXF18l2jZ9PhWUn2cqvOSY3W4osN0Pq29AOMOBpcxdZCzgc7Lb0r/bgkDw== - dependencies: - "@ant-design/create-react-context" "^0.2.4" - classnames "^2.2.6" - rc-menu "^7.4.22" - rc-trigger "^2.6.2" - rc-util "^4.6.0" - react-lifecycles-compat "^3.0.4" - -rc-menu@^7.3.0, rc-menu@^7.4.22, rc-menu@~7.5.1: - version "7.5.5" - resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-7.5.5.tgz#78cdc817d86fc353a1430b864d3d96c7489600ca" - integrity sha512-4YJXJgrpUGEA1rMftXN7bDhrV5rPB8oBJoHqT+GVXtIWCanfQxEnM3fmhHQhatL59JoAFMZhJaNzhJIk4FUWCQ== - dependencies: - classnames "2.x" - dom-scroll-into-view "1.x" - mini-store "^2.0.0" - mutationobserver-shim "^0.3.2" - rc-animate "^2.10.1" - rc-trigger "^2.3.0" - rc-util "^4.13.0" - resize-observer-polyfill "^1.5.0" - shallowequal "^1.1.0" - -rc-notification@~3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-3.3.1.tgz#0baa3e70f8d40ab015ce8fa78c260c490fc7beb4" - integrity sha512-U5+f4BmBVfMSf3OHSLyRagsJ74yKwlrQAtbbL5ijoA0F2C60BufwnOcHG18tVprd7iaIjzZt1TKMmQSYSvgrig== - dependencies: - babel-runtime "6.x" - classnames "2.x" - prop-types "^15.5.8" - rc-animate "2.x" - rc-util "^4.0.4" - -rc-pagination@~1.20.11: - version "1.20.15" - resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-1.20.15.tgz#ccb4cd0e9bd4e47f72f29ea432c0350bf7b3d807" - integrity sha512-/Xr4/3GOa1DtL8iCYl7qRUroEMrRDhZiiuHwcVFfSiwa9LYloMlUWcOJsnr8LN6A7rLPdm3/CHStUNeYd+2pKw== - dependencies: - babel-runtime "6.x" - classnames "^2.2.6" - prop-types "^15.5.7" - react-lifecycles-compat "^3.0.4" - -rc-progress@~2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-2.5.3.tgz#00f01b95bdbe1856d3a5f82242051902e8b7a8e7" - integrity sha512-K2fa4CnqGehLZoMrdmBeZ86ONSTVcdk5FlqetbwJ3R/+42XfqhwQVOjWp2MH4P7XSQOMAGcNOy1SFfCP3415sg== - dependencies: - babel-runtime "6.x" - prop-types "^15.5.8" - -rc-rate@~2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.5.1.tgz#55fc5fd23ea9dcc72250b9a889803479f4842961" - integrity sha512-3iJkNJT8xlHklPCdeZtUZmJmRVUbr6AHRlfSsztfYTXVlHrv2TcPn3XkHsH+12j812WVB7gvilS2j3+ffjUHXg== - dependencies: - classnames "^2.2.5" - prop-types "^15.5.8" - rc-util "^4.3.0" - react-lifecycles-compat "^3.0.4" - -rc-resize-observer@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-0.1.3.tgz#097191f9c3ab186ed907b553ba6ef565df11c249" - integrity sha512-uzOQEwx83xdQSFOkOAM7x7GHIQKYnrDV4dWxtCxyG1BS1pkfJ4EvDeMfsvAJHSYkQXVBu+sgRHGbRtLG3qiuUg== - dependencies: - classnames "^2.2.1" - rc-util "^4.13.0" - resize-observer-polyfill "^1.5.1" - -rc-select@~9.2.0: - version "9.2.3" - resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-9.2.3.tgz#64340e2d6ef64e8bc3cfc6f468ffd28625589ac2" - integrity sha512-WhswxOMWiNnkXRbxyrj0kiIvyCfo/BaRPaYbsDetSIAU2yEDwKHF798blCP5u86KLOBKBvtxWLFCkSsQw1so5w== - dependencies: - babel-runtime "^6.23.0" - classnames "2.x" - component-classes "1.x" - dom-scroll-into-view "1.x" - prop-types "^15.5.8" - raf "^3.4.0" - rc-animate "2.x" - rc-menu "^7.3.0" - rc-trigger "^2.5.4" - rc-util "^4.0.4" - react-lifecycles-compat "^3.0.2" - warning "^4.0.2" - -rc-slider@~8.7.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-8.7.1.tgz#9ed07362dc93489a38e654b21b8122ad70fd3c42" - integrity sha512-WMT5mRFUEcrLWwTxsyS8jYmlaMsTVCZIGENLikHsNv+tE8ThU2lCoPfi/xFNUfJFNFSBFP3MwPez9ZsJmNp13g== - dependencies: - babel-runtime "6.x" - classnames "^2.2.5" - prop-types "^15.5.4" - rc-tooltip "^3.7.0" - rc-util "^4.0.4" - react-lifecycles-compat "^3.0.4" - shallowequal "^1.1.0" - warning "^4.0.3" +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +puppeteer-core@19.11.1: + version "19.11.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.11.1.tgz#4c63d7a0a6cd268ff054ebcac315b646eee32667" + integrity sha512-qcuC2Uf0Fwdj9wNtaTZ2OvYRraXpAK+puwwVW8ofOhOgLPZyz1c68tsorfIZyCUOpyBisjr+xByu7BMbEYMepA== + dependencies: + "@puppeteer/browsers" "0.5.0" + chromium-bidi "0.4.7" + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.1107588" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + proxy-from-env "1.1.0" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.13.0" + +puppeteer@^19.6.2: + version "19.11.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.11.1.tgz#bb75d518e87b0b4f6ef9bad1ea7e9d1cdcd18a5d" + integrity sha512-39olGaX2djYUdhaQQHDZ0T0GwEp+5f9UB9HmEP0qHfdQHIq0xGQZuAZ5TLnJIc/88SrPLpEflPC+xUqOTv3c5g== + dependencies: + "@puppeteer/browsers" "0.5.0" + cosmiconfig "8.1.3" + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + puppeteer-core "19.11.1" -rc-steps@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-3.5.0.tgz#36b2a7f1f49907b0d90363884b18623caf9fb600" - integrity sha512-2Vkkrpa7PZbg7qPsqTNzVDov4u78cmxofjjnIHiGB9+9rqKS8oTLPzbW2uiWDr3Lk+yGwh8rbpGO1E6VAgBCOg== - dependencies: - babel-runtime "^6.23.0" - classnames "^2.2.3" - lodash "^4.17.5" - prop-types "^15.5.7" +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -rc-switch@~1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-1.9.2.tgz#7921c766411fe9a6426510c3429022d6ba4dfde2" - integrity sha512-qaK7mY4FLDKy99Hq3A1tf8CcqfzKtHp9LPX8WTnZ0MzdHCTneSARb1XD7Eqeu8BactasYGsi2bF9p18Q+/5JEw== +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== dependencies: - classnames "^2.2.1" - prop-types "^15.5.6" - react-lifecycles-compat "^3.0.4" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" -rc-table@~6.10.5: - version "6.10.15" - resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-6.10.15.tgz#181f4c70c4fd74f657ee8f23196e7eb08a0365ca" - integrity sha512-LAr0M/gqt+irOjvPNBLApmQ0CUHNOfKsEBhu1uIuB3OlN1ynA9z+sdoTQyNd9+8NSl0MYnQOOfhtLChAY7nU0A== - dependencies: - classnames "^2.2.5" - component-classes "^1.2.6" - lodash "^4.17.5" - mini-store "^2.0.0" - prop-types "^15.5.8" - rc-util "^4.13.0" - react-lifecycles-compat "^3.0.2" - shallowequal "^1.0.2" - -rc-tabs@~9.7.0: - version "9.7.0" - resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-9.7.0.tgz#ae09695bef5963d6e64e7bc10521c76dfdd8448b" - integrity sha512-kvmgp8/MfLzFZ06hWHignqomFQ5nF7BqKr5O1FfhE4VKsGrep52YSF/1MvS5oe0NPcI9XGNS2p751C5v6cYDpQ== - dependencies: - "@ant-design/create-react-context" "^0.2.4" - babel-runtime "6.x" - classnames "2.x" - lodash "^4.17.5" - prop-types "15.x" - raf "^3.4.1" - rc-hammerjs "~0.6.0" - rc-util "^4.0.4" - react-lifecycles-compat "^3.0.4" - resize-observer-polyfill "^1.5.1" - warning "^4.0.3" +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -rc-time-picker@~3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/rc-time-picker/-/rc-time-picker-3.7.3.tgz#65a8de904093250ae9c82b02a4905e0f995e23e2" - integrity sha512-Lv1Mvzp9fRXhXEnRLO4nW6GLNxUkfAZ3RsiIBsWjGjXXvMNjdr4BX/ayElHAFK0DoJqOhm7c5tjmIYpEOwcUXg== +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: - classnames "2.x" - moment "2.x" - prop-types "^15.5.8" - raf "^3.4.1" - rc-trigger "^2.2.0" - react-lifecycles-compat "^3.0.4" + performance-now "^2.1.0" -rc-tooltip@^3.7.0, rc-tooltip@~3.7.3: - version "3.7.3" - resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-3.7.3.tgz#280aec6afcaa44e8dff0480fbaff9e87fc00aecc" - integrity sha512-dE2ibukxxkrde7wH9W8ozHKUO4aQnPZ6qBHtrTH9LoO836PjDdiaWO73fgPB05VfJs9FbZdmGPVEbXCeOP99Ww== - dependencies: - babel-runtime "6.x" - prop-types "^15.5.8" - rc-trigger "^2.2.2" +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A== -rc-tree-select@~2.9.1: - version "2.9.4" - resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-2.9.4.tgz#6aa794e1f0e65c66c406aa0a2a0e74fd0a557b09" - integrity sha512-0HQkXAN4XbfBW20CZYh3G+V+VMrjX42XRtDCpyv6PDUm5vikC0Ob682ZBCVS97Ww2a5Hf6Ajmu0ahWEdIEpwhg== +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== dependencies: - classnames "^2.2.1" - dom-scroll-into-view "^1.2.1" - prop-types "^15.5.8" - raf "^3.4.0" - rc-animate "^2.8.2" - rc-tree "~2.1.0" - rc-trigger "^3.0.0" - rc-util "^4.5.0" - react-lifecycles-compat "^3.0.4" - shallowequal "^1.0.2" - warning "^4.0.1" + discontinuous-range "1.0.0" + ret "~0.1.10" -rc-tree@~2.1.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-2.1.4.tgz#ef759f3e799a21b43c1ecf9c794ea1c14e70b59b" - integrity sha512-Xey794Iavgs8YldFlXcZLOhfcIhlX5Oz/yfKufknBXf2AlZCOkc7aHqSM9uTF7fBPtTGPhPxNEfOqHfY7b7xng== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: - "@ant-design/create-react-context" "^0.2.4" - classnames "2.x" - prop-types "^15.5.8" - rc-animate "^2.6.0" - rc-util "^4.5.1" - react-lifecycles-compat "^3.0.4" - warning "^4.0.3" - -rc-trigger@^2.2.0, rc-trigger@^2.2.2, rc-trigger@^2.3.0, rc-trigger@^2.5.1, rc-trigger@^2.5.4, rc-trigger@^2.6.2: - version "2.6.5" - resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-2.6.5.tgz#140a857cf28bd0fa01b9aecb1e26a50a700e9885" - integrity sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw== - dependencies: - babel-runtime "6.x" - classnames "^2.2.6" - prop-types "15.x" - rc-align "^2.4.0" - rc-animate "2.x" - rc-util "^4.4.0" - react-lifecycles-compat "^3.0.4" - -rc-trigger@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-3.0.0.tgz#f6d9b1da8a26b2b2d1d912a06876c1a486f5980f" - integrity sha512-hQxbbJpo23E2QnYczfq3Ec5J5tVl2mUDhkqxrEsQAqk16HfADQg+iKNWzEYXyERSncdxfnzYuaBgy764mNRzTA== - dependencies: - babel-runtime "6.x" - classnames "^2.2.6" - prop-types "15.x" - raf "^3.4.0" - rc-align "^2.4.1" - rc-animate "^3.0.0-rc.1" - rc-util "^4.15.7" - -rc-upload@~2.9.1: - version "2.9.4" - resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-2.9.4.tgz#8e34a73a468d7907fe31982c38100e4593857d32" - integrity sha512-WXt0HGxXyzLrPV6iec/96Rbl/6dyrAW8pKuY6wwD7yFYwfU5bjgKjv7vC8KNMJ6wzitFrZjnoiogNL3dF9dj3Q== - dependencies: - babel-runtime "6.x" - classnames "^2.2.5" - prop-types "^15.5.7" - warning "4.x" - -rc-util@^4.0.4, rc-util@^4.1.1, rc-util@^4.13.0, rc-util@^4.15.3, rc-util@^4.15.7, rc-util@^4.16.1, rc-util@^4.3.0, rc-util@^4.4.0, rc-util@^4.5.0, rc-util@^4.5.1, rc-util@^4.6.0: - version "4.21.1" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.21.1.tgz#88602d0c3185020aa1053d9a1e70eac161becb05" - integrity sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg== - dependencies: - add-dom-event-listener "^1.1.0" - prop-types "^15.5.10" - react-is "^16.12.0" - react-lifecycles-compat "^3.0.4" - shallowequal "^1.1.0" - -react-colorful@^5.1.2: - version "5.5.1" - resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.5.1.tgz#29d9c4e496f2ca784dd2bb5053a3a4340cfaf784" - integrity sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg== - -react-docgen-typescript@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz#4611055e569edc071204aadb20e1c93e1ab1659c" - integrity sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg== - -react-docgen@^5.0.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-5.4.0.tgz#2cd7236720ec2769252ef0421f23250b39a153a1" - integrity sha512-JBjVQ9cahmNlfjMGxWUxJg919xBBKAoy3hgDgKERbR+BcF4ANpDuzWAScC7j27hZfd8sJNmMPOLWo9+vB/XJEQ== - dependencies: - "@babel/core" "^7.7.5" - "@babel/generator" "^7.12.11" - "@babel/runtime" "^7.7.6" - ast-types "^0.14.2" - commander "^2.19.0" - doctrine "^3.0.0" - estree-to-babel "^3.1.0" - neo-async "^2.6.1" - node-dir "^0.1.10" - strip-indent "^3.0.0" + safe-buffer "^5.1.0" react-dom@^17.0.2: version "17.0.2" @@ -12575,141 +6565,122 @@ react-dom@^17.0.2: object-assign "^4.1.1" scheduler "^0.20.2" -react-draggable@^4.4.3: - version "4.4.4" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.4.tgz#5b26d9996be63d32d285a426f41055de87e59b2f" - integrity sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA== +react-draggable@4.4.6: + version "4.4.6" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.6.tgz#63343ee945770881ca1256a5b6fa5c9f5983fe1e" + integrity sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw== dependencies: clsx "^1.1.1" - prop-types "^15.6.0" - -react-element-to-jsx-string@^14.3.4: - version "14.3.4" - resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.4.tgz#709125bc72f06800b68f9f4db485f2c7d31218a8" - integrity sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg== - dependencies: - "@base2/pretty-print-object" "1.0.1" - is-plain-object "5.0.0" - react-is "17.0.2" + prop-types "^15.8.1" -react-fast-compare@^3.0.1, react-fast-compare@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" - integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== - -react-helmet-async@^1.0.7: - version "1.2.2" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.2.2.tgz#38d58d32ebffbc01ba42b5ad9142f85722492389" - integrity sha512-XgSQezeCbLfCxdZhDA3T/g27XZKnOYyOkruopTLSJj8RvFZwdXnM4djnfYaiBSDzOidDgTo1jcEozoRu/+P9UQ== - dependencies: - "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" +react-fast-compare@^3.0.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== -react-inspector@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-5.1.1.tgz#58476c78fde05d5055646ed8ec02030af42953c8" - integrity sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg== +react-floater@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/react-floater/-/react-floater-0.8.2.tgz#7ce14093351e6afe1275ac7b08d709063dfef381" + integrity sha512-nMbh2vH6pcrjYpovwR0vgx4lT4ZzyOTj/7t5QPzVThaTH/Zep9L4Xw59c5sP3Rel1idhMHcJkLSPV6Jk+KKJuw== dependencies: - "@babel/runtime" "^7.0.0" - is-dom "^1.0.0" - prop-types "^15.0.0" + "@popperjs/core" "^2.11.5" + deepmerge-ts "^4.2.1" + exenv "^1.2.2" + is-lite "^0.8.2" + tree-changes-hook "^0.9.1" -react-is@17.0.2, react-is@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.6: +react-is@^16.13.1, react-is@^16.6.3, react-is@^16.8.6: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-lazy-load@^3.0.13: - version "3.1.13" - resolved "https://registry.yarnpkg.com/react-lazy-load/-/react-lazy-load-3.1.13.tgz#236943f76b7084cc8458716d9632a1c9853ea5cd" - integrity sha512-eAVNUn3vhNj79Iv04NOCwy/sCLyqDEhL3j9aJKV7VJuRBDg6rCiB+BIWHuG7VXJGCgb//6nX/soR8PTyWRhFvQ== - dependencies: - eventlistener "0.0.1" - lodash.debounce "^4.0.0" - lodash.throttle "^4.0.0" - prop-types "^15.5.8" +"react-is@^16.8.6 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-popper-tooltip@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-3.1.1.tgz#329569eb7b287008f04fcbddb6370452ad3f9eac" - integrity sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ== +react-markdown@^8.0.7: + version "8.0.7" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.7.tgz#c8dbd1b9ba5f1c5e7e5f2a44de465a3caafdf89b" + integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ== dependencies: - "@babel/runtime" "^7.12.5" - "@popperjs/core" "^2.5.4" - react-popper "^2.2.4" + "@types/hast" "^2.0.0" + "@types/prop-types" "^15.0.0" + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^2.0.0" + prop-types "^15.0.0" + property-information "^6.0.0" + react-is "^18.0.0" + remark-parse "^10.0.0" + remark-rehype "^10.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.0" + unified "^10.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + +react-measure@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/react-measure/-/react-measure-2.5.2.tgz#4ffc410e8b9cb836d9455a9ff18fc1f0fca67f89" + integrity sha512-M+rpbTLWJ3FD6FXvYV6YEGvQ5tMayQ3fGrZhRPHrE9bVlBYfDCLuDcgNttYfk8IqfOI03jz6cbpqMRTUclQnaA== + dependencies: + "@babel/runtime" "^7.2.0" + get-node-dimensions "^1.2.1" + prop-types "^15.6.2" + resize-observer-polyfill "^1.5.0" -react-popper@^2.2.4: - version "2.2.5" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" - integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== +react-popper@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.3.0.tgz#17891c620e1320dce318bad9fede46a5f71c70ba" + integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== dependencies: react-fast-compare "^3.0.1" warning "^4.0.2" -react-refresh@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" - integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== - -react-router-dom@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.2.1.tgz#32ec81829152fbb8a7b045bf593a22eadf019bec" - integrity sha512-I6Zax+/TH/cZMDpj3/4Fl2eaNdcvoxxHoH1tYOREsQ22OKDYofGebrNm6CTPUcvLvZm63NL/vzCYdjf9CUhqmA== - dependencies: - history "^5.2.0" - react-router "6.2.1" - -react-router@6.2.1, react-router@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.2.1.tgz#be2a97a6006ce1d9123c28934e604faef51448a3" - integrity sha512-2fG0udBtxou9lXtK97eJeET2ki5//UWfQSl1rlJ7quwe6jrktK9FCCc8dQb5QY6jAv3jua8bBQRhhDOM/kVRsg== +react-portal@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/react-portal/-/react-portal-4.2.2.tgz#bff1e024147d6041ba8c530ffc99d4c8248f49fa" + integrity sha512-vS18idTmevQxyQpnde0Td6ZcUlv+pD8GTyR42n3CHUQq9OHi1C4jDE4ZWEbEsrbrLRhSECYiao58cvocwMtP7Q== dependencies: - history "^5.2.0" + prop-types "^15.5.8" -react-sizeme@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-3.0.2.tgz#4a2f167905ba8f8b8d932a9e35164e459f9020e4" - integrity sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw== +react-split-pane@^0.1.92: + version "0.1.92" + resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.92.tgz#68242f72138aed95dd5910eeb9d99822c4fc3a41" + integrity sha512-GfXP1xSzLMcLJI5BM36Vh7GgZBpy+U/X0no+VM3fxayv+p1Jly5HpMofZJraeaMl73b3hvlr+N9zJKvLB/uz9w== dependencies: - element-resize-detector "^1.2.2" - invariant "^2.2.4" - shallowequal "^1.1.0" - throttle-debounce "^3.0.1" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.4" + react-style-proptype "^3.2.2" -react-slick@~0.25.2: - version "0.25.2" - resolved "https://registry.yarnpkg.com/react-slick/-/react-slick-0.25.2.tgz#56331b67d47d8bcfe2dceb6acab1c8fd5bd1f6bc" - integrity sha512-8MNH/NFX/R7zF6W/w+FS5VXNyDusF+XDW1OU0SzODEU7wqYB+ZTGAiNJ++zVNAVqCAHdyCybScaUB+FCZOmBBw== +react-style-proptype@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-style-proptype/-/react-style-proptype-3.2.2.tgz#d8e998e62ce79ec35b087252b90f19f1c33968a0" + integrity sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ== dependencies: - classnames "^2.2.5" - enquire.js "^2.1.6" - json2mq "^0.2.0" - lodash.debounce "^4.0.8" - resize-observer-polyfill "^1.5.0" + prop-types "^15.5.4" -react-syntax-highlighter@^13.5.3: - version "13.5.3" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz#9712850f883a3e19eb858cf93fad7bb357eea9c6" - integrity sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg== +react-syntax-highlighter@^15.5.0: + version "15.5.0" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" + integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== dependencies: "@babel/runtime" "^7.3.1" - highlight.js "^10.1.1" - lowlight "^1.14.0" - prismjs "^1.21.0" - refractor "^3.1.0" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.27.0" + refractor "^3.6.0" react-test-renderer@^16.0.0-0: version "16.14.0" @@ -12721,19 +6692,10 @@ react-test-renderer@^16.0.0-0: react-is "^16.8.6" scheduler "^0.19.1" -react-textarea-autosize@^8.3.0: - version "8.3.3" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" - integrity sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ== - dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.0.0" - use-latest "^1.0.0" - react-virtualized@^9.19.1: - version "9.22.3" - resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" - integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== + version "9.22.5" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.5.tgz#bfb96fed519de378b50d8c0064b92994b3b91620" + integrity sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ== dependencies: "@babel/runtime" "^7.7.2" clsx "^1.0.4" @@ -12750,29 +6712,10 @@ react@^17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -12782,34 +6725,15 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1: - version "1.1.13" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" - integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.0.0, readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -12817,17 +6741,10 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - reduce-css-calc@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= + integrity sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA== dependencies: balanced-match "^0.4.2" math-expression-evaluator "^1.2.14" @@ -12840,70 +6757,61 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^1.0.0" +redux-thunk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" + integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== + +redux@^4.0.1, redux@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== + dependencies: + "@babel/runtime" "^7.9.2" + reflect.ownkeys@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" - integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= + integrity sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg== -refractor@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.5.0.tgz#334586f352dda4beaf354099b48c2d18e0819aec" - integrity sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg== +refractor@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" + integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== dependencies: hastscript "^6.0.0" parse-entities "^2.0.0" - prismjs "~1.25.0" + prismjs "~1.27.0" -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" - integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" -regenerate@^1.2.1, regenerate@^1.4.2: +regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -12912,303 +6820,175 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" - integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" + unicode-match-property-value-ecmascript "^2.1.0" -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" - integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= - -remark-external-links@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345" - integrity sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA== +rehype-autolink-headings@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/rehype-autolink-headings/-/rehype-autolink-headings-6.1.1.tgz#0cb874a56f3de6ead1c2268d7f0fc5006f244db5" + integrity sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA== dependencies: + "@types/hast" "^2.0.0" extend "^3.0.0" - is-absolute-url "^3.0.0" - mdast-util-definitions "^4.0.0" - space-separated-tokens "^1.0.0" - unist-util-visit "^2.0.0" + hast-util-has-property "^2.0.0" + hast-util-heading-rank "^2.0.0" + hast-util-is-element "^2.0.0" + unified "^10.0.0" + unist-util-visit "^4.0.0" -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== - -remark-mdx@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" - integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== - dependencies: - "@babel/core" "7.12.9" - "@babel/helper-plugin-utils" "7.10.4" - "@babel/plugin-proposal-object-rest-spread" "7.12.1" - "@babel/plugin-syntax-jsx" "7.12.1" - "@mdx-js/util" "1.6.22" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" - -remark-parse@8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-slug@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.1.0.tgz#0503268d5f0c4ecb1f33315c00465ccdd97923ce" - integrity sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ== +rehype-raw@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-6.1.1.tgz#81bbef3793bd7abacc6bf8335879d1b6c868c9d4" + integrity sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ== dependencies: - github-slugger "^1.0.0" - mdast-util-to-string "^1.0.0" - unist-util-visit "^2.0.0" + "@types/hast" "^2.0.0" + hast-util-raw "^7.2.0" + unified "^10.0.0" -remark-squeeze-paragraphs@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" - integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== +rehype-slug@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/rehype-slug/-/rehype-slug-5.1.0.tgz#1f7e69be7ea1a2067bcc4cfe58e74c881d5c047e" + integrity sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw== dependencies: - mdast-squeeze-paragraphs "^4.0.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + "@types/hast" "^2.0.0" + github-slugger "^2.0.0" + hast-util-has-property "^2.0.0" + hast-util-heading-rank "^2.0.0" + hast-util-to-string "^2.0.0" + unified "^10.0.0" + unist-util-visit "^4.0.0" + +remark-gfm@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-gfm "^2.0.0" + micromark-extension-gfm "^2.0.0" + unified "^10.0.0" -renderkid@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" - integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== +remark-parse@^10.0.0: + version "10.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^3.0.1" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + unified "^10.0.0" -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== +remark-rehype@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" + integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-to-hast "^12.1.0" + unified "^10.0.0" repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== -repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - integrity sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw= - dependencies: - is-finite "^1.0.0" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.55.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== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +reselect@^4.0.0, reselect@^4.1.8: + version "4.1.8" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" + integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== -resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: +resize-observer-polyfill@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - resolve-from@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + integrity sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ== resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.9.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.14.2, resolve@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -13218,16 +6998,6 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -13235,68 +7005,26 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@^2.2.8: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rmc-feedback@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rmc-feedback/-/rmc-feedback-2.0.0.tgz#cbc6cb3ae63c7a635eef0e25e4fbaf5ac366eeaa" - integrity sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ== - dependencies: - babel-runtime "6.x" - classnames "^2.2.5" - rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" - integrity sha1-gbIw6i/MYGbInjRy3nlChdmwPZE= + integrity sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA== dependencies: lodash.flattendeep "^4.4.0" nearley "^2.7.10" -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - run-async@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - rxjs@^6.3.3, rxjs@^6.4.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -13304,49 +7032,55 @@ rxjs@^6.3.3, rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sax@^1.1.4, sax@~1.2.1: +sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -13374,33 +7108,15 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^0.4.5: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== +schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== dependencies: ajv "^6.1.0" - ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.6.5, schema-utils@^2.7.0: +schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -13409,148 +7125,61 @@ schema-utils@^2.6.5, schema-utils@^2.7.0: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== +semantic-ui-css@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/semantic-ui-css/-/semantic-ui-css-2.5.0.tgz#b3b7b58b5ffbe6d6fb6549beded16e79a9aa64eb" + integrity sha512-jIWn3WXXE2uSaWCcB+gVJVRG3masIKtTMNEP2X8Aw909H2rHpXGneYOxzO3hT8TpyvB5/dEEo9mBFCitGwoj1A== dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + jquery x.* -selfsigned@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.0.tgz#e927cd5377cbb0a1075302cff8df1042cc2bce5b" - integrity sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ== +semantic-ui-react@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/semantic-ui-react/-/semantic-ui-react-2.1.4.tgz#8a877b169125bb7dd9321c53c425d6d46ac53862" + integrity sha512-7CxjBoFUfH7fUvtn+SPkkIocthUD9kV3niF1mUMa9TbeyPAf2brtRCZBlT2OpHaXmkscFzGjEfhbJo9gKfotzQ== dependencies: - node-forge "^1.2.0" + "@babel/runtime" "^7.10.5" + "@fluentui/react-component-event-listener" "~0.63.0" + "@fluentui/react-component-ref" "~0.63.0" + "@popperjs/core" "^2.6.0" + "@semantic-ui-react/event-stack" "^3.1.3" + clsx "^1.1.1" + keyboard-key "^1.1.0" + lodash "^4.17.21" + lodash-es "^4.17.21" + prop-types "^15.7.2" + react-is "^16.8.6 || ^17.0.0 || ^18.0.0" + react-popper "^2.3.0" + shallowequal "^1.1.0" semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@^7.3.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "1.8.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serialize-javascript@^1.7.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" - integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^6.0.0: +serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" -serve-favicon@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" - integrity sha1-k10kDN/g9YBTB/3+ln2IlCosvPA= - dependencies: - etag "~1.8.1" - fresh "0.5.2" - ms "2.1.1" - parseurl "~1.3.2" - safe-buffer "5.1.1" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.2" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -13561,42 +7190,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallow-equal@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" - integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== - -shallowequal@^1.0.2, shallowequal@^1.1.0: +shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== @@ -13604,26 +7198,14 @@ shallowequal@^1.0.2, shallowequal@^1.1.0: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== side-channel@^1.0.4: version "1.0.4" @@ -13634,10 +7216,10 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.6" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-git@^1.85.0: version "1.132.0" @@ -13646,30 +7228,22 @@ simple-git@^1.85.0: dependencies: debug "^4.0.1" -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== slice-ansi@^2.1.0: version "2.1.0" @@ -13710,19 +7284,10 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs@^0.3.21: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== dependencies: is-plain-obj "^1.0.0" @@ -13742,94 +7307,30 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.16, source-map-support@~0.5.12, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-url@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.3, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3, source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - space-separated-tokens@^1.0.0: version "1.1.5" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -13841,145 +7342,57 @@ split-string@^3.0.1, split-string@^3.0.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-trace@^1.0.0-pre2: + version "1.0.0-pre2" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-1.0.0-pre2.tgz#46a83a79f1b287807e9aaafc6a5dd8bcde626f9c" + integrity sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A== -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== staged-git-files@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b" integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA== -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -store2@^2.12.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/store2/-/store2-2.13.1.tgz#fae7b5bb9d35fc53dc61cd262df3abb2f6e59022" - integrity sha512-iJtHSGmNgAUx0b/MCS6ASGxb//hGrHHRgzvN+K5bvkBTN7A9RTpPSf1WSp+nPGvWCJ1jRnvY7MKnuqfoi3OEqg== - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + internal-slot "^1.0.4" strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== string-argv@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" - integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY= - -string-convert@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" - integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= + integrity sha512-p6/Mqq0utTQWUeGMi/m0uBtlLZEwXSY3+mXzeRRqw7fz5ezUb28Wr0R99NlfbWaMmL/jCyT9be4jpn7Yz8IO8w== string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -13997,75 +7410,63 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" - integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" - side-channel "^1.0.4" - -string.prototype.padend@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" - integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -string.prototype.padstart@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.3.tgz#4551d0117d9501692ec6000b15056ac3f816cfa5" - integrity sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA== +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" -string.prototype.trim@^1.2.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz#a587bcc8bfad8cb9829a577f5de30dd170c1682c" - integrity sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg== +string.prototype.trim@^1.2.1, string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -14085,14 +7486,14 @@ stringify-object@^3.2.2: strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" @@ -14110,44 +7511,30 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== style-loader@^0.21.0: version "0.21.0" @@ -14157,37 +7544,29 @@ style-loader@^0.21.0: loader-utils "^1.1.0" schema-utils "^0.4.5" -style-loader@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" - integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.7.0" - -style-to-object@0.3.0, style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== +style-to-object@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== dependencies: has-flag "^1.0.0" @@ -14198,20 +7577,13 @@ supports-color@^5.3.0, supports-color@^5.4.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -14220,7 +7592,7 @@ supports-preserve-symlinks-flag@^1.0.0: svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= + integrity sha512-jT/g9FFMoe9lu2IT6HtAxTA7RR2XOrmcrmCtGnyB/+GQnV6ZjNn+KOHZbZ35yL81+1F/aB6OeEsJztzBQ2EEwA== dependencies: coa "~1.0.1" colors "~1.1.2" @@ -14235,25 +7607,15 @@ symbol-observable@^1.1.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -"symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.4: +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== -symbol.prototype.description@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz#d30e01263b6020fbbd2d2884a6276ce4d49ab568" - integrity sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ== - dependencies: - call-bind "^1.0.2" - get-symbol-description "^1.0.0" - has-symbols "^1.0.2" - object.getownpropertydescriptors "^2.1.2" - -synchronous-promise@^2.0.15, synchronous-promise@^2.0.6: - version "2.0.15" - resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.15.tgz#07ca1822b9de0001f5ff73595f3d08c4f720eb8e" - integrity sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg== +synchronous-promise@^2.0.6: + version "2.0.17" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.17.tgz#38901319632f946c982152586f2caf8ddc25c032" + integrity sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g== table@^5.2.3: version "5.4.6" @@ -14265,61 +7627,41 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -taffydb@2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" - integrity sha1-e/gQalwaSCUbPjvAoOFzJIn9Dcg= - -taffydb@2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.3.tgz#2ad37169629498fca5bc84243096d3cde0ec3a34" - integrity sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ= - tapable@^0.2.3: version "0.2.9" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" -telejson@^5.3.2, telejson@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/telejson/-/telejson-5.3.3.tgz#fa8ca84543e336576d8734123876a9f02bf41d2e" - integrity sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA== +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: - "@types/is-function" "^1.0.0" - global "^4.4.0" - is-function "^1.0.2" - is-regex "^1.1.2" - is-symbol "^1.0.3" - isobject "^4.0.0" - lodash "^4.17.21" - memoizerific "^1.11.3" + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" tern@^0.21.0: version "0.21.0" resolved "https://registry.yarnpkg.com/tern/-/tern-0.21.0.tgz#809c87a826e112494398cf8894f7c2d1b3464eb7" - integrity sha1-gJyHqCbhEklDmM+IlPfC0bNGTrc= + integrity sha512-nZR1LS8c/cHna4fYSLJ31yFCXLFWcHENoFYXH7wVj5tw2PkHEz5EuQbbApUXDKSbMGS9LWjmNtCAT1Xno00+eA== dependencies: acorn "^4.0.9" enhanced-resolve "^2.2.2" @@ -14327,113 +7669,15 @@ tern@^0.21.0: minimatch "^3.0.3" resolve-from "2.0.0" -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser-webpack-plugin@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" - integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== - dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.5.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.3.4" - webpack-sources "^1.4.3" - -terser-webpack-plugin@^5.1.3: - version "5.3.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz#21641326486ecf91d8054161c816e464435bae9f" - integrity sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ== - dependencies: - jest-worker "^27.4.1" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.2" - -terser@^4.1.2, terser@^4.6.3: - version "4.8.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" - integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -terser@^5.10.0, terser@^5.3.4, terser@^5.7.2: - version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -throttle-debounce@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" - integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -tinycolor2@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" - integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmp@^0.0.33: version "0.0.33" @@ -14442,37 +7686,22 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -14494,37 +7723,20 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - toposort@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= - -tough-cookie@^2.2.0, tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^2.1.0: version "2.1.0" @@ -14533,49 +7745,55 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -tr46@~0.0.1, tr46@~0.0.3: +tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== +tree-changes-hook@^0.9.1: + version "0.9.3" + resolved "https://registry.yarnpkg.com/tree-changes-hook/-/tree-changes-hook-0.9.3.tgz#7fa8255cbe3300180e03330cdda9953b0e7f6bff" + integrity sha512-C7xbFumf+8L7/+yIp8fubDYXIKsumuRRYYIgZYA3paymygw8NnKguox5/s0/Fj83hJbTWyEASeuzRRb3Pllo5A== + dependencies: + "@gilbarbara/deep-equal" "^0.1.1" + tree-changes "^0.9.3" -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= +tree-changes@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/tree-changes/-/tree-changes-0.9.3.tgz#89433ab3b4250c2910d386be1f83912b7144efcc" + integrity sha512-vvvS+O6kEeGRzMglTKbc19ltLWNtmNt1cpBoSYLj/iEcPVvpJasemKOlxBrmZaCtDJoF+4bwv3m01UKYi8mukQ== + dependencies: + "@gilbarbara/deep-equal" "^0.1.1" + is-lite "^0.8.2" -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== -ts-dedent@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" - integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== -ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== +ts-loader@^9.4.2: + version "9.4.4" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4" + integrity sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" -tsconfig-paths@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" - integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" + json5 "^1.0.2" + minimist "^1.2.6" strip-bom "^3.0.0" tslib@^1.9.0: @@ -14583,32 +7801,10 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.2.0, tslib@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -14617,88 +7813,72 @@ type-detect@^4.0.0, type-detect@^4.0.5: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" -ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" -uglify-js@^3.1.4, uglify-js@^3.6.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.0.tgz#2d6a689d94783cab43975721977a13c2afec28f1" - integrity sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg== +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" -uglifyjs-webpack-plugin@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz#e75bc80e7f1937f725954c9b4c5a1e967ea9d0d7" - integrity sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^1.7.0" - source-map "^0.6.1" - uglify-js "^3.6.0" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" +typescript@~5.3.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== dependencies: - inherits "^2.0.0" - xtend "^4.0.0" + buffer "^5.2.1" + through "^2.3.8" + +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -14713,27 +7893,28 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unified@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== +unified@^10.0.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== dependencies: - bail "^1.0.0" + "@types/unist" "^2.0.0" + bail "^2.0.0" extend "^3.0.0" is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" union-value@^1.0.0: version "1.0.1" @@ -14748,112 +7929,84 @@ union-value@^1.0.0: uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" + integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ== -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unist-builder@2.0.3, unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: +unist-util-generated@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== -unist-util-remove@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" - integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== dependencies: - unist-util-is "^4.0.0" + "@types/unist" "^2.0.0" -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== +unist-util-position@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: - "@types/unist" "^2.0.2" + "@types/unist" "^2.0.0" -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== +unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -universalify@^0.1.0, universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unist-util-is "^5.0.0" -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" uri-js@^4.2.2: version "4.4.1" @@ -14865,174 +8018,66 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use-composed-ref@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.2.1.tgz#9bdcb5ccd894289105da2325e1210079f56bf849" - integrity sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw== - -use-isomorphic-layout-effect@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225" - integrity sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ== + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== -use-latest@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232" - integrity sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw== +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: - use-isomorphic-layout-effect "^1.0.0" + querystringify "^2.1.1" + requires-port "^1.0.0" use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid-browser@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" - integrity sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA= - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-to-istanbul@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -v8flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= - dependencies: - user-home "^1.1.1" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" vendors@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= +vfile-location@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" + integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + "@types/unist" "^2.0.0" + vfile "^5.0.0" -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== dependencies: "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" + unist-util-stringify-position "^3.0.0" -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" w3c-hr-time@^1.0.2: version "1.0.2" @@ -15048,67 +8093,22 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -walker@^1.0.7, walker@~1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -warning@4.x, warning@^4.0.1, warning@^4.0.2, warning@^4.0.3, warning@~4.0.3: +warning@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - -watchpack@^2.2.0, watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -webidl-conversions@^2.0.0: +web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" - integrity sha1-O/glj30xjHRDw28uFpQCoaZwNQY= + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^5.0.0: version "5.0.0" @@ -15120,205 +8120,6 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-cli@^4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" - integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.1.1" - "@webpack-cli/info" "^1.4.1" - "@webpack-cli/serve" "^1.6.1" - colorette "^2.0.14" - commander "^7.0.0" - execa "^5.0.0" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - webpack-merge "^5.7.3" - -webpack-dev-middleware@^3.7.3: - version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-middleware@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz#8fc02dba6e72e1d373eca361623d84610f27be7c" - integrity sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg== - dependencies: - colorette "^2.0.10" - memfs "^3.2.2" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.7.3: - version "4.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz#4e995b141ff51fa499906eebc7906f6925d0beaa" - integrity sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/serve-index" "^1.9.1" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.2.2" - ansi-html-community "^0.0.8" - bonjour "^3.5.0" - chokidar "^3.5.2" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - default-gateway "^6.0.3" - del "^6.0.0" - express "^4.17.1" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - portfinder "^1.0.28" - schema-utils "^4.0.0" - selfsigned "^2.0.0" - serve-index "^1.9.1" - sockjs "^0.3.21" - spdy "^4.0.2" - strip-ansi "^7.0.0" - webpack-dev-middleware "^5.3.0" - ws "^8.1.0" - -webpack-filter-warnings-plugin@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz#dc61521cf4f9b4a336fbc89108a75ae1da951cdb" - integrity sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg== - -webpack-hot-middleware@^2.25.1: - version "2.25.1" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz#581f59edf0781743f4ca4c200fd32c9266c6cf7c" - integrity sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw== - dependencies: - ansi-html-community "0.0.8" - html-entities "^2.1.0" - querystring "^0.2.0" - strip-ansi "^6.0.0" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-merge@^5.7.3, webpack-merge@^5.8.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack-virtual-modules@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz#20863dc3cb6bb2104729fff951fbe14b18bd0299" - integrity sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA== - dependencies: - debug "^3.0.0" - -webpack@4: - version "4.46.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" - integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.5.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - -webpack@^5.67.0: - version "5.67.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.67.0.tgz#cb43ca2aad5f7cc81c4cd36b626e6b819805dbfd" - integrity sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw== - dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.50" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.3" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" - webpack-sources "^3.2.3" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -15326,32 +8127,20 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@>=0.10.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url-compat@~0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" - integrity sha1-AImBEa9om7CXVBzVpFymyHmERb8= - dependencies: - tr46 "~0.0.1" - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^8.0.0: +whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== @@ -15363,7 +8152,7 @@ whatwg-url@^8.0.0: whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= + integrity sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA== which-boxed-primitive@^1.0.2: version "1.0.2" @@ -15376,6 +8165,27 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + which@^1.2.10, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -15383,60 +8193,20 @@ which@^1.2.10, which@^1.2.9: dependencies: isexe "^2.0.0" -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -worker-rpc@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" - integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== - dependencies: - microevent.ts "~0.1.1" +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ== dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" @@ -15453,17 +8223,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write@1.0.3: version "1.0.3" @@ -15472,20 +8232,15 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.4.4: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== +ws@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -ws@^8.1.0, ws@^8.2.3: - version "8.4.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" - integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== - -"xml-name-validator@>= 2.0.1 < 3.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" - integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xml-name-validator@^3.0.0: version "3.0.0" @@ -15497,16 +8252,11 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -15522,17 +8272,32 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^20.2.2, yargs-parser@^20.2.7: +yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^16.2.0: +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -15545,6 +8310,27 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@17.7.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" @@ -15562,7 +8348,7 @@ yup@^0.27.0: synchronous-promise "^2.0.6" toposort "^2.0.2" -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==