├── .babelrc
├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── example
├── .gitignore
├── package.json
├── public
│ ├── favicon.png
│ ├── global.css
│ └── index.html
├── rollup.config.js
├── src
│ ├── Conference
│ │ ├── Conference.svelte
│ │ └── index.js
│ ├── Participant
│ │ ├── Participant.svelte
│ │ └── index.js
│ ├── SampleApp.svelte
│ └── main.js
└── yarn.lock
├── images
└── screenshot.png
├── package.json
├── rollup.config.js
├── src
├── components
│ ├── Audio
│ │ ├── Audio.svelte
│ │ └── index.js
│ ├── Mirror
│ │ ├── ContinueButton
│ │ │ ├── ContinueButton.svelte
│ │ │ └── index.js
│ │ ├── DeviceSelector
│ │ │ ├── DeviceSelector.svelte
│ │ │ ├── Select
│ │ │ │ ├── Select.svelte
│ │ │ │ └── index.js
│ │ │ ├── images
│ │ │ │ ├── audio-enabled.svg
│ │ │ │ ├── speaker-icon.svg
│ │ │ │ └── video-enabled.svg
│ │ │ └── index.js
│ │ ├── Mirror.svelte
│ │ ├── images
│ │ │ ├── audio-disabled.svg
│ │ │ ├── audio-enabled.svg
│ │ │ ├── settings.svg
│ │ │ ├── video-disabled.svg
│ │ │ └── video-enabled.svg
│ │ └── index.js
│ └── Video
│ │ ├── Video.svelte
│ │ └── index.js
├── index.js
├── jitsi
│ ├── canAutoPermit.js
│ ├── init.js
│ └── tracks.js
├── main.js
├── stores
│ ├── ConferencesStore.js
│ ├── ConnectionStore.js
│ ├── DeviceListStore.js
│ ├── ElementTrackStore.js
│ ├── LocalTracksStore.js
│ └── ParticipantsStore.js
└── utils
│ ├── events.js
│ ├── groupBy.js
│ ├── hasAncestor.js
│ ├── omit.js
│ ├── ready.js
│ └── uuid.js
└── yarn.lock
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/env"],
3 | "plugins": ["@babel/transform-runtime"]
4 | }
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .cache
3 | dist/
4 | node_modules/
5 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "semi": false,
3 | "singleQuote": true,
4 | "svelteSortOrder": "scripts-markup-styles"
5 | }
6 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 relm-us
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # jitsi-svelte
2 |
3 | This library allows you to easily create your own custom [Jitsi](https://jitsi.org/jitsi-meet/) client, in the [Svelte](https://svelte.dev/) framework.
4 |
5 | Jitsi is a free, open-source, web-based video conferencing app that has a handy library called lib-jitsi-meet. However, there are quite a few intricacies to getting it working well, and if you're writing a Svelte3-based app, there is some additional complexity in getting all of the events to work together.
6 |
7 | `jitsi-svelte` simplifies all of this and provides the svelte stores you need to build a web-based video conferencing app. It also provides Svelte components for Audio, and Video, among others. We use it at [Relm](http://www.relm.us) to power our social virtual world.
8 |
9 |
10 |
11 |
12 |
13 | We were inspired by Whereby's intro screen and created what we call the "Mirror" component that mimics their UX & design. This `Mirror` can reduce the code you need to write to give a robust setup screen experience for your users.
14 |
15 | # Getting Started
16 |
17 | See the `example/` folder for a sample app that uses `jitsi-svelte`.
18 |
19 | In general, you need to create a ConnectionStore via `createConnectionStore` and supply a `JitsiConfig` as the parameter; then, join a conference (at this point, the user will see others who've already entered the room), and use a `Mirror` component to let the user configure their mic and camera before entering the room.
20 |
21 | ```javascript
22 | import { createConnectionStore, DEFAULT_JITSI_CONFIG, Mirror } from 'jitsi-svelte'
23 |
24 | import Conference from './Conference'
25 |
26 | const connection = createConnectionStore(DEFAULT_JITSI_CONFIG, 'jitsi-svelte-test')
27 |
28 | connection.conferences.join('jitsi-svelte-test')
29 |
30 | // NEXT: use Mirror svelte component (see SampleApp.svelte)
31 | ```
32 |
33 | # License
34 |
35 | MIT
36 |
37 | # What is Relm?
38 |
39 | Relm is a social universe--a kinder, gentler online community. It's an experiment in mixing a game world with work meetings. Come visit sometime! https://www.relm.us
40 |
--------------------------------------------------------------------------------
/example/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 | /public/build/
3 |
4 | .DS_Store
5 |
--------------------------------------------------------------------------------
/example/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jitsi-svelte-example",
3 | "version": "1.0.0",
4 | "description": "Example app using jitsi-svelte",
5 | "repository": "https://github.com/relm-us/jitsi-svelte",
6 | "author": "Duane Johnson",
7 | "license": "MIT",
8 | "private": false,
9 | "devDependencies": {
10 | "@babel/core": "^7.11.6",
11 | "@babel/plugin-transform-runtime": "^7.11.5",
12 | "@babel/preset-env": "^7.11.5",
13 | "@rollup/plugin-commonjs": "^14.0.0",
14 | "@rollup/plugin-image": "^2.0.5",
15 | "@rollup/plugin-node-resolve": "^8.0.0",
16 | "rollup": "^2.3.4",
17 | "rollup-plugin-livereload": "^2.0.0",
18 | "rollup-plugin-svelte": "^6.0.0",
19 | "rollup-plugin-terser": "^7.0.0",
20 | "svelte": "^3.29.0"
21 | },
22 | "dependencies": {
23 | "jitsi-svelte": "0.3.0",
24 | "sirv-cli": "^1.0.0"
25 | },
26 | "scripts": {
27 | "build": "rollup -c",
28 | "dev": "rollup -c -w",
29 | "start": "sirv public"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/example/public/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/relm-us/jitsi-svelte/dc3fb2440c503c2e54d8f64368a3c1f291593ca3/example/public/favicon.png
--------------------------------------------------------------------------------
/example/public/global.css:
--------------------------------------------------------------------------------
1 | html, body {
2 | position: relative;
3 | width: 100%;
4 | height: 100%;
5 | }
6 |
7 | body {
8 | color: #333;
9 | margin: 0;
10 | padding: 8px;
11 | box-sizing: border-box;
12 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
13 | }
14 |
15 | a {
16 | color: rgb(0,100,200);
17 | text-decoration: none;
18 | }
19 |
20 | a:hover {
21 | text-decoration: underline;
22 | }
23 |
24 | a:visited {
25 | color: rgb(0,80,160);
26 | }
27 |
28 | label {
29 | display: block;
30 | }
31 |
32 | input, button, select, textarea {
33 | font-family: inherit;
34 | font-size: inherit;
35 | -webkit-padding: 0.4em 0;
36 | padding: 0.4em;
37 | margin: 0 0 0.5em 0;
38 | box-sizing: border-box;
39 | border: 1px solid #ccc;
40 | border-radius: 2px;
41 | }
42 |
43 | input:disabled {
44 | color: #ccc;
45 | }
46 |
47 | button {
48 | color: #333;
49 | background-color: #f4f4f4;
50 | outline: none;
51 | }
52 |
53 | button:disabled {
54 | color: #999;
55 | }
56 |
57 | button:not(:disabled):active {
58 | background-color: #ddd;
59 | }
60 |
61 | button:focus {
62 | border-color: #666;
63 | }
64 |
--------------------------------------------------------------------------------
/example/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Jitsi Svelte
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/example/rollup.config.js:
--------------------------------------------------------------------------------
1 | import svelte from 'rollup-plugin-svelte'
2 | import resolve from '@rollup/plugin-node-resolve'
3 | import commonjs from '@rollup/plugin-commonjs'
4 | import image from '@rollup/plugin-image'
5 | import livereload from 'rollup-plugin-livereload'
6 | import { terser } from 'rollup-plugin-terser'
7 |
8 | const production = !process.env.ROLLUP_WATCH
9 |
10 | function serve() {
11 | let server
12 |
13 | function toExit() {
14 | if (server) server.kill(0)
15 | }
16 |
17 | return {
18 | writeBundle() {
19 | if (server) return
20 | server = require('child_process').spawn(
21 | 'npm',
22 | ['run', 'start', '--', '--dev'],
23 | {
24 | stdio: ['ignore', 'inherit', 'inherit'],
25 | shell: true,
26 | }
27 | )
28 |
29 | process.on('SIGTERM', toExit)
30 | process.on('exit', toExit)
31 | },
32 | }
33 | }
34 |
35 | export default {
36 | input: 'src/main.js',
37 | output: {
38 | sourcemap: true,
39 | format: 'iife',
40 | name: 'app',
41 | file: 'public/build/bundle.js',
42 | },
43 | plugins: [
44 | svelte({
45 | // enable run-time checks when not in production
46 | dev: !production,
47 | // we'll extract any component CSS out into
48 | // a separate file - better for performance
49 | css: (css) => {
50 | css.write('bundle.css')
51 | },
52 | }),
53 |
54 | // If you have external dependencies installed from
55 | // npm, you'll most likely need these plugins. In
56 | // some cases you'll need additional configuration -
57 | // consult the documentation for details:
58 | // https://github.com/rollup/plugins/tree/master/packages/commonjs
59 | resolve({
60 | browser: true,
61 | dedupe: ['svelte'],
62 | }),
63 | commonjs(),
64 | image(),
65 |
66 | // In dev mode, call `npm run start` once
67 | // the bundle has been generated
68 | !production && serve(),
69 |
70 | // Watch the `public` directory and refresh the
71 | // browser on changes when not in production
72 | !production && livereload('public'),
73 |
74 | // If we're building for production (npm run build
75 | // instead of npm run dev), minify
76 | production && terser(),
77 | ],
78 | watch: {
79 | clearScreen: false,
80 | },
81 | }
82 |
--------------------------------------------------------------------------------
/example/src/Conference/Conference.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
Conference Room: {conferenceId}
16 |
Status: {$status}
17 |
18 | Participants:
19 | {#each Object.entries($participants) as [participantId, participant], key}
20 |
21 | {/each}
22 |
23 |
24 |
25 |
31 |
--------------------------------------------------------------------------------
/example/src/Conference/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './Conference.svelte'
2 |
--------------------------------------------------------------------------------
/example/src/Participant/Participant.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 | Local:
12 | {$participant.isLocal}
13 |
14 |
15 | Jitsi ID:
16 | {$participant.jid}
17 |
18 |
19 | Role:
20 | {$participant.role}
21 |
22 |
23 | Audio Level:
24 | {$participant.audioLevel}
25 |
26 |
27 | Audio:
28 | {$participant.audioEnabled ? 'enabled' : 'disabled'}
29 |
30 | {#if $participant.audioEnabled}
31 | participant.setAudioEnabled(false)}>mute
33 | {:else}
34 | participant.setAudioEnabled(true)}>unmute
36 | {/if}
37 |
38 |
39 |
40 | Video:
41 | {$participant.videoEnabled ? 'enabled' : 'disabled'}
42 |
43 | {#if $participant.videoEnabled}
44 | participant.setVideoEnabled(false)}>mute
46 | {:else}
47 | participant.setVideoEnabled(true)}>unmute
49 | {/if}
50 |
51 |
52 |
53 | Desktop:
54 | {$participant.desktopEnabled ? 'enabled' : 'disabled'}
55 |
56 | {#if $participant.desktopEnabled}
57 | participant.setDesktopEnabled(false)}>mute
59 | {:else}
60 | participant.setDesktopEnabled(true)}>unmute
62 | {/if}
63 |
64 |
65 |
66 |
67 |
68 | {#if $participant.video}
69 |
70 |
71 |
72 | {/if}
73 | {#if $participant.desktop}
74 |
75 |
76 |
77 | {/if}
78 |
79 |
80 |
81 |
113 |
--------------------------------------------------------------------------------
/example/src/Participant/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './Participant.svelte'
2 |
--------------------------------------------------------------------------------
/example/src/SampleApp.svelte:
--------------------------------------------------------------------------------
1 |
27 |
28 | {#if mirrorPage}
29 |
30 |
You're about to join a video meeting
31 |
(mirrorPage = false)} />
32 |
33 | {/if}
34 | {$connection ? 'Connected' : 'Not Connected'}
35 |
36 | {#each Object.entries($conferences) as [conferenceId, conference], key}
37 |
38 | conferences.leave(conferenceId)}
39 | >Leave Conference
41 | {/each}
42 |
43 | {
45 | shareDesktop = !shareDesktop
46 | localTracksStore.shareDesktop(shareDesktop)
47 | }}
48 | >
49 | {shareDesktop ? 'Stop Sharing Screen' : 'Share Screen'}
50 |
51 |
52 |
63 |
--------------------------------------------------------------------------------
/example/src/main.js:
--------------------------------------------------------------------------------
1 | import SampleApp from './SampleApp.svelte'
2 |
3 | const app = new SampleApp({
4 | target: document.body,
5 | })
6 |
7 | export default app
8 |
--------------------------------------------------------------------------------
/images/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/relm-us/jitsi-svelte/dc3fb2440c503c2e54d8f64368a3c1f291593ca3/images/screenshot.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jitsi-svelte",
3 | "version": "0.4.0",
4 | "description": "Reactive svelte3 stores for lib-jitsi-meet",
5 | "keywords": [
6 | "svelte"
7 | ],
8 | "repository": "https://github.com/relm-us/jitsi-svelte",
9 | "author": "Duane Johnson",
10 | "license": "MIT",
11 | "private": false,
12 | "main": "dist/index.js",
13 | "module": "dist/index.mjs",
14 | "files": [
15 | "src",
16 | "dist"
17 | ],
18 | "devDependencies": {
19 | "@babel/core": "^7.11.6",
20 | "@babel/plugin-transform-runtime": "^7.11.5",
21 | "@babel/preset-env": "^7.11.5",
22 | "@rollup/plugin-image": "^2.0.5",
23 | "@rollup/plugin-node-resolve": "^9.0.0",
24 | "rollup": "^2.29.0",
25 | "rollup-plugin-svelte": "^6.0.1",
26 | "svelte": "^3.29.0"
27 | },
28 | "dependencies": {
29 | "keycode-js": "^3.1.0"
30 | },
31 | "svelte": "src/index.js",
32 | "scripts": {
33 | "build": "rollup --config",
34 | "prepublishOnly": "npm run build"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import svelte from 'rollup-plugin-svelte'
2 | import resolve from '@rollup/plugin-node-resolve'
3 | import image from '@rollup/plugin-image'
4 |
5 | import pkg from './package.json'
6 |
7 | const name = pkg.name
8 | .replace(/^(@\S+\/)?(svelte-)?(\S+)/, '$3')
9 | .replace(/^\w/, (m) => m.toUpperCase())
10 | .replace(/-\w/g, (m) => m[1].toUpperCase())
11 |
12 | export default {
13 | input: 'src/index.js',
14 | output: [
15 | { file: pkg.module, format: 'es' },
16 | { file: pkg.main, format: 'umd', name },
17 | ],
18 | plugins: [svelte(), resolve(), image()],
19 | }
20 |
--------------------------------------------------------------------------------
/src/components/Audio/Audio.svelte:
--------------------------------------------------------------------------------
1 |
21 |
22 |
28 |
29 |
34 |
--------------------------------------------------------------------------------
/src/components/Audio/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './Audio.svelte'
2 |
--------------------------------------------------------------------------------
/src/components/Mirror/ContinueButton/ContinueButton.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 | {
13 | dispatch('click')
14 | }}>
15 | Continue
16 |
17 |
18 |
43 |
--------------------------------------------------------------------------------
/src/components/Mirror/ContinueButton/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './ContinueButton.svelte'
2 |
--------------------------------------------------------------------------------
/src/components/Mirror/DeviceSelector/DeviceSelector.svelte:
--------------------------------------------------------------------------------
1 |
55 |
56 | {#each kinds as kind}
57 | {
61 | selected(option, kind)
62 | }}
63 | icon={icons[kind]} />
64 | {/each}
65 |
--------------------------------------------------------------------------------
/src/components/Mirror/DeviceSelector/Select/Select.svelte:
--------------------------------------------------------------------------------
1 |
74 |
75 |
80 |
85 | {#if icon}
86 |
87 | {/if}
88 |
{selectedOption ? selectedOption.label : ''}
89 |
90 |
91 | {#if popupVisible}
92 |
104 | {/if}
105 |
106 |
107 |
175 |
--------------------------------------------------------------------------------
/src/components/Mirror/DeviceSelector/Select/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './Select.svelte'
--------------------------------------------------------------------------------
/src/components/Mirror/DeviceSelector/images/audio-enabled.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/components/Mirror/DeviceSelector/images/speaker-icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/components/Mirror/DeviceSelector/images/video-enabled.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/components/Mirror/DeviceSelector/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './DeviceSelector.svelte'
--------------------------------------------------------------------------------
/src/components/Mirror/Mirror.svelte:
--------------------------------------------------------------------------------
1 |
107 |
108 |
109 | {#if hasPermission}
110 |
111 | {#if letMeHearMyself}
112 |
113 | {/if}
114 |
115 |
116 | {#if !$audioRequested && !$videoRequested}
117 |
Join with cam and mic off
118 | {:else if !$videoRequested}
119 |
Join with cam off
120 | {:else if !$audioRequested}
121 |
Join with mic off
122 | {:else}
123 |
124 | {/if}
125 |
153 |
154 |
155 |
Continue
156 | {#if advancedSettings}
157 |
158 | {
161 | requestPermissions()
162 | }} />
163 |
164 | {/if}
165 | {:else}
166 |
170 |
171 |
172 |
173 |
174 | {#if requestBlocked}
175 | Cam and mic are blocked
176 | (Need help?)
177 | {:else}Cam and mic are not active{/if}
178 |
179 |
180 |
181 |
182 | For others to see and hear you, your browser will request access to your
183 | cam and mic.
184 |
185 |
186 |
187 | {#if requestBlocked}Try Again{:else}Request Permissions{/if}
188 |
189 | {/if}
190 |
191 |
192 |
336 |
--------------------------------------------------------------------------------
/src/components/Mirror/images/audio-disabled.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/components/Mirror/images/audio-enabled.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/components/Mirror/images/settings.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/components/Mirror/images/video-disabled.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/components/Mirror/images/video-enabled.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/components/Mirror/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './Mirror.svelte'
2 |
--------------------------------------------------------------------------------
/src/components/Video/Video.svelte:
--------------------------------------------------------------------------------
1 |
24 |
25 |
33 |
34 |
42 |
43 |
57 |
--------------------------------------------------------------------------------
/src/components/Video/index.js:
--------------------------------------------------------------------------------
1 | export { default } from './Video.svelte'
2 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | export { default as Audio } from './components/Audio/Audio.svelte'
2 | export { default as Video } from './components/Video/Video.svelte'
3 | export { default as Mirror } from './components/Mirror/Mirror.svelte'
4 |
5 | export { default as canAutoPermit } from './jitsi/canAutoPermit.js'
6 |
7 | export { localTracksStore } from './stores/LocalTracksStore.js'
8 | export {
9 | createConnectionStore,
10 | DEFAULT_JITSI_CONFIG,
11 | } from './stores/ConnectionStore.js'
12 |
--------------------------------------------------------------------------------
/src/jitsi/canAutoPermit.js:
--------------------------------------------------------------------------------
1 | async function canAutoPermit() {
2 | return new Promise((resolve) => {
3 | // If the browser allows us to enumerate any of the devices, then
4 | // there is at least some "permission" granted by the user from
5 | // the last time they visited. Take the hint and attempt to request
6 | // full permission to use audio & video.
7 | if (JitsiMeetJS.mediaDevices.isDeviceListAvailable()) {
8 | JitsiMeetJS.mediaDevices.enumerateDevices((deviceList) => {
9 | let autoPermit = false
10 | for (const device of deviceList) {
11 | if (device.label) autoPermit = true
12 | }
13 | resolve(autoPermit)
14 | })
15 | } else {
16 | resolve(false)
17 | }
18 | })
19 | }
20 |
21 | export default canAutoPermit
22 |
--------------------------------------------------------------------------------
/src/jitsi/init.js:
--------------------------------------------------------------------------------
1 | // Global JitsiMeetJS Init
2 | //
3 | // Note: this needs to run just once, but it must run or there can be
4 | // unusual errors, e.g.
5 | // https://community.jitsi.org/t/why-is-rtcutils-missing-enumeratedevices/79005/3
6 |
7 | JitsiMeetJS.setLogLevel(JitsiMeetJS.logLevels.ERROR)
8 |
9 | JitsiMeetJS.init({
10 | audioLevelsInterval: 40,
11 | disableAudioLevels: false,
12 | })
13 |
--------------------------------------------------------------------------------
/src/jitsi/tracks.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Attach a set of local tracks to a conference.
3 | *
4 | * @param {JitsiConference} conference - Conference instance.
5 | * @param {JitsiLocalTrack[]} localTracks - List of local media tracks.
6 | * @protected
7 | * @returns {Promise}
8 | */
9 | function addLocalTracksToConference(conference, localTracks) {
10 | const conferenceLocalTracks = conference.getLocalTracks()
11 | const promises = []
12 |
13 | for (const track of localTracks) {
14 | // XXX The library lib-jitsi-meet may be draconian, for example, when
15 | // adding one and the same video track multiple times.
16 | if (conferenceLocalTracks.indexOf(track) === -1) {
17 | promises.push(
18 | conference.addTrack(track).catch((err) => {
19 | console.warn('Failed to add local track to conference', err)
20 | })
21 | )
22 | }
23 | }
24 |
25 | return Promise.all(promises)
26 | }
27 |
28 | /**
29 | * Remove a set of local tracks from a conference.
30 | *
31 | * @param {JitsiConference} conference - Conference instance.
32 | * @param {JitsiLocalTrack[]} localTracks - List of local media tracks.
33 | * @protected
34 | * @returns {Promise}
35 | */
36 | function removeLocalTracksFromConference(conference, localTracks) {
37 | return Promise.all(
38 | localTracks.map((track) =>
39 | conference.removeTrack(track).catch((err) => {
40 | // Local track might be already disposed by direct
41 | // JitsiTrack#dispose() call. So we should ignore this error
42 | // here.
43 | if (err.name !== JitsiTrackErrors.TRACK_IS_DISPOSED) {
44 | console.warn('Failed to remove local track from conference', err)
45 | }
46 | })
47 | )
48 | )
49 | }
50 |
51 | export { addLocalTracksToConference, removeLocalTracksFromConference }
52 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import {
2 | createConnectionStore,
3 | DEFAULT_JITSI_CONFIG,
4 | } from './stores/ConnectionStore.js'
5 |
6 | import Mirror from './components/Mirror'
7 | import Audio from './components/Audio'
8 | import Video from './components/Video'
9 |
10 | export {
11 | defaultConfigStore,
12 | createConnectionStore,
13 | Mirror,
14 | Audio,
15 | Video,
16 | DEFAULT_JITSI_CONFIG,
17 | }
18 |
--------------------------------------------------------------------------------
/src/stores/ConferencesStore.js:
--------------------------------------------------------------------------------
1 | import { writable, derived, get } from 'svelte/store'
2 | import omit from '../utils/omit.js'
3 |
4 | import {
5 | createParticipantsStore,
6 | createSingleParticipantStore,
7 | } from './ParticipantsStore.js'
8 | import { localTracksStore } from './LocalTracksStore.js'
9 |
10 | import { addLocalTracksToConference } from '../jitsi/tracks.js'
11 | import { trackDirection, wireEventListeners } from '../utils/events.js'
12 |
13 | const CLEANUP_EVENT_LISTENERS_MAX_TIMEOUT = 4000
14 |
15 | const ConferenceState = {
16 | INITIAL: 'initial',
17 | JOINING: 'joining',
18 | JOINED: 'joined',
19 | LEAVING: 'leaving',
20 | LEFT: 'left',
21 | FAILED: 'failed',
22 | ERROR: 'error',
23 | KICKED: 'kicked',
24 | }
25 |
26 | function createSingleConferenceStore(conferenceId, connectionStore) {
27 | const stateStore = writable(ConferenceState.INITIAL)
28 |
29 | // Boolean flag that signals the user has given permission to enter the conference
30 | const permitEntryStore = writable(false)
31 |
32 | // Each conference gets a "localParticipantStore" which is what represents
33 | // the user & the user's local tracks in this particular conference (player
34 | // can potentially be connected to multiple rooms at once).
35 | const localParticipantStore = createSingleParticipantStore(true)
36 |
37 | // A store of objects, keys are participantIds and values are stores
38 | const remoteParticipantsStore = createParticipantsStore()
39 |
40 | let localParticipantId
41 | localParticipantStore.subscribe(
42 | ($localParticipant) => (localParticipantId = $localParticipant.jid)
43 | )
44 |
45 | const cachedTrackParticipantId = new WeakMap()
46 |
47 | const store = derived(
48 | connectionStore,
49 | ($connection, set) => {
50 | if ($connection) {
51 | const conference = $connection.initJitsiConference(conferenceId, {
52 | // per latest recommendation:
53 | // https://community.jitsi.org/t/sctp-channels-deprecation-use-websockets/79408/8
54 | openBridgeChannel: 'websocket',
55 | })
56 |
57 | const setStatus = (state) => {
58 | switch (state) {
59 | case ConferenceState.JOINING:
60 | // Record the ID we're given to identify "self"
61 | localParticipantStore.setJid(conference.myUserId())
62 | break
63 | case ConferenceState.JOINED:
64 | set(conference)
65 | break
66 | default:
67 | set(null)
68 | }
69 | stateStore.set(state)
70 | }
71 |
72 | const addRemoveTrack = (track, direction) => {
73 | let fnName = trackDirection(direction)
74 |
75 | let pId = track.getParticipantId()
76 | if (!pId) {
77 | pId = cachedTrackParticipantId.get(track)
78 | }
79 | if (pId) {
80 | cachedTrackParticipantId.set(track, pId)
81 | remoteParticipantsStore.updateParticipant(pId, (pStore) => {
82 | pStore[fnName](track)
83 | })
84 | } else {
85 | console.warn(`Track does not have participantId`, track)
86 | }
87 | }
88 |
89 | const events = {
90 | conference: {
91 | /**
92 | * Events that affect the participant's status in the conference
93 | */
94 |
95 | CONFERENCE_JOINED: () => setStatus(ConferenceState.JOINED),
96 | CONFERENCE_LEFT: () => {
97 | wireEventListeners('remove', conference, events)
98 | setStatus(ConferenceState.LEFT)
99 | },
100 | CONFERENCE_FAILED: () => setStatus(ConferenceState.FAILED),
101 | CONFERENCE_ERROR: (errorCode) => {
102 | console.error('Jitsi conference error', errorCode)
103 | setStatus(ConferenceState.ERROR)
104 | },
105 | KICKED: () => setStatus(ConferenceState.KICKED),
106 |
107 | /**
108 | * Events that can be used to update participant's metadata
109 | */
110 |
111 | USER_JOINED: (pId, participant) => {
112 | remoteParticipantsStore.updateParticipant(pId, (pStore) => {
113 | pStore.updateFieldsFromJitsiParticipant(participant)
114 | })
115 | },
116 | USER_LEFT: (pId) => {
117 | remoteParticipantsStore.update(($participants) => {
118 | return omit($participants, [pId])
119 | })
120 | },
121 | USER_ROLE_CHANGED: (pId, role) => {
122 | if (pId === localParticipantId) {
123 | localParticipantStore.setRole(role)
124 | } else {
125 | remoteParticipantsStore.updateParticipant(pId, (pStore) => {
126 | pStore.setRole(role)
127 | })
128 | }
129 | },
130 |
131 | /**
132 | * "Track" events: we get notified whenever a remote participant adds an
133 | * audio or video track to the conference, and we can then attach it to
134 | * the local representation of the corresponding participant.
135 | */
136 |
137 | TRACK_ADDED: (track) => {
138 | addRemoveTrack(track, 'add')
139 | },
140 | TRACK_REMOVED: (track) => {
141 | addRemoveTrack(track, 'remove')
142 | },
143 | },
144 | }
145 |
146 | // Add all `events` functions as eventListeners on the JitsiConference object
147 | wireEventListeners('add', conference, events)
148 |
149 | setStatus(ConferenceState.JOINING)
150 | conference.join()
151 |
152 | // When connection status changes, clean up before re-creating a new JitsiConference
153 | return () => {
154 | const $state = get(stateStore)
155 | if (
156 | $state === ConferenceState.JOINING ||
157 | $state === ConferenceState.JOINED
158 | ) {
159 | const $connection = get(connectionStore)
160 |
161 | // Can't leave if the connection is null
162 | if ($connection) {
163 | // Leave the conference
164 | setStatus(ConferenceState.LEAVING)
165 | conference
166 | .leave()
167 | .then(() => {
168 | console.log('Left conference', conferenceId)
169 | // status will be set by CONFERENCE_LEFT callback
170 | })
171 | .catch((err) => {
172 | setStatus(ConferenceState.LEFT)
173 | console.warn('Error when leaving conference', err)
174 | })
175 |
176 | /**
177 | * Make sure we clean up event listeners.
178 | *
179 | * NOTE: Hopefully this will have been taken care of by
180 | * the CONFERENCE_LEFT event, but if not this will
181 | * be our fallback, e.g. in the case of
182 | * CONFERENCE_FAILED or other states.
183 | */
184 | setTimeout(
185 | () => wireEventListeners('remove', conference, events),
186 | CLEANUP_EVENT_LISTENERS_MAX_TIMEOUT
187 | )
188 | } else {
189 | setStatus(ConferenceState.LEFT)
190 | wireEventListeners('remove', conference, events)
191 | }
192 | } else {
193 | // Whether or not we're joined, we must still clean up event listeners
194 | setStatus(ConferenceState.LEFT)
195 | wireEventListeners('remove', conference, events)
196 | }
197 | }
198 | }
199 | },
200 |
201 | // Initial derived store value
202 | null
203 | )
204 |
205 | // Whenever the conference OR the localTrackStore changes, we want to re-add
206 | // local tracks to the conference.
207 | derived(
208 | [store, localTracksStore, permitEntryStore],
209 | ([$store, $localTracks, $permitEntry]) => {
210 | const conference = $store
211 | const tracks = $localTracks
212 | const permitEntry = $permitEntry
213 | const r = { conference, tracks, permitEntry }
214 | return r
215 | }
216 | ).subscribe(($props) => {
217 | if ($props.conference && $props.tracks && $props.permitEntry) {
218 | // Whenever local tracks exist, add them to the localParticipant for this conference
219 | // (Allows this participant to see self)
220 | localParticipantStore.addTrack($props.tracks.audio)
221 | localParticipantStore.addTrack($props.tracks.video)
222 |
223 | // When conference & local tracks exist, add local tracks to the conference
224 | // (Allows others to see this participant)
225 | const tracksList = Object.values($props.tracks)
226 | addLocalTracksToConference($props.conference, tracksList)
227 | } else {
228 | // TODO: remove local tracks?
229 | }
230 | })
231 |
232 | /**
233 | * A store containing all participant stores, both local and remote.
234 | *
235 | * This derives from `store` because we need to guarantee that there is
236 | * at least one subscriber to `store`, so that the conference is joined.
237 | */
238 | const allParticipantsStore = derived(
239 | [
240 | localParticipantStore,
241 | remoteParticipantsStore,
242 | store /* ConferenceStore */,
243 | ],
244 | ([$localParticipant, $remoteParticipants, $store], set) => {
245 | if ($store) {
246 | const allParticipants = {}
247 |
248 | // Add remote participants
249 | for (let [participantId, remoteParticipantStore] of Object.entries(
250 | $remoteParticipants
251 | )) {
252 | if (get(remoteParticipantStore).jid) {
253 | allParticipants[participantId] = remoteParticipantStore
254 | }
255 | }
256 |
257 | // Add local participant, if present
258 | if ($localParticipant && $localParticipant.jid) {
259 | allParticipants[$localParticipant.jid] = localParticipantStore
260 | }
261 |
262 | set(allParticipants)
263 | } else {
264 | // If the ConferenceStore is null, then we consider the conference to have no participants
265 | set({})
266 | }
267 | },
268 | // Initial allParticipantsStore value
269 | {}
270 | )
271 |
272 | return {
273 | subscribe: store.subscribe,
274 | state: stateStore,
275 | localParticipant: localParticipantStore,
276 | participants: allParticipantsStore,
277 | permitEntry: (permit) => {
278 | permitEntryStore.set(permit)
279 | },
280 | }
281 | }
282 |
283 | function createConferencesStore(connectionStore) {
284 | const store = writable({})
285 |
286 | const { subscribe, update, set } = store
287 |
288 | const join = (conferenceId) => {
289 | update(($store) => {
290 | return {
291 | ...$store,
292 | [conferenceId]: createSingleConferenceStore(
293 | conferenceId,
294 | connectionStore
295 | ),
296 | }
297 | })
298 | }
299 |
300 | const leave = (conferenceId) => {
301 | update(($store) => {
302 | const conferenceStore = $store[conferenceId]
303 | if (conferenceStore) {
304 | // TODO: deinit
305 | }
306 | return omit($store, [conferenceId])
307 | })
308 | }
309 |
310 | return { subscribe, join, leave }
311 | }
312 |
313 | export { createConferencesStore, ConferenceState }
314 |
--------------------------------------------------------------------------------
/src/stores/ConnectionStore.js:
--------------------------------------------------------------------------------
1 | import { writable, get } from 'svelte/store'
2 | import { createConferencesStore } from './ConferencesStore.js'
3 | import { wireEventListeners } from '../utils/events.js'
4 |
5 | import '../jitsi/init.js'
6 |
7 | const ConnectState = {
8 | INITIAL: 'initial',
9 | CONNECTING: 'connecting',
10 | CONNECTED: 'connected',
11 | DISCONNECTING: 'disconnecting',
12 | DISCONNECTED: 'disconnected',
13 | FAILED: 'failed',
14 | }
15 |
16 | const CLEANUP_EVENT_LISTENERS_MAX_TIMEOUT = 4000
17 |
18 | export const DEFAULT_JITSI_CONFIG = {
19 | hosts: {
20 | domain: 'meet.jit.si',
21 | muc: 'conference.meet.jit.si',
22 | focus: 'focus.meet.jit.si',
23 | },
24 | externalConnectUrl: 'https://meet.jit.si/http-pre-bind',
25 | enableP2P: true,
26 | p2p: {
27 | enabled: true,
28 | preferH264: true,
29 | disableH264: true,
30 | useStunTurn: true,
31 | },
32 | useStunTurn: true,
33 | bosh: `https://meet.jit.si/http-bind`, // need to add `room=[ROOM]` when joining
34 | websocket: 'wss://meet.jit.si/xmpp-websocket',
35 | clientNode: 'http://jitsi.org/jitsimeet',
36 | }
37 |
38 | /**
39 | * Create a ConnectionStore that holds a single JitsiConnection instance when connected,
40 | * or `null` otherwise.
41 | *
42 | * If the config inside `configStore` is null, then disconnect.
43 | *
44 | * @param {ConfigStore} configStore
45 | */
46 | function createConnectionStore(config, room) {
47 | if (!config) {
48 | throw Error('Jitsi connection config required')
49 | }
50 |
51 | config.bosh += `?room=${room}`
52 |
53 | const stateStore = writable(ConnectState.INITIAL)
54 |
55 | const qualityStore = writable(0.0)
56 |
57 | const store = writable()
58 |
59 | const connection = new JitsiMeetJS.JitsiConnection(null, null, config)
60 |
61 | const setStatus = (state) => {
62 | store.set(state === ConnectState.CONNECTED ? connection : null)
63 | stateStore.set(state)
64 | }
65 |
66 | const events = {
67 | connection: {
68 | CONNECTION_ESTABLISHED: () => setStatus(ConnectState.CONNECTED),
69 | CONNECTION_FAILED: () => setStatus(ConnectState.FAILED),
70 | CONNECTION_DISCONNECTED: () => {
71 | wireEventListeners('remove', connection, events)
72 | setStatus(ConnectState.DISCONNECTED)
73 | },
74 | WRONG_STATE: () => {
75 | console.error('Jitsi Connection: Wrong State')
76 | setStatus(ConnectState.FAILED)
77 | },
78 | },
79 | connectionQuality: {
80 | LOCAL_STATS_UPDATED: ({ connectionQuality }) => {
81 | // TODO: check that this is working when conference has been joined
82 | console.log('LOCAL_STATS_UPDATED', connectionQuality)
83 | qualityStore.set(connectionQuality)
84 | },
85 | },
86 | }
87 |
88 | wireEventListeners('add', connection, events)
89 |
90 | setStatus(ConnectState.CONNECTING)
91 | connection.connect()
92 |
93 | const disconnect = () => {
94 | // If connected, disconnect
95 | const $state = get(stateStore)
96 | if (
97 | $state === ConnectState.CONNECTING ||
98 | $state === ConnectState.CONNECTED
99 | ) {
100 | // Disconnect from the server
101 | setStatus(ConnectState.DISCONNECTING)
102 | connection.disconnect()
103 |
104 | /**
105 | * Make sure we clean up event listeners.
106 | *
107 | * NOTE: Hopefully this will have been taken care of by
108 | * the CONNECTION_DISCONNECTED event, but if not
109 | * this will be our fallback, e.g. in the case of
110 | * CONNECTION_FAILED or other states.
111 | */
112 | setTimeout(
113 | () => wireEventListeners('remove', connection, events),
114 | CLEANUP_EVENT_LISTENERS_MAX_TIMEOUT
115 | )
116 | } else {
117 | // Whether or not we're connected, we must still clean up event listeners
118 | wireEventListeners('remove', connection, events)
119 | }
120 | }
121 |
122 | const conferencesStore = createConferencesStore(store)
123 | return {
124 | subscribe: store.subscribe,
125 | state: stateStore,
126 | quality: qualityStore,
127 |
128 | // Each connection can have multiple conferences (rooms)
129 | conferencesStore: conferencesStore,
130 |
131 | joinConference: (conferenceId) => conferencesStore.join(conferenceId),
132 | disconnect,
133 | }
134 | }
135 |
136 | export { createConnectionStore, ConnectState }
137 |
--------------------------------------------------------------------------------
/src/stores/DeviceListStore.js:
--------------------------------------------------------------------------------
1 | import { writable, derived } from 'svelte/store'
2 |
3 | import ready from '../utils/ready.js'
4 |
5 | /**
6 | * The DeviceListStore is responsible for being an up-to-date list of media devices
7 | * available to the app.
8 | *
9 | * Available means:
10 | * 1. There is sufficient permission granted by the user (via the browser's getUserMedia call)
11 | * 2. The device is plugged in and listed by the browser
12 | */
13 |
14 | const { DEVICE_LIST_CHANGED } = JitsiMeetJS.events.mediaDevices
15 | const { mediaDevices } = JitsiMeetJS
16 |
17 | async function getDeviceList() {
18 | return new Promise((resolve, reject) => {
19 | if (JitsiMeetJS.mediaDevices.isDeviceListAvailable()) {
20 | JitsiMeetJS.mediaDevices.enumerateDevices((deviceList) =>
21 | resolve(deviceList)
22 | )
23 | } else {
24 | reject(new Error('Device List not available'))
25 | }
26 | })
27 | }
28 |
29 | function createDeviceListStore() {
30 | const { subscribe, set } = writable([])
31 |
32 | // Sets the deviceList array, and augments with pseudo-devices if needed
33 | const setDeviceList = (deviceList_) => {
34 | // Clone the deviceList so we aren't modifying the original
35 | const deviceList = deviceList_.slice()
36 |
37 | // In some browsers such as Firefox, the audiooutput is not listed
38 | // when there is just one default device, so create a pseudo-device
39 | const atLeastOneAudioOutputDevice = !!deviceList.find(
40 | (device) => device.kind === 'audiooutput'
41 | )
42 |
43 | if (!atLeastOneAudioOutputDevice) {
44 | deviceList.push({
45 | deviceId: 'default',
46 | kind: 'audiooutput',
47 | label: 'Default Speakers',
48 | })
49 | }
50 |
51 | set(deviceList)
52 | }
53 |
54 | // Initialize the deviceList with whatever the browser will tell us at this time
55 | ready(() => {
56 | getDeviceList().then(setDeviceList)
57 | })
58 |
59 | // Whenever there is a device change event, update the store
60 | mediaDevices.addEventListener(DEVICE_LIST_CHANGED, setDeviceList)
61 |
62 | return {
63 | // DeviceList behaves as a Svelte-subscribable store
64 | subscribe,
65 |
66 | // DeviceList can be set, e.g. on callbacks and events returned by Jitsi
67 | set: setDeviceList,
68 |
69 | // Instruct DeviceList to ask the browser for its most recent enumeration of devices
70 | requery: async () => {
71 | const deviceList = await getDeviceList()
72 | setDeviceList(deviceList)
73 | return deviceList
74 | },
75 | }
76 | }
77 |
78 | // The default store containing an array of MediaDeviceInfo devices
79 | const deviceList = createDeviceListStore()
80 |
81 | // Given a deviceList, pick out the most likely default device of a certain kind
82 | function getDefaultDeviceId(deviceList, kind) {
83 | const deviceListOfKind = deviceList.filter((device) => device.kind === kind)
84 | const defaultDevice = deviceListOfKind.find((d) => d.deviceId === 'default')
85 |
86 | let matchingDevice
87 |
88 | if (defaultDevice) {
89 | // Find the device with a matching group id.
90 | matchingDevice = deviceListOfKind.find(
91 | (d) => d.deviceId !== 'default' && d.groupId === defaultDevice.groupId
92 | )
93 | }
94 |
95 | if (matchingDevice) {
96 | return matchingDevice.deviceId
97 | } else if (deviceListOfKind.length >= 1) {
98 | return deviceListOfKind[0].deviceId
99 | } else {
100 | return null
101 | }
102 | }
103 |
104 | const defaultDevices = derived(deviceList, ($deviceList) => {
105 | return {
106 | videoinput: getDefaultDeviceId($deviceList, 'videoinput'),
107 | audioinput: getDefaultDeviceId($deviceList, 'audioinput'),
108 | audiooutput: getDefaultDeviceId($deviceList, 'audiooutput'),
109 | }
110 | })
111 |
112 | const selectedDevices = writable({})
113 |
114 | export { deviceList, defaultDevices, selectedDevices }
115 |
--------------------------------------------------------------------------------
/src/stores/ElementTrackStore.js:
--------------------------------------------------------------------------------
1 | import { writable, derived, get } from 'svelte/store'
2 |
3 | function createElementAndTrackStore() {
4 | let attachedTrack
5 |
6 | const elementStore = writable(null)
7 | const trackStore = writable(null)
8 |
9 | const detach = () => {
10 | const element = get(elementStore)
11 | if (attachedTrack) {
12 | attachedTrack.detach(element)
13 | attachedTrack = null
14 | }
15 | }
16 |
17 | const attach = () => {
18 | const track = get(trackStore)
19 | const element = get(elementStore)
20 | if (track && track !== attachedTrack) {
21 | detach()
22 | attachedTrack = track
23 | track.attach(element)
24 | }
25 | }
26 |
27 | const store = derived([elementStore, trackStore], ([$element, $track]) => {
28 | return { element: $element, track: $track }
29 | })
30 |
31 | const unsubscribe = store.subscribe(($props) => {
32 | if ($props.element && $props.track) {
33 | attach()
34 | }
35 | })
36 |
37 | return {
38 | subscribe: store.subscribe,
39 |
40 | destroy: () => {
41 | detach()
42 | unsubscribe()
43 | },
44 |
45 | setElement: (element) => {
46 | elementStore.set(element)
47 | },
48 |
49 | setTrack: (track) => {
50 | if (track !== get(trackStore)) {
51 | trackStore.set(track)
52 | }
53 | },
54 | }
55 | }
56 |
57 | export { createElementAndTrackStore }
58 |
--------------------------------------------------------------------------------
/src/stores/LocalTracksStore.js:
--------------------------------------------------------------------------------
1 | import { derived, writable, get } from 'svelte/store'
2 | import omit from '../utils/omit.js'
3 | import { selectedDevices as selectedDevicesStore } from './DeviceListStore.js'
4 |
5 | const { TRACK_AUDIO_LEVEL_CHANGED } = JitsiMeetJS.events.track
6 |
7 | const requestedTracks = {
8 | audio: writable(true),
9 | video: writable(true),
10 | }
11 |
12 | /**
13 | * Converts requestedTracks to a list of track names, e.g. ['audio', 'video']
14 | */
15 | const requestedTrackNames = derived(
16 | [requestedTracks.audio, requestedTracks.video],
17 | ([$audio, $video]) =>
18 | [$audio ? 'audio' : null, $video ? 'video' : null].filter((x) => x),
19 | []
20 | )
21 |
22 | function createAudioLevelStore() {
23 | const { subscribe, set } = writable(0)
24 |
25 | /**
26 | * Adds or removes an event listener function if the track is an audio track
27 | *
28 | * @param {JitsiTrack} track
29 | * @param {string} direction - 'add' | 'remove'
30 | */
31 | const changeAudioTrackEventListener = (track, direction) => {
32 | if (track.getType() === 'audio') {
33 | track[`${direction}EventListener`](TRACK_AUDIO_LEVEL_CHANGED, set)
34 | }
35 | return track
36 | }
37 |
38 | return {
39 | subscribe,
40 | set,
41 | initTrack: (track) => {
42 | return changeAudioTrackEventListener(track, 'add')
43 | },
44 | deinitTrack: (track) => {
45 | return changeAudioTrackEventListener(track, 'remove')
46 | },
47 | }
48 | }
49 |
50 | const localAudioLevel = createAudioLevelStore()
51 |
52 | async function createLocalTracks(requestedTrackNames, selectedDevices = {}) {
53 | let tracks = {}
54 |
55 | const options = { devices: requestedTrackNames }
56 |
57 | // If we have a specific video camera to request, include it in the options
58 | if (requestedTrackNames.includes('video') && selectedDevices.videoinput) {
59 | options.cameraDeviceId = selectedDevices.videoinput
60 | }
61 |
62 | // If we have a specific microphone to request, include it in the options
63 | if (requestedTrackNames.includes('audio') && selectedDevices.audioinput) {
64 | options.micDeviceId = selectedDevices.audioinput
65 | }
66 |
67 | try {
68 | // Get all requested tracks at once
69 | for (const track of await JitsiMeetJS.createLocalTracks(options)) {
70 | tracks[track.getType()] = localAudioLevel.initTrack(track)
71 | }
72 | } catch (err) {
73 | if (requestedTrackNames.length > 1) {
74 | // If multiple tracks were requested, try again by requesting one at a time
75 | for (const requestedTrack of requestedTrackNames) {
76 | try {
77 | Object.assign(
78 | tracks,
79 | await createLocalTracks([requestedTrack], selectedDevices)
80 | )
81 | } catch (err2) {
82 | console.error(`Shouldn't happen:`, err2)
83 | }
84 | }
85 | } else {
86 | console.warn(
87 | `Unable to create local track: ${requestedTrackNames.join(', ')}`
88 | )
89 | }
90 | }
91 |
92 | return tracks
93 | }
94 |
95 | function createLocalTracksStore() {
96 | const store = writable({})
97 | const { subscribe, update, set } = store
98 |
99 | function clear() {
100 | const tracks = get(store)
101 |
102 | // Clean up from past local track creation
103 | for (const track of Object.values(tracks)) {
104 | localAudioLevel.deinitTrack(track)
105 | }
106 |
107 | // Reset localTracks to empty object
108 | set({})
109 | }
110 |
111 | return {
112 | // LocalTracksStore behaves as a Svelte-subscribable store
113 | subscribe,
114 |
115 | // LocalTracksStore can be set
116 | set,
117 |
118 | count: () => {
119 | return Object.values(get()).length
120 | },
121 |
122 | /**
123 | * Switch from sharing video to sharing desktop, or back if `desktop` is false.
124 | */
125 | shareDesktop: async (desktop = true) => {
126 | const desktopTracks = await createLocalTracks([
127 | desktop ? 'desktop' : 'video',
128 | ])
129 |
130 | update(($tracks) => {
131 | if ($tracks.video) {
132 | $tracks.video.dispose()
133 | }
134 | return omit($tracks, ['video'])
135 | })
136 |
137 | setTimeout(() => {
138 | update(($tracks) => {
139 | return { ...$tracks, ...desktopTracks }
140 | })
141 | }, 1000)
142 | },
143 |
144 | /**
145 | * Create multiple local tracks at once, or if error, create multiple
146 | * local tracks one at a time. Takes into account `selectedDevices`
147 | * setting that is "global" to this component.
148 | *
149 | * @param {[string]} requestedTracks - a list of types of devices to allocate as tracks, e.g. ['video', 'audio']
150 | *
151 | * @returns {Object} - an object with keys equal to device types and values set to corresponding JitsiTrack
152 | */
153 | request: async ({ requestedTracks, selectedDevices } = {}) => {
154 | if (!requestedTracks) {
155 | requestedTracks = get(requestedTrackNames)
156 | }
157 |
158 | if (!selectedDevices) {
159 | selectedDevices = get(selectedDevicesStore)
160 | }
161 |
162 | const tracks = await createLocalTracks(requestedTracks, selectedDevices)
163 |
164 | clear()
165 |
166 | set(tracks)
167 |
168 | return Object.values(tracks).length > 0
169 | },
170 |
171 | // De-initialize existing tracks & clear the LocalTracksStore
172 | clear,
173 | }
174 | }
175 |
176 | const localTracksStore = createLocalTracksStore()
177 |
178 | export {
179 | localTracksStore,
180 | localAudioLevel,
181 | requestedTracks,
182 | createAudioLevelStore,
183 | }
184 |
--------------------------------------------------------------------------------
/src/stores/ParticipantsStore.js:
--------------------------------------------------------------------------------
1 | import { derived, writable, get } from 'svelte/store'
2 | import omit from '../utils/omit.js'
3 | import { wireEventListeners } from '../utils/events.js'
4 |
5 | function createSingleParticipantStore(isLocal = false) {
6 | // Stores participant properties
7 | const fieldsStore = writable({
8 | jid: null,
9 | role: null,
10 |
11 | audioEnabled: false,
12 | videoEnabled: false,
13 | desktopEnabled: false,
14 |
15 | // boolean
16 | isLocal: false,
17 | })
18 |
19 | // Stores JitsiTrack by track type ('audio' | 'video')
20 | const tracksStore = writable({})
21 |
22 | // Store audioLevel separately because it changes frequently (~40ms)
23 | const audioLevelStore = writable(0.0)
24 |
25 | // The main participant store, derived from other stores
26 | const store = derived(
27 | [fieldsStore, tracksStore, audioLevelStore],
28 | ([$fields, $tracks, $audioLevel], set) => {
29 | set({
30 | ...$fields,
31 | ...$tracks,
32 | audioLevel: $audioLevel,
33 | })
34 | },
35 | {}
36 | )
37 |
38 | const events = {
39 | audio: {
40 | track: {
41 | TRACK_AUDIO_LEVEL_CHANGED: (audioLevel) => {
42 | audioLevelStore.set(audioLevel)
43 | },
44 | TRACK_MUTE_CHANGED: (track) => {
45 | fieldsStore.update(($fields) => ({
46 | ...$fields,
47 | audioEnabled: !track.isMuted(),
48 | }))
49 | },
50 | },
51 | },
52 | video: {
53 | track: {
54 | TRACK_MUTE_CHANGED: (track) => {
55 | fieldsStore.update(($fields) => ({
56 | ...$fields,
57 | videoEnabled: !track.isMuted(),
58 | }))
59 | },
60 | },
61 | },
62 | }
63 |
64 | return {
65 | subscribe: store.subscribe,
66 |
67 | setJid: (jid) => {
68 | fieldsStore.update(($fields) => ({ ...$fields, jid }))
69 | },
70 |
71 | setRole: (role) => {
72 | fieldsStore.update(($fields) => ({ ...$fields, role }))
73 | },
74 |
75 | setAudioEnabled: (enabled) => {
76 | const tracks = get(tracksStore)
77 | if (tracks.audio) {
78 | if (enabled) {
79 | tracks.audio.unmute()
80 | } else {
81 | tracks.audio.mute()
82 | }
83 | }
84 | },
85 |
86 | setVideoEnabled: (enabled) => {
87 | const tracks = get(tracksStore)
88 | if (tracks.video) {
89 | if (enabled) {
90 | tracks.video.unmute()
91 | } else {
92 | tracks.video.mute()
93 | }
94 | }
95 | },
96 |
97 | setAudioLevel: (audioLevel) => {
98 | audioLevelStore.set(audioLevel)
99 | },
100 |
101 | updateFieldsFromJitsiParticipant: (participant) => {
102 | fieldsStore.update(($fields) => {
103 | return {
104 | ...$fields,
105 | jid: participant.getId(),
106 | role: participant.getRole(),
107 | }
108 | })
109 | },
110 |
111 | addTrack: (track) => {
112 | if (track) {
113 | const trackType = track.getType()
114 | if (events[trackType]) {
115 | wireEventListeners('add', track, events[trackType])
116 | }
117 | fieldsStore.update(($fields) => ({
118 | ...$fields,
119 | [`${trackType}Enabled`]: !track.isMuted(),
120 | }))
121 | tracksStore.update(($tracks) => ({
122 | ...$tracks,
123 | [trackType]: track,
124 | }))
125 | }
126 | },
127 |
128 | removeTrack: (track) => {
129 | if (track) {
130 | const trackType = track.getType()
131 | if (events[trackType]) {
132 | wireEventListeners('remove', track, events[trackType])
133 | }
134 | tracksStore.update(($tracks) => omit($tracks, [trackType]))
135 | }
136 | },
137 |
138 | // Expose read-only versions of stores so they can be subscribed to individually
139 | fieldsStore: { subscribe: fieldsStore.subscribe },
140 | tracksStore: { subscribe: tracksStore.subscribe },
141 | audioLevelStore: { subscribe: audioLevelStore.subscribe },
142 | }
143 | }
144 |
145 | function createParticipantsStore() {
146 | const store = writable({})
147 |
148 | const { subscribe, update, set } = store
149 |
150 | const updateParticipant = (participantId, action) => {
151 | let participant = get(store)[participantId]
152 | if (participant) {
153 | action(participant, false)
154 | } else {
155 | store.update(($participants) => {
156 | if ($participants[participantId]) {
157 | console.warn(`participant '${participantId}' should not exist`)
158 | }
159 | participant = createSingleParticipantStore()
160 | action(participant, true)
161 | return {
162 | ...$participants,
163 | [participantId]: participant,
164 | }
165 | })
166 | }
167 | }
168 |
169 | return {
170 | subscribe,
171 | update,
172 | updateParticipant,
173 | set,
174 | }
175 | }
176 |
177 | export { createParticipantsStore, createSingleParticipantStore }
178 |
--------------------------------------------------------------------------------
/src/utils/events.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Restrict valid function names to 'addEventListener' and 'removeEventListener'
3 | *
4 | * @param {string} direction - 'add' | 'remove'
5 | */
6 | function eventListenerDirection(direction) {
7 | switch (direction) {
8 | case 'add':
9 | return 'addEventListener'
10 | case 'remove':
11 | return 'removeEventListener'
12 | default:
13 | throw new Error(
14 | `eventListener direction must be 'add' or 'remove', but was '${direction}'`
15 | )
16 | }
17 | }
18 |
19 | function trackDirection(direction) {
20 | switch (direction) {
21 | case 'add':
22 | return 'addTrack'
23 | case 'remove':
24 | return 'removeTrack'
25 | default:
26 | throw new Error(
27 | `addRemoveTrack direction must be 'add' or 'remove', but was '${direction}'`
28 | )
29 | }
30 | }
31 |
32 | /**
33 | * Add or remove a batch of JitsiMeetJS events on a given listening object
34 | *
35 | * @param {string} direction - 'add' | 'remove' event listeners
36 | * @param {any} listening - object that can listen for events, i.e. must have 'addEventListener', 'removeEventListener'
37 | * @param {object} events - an object containing event types as keys and values as object containing event names as keys and event functions as values
38 | */
39 | function wireEventListeners(direction, listening, events) {
40 | let fnName = eventListenerDirection(direction)
41 |
42 | for (const eventType of Object.keys(events)) {
43 | for (const [eventName, callback] of Object.entries(events[eventType])) {
44 | listening[fnName](JitsiMeetJS.events[eventType][eventName], callback)
45 | }
46 | }
47 | }
48 |
49 | export { eventListenerDirection, trackDirection, wireEventListeners }
50 |
--------------------------------------------------------------------------------
/src/utils/groupBy.js:
--------------------------------------------------------------------------------
1 | function groupBy(xs, key) {
2 | return xs.reduce((rv, x) => {
3 | ;(rv[x[key]] = rv[x[key]] || []).push(x)
4 | return rv
5 | }, {})
6 | }
7 |
8 | export default groupBy
9 |
--------------------------------------------------------------------------------
/src/utils/hasAncestor.js:
--------------------------------------------------------------------------------
1 | function hasAncestor(element, ancestor) {
2 | if (element === null) {
3 | return false
4 | } else if (element === ancestor) {
5 | return true
6 | } else {
7 | return hasAncestor(element.parentNode, ancestor)
8 | }
9 | }
10 |
11 | export default hasAncestor
12 |
--------------------------------------------------------------------------------
/src/utils/omit.js:
--------------------------------------------------------------------------------
1 | function omit(obj, remove) {
2 | var result = {}
3 | if (typeof remove === 'string') {
4 | remove = [].slice.call(arguments, 1)
5 | }
6 | for (var prop in obj) {
7 | if (!obj.hasOwnProperty || obj.hasOwnProperty(prop)) {
8 | if (remove.indexOf(prop) === -1) {
9 | result[prop] = obj[prop]
10 | }
11 | }
12 | }
13 | return result
14 | }
15 |
16 | export default omit
17 |
--------------------------------------------------------------------------------
/src/utils/ready.js:
--------------------------------------------------------------------------------
1 | function ready(fn) {
2 | if (document.readyState === 'complete') {
3 | fn()
4 | } else {
5 | document.addEventListener('readystatechange', () => {
6 | if (document.readyState === 'complete') {
7 | fn()
8 | }
9 | })
10 | }
11 | }
12 |
13 | export default ready
14 |
--------------------------------------------------------------------------------
/src/utils/uuid.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Generates a random UUID (version 4). This can be used as a decentralized way
3 | * to create an identifier that has such a low probability of collision that it
4 | * can essentially be treated as universally unique.
5 | *
6 | * @returns {string}
7 | */
8 | function uuidv4() {
9 | return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
10 | var r = (Math.random() * 16) | 0,
11 | v = c == 'x' ? r : (r & 0x3) | 0x8
12 | return v.toString(16)
13 | })
14 | }
15 |
16 | export { uuidv4 }
17 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@babel/code-frame@^7.10.4":
6 | version "7.10.4"
7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
8 | integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
9 | dependencies:
10 | "@babel/highlight" "^7.10.4"
11 |
12 | "@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0":
13 | version "7.11.0"
14 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c"
15 | integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==
16 | dependencies:
17 | browserslist "^4.12.0"
18 | invariant "^2.2.4"
19 | semver "^5.5.0"
20 |
21 | "@babel/core@^7.11.6":
22 | version "7.11.6"
23 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651"
24 | integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==
25 | dependencies:
26 | "@babel/code-frame" "^7.10.4"
27 | "@babel/generator" "^7.11.6"
28 | "@babel/helper-module-transforms" "^7.11.0"
29 | "@babel/helpers" "^7.10.4"
30 | "@babel/parser" "^7.11.5"
31 | "@babel/template" "^7.10.4"
32 | "@babel/traverse" "^7.11.5"
33 | "@babel/types" "^7.11.5"
34 | convert-source-map "^1.7.0"
35 | debug "^4.1.0"
36 | gensync "^1.0.0-beta.1"
37 | json5 "^2.1.2"
38 | lodash "^4.17.19"
39 | resolve "^1.3.2"
40 | semver "^5.4.1"
41 | source-map "^0.5.0"
42 |
43 | "@babel/generator@^7.11.5", "@babel/generator@^7.11.6":
44 | version "7.11.6"
45 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620"
46 | integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==
47 | dependencies:
48 | "@babel/types" "^7.11.5"
49 | jsesc "^2.5.1"
50 | source-map "^0.5.0"
51 |
52 | "@babel/helper-annotate-as-pure@^7.10.4":
53 | version "7.10.4"
54 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
55 | integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==
56 | dependencies:
57 | "@babel/types" "^7.10.4"
58 |
59 | "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4":
60 | version "7.10.4"
61 | resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3"
62 | integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==
63 | dependencies:
64 | "@babel/helper-explode-assignable-expression" "^7.10.4"
65 | "@babel/types" "^7.10.4"
66 |
67 | "@babel/helper-compilation-targets@^7.10.4":
68 | version "7.10.4"
69 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2"
70 | integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==
71 | dependencies:
72 | "@babel/compat-data" "^7.10.4"
73 | browserslist "^4.12.0"
74 | invariant "^2.2.4"
75 | levenary "^1.1.1"
76 | semver "^5.5.0"
77 |
78 | "@babel/helper-create-class-features-plugin@^7.10.4":
79 | version "7.10.5"
80 | resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
81 | integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==
82 | dependencies:
83 | "@babel/helper-function-name" "^7.10.4"
84 | "@babel/helper-member-expression-to-functions" "^7.10.5"
85 | "@babel/helper-optimise-call-expression" "^7.10.4"
86 | "@babel/helper-plugin-utils" "^7.10.4"
87 | "@babel/helper-replace-supers" "^7.10.4"
88 | "@babel/helper-split-export-declaration" "^7.10.4"
89 |
90 | "@babel/helper-create-regexp-features-plugin@^7.10.4":
91 | version "7.10.4"
92 | resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8"
93 | integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==
94 | dependencies:
95 | "@babel/helper-annotate-as-pure" "^7.10.4"
96 | "@babel/helper-regex" "^7.10.4"
97 | regexpu-core "^4.7.0"
98 |
99 | "@babel/helper-define-map@^7.10.4":
100 | version "7.10.5"
101 | resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30"
102 | integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==
103 | dependencies:
104 | "@babel/helper-function-name" "^7.10.4"
105 | "@babel/types" "^7.10.5"
106 | lodash "^4.17.19"
107 |
108 | "@babel/helper-explode-assignable-expression@^7.10.4":
109 | version "7.11.4"
110 | resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b"
111 | integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==
112 | dependencies:
113 | "@babel/types" "^7.10.4"
114 |
115 | "@babel/helper-function-name@^7.10.4":
116 | version "7.10.4"
117 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
118 | integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
119 | dependencies:
120 | "@babel/helper-get-function-arity" "^7.10.4"
121 | "@babel/template" "^7.10.4"
122 | "@babel/types" "^7.10.4"
123 |
124 | "@babel/helper-get-function-arity@^7.10.4":
125 | version "7.10.4"
126 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
127 | integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
128 | dependencies:
129 | "@babel/types" "^7.10.4"
130 |
131 | "@babel/helper-hoist-variables@^7.10.4":
132 | version "7.10.4"
133 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e"
134 | integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==
135 | dependencies:
136 | "@babel/types" "^7.10.4"
137 |
138 | "@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5":
139 | version "7.11.0"
140 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df"
141 | integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==
142 | dependencies:
143 | "@babel/types" "^7.11.0"
144 |
145 | "@babel/helper-module-imports@^7.10.4":
146 | version "7.10.4"
147 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
148 | integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
149 | dependencies:
150 | "@babel/types" "^7.10.4"
151 |
152 | "@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0":
153 | version "7.11.0"
154 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
155 | integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==
156 | dependencies:
157 | "@babel/helper-module-imports" "^7.10.4"
158 | "@babel/helper-replace-supers" "^7.10.4"
159 | "@babel/helper-simple-access" "^7.10.4"
160 | "@babel/helper-split-export-declaration" "^7.11.0"
161 | "@babel/template" "^7.10.4"
162 | "@babel/types" "^7.11.0"
163 | lodash "^4.17.19"
164 |
165 | "@babel/helper-optimise-call-expression@^7.10.4":
166 | version "7.10.4"
167 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
168 | integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
169 | dependencies:
170 | "@babel/types" "^7.10.4"
171 |
172 | "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
173 | version "7.10.4"
174 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
175 | integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
176 |
177 | "@babel/helper-regex@^7.10.4":
178 | version "7.10.5"
179 | resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0"
180 | integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==
181 | dependencies:
182 | lodash "^4.17.19"
183 |
184 | "@babel/helper-remap-async-to-generator@^7.10.4":
185 | version "7.11.4"
186 | resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d"
187 | integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==
188 | dependencies:
189 | "@babel/helper-annotate-as-pure" "^7.10.4"
190 | "@babel/helper-wrap-function" "^7.10.4"
191 | "@babel/template" "^7.10.4"
192 | "@babel/types" "^7.10.4"
193 |
194 | "@babel/helper-replace-supers@^7.10.4":
195 | version "7.10.4"
196 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
197 | integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==
198 | dependencies:
199 | "@babel/helper-member-expression-to-functions" "^7.10.4"
200 | "@babel/helper-optimise-call-expression" "^7.10.4"
201 | "@babel/traverse" "^7.10.4"
202 | "@babel/types" "^7.10.4"
203 |
204 | "@babel/helper-simple-access@^7.10.4":
205 | version "7.10.4"
206 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
207 | integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==
208 | dependencies:
209 | "@babel/template" "^7.10.4"
210 | "@babel/types" "^7.10.4"
211 |
212 | "@babel/helper-skip-transparent-expression-wrappers@^7.11.0":
213 | version "7.11.0"
214 | resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729"
215 | integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==
216 | dependencies:
217 | "@babel/types" "^7.11.0"
218 |
219 | "@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0":
220 | version "7.11.0"
221 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f"
222 | integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==
223 | dependencies:
224 | "@babel/types" "^7.11.0"
225 |
226 | "@babel/helper-validator-identifier@^7.10.4":
227 | version "7.10.4"
228 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
229 | integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
230 |
231 | "@babel/helper-wrap-function@^7.10.4":
232 | version "7.10.4"
233 | resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87"
234 | integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==
235 | dependencies:
236 | "@babel/helper-function-name" "^7.10.4"
237 | "@babel/template" "^7.10.4"
238 | "@babel/traverse" "^7.10.4"
239 | "@babel/types" "^7.10.4"
240 |
241 | "@babel/helpers@^7.10.4":
242 | version "7.10.4"
243 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044"
244 | integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==
245 | dependencies:
246 | "@babel/template" "^7.10.4"
247 | "@babel/traverse" "^7.10.4"
248 | "@babel/types" "^7.10.4"
249 |
250 | "@babel/highlight@^7.10.4":
251 | version "7.10.4"
252 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
253 | integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
254 | dependencies:
255 | "@babel/helper-validator-identifier" "^7.10.4"
256 | chalk "^2.0.0"
257 | js-tokens "^4.0.0"
258 |
259 | "@babel/parser@^7.10.4", "@babel/parser@^7.11.5":
260 | version "7.11.5"
261 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
262 | integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
263 |
264 | "@babel/plugin-proposal-async-generator-functions@^7.10.4":
265 | version "7.10.5"
266 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558"
267 | integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==
268 | dependencies:
269 | "@babel/helper-plugin-utils" "^7.10.4"
270 | "@babel/helper-remap-async-to-generator" "^7.10.4"
271 | "@babel/plugin-syntax-async-generators" "^7.8.0"
272 |
273 | "@babel/plugin-proposal-class-properties@^7.10.4":
274 | version "7.10.4"
275 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807"
276 | integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==
277 | dependencies:
278 | "@babel/helper-create-class-features-plugin" "^7.10.4"
279 | "@babel/helper-plugin-utils" "^7.10.4"
280 |
281 | "@babel/plugin-proposal-dynamic-import@^7.10.4":
282 | version "7.10.4"
283 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e"
284 | integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==
285 | dependencies:
286 | "@babel/helper-plugin-utils" "^7.10.4"
287 | "@babel/plugin-syntax-dynamic-import" "^7.8.0"
288 |
289 | "@babel/plugin-proposal-export-namespace-from@^7.10.4":
290 | version "7.10.4"
291 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54"
292 | integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==
293 | dependencies:
294 | "@babel/helper-plugin-utils" "^7.10.4"
295 | "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
296 |
297 | "@babel/plugin-proposal-json-strings@^7.10.4":
298 | version "7.10.4"
299 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db"
300 | integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==
301 | dependencies:
302 | "@babel/helper-plugin-utils" "^7.10.4"
303 | "@babel/plugin-syntax-json-strings" "^7.8.0"
304 |
305 | "@babel/plugin-proposal-logical-assignment-operators@^7.11.0":
306 | version "7.11.0"
307 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8"
308 | integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==
309 | dependencies:
310 | "@babel/helper-plugin-utils" "^7.10.4"
311 | "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
312 |
313 | "@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4":
314 | version "7.10.4"
315 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a"
316 | integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==
317 | dependencies:
318 | "@babel/helper-plugin-utils" "^7.10.4"
319 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
320 |
321 | "@babel/plugin-proposal-numeric-separator@^7.10.4":
322 | version "7.10.4"
323 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06"
324 | integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==
325 | dependencies:
326 | "@babel/helper-plugin-utils" "^7.10.4"
327 | "@babel/plugin-syntax-numeric-separator" "^7.10.4"
328 |
329 | "@babel/plugin-proposal-object-rest-spread@^7.11.0":
330 | version "7.11.0"
331 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af"
332 | integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==
333 | dependencies:
334 | "@babel/helper-plugin-utils" "^7.10.4"
335 | "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
336 | "@babel/plugin-transform-parameters" "^7.10.4"
337 |
338 | "@babel/plugin-proposal-optional-catch-binding@^7.10.4":
339 | version "7.10.4"
340 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd"
341 | integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==
342 | dependencies:
343 | "@babel/helper-plugin-utils" "^7.10.4"
344 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
345 |
346 | "@babel/plugin-proposal-optional-chaining@^7.11.0":
347 | version "7.11.0"
348 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076"
349 | integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==
350 | dependencies:
351 | "@babel/helper-plugin-utils" "^7.10.4"
352 | "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
353 | "@babel/plugin-syntax-optional-chaining" "^7.8.0"
354 |
355 | "@babel/plugin-proposal-private-methods@^7.10.4":
356 | version "7.10.4"
357 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909"
358 | integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==
359 | dependencies:
360 | "@babel/helper-create-class-features-plugin" "^7.10.4"
361 | "@babel/helper-plugin-utils" "^7.10.4"
362 |
363 | "@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
364 | version "7.10.4"
365 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d"
366 | integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==
367 | dependencies:
368 | "@babel/helper-create-regexp-features-plugin" "^7.10.4"
369 | "@babel/helper-plugin-utils" "^7.10.4"
370 |
371 | "@babel/plugin-syntax-async-generators@^7.8.0":
372 | version "7.8.4"
373 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
374 | integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
375 | dependencies:
376 | "@babel/helper-plugin-utils" "^7.8.0"
377 |
378 | "@babel/plugin-syntax-class-properties@^7.10.4":
379 | version "7.10.4"
380 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c"
381 | integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==
382 | dependencies:
383 | "@babel/helper-plugin-utils" "^7.10.4"
384 |
385 | "@babel/plugin-syntax-dynamic-import@^7.8.0":
386 | version "7.8.3"
387 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
388 | integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
389 | dependencies:
390 | "@babel/helper-plugin-utils" "^7.8.0"
391 |
392 | "@babel/plugin-syntax-export-namespace-from@^7.8.3":
393 | version "7.8.3"
394 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
395 | integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
396 | dependencies:
397 | "@babel/helper-plugin-utils" "^7.8.3"
398 |
399 | "@babel/plugin-syntax-json-strings@^7.8.0":
400 | version "7.8.3"
401 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
402 | integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
403 | dependencies:
404 | "@babel/helper-plugin-utils" "^7.8.0"
405 |
406 | "@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
407 | version "7.10.4"
408 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
409 | integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
410 | dependencies:
411 | "@babel/helper-plugin-utils" "^7.10.4"
412 |
413 | "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
414 | version "7.8.3"
415 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
416 | integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
417 | dependencies:
418 | "@babel/helper-plugin-utils" "^7.8.0"
419 |
420 | "@babel/plugin-syntax-numeric-separator@^7.10.4":
421 | version "7.10.4"
422 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
423 | integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
424 | dependencies:
425 | "@babel/helper-plugin-utils" "^7.10.4"
426 |
427 | "@babel/plugin-syntax-object-rest-spread@^7.8.0":
428 | version "7.8.3"
429 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
430 | integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
431 | dependencies:
432 | "@babel/helper-plugin-utils" "^7.8.0"
433 |
434 | "@babel/plugin-syntax-optional-catch-binding@^7.8.0":
435 | version "7.8.3"
436 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
437 | integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
438 | dependencies:
439 | "@babel/helper-plugin-utils" "^7.8.0"
440 |
441 | "@babel/plugin-syntax-optional-chaining@^7.8.0":
442 | version "7.8.3"
443 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
444 | integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
445 | dependencies:
446 | "@babel/helper-plugin-utils" "^7.8.0"
447 |
448 | "@babel/plugin-syntax-top-level-await@^7.10.4":
449 | version "7.10.4"
450 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d"
451 | integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==
452 | dependencies:
453 | "@babel/helper-plugin-utils" "^7.10.4"
454 |
455 | "@babel/plugin-transform-arrow-functions@^7.10.4":
456 | version "7.10.4"
457 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd"
458 | integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==
459 | dependencies:
460 | "@babel/helper-plugin-utils" "^7.10.4"
461 |
462 | "@babel/plugin-transform-async-to-generator@^7.10.4":
463 | version "7.10.4"
464 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37"
465 | integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==
466 | dependencies:
467 | "@babel/helper-module-imports" "^7.10.4"
468 | "@babel/helper-plugin-utils" "^7.10.4"
469 | "@babel/helper-remap-async-to-generator" "^7.10.4"
470 |
471 | "@babel/plugin-transform-block-scoped-functions@^7.10.4":
472 | version "7.10.4"
473 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8"
474 | integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==
475 | dependencies:
476 | "@babel/helper-plugin-utils" "^7.10.4"
477 |
478 | "@babel/plugin-transform-block-scoping@^7.10.4":
479 | version "7.11.1"
480 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215"
481 | integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==
482 | dependencies:
483 | "@babel/helper-plugin-utils" "^7.10.4"
484 |
485 | "@babel/plugin-transform-classes@^7.10.4":
486 | version "7.10.4"
487 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7"
488 | integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==
489 | dependencies:
490 | "@babel/helper-annotate-as-pure" "^7.10.4"
491 | "@babel/helper-define-map" "^7.10.4"
492 | "@babel/helper-function-name" "^7.10.4"
493 | "@babel/helper-optimise-call-expression" "^7.10.4"
494 | "@babel/helper-plugin-utils" "^7.10.4"
495 | "@babel/helper-replace-supers" "^7.10.4"
496 | "@babel/helper-split-export-declaration" "^7.10.4"
497 | globals "^11.1.0"
498 |
499 | "@babel/plugin-transform-computed-properties@^7.10.4":
500 | version "7.10.4"
501 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb"
502 | integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==
503 | dependencies:
504 | "@babel/helper-plugin-utils" "^7.10.4"
505 |
506 | "@babel/plugin-transform-destructuring@^7.10.4":
507 | version "7.10.4"
508 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5"
509 | integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==
510 | dependencies:
511 | "@babel/helper-plugin-utils" "^7.10.4"
512 |
513 | "@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4":
514 | version "7.10.4"
515 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee"
516 | integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==
517 | dependencies:
518 | "@babel/helper-create-regexp-features-plugin" "^7.10.4"
519 | "@babel/helper-plugin-utils" "^7.10.4"
520 |
521 | "@babel/plugin-transform-duplicate-keys@^7.10.4":
522 | version "7.10.4"
523 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47"
524 | integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==
525 | dependencies:
526 | "@babel/helper-plugin-utils" "^7.10.4"
527 |
528 | "@babel/plugin-transform-exponentiation-operator@^7.10.4":
529 | version "7.10.4"
530 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e"
531 | integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==
532 | dependencies:
533 | "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
534 | "@babel/helper-plugin-utils" "^7.10.4"
535 |
536 | "@babel/plugin-transform-for-of@^7.10.4":
537 | version "7.10.4"
538 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9"
539 | integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==
540 | dependencies:
541 | "@babel/helper-plugin-utils" "^7.10.4"
542 |
543 | "@babel/plugin-transform-function-name@^7.10.4":
544 | version "7.10.4"
545 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7"
546 | integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==
547 | dependencies:
548 | "@babel/helper-function-name" "^7.10.4"
549 | "@babel/helper-plugin-utils" "^7.10.4"
550 |
551 | "@babel/plugin-transform-literals@^7.10.4":
552 | version "7.10.4"
553 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c"
554 | integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==
555 | dependencies:
556 | "@babel/helper-plugin-utils" "^7.10.4"
557 |
558 | "@babel/plugin-transform-member-expression-literals@^7.10.4":
559 | version "7.10.4"
560 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7"
561 | integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==
562 | dependencies:
563 | "@babel/helper-plugin-utils" "^7.10.4"
564 |
565 | "@babel/plugin-transform-modules-amd@^7.10.4":
566 | version "7.10.5"
567 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1"
568 | integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==
569 | dependencies:
570 | "@babel/helper-module-transforms" "^7.10.5"
571 | "@babel/helper-plugin-utils" "^7.10.4"
572 | babel-plugin-dynamic-import-node "^2.3.3"
573 |
574 | "@babel/plugin-transform-modules-commonjs@^7.10.4":
575 | version "7.10.4"
576 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0"
577 | integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==
578 | dependencies:
579 | "@babel/helper-module-transforms" "^7.10.4"
580 | "@babel/helper-plugin-utils" "^7.10.4"
581 | "@babel/helper-simple-access" "^7.10.4"
582 | babel-plugin-dynamic-import-node "^2.3.3"
583 |
584 | "@babel/plugin-transform-modules-systemjs@^7.10.4":
585 | version "7.10.5"
586 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85"
587 | integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==
588 | dependencies:
589 | "@babel/helper-hoist-variables" "^7.10.4"
590 | "@babel/helper-module-transforms" "^7.10.5"
591 | "@babel/helper-plugin-utils" "^7.10.4"
592 | babel-plugin-dynamic-import-node "^2.3.3"
593 |
594 | "@babel/plugin-transform-modules-umd@^7.10.4":
595 | version "7.10.4"
596 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e"
597 | integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==
598 | dependencies:
599 | "@babel/helper-module-transforms" "^7.10.4"
600 | "@babel/helper-plugin-utils" "^7.10.4"
601 |
602 | "@babel/plugin-transform-named-capturing-groups-regex@^7.10.4":
603 | version "7.10.4"
604 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6"
605 | integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==
606 | dependencies:
607 | "@babel/helper-create-regexp-features-plugin" "^7.10.4"
608 |
609 | "@babel/plugin-transform-new-target@^7.10.4":
610 | version "7.10.4"
611 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888"
612 | integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==
613 | dependencies:
614 | "@babel/helper-plugin-utils" "^7.10.4"
615 |
616 | "@babel/plugin-transform-object-super@^7.10.4":
617 | version "7.10.4"
618 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894"
619 | integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==
620 | dependencies:
621 | "@babel/helper-plugin-utils" "^7.10.4"
622 | "@babel/helper-replace-supers" "^7.10.4"
623 |
624 | "@babel/plugin-transform-parameters@^7.10.4":
625 | version "7.10.5"
626 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a"
627 | integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==
628 | dependencies:
629 | "@babel/helper-get-function-arity" "^7.10.4"
630 | "@babel/helper-plugin-utils" "^7.10.4"
631 |
632 | "@babel/plugin-transform-property-literals@^7.10.4":
633 | version "7.10.4"
634 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0"
635 | integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==
636 | dependencies:
637 | "@babel/helper-plugin-utils" "^7.10.4"
638 |
639 | "@babel/plugin-transform-regenerator@^7.10.4":
640 | version "7.10.4"
641 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63"
642 | integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==
643 | dependencies:
644 | regenerator-transform "^0.14.2"
645 |
646 | "@babel/plugin-transform-reserved-words@^7.10.4":
647 | version "7.10.4"
648 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd"
649 | integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==
650 | dependencies:
651 | "@babel/helper-plugin-utils" "^7.10.4"
652 |
653 | "@babel/plugin-transform-runtime@^7.11.5":
654 | version "7.11.5"
655 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz#f108bc8e0cf33c37da031c097d1df470b3a293fc"
656 | integrity sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==
657 | dependencies:
658 | "@babel/helper-module-imports" "^7.10.4"
659 | "@babel/helper-plugin-utils" "^7.10.4"
660 | resolve "^1.8.1"
661 | semver "^5.5.1"
662 |
663 | "@babel/plugin-transform-shorthand-properties@^7.10.4":
664 | version "7.10.4"
665 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6"
666 | integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==
667 | dependencies:
668 | "@babel/helper-plugin-utils" "^7.10.4"
669 |
670 | "@babel/plugin-transform-spread@^7.11.0":
671 | version "7.11.0"
672 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc"
673 | integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==
674 | dependencies:
675 | "@babel/helper-plugin-utils" "^7.10.4"
676 | "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
677 |
678 | "@babel/plugin-transform-sticky-regex@^7.10.4":
679 | version "7.10.4"
680 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d"
681 | integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==
682 | dependencies:
683 | "@babel/helper-plugin-utils" "^7.10.4"
684 | "@babel/helper-regex" "^7.10.4"
685 |
686 | "@babel/plugin-transform-template-literals@^7.10.4":
687 | version "7.10.5"
688 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c"
689 | integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==
690 | dependencies:
691 | "@babel/helper-annotate-as-pure" "^7.10.4"
692 | "@babel/helper-plugin-utils" "^7.10.4"
693 |
694 | "@babel/plugin-transform-typeof-symbol@^7.10.4":
695 | version "7.10.4"
696 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc"
697 | integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==
698 | dependencies:
699 | "@babel/helper-plugin-utils" "^7.10.4"
700 |
701 | "@babel/plugin-transform-unicode-escapes@^7.10.4":
702 | version "7.10.4"
703 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007"
704 | integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==
705 | dependencies:
706 | "@babel/helper-plugin-utils" "^7.10.4"
707 |
708 | "@babel/plugin-transform-unicode-regex@^7.10.4":
709 | version "7.10.4"
710 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8"
711 | integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==
712 | dependencies:
713 | "@babel/helper-create-regexp-features-plugin" "^7.10.4"
714 | "@babel/helper-plugin-utils" "^7.10.4"
715 |
716 | "@babel/preset-env@^7.11.5":
717 | version "7.11.5"
718 | resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272"
719 | integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==
720 | dependencies:
721 | "@babel/compat-data" "^7.11.0"
722 | "@babel/helper-compilation-targets" "^7.10.4"
723 | "@babel/helper-module-imports" "^7.10.4"
724 | "@babel/helper-plugin-utils" "^7.10.4"
725 | "@babel/plugin-proposal-async-generator-functions" "^7.10.4"
726 | "@babel/plugin-proposal-class-properties" "^7.10.4"
727 | "@babel/plugin-proposal-dynamic-import" "^7.10.4"
728 | "@babel/plugin-proposal-export-namespace-from" "^7.10.4"
729 | "@babel/plugin-proposal-json-strings" "^7.10.4"
730 | "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0"
731 | "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4"
732 | "@babel/plugin-proposal-numeric-separator" "^7.10.4"
733 | "@babel/plugin-proposal-object-rest-spread" "^7.11.0"
734 | "@babel/plugin-proposal-optional-catch-binding" "^7.10.4"
735 | "@babel/plugin-proposal-optional-chaining" "^7.11.0"
736 | "@babel/plugin-proposal-private-methods" "^7.10.4"
737 | "@babel/plugin-proposal-unicode-property-regex" "^7.10.4"
738 | "@babel/plugin-syntax-async-generators" "^7.8.0"
739 | "@babel/plugin-syntax-class-properties" "^7.10.4"
740 | "@babel/plugin-syntax-dynamic-import" "^7.8.0"
741 | "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
742 | "@babel/plugin-syntax-json-strings" "^7.8.0"
743 | "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
744 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
745 | "@babel/plugin-syntax-numeric-separator" "^7.10.4"
746 | "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
747 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
748 | "@babel/plugin-syntax-optional-chaining" "^7.8.0"
749 | "@babel/plugin-syntax-top-level-await" "^7.10.4"
750 | "@babel/plugin-transform-arrow-functions" "^7.10.4"
751 | "@babel/plugin-transform-async-to-generator" "^7.10.4"
752 | "@babel/plugin-transform-block-scoped-functions" "^7.10.4"
753 | "@babel/plugin-transform-block-scoping" "^7.10.4"
754 | "@babel/plugin-transform-classes" "^7.10.4"
755 | "@babel/plugin-transform-computed-properties" "^7.10.4"
756 | "@babel/plugin-transform-destructuring" "^7.10.4"
757 | "@babel/plugin-transform-dotall-regex" "^7.10.4"
758 | "@babel/plugin-transform-duplicate-keys" "^7.10.4"
759 | "@babel/plugin-transform-exponentiation-operator" "^7.10.4"
760 | "@babel/plugin-transform-for-of" "^7.10.4"
761 | "@babel/plugin-transform-function-name" "^7.10.4"
762 | "@babel/plugin-transform-literals" "^7.10.4"
763 | "@babel/plugin-transform-member-expression-literals" "^7.10.4"
764 | "@babel/plugin-transform-modules-amd" "^7.10.4"
765 | "@babel/plugin-transform-modules-commonjs" "^7.10.4"
766 | "@babel/plugin-transform-modules-systemjs" "^7.10.4"
767 | "@babel/plugin-transform-modules-umd" "^7.10.4"
768 | "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4"
769 | "@babel/plugin-transform-new-target" "^7.10.4"
770 | "@babel/plugin-transform-object-super" "^7.10.4"
771 | "@babel/plugin-transform-parameters" "^7.10.4"
772 | "@babel/plugin-transform-property-literals" "^7.10.4"
773 | "@babel/plugin-transform-regenerator" "^7.10.4"
774 | "@babel/plugin-transform-reserved-words" "^7.10.4"
775 | "@babel/plugin-transform-shorthand-properties" "^7.10.4"
776 | "@babel/plugin-transform-spread" "^7.11.0"
777 | "@babel/plugin-transform-sticky-regex" "^7.10.4"
778 | "@babel/plugin-transform-template-literals" "^7.10.4"
779 | "@babel/plugin-transform-typeof-symbol" "^7.10.4"
780 | "@babel/plugin-transform-unicode-escapes" "^7.10.4"
781 | "@babel/plugin-transform-unicode-regex" "^7.10.4"
782 | "@babel/preset-modules" "^0.1.3"
783 | "@babel/types" "^7.11.5"
784 | browserslist "^4.12.0"
785 | core-js-compat "^3.6.2"
786 | invariant "^2.2.2"
787 | levenary "^1.1.1"
788 | semver "^5.5.0"
789 |
790 | "@babel/preset-modules@^0.1.3":
791 | version "0.1.4"
792 | resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
793 | integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
794 | dependencies:
795 | "@babel/helper-plugin-utils" "^7.0.0"
796 | "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
797 | "@babel/plugin-transform-dotall-regex" "^7.4.4"
798 | "@babel/types" "^7.4.4"
799 | esutils "^2.0.2"
800 |
801 | "@babel/runtime@^7.8.4":
802 | version "7.11.2"
803 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
804 | integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
805 | dependencies:
806 | regenerator-runtime "^0.13.4"
807 |
808 | "@babel/template@^7.10.4":
809 | version "7.10.4"
810 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
811 | integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
812 | dependencies:
813 | "@babel/code-frame" "^7.10.4"
814 | "@babel/parser" "^7.10.4"
815 | "@babel/types" "^7.10.4"
816 |
817 | "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5":
818 | version "7.11.5"
819 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3"
820 | integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==
821 | dependencies:
822 | "@babel/code-frame" "^7.10.4"
823 | "@babel/generator" "^7.11.5"
824 | "@babel/helper-function-name" "^7.10.4"
825 | "@babel/helper-split-export-declaration" "^7.11.0"
826 | "@babel/parser" "^7.11.5"
827 | "@babel/types" "^7.11.5"
828 | debug "^4.1.0"
829 | globals "^11.1.0"
830 | lodash "^4.17.19"
831 |
832 | "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.4.4":
833 | version "7.11.5"
834 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
835 | integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
836 | dependencies:
837 | "@babel/helper-validator-identifier" "^7.10.4"
838 | lodash "^4.17.19"
839 | to-fast-properties "^2.0.0"
840 |
841 | "@rollup/plugin-image@^2.0.5":
842 | version "2.0.5"
843 | resolved "https://registry.yarnpkg.com/@rollup/plugin-image/-/plugin-image-2.0.5.tgz#07859a69f5fe592643c2ad3ef59ae8a5c268a7ef"
844 | integrity sha512-R+yGLJjLN1won2JlZPZmdlyZGLZwwsW8V/RYu3mTcRq8Aqd9GC2fo4Zi892bFteM5LolfbpxK8Y9QQcAhbBwSQ==
845 | dependencies:
846 | "@rollup/pluginutils" "^3.0.4"
847 | mini-svg-data-uri "^1.1.3"
848 |
849 | "@rollup/plugin-node-resolve@^9.0.0":
850 | version "9.0.0"
851 | resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6"
852 | integrity sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==
853 | dependencies:
854 | "@rollup/pluginutils" "^3.1.0"
855 | "@types/resolve" "1.17.1"
856 | builtin-modules "^3.1.0"
857 | deepmerge "^4.2.2"
858 | is-module "^1.0.0"
859 | resolve "^1.17.0"
860 |
861 | "@rollup/pluginutils@^3.0.4", "@rollup/pluginutils@^3.1.0":
862 | version "3.1.0"
863 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
864 | integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
865 | dependencies:
866 | "@types/estree" "0.0.39"
867 | estree-walker "^1.0.1"
868 | picomatch "^2.2.2"
869 |
870 | "@types/estree@0.0.39":
871 | version "0.0.39"
872 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
873 | integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
874 |
875 | "@types/node@*":
876 | version "14.11.2"
877 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256"
878 | integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==
879 |
880 | "@types/resolve@1.17.1":
881 | version "1.17.1"
882 | resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
883 | integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==
884 | dependencies:
885 | "@types/node" "*"
886 |
887 | ansi-styles@^3.2.1:
888 | version "3.2.1"
889 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
890 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
891 | dependencies:
892 | color-convert "^1.9.0"
893 |
894 | babel-plugin-dynamic-import-node@^2.3.3:
895 | version "2.3.3"
896 | resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
897 | integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
898 | dependencies:
899 | object.assign "^4.1.0"
900 |
901 | browserslist@^4.12.0, browserslist@^4.8.5:
902 | version "4.14.5"
903 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015"
904 | integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==
905 | dependencies:
906 | caniuse-lite "^1.0.30001135"
907 | electron-to-chromium "^1.3.571"
908 | escalade "^3.1.0"
909 | node-releases "^1.1.61"
910 |
911 | builtin-modules@^3.1.0:
912 | version "3.1.0"
913 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
914 | integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
915 |
916 | caniuse-lite@^1.0.30001135:
917 | version "1.0.30001143"
918 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001143.tgz#560f2cfb9f313d1d7e52eb8dac0e4e36c8821c0d"
919 | integrity sha512-p/PO5YbwmCpBJPxjOiKBvAlUPgF8dExhfEpnsH+ys4N/791WHrYrGg0cyHiAURl5hSbx5vIcjKmQAP6sHDYH3w==
920 |
921 | chalk@^2.0.0:
922 | version "2.4.2"
923 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
924 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
925 | dependencies:
926 | ansi-styles "^3.2.1"
927 | escape-string-regexp "^1.0.5"
928 | supports-color "^5.3.0"
929 |
930 | color-convert@^1.9.0:
931 | version "1.9.3"
932 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
933 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
934 | dependencies:
935 | color-name "1.1.3"
936 |
937 | color-name@1.1.3:
938 | version "1.1.3"
939 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
940 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
941 |
942 | convert-source-map@^1.7.0:
943 | version "1.7.0"
944 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
945 | integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
946 | dependencies:
947 | safe-buffer "~5.1.1"
948 |
949 | core-js-compat@^3.6.2:
950 | version "3.6.5"
951 | resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
952 | integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==
953 | dependencies:
954 | browserslist "^4.8.5"
955 | semver "7.0.0"
956 |
957 | debug@^4.1.0:
958 | version "4.2.0"
959 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
960 | integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
961 | dependencies:
962 | ms "2.1.2"
963 |
964 | deepmerge@^4.2.2:
965 | version "4.2.2"
966 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
967 | integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
968 |
969 | define-properties@^1.1.3:
970 | version "1.1.3"
971 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
972 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
973 | dependencies:
974 | object-keys "^1.0.12"
975 |
976 | electron-to-chromium@^1.3.571:
977 | version "1.3.576"
978 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.576.tgz#2e70234484e03d7c7e90310d7d79fd3775379c34"
979 | integrity sha512-uSEI0XZ//5ic+0NdOqlxp0liCD44ck20OAGyLMSymIWTEAtHKVJi6JM18acOnRgUgX7Q65QqnI+sNncNvIy8ew==
980 |
981 | es-abstract@^1.17.5:
982 | version "1.17.7"
983 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c"
984 | integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==
985 | dependencies:
986 | es-to-primitive "^1.2.1"
987 | function-bind "^1.1.1"
988 | has "^1.0.3"
989 | has-symbols "^1.0.1"
990 | is-callable "^1.2.2"
991 | is-regex "^1.1.1"
992 | object-inspect "^1.8.0"
993 | object-keys "^1.1.1"
994 | object.assign "^4.1.1"
995 | string.prototype.trimend "^1.0.1"
996 | string.prototype.trimstart "^1.0.1"
997 |
998 | es-abstract@^1.18.0-next.0:
999 | version "1.18.0-next.1"
1000 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68"
1001 | integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==
1002 | dependencies:
1003 | es-to-primitive "^1.2.1"
1004 | function-bind "^1.1.1"
1005 | has "^1.0.3"
1006 | has-symbols "^1.0.1"
1007 | is-callable "^1.2.2"
1008 | is-negative-zero "^2.0.0"
1009 | is-regex "^1.1.1"
1010 | object-inspect "^1.8.0"
1011 | object-keys "^1.1.1"
1012 | object.assign "^4.1.1"
1013 | string.prototype.trimend "^1.0.1"
1014 | string.prototype.trimstart "^1.0.1"
1015 |
1016 | es-to-primitive@^1.2.1:
1017 | version "1.2.1"
1018 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
1019 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
1020 | dependencies:
1021 | is-callable "^1.1.4"
1022 | is-date-object "^1.0.1"
1023 | is-symbol "^1.0.2"
1024 |
1025 | escalade@^3.1.0:
1026 | version "3.1.0"
1027 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e"
1028 | integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==
1029 |
1030 | escape-string-regexp@^1.0.5:
1031 | version "1.0.5"
1032 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
1033 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
1034 |
1035 | estree-walker@^0.6.1:
1036 | version "0.6.1"
1037 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
1038 | integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
1039 |
1040 | estree-walker@^1.0.1:
1041 | version "1.0.1"
1042 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
1043 | integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
1044 |
1045 | esutils@^2.0.2:
1046 | version "2.0.3"
1047 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
1048 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
1049 |
1050 | fsevents@~2.1.2:
1051 | version "2.1.3"
1052 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
1053 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
1054 |
1055 | function-bind@^1.1.1:
1056 | version "1.1.1"
1057 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
1058 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
1059 |
1060 | gensync@^1.0.0-beta.1:
1061 | version "1.0.0-beta.1"
1062 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
1063 | integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
1064 |
1065 | globals@^11.1.0:
1066 | version "11.12.0"
1067 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
1068 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
1069 |
1070 | has-flag@^3.0.0:
1071 | version "3.0.0"
1072 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
1073 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
1074 |
1075 | has-symbols@^1.0.1:
1076 | version "1.0.1"
1077 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
1078 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
1079 |
1080 | has@^1.0.3:
1081 | version "1.0.3"
1082 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
1083 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
1084 | dependencies:
1085 | function-bind "^1.1.1"
1086 |
1087 | invariant@^2.2.2, invariant@^2.2.4:
1088 | version "2.2.4"
1089 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
1090 | integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
1091 | dependencies:
1092 | loose-envify "^1.0.0"
1093 |
1094 | is-callable@^1.1.4, is-callable@^1.2.2:
1095 | version "1.2.2"
1096 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9"
1097 | integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==
1098 |
1099 | is-date-object@^1.0.1:
1100 | version "1.0.2"
1101 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
1102 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
1103 |
1104 | is-module@^1.0.0:
1105 | version "1.0.0"
1106 | resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
1107 | integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
1108 |
1109 | is-negative-zero@^2.0.0:
1110 | version "2.0.0"
1111 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
1112 | integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=
1113 |
1114 | is-regex@^1.1.1:
1115 | version "1.1.1"
1116 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
1117 | integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==
1118 | dependencies:
1119 | has-symbols "^1.0.1"
1120 |
1121 | is-symbol@^1.0.2:
1122 | version "1.0.3"
1123 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
1124 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
1125 | dependencies:
1126 | has-symbols "^1.0.1"
1127 |
1128 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
1129 | version "4.0.0"
1130 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
1131 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
1132 |
1133 | jsesc@^2.5.1:
1134 | version "2.5.2"
1135 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
1136 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
1137 |
1138 | jsesc@~0.5.0:
1139 | version "0.5.0"
1140 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
1141 | integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
1142 |
1143 | json5@^2.1.2:
1144 | version "2.1.3"
1145 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
1146 | integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
1147 | dependencies:
1148 | minimist "^1.2.5"
1149 |
1150 | keycode-js@^3.1.0:
1151 | version "3.1.0"
1152 | resolved "https://registry.yarnpkg.com/keycode-js/-/keycode-js-3.1.0.tgz#9938d5488f9415ae243c4de6d6e827af293c7d75"
1153 | integrity sha512-aAa8PVW7kBDyG14ifGOseaVBjsT1LI953060yRSzzf3G0beKKEuwHVvFGcCI+AofY68NUkPxbLqrkfWPjXySCw==
1154 |
1155 | leven@^3.1.0:
1156 | version "3.1.0"
1157 | resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
1158 | integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
1159 |
1160 | levenary@^1.1.1:
1161 | version "1.1.1"
1162 | resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77"
1163 | integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==
1164 | dependencies:
1165 | leven "^3.1.0"
1166 |
1167 | lodash@^4.17.19:
1168 | version "4.17.20"
1169 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
1170 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
1171 |
1172 | loose-envify@^1.0.0:
1173 | version "1.4.0"
1174 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
1175 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
1176 | dependencies:
1177 | js-tokens "^3.0.0 || ^4.0.0"
1178 |
1179 | mini-svg-data-uri@^1.1.3:
1180 | version "1.2.3"
1181 | resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.2.3.tgz#e16baa92ad55ddaa1c2c135759129f41910bc39f"
1182 | integrity sha512-zd6KCAyXgmq6FV1mR10oKXYtvmA9vRoB6xPSTUJTbFApCtkefDnYueVR1gkof3KcdLZo1Y8mjF2DFmQMIxsHNQ==
1183 |
1184 | minimist@^1.2.5:
1185 | version "1.2.5"
1186 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
1187 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
1188 |
1189 | ms@2.1.2:
1190 | version "2.1.2"
1191 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
1192 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1193 |
1194 | node-releases@^1.1.61:
1195 | version "1.1.61"
1196 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e"
1197 | integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==
1198 |
1199 | object-inspect@^1.8.0:
1200 | version "1.8.0"
1201 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
1202 | integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
1203 |
1204 | object-keys@^1.0.12, object-keys@^1.1.1:
1205 | version "1.1.1"
1206 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
1207 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
1208 |
1209 | object.assign@^4.1.0, object.assign@^4.1.1:
1210 | version "4.1.1"
1211 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd"
1212 | integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==
1213 | dependencies:
1214 | define-properties "^1.1.3"
1215 | es-abstract "^1.18.0-next.0"
1216 | has-symbols "^1.0.1"
1217 | object-keys "^1.1.1"
1218 |
1219 | path-parse@^1.0.6:
1220 | version "1.0.6"
1221 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
1222 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
1223 |
1224 | picomatch@^2.2.2:
1225 | version "2.2.2"
1226 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
1227 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
1228 |
1229 | regenerate-unicode-properties@^8.2.0:
1230 | version "8.2.0"
1231 | resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
1232 | integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
1233 | dependencies:
1234 | regenerate "^1.4.0"
1235 |
1236 | regenerate@^1.4.0:
1237 | version "1.4.1"
1238 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f"
1239 | integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==
1240 |
1241 | regenerator-runtime@^0.13.4:
1242 | version "0.13.7"
1243 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
1244 | integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
1245 |
1246 | regenerator-transform@^0.14.2:
1247 | version "0.14.5"
1248 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
1249 | integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
1250 | dependencies:
1251 | "@babel/runtime" "^7.8.4"
1252 |
1253 | regexpu-core@^4.7.0:
1254 | version "4.7.1"
1255 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6"
1256 | integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==
1257 | dependencies:
1258 | regenerate "^1.4.0"
1259 | regenerate-unicode-properties "^8.2.0"
1260 | regjsgen "^0.5.1"
1261 | regjsparser "^0.6.4"
1262 | unicode-match-property-ecmascript "^1.0.4"
1263 | unicode-match-property-value-ecmascript "^1.2.0"
1264 |
1265 | regjsgen@^0.5.1:
1266 | version "0.5.2"
1267 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
1268 | integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
1269 |
1270 | regjsparser@^0.6.4:
1271 | version "0.6.4"
1272 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272"
1273 | integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==
1274 | dependencies:
1275 | jsesc "~0.5.0"
1276 |
1277 | require-relative@^0.8.7:
1278 | version "0.8.7"
1279 | resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
1280 | integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=
1281 |
1282 | resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1:
1283 | version "1.17.0"
1284 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
1285 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
1286 | dependencies:
1287 | path-parse "^1.0.6"
1288 |
1289 | rollup-plugin-svelte@^6.0.1:
1290 | version "6.0.1"
1291 | resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-6.0.1.tgz#a4fc9c19c5c4277e6dbf8e79185c4cbd6b4383bf"
1292 | integrity sha512-kS9/JZMBNgpKTqVKlwV8mhmGwxu8NiNf6+n5ZzdZ8yDp3+ADqjf8Au+JNEpoOn6kLlh1hLS2Gsa76k9RP57HDQ==
1293 | dependencies:
1294 | require-relative "^0.8.7"
1295 | rollup-pluginutils "^2.8.2"
1296 | sourcemap-codec "^1.4.8"
1297 |
1298 | rollup-pluginutils@^2.8.2:
1299 | version "2.8.2"
1300 | resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e"
1301 | integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==
1302 | dependencies:
1303 | estree-walker "^0.6.1"
1304 |
1305 | rollup@^2.29.0:
1306 | version "2.29.0"
1307 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.29.0.tgz#0c5c5968530b21ca0e32f8b94b7cd9346cfb0eec"
1308 | integrity sha512-gtU0sjxMpsVlpuAf4QXienPmUAhd6Kc7owQ4f5lypoxBW18fw2UNYZ4NssLGsri6WhUZkE/Ts3EMRebN+gNLiQ==
1309 | optionalDependencies:
1310 | fsevents "~2.1.2"
1311 |
1312 | safe-buffer@~5.1.1:
1313 | version "5.1.2"
1314 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
1315 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
1316 |
1317 | semver@7.0.0:
1318 | version "7.0.0"
1319 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
1320 | integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
1321 |
1322 | semver@^5.4.1, semver@^5.5.0, semver@^5.5.1:
1323 | version "5.7.1"
1324 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
1325 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1326 |
1327 | source-map@^0.5.0:
1328 | version "0.5.7"
1329 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
1330 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
1331 |
1332 | sourcemap-codec@^1.4.8:
1333 | version "1.4.8"
1334 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
1335 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
1336 |
1337 | string.prototype.trimend@^1.0.1:
1338 | version "1.0.1"
1339 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
1340 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
1341 | dependencies:
1342 | define-properties "^1.1.3"
1343 | es-abstract "^1.17.5"
1344 |
1345 | string.prototype.trimstart@^1.0.1:
1346 | version "1.0.1"
1347 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
1348 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
1349 | dependencies:
1350 | define-properties "^1.1.3"
1351 | es-abstract "^1.17.5"
1352 |
1353 | supports-color@^5.3.0:
1354 | version "5.5.0"
1355 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1356 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1357 | dependencies:
1358 | has-flag "^3.0.0"
1359 |
1360 | svelte@^3.29.0:
1361 | version "3.29.0"
1362 | resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.29.0.tgz#80acac4254341ad8f3301e5ef03f4127ea967d96"
1363 | integrity sha512-f+A65eyOQ5ujETLy+igNXtlr6AEjAQLYd1yJE1VwNiXMQO5Z/Vmiy3rL+zblV/9jd7rtTTWqO1IcuXsP2Qv0OA==
1364 |
1365 | to-fast-properties@^2.0.0:
1366 | version "2.0.0"
1367 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
1368 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
1369 |
1370 | unicode-canonical-property-names-ecmascript@^1.0.4:
1371 | version "1.0.4"
1372 | resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
1373 | integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
1374 |
1375 | unicode-match-property-ecmascript@^1.0.4:
1376 | version "1.0.4"
1377 | resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
1378 | integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
1379 | dependencies:
1380 | unicode-canonical-property-names-ecmascript "^1.0.4"
1381 | unicode-property-aliases-ecmascript "^1.0.4"
1382 |
1383 | unicode-match-property-value-ecmascript@^1.2.0:
1384 | version "1.2.0"
1385 | resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
1386 | integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
1387 |
1388 | unicode-property-aliases-ecmascript@^1.0.4:
1389 | version "1.1.0"
1390 | resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
1391 | integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
1392 |
--------------------------------------------------------------------------------