├── .husky └── .gitignore ├── example ├── .gitignore ├── .npmignore ├── utils │ └── formatTime.ts ├── index.html ├── tsconfig.json ├── package.json ├── components │ ├── Source.tsx │ ├── Controls.tsx │ └── Details.tsx └── index.tsx ├── src ├── index.tsx ├── utils │ └── constants.ts ├── types │ └── index.ts ├── hooks │ ├── useAudio │ │ ├── useAudio.types.ts │ │ ├── useAudio.ts │ │ └── useAudio.test.ts │ └── useRoover │ │ ├── useRoover.types.ts │ │ ├── useRoover.test.ts │ │ └── useRoover.ts └── machine │ ├── Machine.types.ts │ └── Machine.tsx ├── docs ├── pages │ ├── getting-started │ │ ├── meta.json │ │ ├── install.mdx │ │ └── usage.mdx │ ├── meta.json │ ├── _app.js │ ├── examples │ │ ├── meta.json │ │ ├── basic.mdx │ │ ├── play-pause.mdx │ │ ├── loop.mdx │ │ ├── mute.mdx │ │ ├── rate.mdx │ │ ├── custom-options.mdx │ │ ├── toggle.mdx │ │ ├── forward-backward.mdx │ │ ├── volume.mdx │ │ └── seek.mdx │ └── index.mdx ├── public │ ├── favicon.ico │ └── vercel.svg ├── next.config.js ├── package.json ├── .gitignore ├── theme.config.js ├── README.md └── yarn.lock ├── .editorconfig ├── tsconfig.json ├── .github ├── workflows │ └── main.yml └── dependabot.yml ├── LICENSE ├── .gitignore ├── package.json └── README.md /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | .parcel-cache 2 | .cache -------------------------------------------------------------------------------- /example/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .cache 3 | dist -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | export { default as useRoover } from './hooks/useRoover/useRoover'; 2 | -------------------------------------------------------------------------------- /docs/pages/getting-started/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "install": "Install", 3 | "usage": "Usage" 4 | } 5 | -------------------------------------------------------------------------------- /docs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leonardomso/roover/HEAD/docs/public/favicon.ico -------------------------------------------------------------------------------- /docs/pages/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "index": "Roover", 3 | "getting-started": "Getting Started", 4 | "examples": "Examples" 5 | } 6 | -------------------------------------------------------------------------------- /docs/next.config.js: -------------------------------------------------------------------------------- 1 | const withNextra = require('nextra')('nextra-theme-docs', './theme.config.js'); 2 | module.exports = withNextra(); 3 | -------------------------------------------------------------------------------- /docs/pages/_app.js: -------------------------------------------------------------------------------- 1 | import 'nextra-theme-docs/style.css'; 2 | 3 | export default function Nextra({ Component, pageProps }) { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = true -------------------------------------------------------------------------------- /docs/pages/getting-started/install.mdx: -------------------------------------------------------------------------------- 1 | import Callout from 'nextra-theme-docs/callout'; 2 | 3 | # Install 4 | 5 | Get started with Roover is very simple. Inside your React project directory, run the following: 6 | 7 | ``` 8 | yarn add roover 9 | ``` 10 | 11 | Or with npm: 12 | 13 | ``` 14 | npm install roover 15 | ``` 16 | -------------------------------------------------------------------------------- /docs/pages/examples/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "basic": "Basic", 3 | "toggle": "Toggle", 4 | "play-pause": "Play / Pause", 5 | "mute": "Mute", 6 | "loop": "Loop", 7 | "volume": "Volume", 8 | "rate": "Rate", 9 | "seek": "Seek", 10 | "forward-backward": "Forward / Backward", 11 | "custom-options": "Custom options" 12 | } 13 | -------------------------------------------------------------------------------- /src/utils/constants.ts: -------------------------------------------------------------------------------- 1 | export const EVENTS = { 2 | PLAY: 'PLAY', 3 | PAUSE: 'PAUSE', 4 | MUTE: 'MUTE', 5 | VOLUME: 'VOLUME', 6 | RATE: 'RATE', 7 | LOOP: 'LOOP', 8 | END: 'END', 9 | } as const; 10 | 11 | export const STATUS = { 12 | LOAD: 'LOAD', 13 | READY: 'READY', 14 | ERROR: 'ERROR', 15 | } as const; 16 | -------------------------------------------------------------------------------- /example/utils/formatTime.ts: -------------------------------------------------------------------------------- 1 | const formatTime = (seconds: number) => { 2 | const h = Math.floor(seconds / 3600); 3 | const m = Math.floor((seconds % 3600) / 60); 4 | const s = Math.round(seconds % 60); 5 | return [h, m > 9 ? m : h ? '0' + m : m || '0', s > 9 ? s : '0' + s] 6 | .filter(Boolean) 7 | .join(':'); 8 | }; 9 | 10 | export default formatTime; 11 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "dependencies": { 11 | "next": "12.1.0", 12 | "nextra": "^0.4.5", 13 | "nextra-theme-docs": "^1.1.7", 14 | "react": "17.0.2", 15 | "react-dom": "17.0.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Playground 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | 21 | # debug 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | # local env files 27 | .env.local 28 | .env.development.local 29 | .env.test.local 30 | .env.production.local 31 | -------------------------------------------------------------------------------- /example/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": false, 4 | "target": "es5", 5 | "module": "commonjs", 6 | "jsx": "react", 7 | "moduleResolution": "node", 8 | "noImplicitAny": false, 9 | "noUnusedLocals": false, 10 | "noUnusedParameters": false, 11 | "removeComments": true, 12 | "strictNullChecks": true, 13 | "preserveConstEnums": true, 14 | "sourceMap": true, 15 | "lib": ["es2015", "es2016", "dom"], 16 | "baseUrl": ".", 17 | "types": ["node"] 18 | } 19 | } -------------------------------------------------------------------------------- /src/types/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | MachineContext, 3 | MachineState, 4 | MachineEvent, 5 | MachineLoadEvent, 6 | MachineReadyEvent, 7 | MachinePlayEvent, 8 | MachinePauseEvent, 9 | MachineStopEvent, 10 | MachineVolumeEvent, 11 | MachineRateEvent, 12 | MachineMuteEvent, 13 | MachineLoopEvent, 14 | MachineEndEvent, 15 | MachineErrorEvent, 16 | MachineRetryEvent, 17 | } from '../machine/Machine.types'; 18 | 19 | export { UseAudio, CreateAudioArgs } from '../hooks/useAudio/useAudio.types'; 20 | 21 | export { Args } from '../hooks/useRoover/useRoover.types'; 22 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src", "types"], 3 | "compilerOptions": { 4 | "module": "esnext", 5 | "lib": ["dom", "esnext"], 6 | "importHelpers": true, 7 | "declaration": true, 8 | "sourceMap": true, 9 | "rootDir": "./src", 10 | "strict": true, 11 | "noUnusedLocals": true, 12 | "noUnusedParameters": true, 13 | "noImplicitReturns": true, 14 | "noFallthroughCasesInSwitch": true, 15 | "moduleResolution": "node", 16 | "baseUrl": "./", 17 | "paths": { 18 | "@": ["./"], 19 | "*": ["src/*", "node_modules/*"] 20 | }, 21 | "jsx": "react", 22 | "esModuleInterop": true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/hooks/useAudio/useAudio.types.ts: -------------------------------------------------------------------------------- 1 | import { Interpreter } from 'xstate'; 2 | 3 | import { MachineContext, MachineEvent } from '../../types/index'; 4 | 5 | export type UseAudio = () => { 6 | service: Interpreter; 7 | onCreateAudio: (args: CreateAudioArgs) => HTMLAudioElement; 8 | onLoadAudio: ( 9 | audio: HTMLAudioElement | undefined, 10 | args: CreateAudioArgs 11 | ) => HTMLAudioElement; 12 | onDestroyAudio: (audio: HTMLAudioElement | undefined) => undefined; 13 | }; 14 | 15 | export interface CreateAudioArgs { 16 | src: string; 17 | preload?: 'auto' | 'metadata' | 'none'; 18 | autoplay?: boolean; 19 | volume?: number; 20 | rate?: number; 21 | mute?: boolean; 22 | loop?: boolean; 23 | } 24 | -------------------------------------------------------------------------------- /docs/pages/examples/basic.mdx: -------------------------------------------------------------------------------- 1 | # Basic 2 | 3 | This is a basic example of the usage of `useRoover`. This example preloads the audio and plays it. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | onPlay, 20 | onPause, 21 | } = useRoover({ 22 | src, 23 | autoplay: true, 24 | }); 25 | 26 | return ( 27 |
28 |

Loading: {loading ? 'true' : 'false'}

29 |

Ready: {ready ? 'true' : 'false'}

30 | 31 | 32 |
33 | ); 34 | }; 35 | ``` 36 | -------------------------------------------------------------------------------- /docs/pages/examples/play-pause.mdx: -------------------------------------------------------------------------------- 1 | # Play / Pause 2 | 3 | This is an example using the `onPlay` and `onPause`. The `onPlay` plays the audio. The `onPause` pauses the audio. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | onPlay, 20 | onPause, 21 | } = useRoover({ 22 | src, 23 | autoplay: true, 24 | }); 25 | 26 | return ( 27 |
28 |

Loading: {loading ? 'true' : 'false'}

29 |

Ready: {ready ? 'true' : 'false'}

30 | 31 | 32 |
33 | ); 34 | }; 35 | ``` 36 | -------------------------------------------------------------------------------- /docs/pages/getting-started/usage.mdx: -------------------------------------------------------------------------------- 1 | # Usage 2 | 3 | All you need to do is import the `useRoover` hook and use it on your React component. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | error, 18 | playing, 19 | paused, 20 | stopped, 21 | onPlay, 22 | onPause, 23 | } = useRoover({ 24 | src, 25 | autoplay: true, 26 | }); 27 | 28 | return ( 29 |
30 |

Ready: {ready ? 'true' : 'false'}

31 |

Loading: {loading ? 'true' : 'false'}

32 | 33 | 34 |
35 | ); 36 | }; 37 | ``` 38 | -------------------------------------------------------------------------------- /docs/pages/examples/loop.mdx: -------------------------------------------------------------------------------- 1 | # Loop 2 | 3 | This is an example using the `onLoop`. It will set the `loop` property to `true` or `false` depending on the current value. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | onPlay, 20 | onPause, 21 | onLoop, 22 | } = useRoover({ 23 | src, 24 | autoplay: true, 25 | }); 26 | 27 | return ( 28 |
29 |

Loading: {loading ? 'true' : 'false'}

30 |

Ready: {ready ? 'true' : 'false'}

31 | 32 | 33 | 34 |
35 | ); 36 | }; 37 | ``` 38 | -------------------------------------------------------------------------------- /docs/pages/examples/mute.mdx: -------------------------------------------------------------------------------- 1 | # Mute 2 | 3 | This is an example using the `onMute`. It will set the `mute` property to `true` or `false` depending on the current value. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | onPlay, 20 | onPause, 21 | onMute, 22 | } = useRoover({ 23 | src, 24 | autoplay: true, 25 | }); 26 | 27 | return ( 28 |
29 |

Loading: {loading ? 'true' : 'false'}

30 |

Ready: {ready ? 'true' : 'false'}

31 | 32 | 33 | 34 |
35 | ); 36 | }; 37 | ``` 38 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "author": "leonardomso", 6 | "license": "MIT", 7 | "scripts": { 8 | "start": "parcel index.html" 9 | }, 10 | "dependencies": { 11 | "react": ">=16.8.6", 12 | "react-app-polyfill": "^2.0.0", 13 | "react-dom": ">=16.8.6" 14 | }, 15 | "alias": { 16 | "react": "../node_modules/react", 17 | "react-dom": "../node_modules/react-dom/profiling", 18 | "scheduler/tracing": "../node_modules/scheduler/tracing-profiling" 19 | }, 20 | "devDependencies": { 21 | "@chakra-ui/react": "^1.6.3", 22 | "@emotion/react": "^11.0.0", 23 | "@emotion/styled": "^11.0.0", 24 | "@types/react": "^17.0.8", 25 | "@types/react-dom": "^17.0.5", 26 | "add": "^2.0.6", 27 | "framer-motion": "3.x || 4.x", 28 | "parcel": "^2.0.0-beta.3.1", 29 | "typescript": "^4.3.2", 30 | "yarn": "^1.22.10" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/hooks/useRoover/useRoover.types.ts: -------------------------------------------------------------------------------- 1 | export interface Args { 2 | src: string; 3 | preload?: 'auto' | 'metadata' | 'none'; 4 | autoplay?: boolean; 5 | volume?: number; 6 | rate?: number; 7 | mute?: boolean; 8 | loop?: boolean; 9 | } 10 | 11 | export type ReturnArgs = { 12 | initial: boolean; 13 | loading: boolean; 14 | ready: boolean; 15 | idle: boolean; 16 | playing: boolean; 17 | paused: boolean; 18 | end: boolean; 19 | seek: number; 20 | volume: number; 21 | rate: number; 22 | duration: number; 23 | mute: boolean; 24 | loop: boolean; 25 | error: string | null; 26 | onToggle: () => void; 27 | onPlay: () => void; 28 | onPause: () => void; 29 | onVolume: (value: number) => void; 30 | onRate: (value: string) => void; 31 | onMute: () => void; 32 | onLoop: () => void; 33 | onSeek: (value: number) => void; 34 | onForward: (value: number) => void; 35 | onBackward: (value: number) => void; 36 | }; 37 | -------------------------------------------------------------------------------- /docs/pages/index.mdx: -------------------------------------------------------------------------------- 1 | # Roover 2 | 3 | **Roover** is a powerful audio library for React applications. It helps to implement audio with ease without any extensive configuration. 4 | 5 | ## Motivation 6 | 7 | Modern applications are using audio all the time. Audio can turn a boring application into an interesting one, adding emotion to the content. Most of the modern applications that we use daily are using audio for at least in some part. 8 | 9 | Work with audio in React applications is painful. There are not too many good libraries to manage audio and most of the time we need to create our solutions. Manage audio in a modern application is important and should be made by using the best tools and libraries. 10 | 11 | The idea to create this library was to provide a powerful and lightweight audio library for React apps. A custom React Hook that is easy to integrate with and has a ton of features to help speed up development without having to worry about anything. 12 | -------------------------------------------------------------------------------- /docs/pages/examples/rate.mdx: -------------------------------------------------------------------------------- 1 | # Rate 2 | 3 | This is an example using the `onRate`. It receives a `string` as an argument that ranges from `0.5` to `3.0` and sets it as the new `rate` value. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | onPlay, 20 | onPause, 21 | onRate, 22 | } = useRoover({ 23 | src, 24 | autoplay: true, 25 | }); 26 | 27 | return ( 28 |
29 |

Loading: {loading ? 'true' : 'false'}

30 |

Ready: {ready ? 'true' : 'false'}

31 | 32 | 33 | 34 |
35 | ); 36 | }; 37 | ``` 38 | -------------------------------------------------------------------------------- /docs/pages/examples/custom-options.mdx: -------------------------------------------------------------------------------- 1 | # Custom options 2 | 3 | This is an example using the `useRoover` with custom options. Here is the argumenst that the `useRoover` can accept and its default values: 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | onPlay, 20 | onPause, 21 | } = useRoover({ 22 | src, 23 | autoplay: false, 24 | preload: "auto", 25 | volume: 0.5, 26 | rate: 0,5, 27 | mute: false, 28 | loop: true 29 | }); 30 | 31 | return ( 32 |
33 |

Loading: {loading ? 'true' : 'false'}

34 |

Ready: {ready ? 'true' : 'false'}

35 | 36 | 37 |
38 | ); 39 | }; 40 | ``` 41 | -------------------------------------------------------------------------------- /docs/pages/examples/toggle.mdx: -------------------------------------------------------------------------------- 1 | # Toggle 2 | 3 | This is an example using the `onToggle`. When there's no audio loaded, it loads the audio and based on the `autoplay` argumennt passed to `useRoover`, plays the audio. When there's already an audio, it simply play/pause the audio. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | onToggle, 20 | onPlay, 21 | onPause, 22 | } = useRoover({ 23 | src, 24 | autoplay: true, 25 | }); 26 | 27 | return ( 28 |
29 |

Loading: {loading ? 'true' : 'false'}

30 |

Ready: {ready ? 'true' : 'false'}

31 | 32 | 33 | 34 |
35 | ); 36 | }; 37 | ``` 38 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: [push,workflow_dispatch] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | 7 | steps: 8 | - name: Begin CI... 9 | uses: actions/checkout@v4 10 | 11 | - name: Use Node 18 12 | uses: actions/setup-node@v1 13 | with: 14 | node-version: 18.x 15 | 16 | - name: Use cached node_modules 17 | uses: actions/cache@v1 18 | with: 19 | path: node_modules 20 | key: nodeModules-${{ hashFiles('**/yarn.lock') }} 21 | restore-keys: | 22 | nodeModules- 23 | 24 | - name: Install dependencies 25 | run: yarn install --frozen-lockfile 26 | env: 27 | CI: true 28 | 29 | - name: Lint 30 | run: yarn lint 31 | env: 32 | CI: true 33 | 34 | - name: Test 35 | run: yarn test --ci --coverage --maxWorkers=2 36 | env: 37 | CI: true 38 | 39 | - name: Build 40 | run: yarn build 41 | env: 42 | CI: true 43 | -------------------------------------------------------------------------------- /docs/public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /docs/theme.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | repository: 'https://github.com/leonardomso/roover', 3 | docsRepository: 'https://github.com/leonardomso/roover', 4 | branch: 'master', 5 | path: '/', 6 | titleSuffix: ' – Roover', 7 | nextLinks: true, 8 | prevLinks: true, 9 | search: true, 10 | customSearch: null, 11 | darkMode: true, 12 | footer: true, 13 | footerText: `MIT ${new Date().getFullYear()} © Leonardo Maldonado.`, 14 | footerEditOnGitHubLink: true, 15 | logo: ( 16 | <> 17 | Roover 18 | 19 | Manage audio in React with ease 20 | 21 | 22 | ), 23 | head: ( 24 | <> 25 | 26 | 30 | 34 | 35 | ), 36 | }; 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Leonardo Maldonado 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 | -------------------------------------------------------------------------------- /docs/pages/examples/forward-backward.mdx: -------------------------------------------------------------------------------- 1 | # Forward / Backward 2 | 3 | This is an example using the `onForward` and `onBackward`. Both functions receives a `number` as an argument. The `onForward` forwards the audio based on the received value. The `onBackward` backwards the audio based on the received value. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | onPlay, 20 | onPause, 21 | onForward, 22 | onBackward, 23 | } = useRoover({ 24 | src, 25 | autoplay: true, 26 | }); 27 | 28 | return ( 29 |
30 |

Loading: {loading ? 'true' : 'false'}

31 |

Ready: {ready ? 'true' : 'false'}

32 | 33 | 34 | 35 | 36 |
37 | ); 38 | }; 39 | ``` 40 | -------------------------------------------------------------------------------- /docs/pages/examples/volume.mdx: -------------------------------------------------------------------------------- 1 | # Volume 2 | 3 | This is an example using the `onVolume`. It receives a `number` as an argument and sets it as the new `volume` value. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | volume, 20 | onPlay, 21 | onPause, 22 | onVolume, 23 | } = useRoover({ 24 | src, 25 | autoplay: true, 26 | }); 27 | 28 | return ( 29 |
30 |

Loading: {loading ? 'true' : 'false'}

31 |

Ready: {ready ? 'true' : 'false'}

32 | 33 | 34 | {/* 35 | The onVolume function receives a number as argument. 36 | Be careful when using with an element that returns a string, 37 | such as this following one. 38 | */} 39 | 40 |
41 | ); 42 | }; 43 | ``` 44 | -------------------------------------------------------------------------------- /docs/pages/examples/seek.mdx: -------------------------------------------------------------------------------- 1 | # Seek 2 | 3 | This is an example using the `onSeek`. It receives a `number` as an argument and sets it as the new `seek` value. 4 | 5 | ```jsx 6 | import React from 'react'; 7 | import useRoover from 'roover'; 8 | 9 | const src = 10 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 11 | 12 | const App = () => { 13 | const { 14 | initial, 15 | loading, 16 | ready, 17 | playing, 18 | paused, 19 | seek, 20 | duration, 21 | onPlay, 22 | onPause, 23 | onSeek, 24 | } = useRoover({ 25 | src, 26 | autoplay: true, 27 | }); 28 | 29 | return ( 30 |
31 |

Loading: {loading ? 'true' : 'false'}

32 |

Ready: {ready ? 'true' : 'false'}

33 | 34 | 35 | {/* 36 | The onSeek function receives a number as argument. 37 | Be careful when using with an element that returns a string, 38 | such as this following one. 39 | */} 40 | 41 |
42 | ); 43 | }; 44 | ``` 45 | -------------------------------------------------------------------------------- /example/components/Source.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { 3 | Heading, 4 | Button, 5 | Grid, 6 | } from "@chakra-ui/react" 7 | 8 | interface Props { 9 | gridRow: string; 10 | initial: boolean; 11 | loading: boolean; 12 | ready: boolean; 13 | idle: boolean; 14 | playing: boolean; 15 | paused: boolean; 16 | onPlay: () => void; 17 | onPause: () => void; 18 | onToggle: () => void; 19 | onForward: (value: number) => void; 20 | onBackward: (value: number) => void; 21 | } 22 | 23 | const Source = ({ gridRow, onPlay, onPause, onToggle, onForward, onBackward }: Props) => { 24 | return ( 25 | 26 | Source 1: 27 | 28 | 29 | 30 | 31 | 32 | 33 | ) 34 | }; 35 | 36 | export default Source; -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/zeit/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | ``` 12 | 13 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 14 | 15 | You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. 16 | 17 | ## Learn More 18 | 19 | To learn more about Next.js, take a look at the following resources: 20 | 21 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 22 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 23 | 24 | You can check out [the Next.js GitHub repository](https://github.com/zeit/next.js/) - your feedback and contributions are welcome! 25 | 26 | ## Deploy on Vercel 27 | 28 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/import?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 29 | 30 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 31 | -------------------------------------------------------------------------------- /src/machine/Machine.types.ts: -------------------------------------------------------------------------------- 1 | export type MachineContext = { 2 | volume: number; 3 | rate: number; 4 | duration: number; 5 | mute: boolean; 6 | loop: boolean; 7 | error: string | null; 8 | }; 9 | 10 | export type MachineState = { 11 | states: { 12 | initial: {}; 13 | loading: {}; 14 | ready: { 15 | states: { 16 | idle: {}; 17 | playing: {}; 18 | paused: {}; 19 | }; 20 | }; 21 | ended: {}; 22 | error: {}; 23 | }; 24 | }; 25 | 26 | export type MachineEvent = 27 | | MachineLoadEvent 28 | | MachineReadyEvent 29 | | MachinePlayEvent 30 | | MachinePauseEvent 31 | | MachineStopEvent 32 | | MachineVolumeEvent 33 | | MachineRateEvent 34 | | MachineMuteEvent 35 | | MachineLoopEvent 36 | | MachineEndEvent 37 | | MachineErrorEvent 38 | | MachineRetryEvent; 39 | 40 | export type MachineLoadEvent = { 41 | type: 'LOAD'; 42 | volume: number; 43 | rate: number; 44 | mute: boolean; 45 | loop: boolean; 46 | }; 47 | 48 | export type MachineReadyEvent = { 49 | type: 'READY'; 50 | duration: number; 51 | }; 52 | 53 | export type MachinePlayEvent = { 54 | type: 'PLAY'; 55 | }; 56 | 57 | export type MachinePauseEvent = { 58 | type: 'PAUSE'; 59 | }; 60 | 61 | export type MachineStopEvent = { 62 | type: 'STOP'; 63 | }; 64 | 65 | export type MachineVolumeEvent = { 66 | type: 'VOLUME'; 67 | volume: number; 68 | }; 69 | 70 | export type MachineRateEvent = { 71 | type: 'RATE'; 72 | rate: number; 73 | }; 74 | 75 | export type MachineMuteEvent = { 76 | type: 'MUTE'; 77 | }; 78 | 79 | export type MachineLoopEvent = { 80 | type: 'LOOP'; 81 | }; 82 | 83 | export type MachineEndEvent = { 84 | type: 'END'; 85 | }; 86 | 87 | export type MachineErrorEvent = { 88 | type: 'ERROR'; 89 | error: string; 90 | }; 91 | 92 | export type MachineRetryEvent = { 93 | type: 'RETRY'; 94 | }; 95 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "08:00" 8 | open-pull-requests-limit: 10 9 | ignore: 10 | - dependency-name: "@storybook/addon-actions" 11 | versions: 12 | - 6.1.16 13 | - 6.1.17 14 | - 6.2.1 15 | - 6.2.2 16 | - 6.2.9 17 | - dependency-name: "@storybook/addons" 18 | versions: 19 | - 6.1.16 20 | - 6.1.17 21 | - 6.1.18 22 | - 6.1.19 23 | - 6.1.20 24 | - 6.1.21 25 | - 6.2.8 26 | - 6.2.9 27 | - dependency-name: ts-loader 28 | versions: 29 | - 8.0.16 30 | - 9.1.0 31 | - dependency-name: "@storybook/addon-knobs" 32 | versions: 33 | - 6.1.16 34 | - 6.1.17 35 | - 6.1.19 36 | - 6.1.20 37 | - 6.2.2 38 | - 6.2.7 39 | - 6.2.8 40 | - dependency-name: "@storybook/addon-links" 41 | versions: 42 | - 6.1.16 43 | - 6.1.17 44 | - 6.1.19 45 | - 6.1.21 46 | - 6.2.2 47 | - 6.2.3 48 | - 6.2.4 49 | - 6.2.5 50 | - 6.2.8 51 | - dependency-name: "@storybook/react" 52 | versions: 53 | - 6.1.16 54 | - 6.1.17 55 | - 6.1.19 56 | - 6.1.21 57 | - 6.2.1 58 | - 6.2.3 59 | - 6.2.8 60 | - dependency-name: react-is 61 | versions: 62 | - 17.0.2 63 | - dependency-name: xstate 64 | versions: 65 | - 4.17.0 66 | - 4.17.1 67 | - dependency-name: tslib 68 | versions: 69 | - 2.2.0 70 | - dependency-name: "@storybook/addon-docs" 71 | versions: 72 | - 6.1.17 73 | - 6.1.19 74 | - 6.1.20 75 | - 6.2.4 76 | - 6.2.5 77 | - dependency-name: y18n 78 | versions: 79 | - 4.0.1 80 | - 4.0.2 81 | - dependency-name: "@babel/core" 82 | versions: 83 | - 7.12.13 84 | - 7.13.1 85 | - 7.13.10 86 | - 7.13.13 87 | - 7.13.14 88 | - 7.13.8 89 | - dependency-name: husky 90 | versions: 91 | - 5.1.0 92 | - 5.1.1 93 | - 5.2.0 94 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | .parcel-cache 107 | .cache 108 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roover", 3 | "version": "0.3.1", 4 | "private": false, 5 | "license": "MIT", 6 | "main": "dist/index.js", 7 | "typings": "dist/index.d.ts", 8 | "files": [ 9 | "dist", 10 | "src" 11 | ], 12 | "engines": { 13 | "node": ">=10" 14 | }, 15 | "author": "leonardomso", 16 | "module": "dist/roover.esm.js", 17 | "size-limit": [ 18 | { 19 | "path": "dist/roover.cjs.production.min.js", 20 | "limit": "20 KB" 21 | }, 22 | { 23 | "path": "dist/roover.esm.js", 24 | "limit": "20 KB" 25 | } 26 | ], 27 | "scripts": { 28 | "start": "tsdx watch", 29 | "build": "tsdx build", 30 | "test": "tsdx test --passWithNoTests", 31 | "test:watch": "tsdx test --watchAll", 32 | "test:coverage": "tsdx test --coverage", 33 | "lint": "tsdx lint", 34 | "lint:fix": "tsdx lint --fix", 35 | "prepare": "tsdx build", 36 | "size": "size-limit", 37 | "analyze": "size-limit --why", 38 | "example:start": "cd ./example/ && yarn start", 39 | "docs:dev": "cd ./docs/ && yarn dev", 40 | "docs:start": "cd ./docs/ && yarn start", 41 | "docs:build": "cd ./docs/ && yarn build" 42 | }, 43 | "devDependencies": { 44 | "@babel/core": "^7.23.3", 45 | "@size-limit/preset-small-lib": "^7.0.8", 46 | "@testing-library/jest-dom": "^6.1.3", 47 | "@testing-library/react": "^12.1.5", 48 | "@testing-library/react-hooks": "^8.0.1", 49 | "@testing-library/user-event": "^14.4.3", 50 | "@types/jest": "^29.5.8", 51 | "@types/raf": "^3.4.0", 52 | "@types/react": "^18.0.9", 53 | "@types/react-dom": "^18.0.3", 54 | "@xstate/react": "^1.6.3", 55 | "babel-jest": "^29.6.4", 56 | "babel-loader": "^8.2.5", 57 | "husky": "^7.0.4", 58 | "raf": "^3.4.1", 59 | "react": "^17.0.2", 60 | "react-dom": "^17.0.2", 61 | "react-is": "^18.2.0", 62 | "react-tracked": "^1.7.11", 63 | "size-limit": "^7.0.8", 64 | "ts-loader": "^9.5.1", 65 | "tsdx": "^0.14.1", 66 | "tslib": "^2.6.1", 67 | "typescript": "^5.2.2", 68 | "xstate": "^4.38.2" 69 | }, 70 | "peerDependencies": { 71 | "react": ">=16" 72 | }, 73 | "husky": { 74 | "hooks": { 75 | "pre-commit": "tsdx lint" 76 | } 77 | }, 78 | "prettier": { 79 | "printWidth": 80, 80 | "semi": true, 81 | "singleQuote": true, 82 | "trailingComma": "es5" 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/hooks/useRoover/useRoover.test.ts: -------------------------------------------------------------------------------- 1 | import { renderHook } from '@testing-library/react-hooks'; 2 | // import { act, waitFor } from '@testing-library/react'; 3 | 4 | import useRoover from './useRoover'; 5 | 6 | import { Args } from './useRoover.types'; 7 | 8 | describe('useRoover', () => { 9 | test('should render correctly', () => { 10 | const args: Args = { 11 | src: 12 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 13 | preload: 'auto', 14 | autoplay: false, 15 | volume: 1.0, 16 | rate: 1.0, 17 | mute: false, 18 | loop: false, 19 | }; 20 | 21 | const { result } = renderHook(() => useRoover(args)); 22 | 23 | expect(result.current.initial).toBe(true); 24 | expect(result.current.loading).toBe(false); 25 | expect(result.current.ready).toBe(false); 26 | expect(result.current.idle).toBe(false); 27 | expect(result.current.playing).toBe(false); 28 | expect(result.current.paused).toBe(false); 29 | expect(result.current.end).toBe(false); 30 | }); 31 | 32 | // describe('onToggle', () => { 33 | // test('should create new audio and not play it ', async () => { 34 | // const args: Args = { 35 | // src: 36 | // 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 37 | // preload: 'auto', 38 | // autoplay: false, 39 | // volume: 1.0, 40 | // rate: 1.0, 41 | // mute: false, 42 | // loop: false, 43 | // }; 44 | // const { result } = renderHook(() => useRoover(args)); 45 | 46 | // expect(result.current.initial).toBe(true); 47 | // expect(result.current.loading).toBe(false); 48 | // expect(result.current.ready).toBe(false); 49 | // expect(result.current.idle).toBe(false); 50 | // expect(result.current.playing).toBe(false); 51 | // expect(result.current.paused).toBe(false); 52 | // expect(result.current.end).toBe(false); 53 | 54 | // act(() => result.current.onToggle()); 55 | 56 | // await waitFor(() => { 57 | // expect(result.current.initial).toBe(false); 58 | // expect(result.current.loading).toBe(false); 59 | // expect(result.current.ready).toBe(true); 60 | // expect(result.current.idle).toBe(true); 61 | // expect(result.current.playing).toBe(false); 62 | // expect(result.current.paused).toBe(false); 63 | // expect(result.current.end).toBe(false); 64 | // }); 65 | // }); 66 | // }); 67 | }); 68 | -------------------------------------------------------------------------------- /example/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import * as ReactDOM from 'react-dom'; 3 | import { 4 | ChakraProvider, 5 | Box, 6 | Heading, 7 | Grid, 8 | theme, 9 | } from "@chakra-ui/react"; 10 | 11 | import Source from "./components/Source"; 12 | import Details from "./components/Details"; 13 | import Controls from "./components/Controls"; 14 | 15 | import useRoover from "../src/hooks/useRoover/useRoover"; 16 | 17 | const src: string = "https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3"; 18 | 19 | const App = () => { 20 | const { 21 | initial, 22 | loading, 23 | ready, 24 | idle, 25 | playing, 26 | paused, 27 | end, 28 | seek, 29 | volume, 30 | rate, 31 | duration, 32 | mute, 33 | loop, 34 | error, 35 | onToggle, 36 | onPlay, 37 | onPause, 38 | onVolume, 39 | onRate, 40 | onMute, 41 | onLoop, 42 | onSeek, 43 | onForward, 44 | onBackward, 45 | } = useRoover({ 46 | src, 47 | autoplay: true, 48 | }); 49 | 50 | return ( 51 | 52 | 53 | 54 | Roover 55 | 69 | 70 | 83 | 84 |
100 | 101 | 102 | 103 | ); 104 | }; 105 | 106 | ReactDOM.render(, document.getElementById('root')); -------------------------------------------------------------------------------- /example/components/Controls.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import { 3 | Button, 4 | Text, 5 | Select, 6 | Slider, 7 | SliderTrack, 8 | SliderFilledTrack, 9 | SliderThumb, 10 | Grid, 11 | } from "@chakra-ui/react"; 12 | 13 | interface Props { 14 | seek: number; 15 | volume: number; 16 | rate: number; 17 | duration: number; 18 | mute: boolean; 19 | loop: boolean; 20 | onVolume: (value: number) => void; 21 | onRate: (value: string) => void; 22 | onMute: () => void; 23 | onLoop: () => void; 24 | onSeek: (value: number) => void; 25 | } 26 | 27 | const Controls = ({ seek, volume, rate, duration, mute, loop, onVolume, onRate, onMute, onLoop, onSeek }: Props) => { 28 | return ( 29 | 30 | 31 | Seek 32 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | Volume 50 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | Rate 68 | 74 | 75 | 76 | 77 | Mute 78 | 79 | 80 | 81 | 82 | Loop 83 | 84 | 85 | 86 | ) 87 | }; 88 | 89 | export default Controls; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

3 | 4 | Roover 5 | 6 |

7 | 8 |

9 | Manage audio in React with ease 10 |

11 | 12 | [![Build Status](https://img.shields.io/github/workflow/status/leonardomso/roover/CI?style=flat&colorA=000000&colorB=000000)](https://github.com/leonardomso/roover/actions?query=workflow%3ALint) 13 | [![Build Size](https://img.shields.io/bundlephobia/min/roover?label=bundle%20size&style=flat&colorA=000000&colorB=000000)](https://bundlephobia.com/result?p=roover) 14 | [![Version](https://img.shields.io/npm/v/roover?style=flat&colorA=000000&colorB=000000)](https://www.npmjs.com/package/roover) 15 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat&colorA=000000&colorB=000000)](https://opensource.org/licenses/MIT) 16 | 17 | ## Motivation 18 | 19 | Modern applications are using audio all the time. Audio can turn a boring application into an interesting one, adding emotion to the content. Most of the modern applications that we use daily are using audio for at least in some part. 20 | 21 | Work with audio in React applications is painful. There are not too many good libraries to manage audio and most of the time we need to create our solutions. Manage audio in a modern application is important and should be made by using the best tools and libraries. 22 | 23 | The idea to create this library was to provide a powerful and lightweight audio library for React apps. A custom React Hook that is easy to integrate with and has a ton of features to help speed up development without having to worry about anything. 24 | 25 | ## Installation 26 | 27 | ```bash 28 | yarn add roover 29 | ``` 30 | 31 | ## Usage 32 | 33 | All you need to do is import the `useRoover` hook and use it on your React component. 34 | 35 | ```typescript 36 | import React from 'react'; 37 | import useRoover from 'roover'; 38 | 39 | const src = 40 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3'; 41 | 42 | const App = () => { 43 | const { 44 | initial, 45 | loading, 46 | ready, 47 | playing, 48 | paused, 49 | onPlay, 50 | onPause, 51 | } = useRoover({ 52 | src, 53 | autoplay: true, 54 | }); 55 | 56 | return ( 57 |
58 |

Loading: {loading ? 'true' : 'false'}

59 |

Ready: {ready ? 'true' : 'false'}

60 | 61 | 62 |
63 | ); 64 | }; 65 | ``` 66 | 67 | ## Example 68 | 69 | To run the example do the following steps: 70 | 71 | 1. `git clone` the repository 72 | 2. `cd roover/example` 73 | 3. `yarn install` 74 | 4. `yarn start` 75 | 76 | ## Contributing 77 | 78 | Your contributions are welcome! If you have any questions or want to start to contribute to this library in any form, please open an issue. Feel free to open PR. 79 | 80 | If there are any questions about this library or about any other topic, please contact me on Twitter [@leonardomso](https://twitter.com/leonardomso) and I'll gladly answer it. 81 | 82 | ## License 83 | 84 | MIT License © 2021 [Leonardo Maldonado](https://github.com/leonardomso) 85 | -------------------------------------------------------------------------------- /src/machine/Machine.tsx: -------------------------------------------------------------------------------- 1 | import { createMachine, assign } from 'xstate'; 2 | 3 | import { 4 | MachineContext, 5 | MachineEvent, 6 | MachineLoadEvent, 7 | MachineErrorEvent, 8 | MachineRateEvent, 9 | MachineVolumeEvent, 10 | MachineReadyEvent, 11 | } from '../types'; 12 | 13 | const Machine = createMachine( 14 | { 15 | id: 'roover', 16 | initial: 'initial', 17 | context: { 18 | volume: 1.0, 19 | rate: 1.0, 20 | duration: 0, 21 | mute: false, 22 | loop: false, 23 | error: null, 24 | }, 25 | states: { 26 | initial: { 27 | id: 'initial', 28 | on: { 29 | LOAD: { 30 | target: 'loading', 31 | actions: 'onLoad', 32 | }, 33 | ERROR: 'error', 34 | }, 35 | }, 36 | loading: { 37 | on: { 38 | READY: { 39 | target: 'ready', 40 | actions: 'onReady', 41 | }, 42 | ERROR: { 43 | target: 'error', 44 | actions: 'onError', 45 | }, 46 | }, 47 | }, 48 | ready: { 49 | id: 'ready', 50 | initial: 'idle', 51 | states: { 52 | idle: { 53 | on: { 54 | PLAY: 'playing', 55 | PAUSE: 'paused', 56 | }, 57 | }, 58 | playing: { 59 | on: { 60 | PAUSE: 'paused', 61 | }, 62 | }, 63 | paused: { 64 | on: { 65 | PLAY: 'playing', 66 | }, 67 | }, 68 | }, 69 | on: { 70 | LOAD: { 71 | target: 'loading', 72 | actions: 'onLoad', 73 | }, 74 | END: 'end', 75 | ERROR: 'error', 76 | VOLUME: { 77 | target: '', 78 | actions: 'onVolume', 79 | }, 80 | RATE: { 81 | target: '', 82 | actions: 'onRate', 83 | }, 84 | MUTE: { 85 | target: '', 86 | actions: 'onMute', 87 | }, 88 | LOOP: { 89 | target: '', 90 | actions: 'onLoop', 91 | }, 92 | }, 93 | }, 94 | end: { 95 | id: 'end', 96 | on: { 97 | LOAD: { 98 | target: 'loading', 99 | actions: 'onLoad', 100 | }, 101 | PLAY: 'ready.playing', 102 | }, 103 | }, 104 | error: { 105 | id: 'error', 106 | on: { 107 | LOAD: { 108 | target: 'loading', 109 | actions: 'onLoad', 110 | }, 111 | }, 112 | }, 113 | }, 114 | }, 115 | { 116 | actions: { 117 | onLoad: assign({ 118 | volume: (_, event) => (event as MachineLoadEvent).volume, 119 | rate: (_, event) => (event as MachineLoadEvent).rate, 120 | mute: (_, event) => (event as MachineLoadEvent).mute, 121 | loop: (_, event) => (event as MachineLoadEvent).loop, 122 | }), 123 | onReady: assign({ 124 | duration: (_, event) => (event as MachineReadyEvent).duration, 125 | }), 126 | onVolume: assign({ 127 | volume: (_, event) => (event as MachineVolumeEvent).volume, 128 | }), 129 | onRate: assign({ 130 | rate: (_, event) => (event as MachineRateEvent).rate, 131 | }), 132 | onMute: assign({ 133 | mute: (context, _) => !context.mute, 134 | }), 135 | onLoop: assign({ 136 | loop: (context, _) => !context.loop, 137 | }), 138 | onError: assign({ 139 | error: (_, event) => (event as MachineErrorEvent).error, 140 | }), 141 | }, 142 | } 143 | ); 144 | 145 | export default Machine; 146 | -------------------------------------------------------------------------------- /example/components/Details.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import { 3 | Heading, 4 | Text, 5 | Grid, 6 | } from "@chakra-ui/react"; 7 | 8 | import formatTime from "../utils/formatTime"; 9 | 10 | interface Props { 11 | initial: boolean; 12 | loading: boolean; 13 | ready: boolean; 14 | idle: boolean; 15 | playing: boolean; 16 | paused: boolean; 17 | end: boolean; 18 | seek: number; 19 | volume: number; 20 | rate: number; 21 | duration: number; 22 | mute: boolean; 23 | loop: boolean; 24 | error: string | null; 25 | } 26 | 27 | const Details = ({ initial, loading, ready, idle, playing, paused, end, seek, volume, rate, duration, mute, loop, error }: Props) => { 28 | return ( 29 | 30 | State 31 | 32 | 33 | 34 | Initial: 35 | {`${initial}`} 36 | 37 | 38 | 39 | Loading: 40 | {`${loading}`} 41 | 42 | 43 | 44 | Ready: 45 | {`${ready}`} 46 | 47 | 48 | 49 | Idle: 50 | {`${idle}`} 51 | 52 | 53 | 54 | Playing: 55 | {`${playing}`} 56 | 57 | 58 | 59 | Paused: 60 | {`${paused}`} 61 | 62 | 63 | 64 | End: 65 | {`${end}`} 66 | 67 | 68 | 69 | 70 | 71 | Seek: 72 | {formatTime(seek)} 73 | 74 | 75 | 76 | Volume: 77 | {`${volume}`} 78 | 79 | 80 | 81 | Rate: 82 | {`${rate}`} 83 | 84 | 85 | 86 | Duration: 87 | {`${duration}`} 88 | 89 | 90 | 91 | Mute: 92 | {`${mute}`} 93 | 94 | 95 | 96 | Loop: 97 | {`${loop}`} 98 | 99 | 100 | 101 | Error: 102 | {`${error}`} 103 | 104 | 105 | 106 | ) 107 | }; 108 | 109 | export default Details; -------------------------------------------------------------------------------- /src/hooks/useAudio/useAudio.ts: -------------------------------------------------------------------------------- 1 | import { useInterpret } from '@xstate/react'; 2 | 3 | import RooverMachine from '../../machine/Machine'; 4 | 5 | import { 6 | UseAudio, 7 | CreateAudioArgs, 8 | MachineContext, 9 | MachineEvent, 10 | } from '../../types'; 11 | 12 | import { EVENTS, STATUS } from '../../utils/constants'; 13 | 14 | const useAudio: UseAudio = () => { 15 | const service = useInterpret(RooverMachine, { 16 | devTools: process.env.NODE_ENV === 'development', 17 | }); 18 | 19 | /** 20 | * Create a new Audio element and returns it. 21 | * @param {string} src - The src of the audio to be loaded. 22 | * @param {string} preload - The preload property for the audio. 23 | * @param {boolean} autoplay - The autoplay property for the audio. 24 | * @param {number} volume - The volume property for the audio. 25 | * @param {number} rate - The rate property for the audio. 26 | * @param {boolean} mute - The mute property for the audio. 27 | * @param {boolean} loop - The loop property for the audio. 28 | * @returns HTMLAudioElement 29 | */ 30 | const onCreateAudio = ({ 31 | src = '', 32 | preload = 'auto', 33 | autoplay = false, 34 | volume = 1.0, 35 | rate = 1.0, 36 | mute = false, 37 | loop = false, 38 | }: CreateAudioArgs): HTMLAudioElement => { 39 | const audioElement: HTMLAudioElement = new Audio(src); 40 | 41 | // Autoplay should be 'false' by default. 42 | // Read more here: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/autoplay 43 | audioElement.autoplay = autoplay; 44 | audioElement.volume = volume; 45 | audioElement.muted = mute; 46 | audioElement.loop = loop; 47 | audioElement.playbackRate = rate; 48 | audioElement.preload = preload; 49 | 50 | // When the audio has started to load, it will trigger a 'LOAD' event. 51 | audioElement.addEventListener('loadstart', () => { 52 | service.send(STATUS.LOAD, { 53 | volume: volume, 54 | rate: rate, 55 | mute: mute, 56 | loop: loop, 57 | }); 58 | }); 59 | // When the audio has loaded successfully, it will triger a 'READY' event and change values in the context. 60 | audioElement.addEventListener('loadeddata', () => { 61 | service.send(STATUS.READY, { duration: audioElement.duration }); 62 | }); 63 | // When the audio has a loading error, it will trigger a 'ERROR' event. 64 | audioElement.addEventListener('error', () => { 65 | service.send(STATUS.ERROR, { 66 | error: `Error while loading: ${src}`, 67 | }); 68 | }); 69 | // When the audio plays, it will trigger a 'PLAY' event. 70 | audioElement.addEventListener('play', () => { 71 | service.send(EVENTS.PLAY); 72 | }); 73 | // When the audio has paused, it will trigger a 'PAUSE' event. 74 | audioElement.addEventListener('pause', () => { 75 | service.send(EVENTS.PAUSE); 76 | }); 77 | // When the volume has changed, will trigger a 'VOLUME' event and set the new value in the context. 78 | audioElement.addEventListener('volumechange', () => { 79 | service.send(EVENTS.VOLUME, { 80 | volume: audioElement.volume, 81 | }); 82 | }); 83 | // When the rate has changed, it will trigger a 'RATE' event and set the new value in the context. 84 | audioElement.addEventListener('ratechange', () => { 85 | service.send(EVENTS.RATE, { 86 | rate: audioElement.playbackRate, 87 | }); 88 | }); 89 | // When the audio has ended, it will trigger a 'END' event. 90 | audioElement.addEventListener('ended', () => { 91 | service.send(EVENTS.END); 92 | }); 93 | 94 | return audioElement; 95 | }; 96 | 97 | /** 98 | * Check if there are any audio available. 99 | * If there's no audio available, it creates a new one and returns it. 100 | * If there's a current audio available, checks if the src of the current audio is equal to the new audio that's trying to be loaded. 101 | * In case the src is the same, it returns the audio. Otherwise, it replaces the src of the current audio with the new src. 102 | * @param {HTMLAudioElement | undefined} audio - The audio element. 103 | * @param {CreateAudioArgs} args - Object to pass to Audio element. 104 | * @returns HTMLAudioElement | undefined 105 | */ 106 | const onLoadAudio = ( 107 | audio: HTMLAudioElement | undefined, 108 | args: CreateAudioArgs 109 | ): HTMLAudioElement => { 110 | if (audio instanceof HTMLAudioElement) { 111 | const currentSrc: string = audio.currentSrc; 112 | 113 | if (currentSrc === args.src) { 114 | return audio; 115 | } 116 | 117 | service.send('LOAD', { 118 | volume: args.volume, 119 | rate: args.rate, 120 | mute: args.mute, 121 | loop: args.loop, 122 | }); 123 | audio.setAttribute('src', audio.src); 124 | audio.load(); 125 | return audio; 126 | } else { 127 | const newAudio: HTMLAudioElement = onCreateAudio(args); 128 | return newAudio; 129 | } 130 | }; 131 | 132 | /** 133 | * Destroy audio element. 134 | * @param audio - The audio element to be checked. 135 | * @returns undefined 136 | */ 137 | const onDestroyAudio = (audio: HTMLAudioElement | undefined): undefined => { 138 | if (!audio) { 139 | return undefined; 140 | } else { 141 | audio.currentTime = 0; 142 | audio.removeAttribute('src'); 143 | audio = undefined; 144 | return audio; 145 | } 146 | }; 147 | 148 | return { 149 | service, 150 | onCreateAudio, 151 | onLoadAudio, 152 | onDestroyAudio, 153 | }; 154 | }; 155 | 156 | export default useAudio; 157 | -------------------------------------------------------------------------------- /src/hooks/useRoover/useRoover.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect, useRef, MutableRefObject } from 'react'; 2 | import { useSelector } from '@xstate/react'; 3 | import raf from 'raf'; 4 | 5 | import useAudio from '../useAudio/useAudio'; 6 | 7 | import { Args, ReturnArgs } from './useRoover.types'; 8 | 9 | import { EVENTS } from '../../utils/constants'; 10 | 11 | /** 12 | * The useRoover hook. 13 | * @param {string} src - The src of the audio to be loaded. 14 | * @param {string} preload - The preload property for the audio. 15 | * @param {boolean} autoplay - The autoplay property for the audio. 16 | * @param {number} volume - The volume property for the audio. 17 | * @param {number} rate - The rate property for the audio. 18 | * @param {boolean} mute - The mute property for the audio. 19 | * @param {boolean} loop - The loop property for the audio. 20 | * 21 | * @return {boolean} initial - Whether the audio is initial. 22 | * @return {boolean} loading - Whether the audio is loading. 23 | * @return {boolean} ready - Whether the audio is ready. 24 | * @return {boolean} idle - Whether the audio is idle. 25 | * @return {boolean} playing - Whether the audio is playing. 26 | * @return {boolean} paused - Whether the audio is paused. 27 | * @return {boolean} end - Whether the audio has ended. 28 | * @return {number} seek - The seek value of the audio. 29 | * @return {number} volume - The volume value of the audio. 30 | * @return {number} rate - The rate value of the audio. 31 | * @return {number} duration - The duration value of the audio. 32 | * @return {boolean} mute - The mute value of the audio. 33 | * @return {boolean} loop - The loop value of the audio. 34 | * @return {function} onToggle - Function to toggle the audio. 35 | * @return {function} onPlay - Function to play the audio. 36 | * @return {function} onPause - Function to pause the audio. 37 | * @return {function} onVolume - Function to change the volume of the audio. 38 | * @return {function} onRate - Function to change the rate of the audio. 39 | * @return {function} onMute - Function to mute/unmute the audio. 40 | * @return {function} onLoop - Function to loop/unloop the audio. 41 | * @return {function} onSeek - Function to change the seek of the audio. 42 | * @return {function} onForward - Function to forward the audio in a specific amount of seconds. 43 | * @return {function} onBackward - Function to backward the audio in a specific amount of seconds. 44 | */ 45 | 46 | const useRoover = ({ 47 | src = '', 48 | preload = 'auto', 49 | autoplay = false, 50 | volume = 1.0, 51 | rate = 1.0, 52 | mute = false, 53 | loop = false, 54 | }: Args): ReturnArgs => { 55 | const { service, onLoadAudio } = useAudio(); 56 | 57 | const [audio, setAudio] = useState(undefined); 58 | const playerRef: MutableRefObject = useRef< 59 | HTMLAudioElement | undefined 60 | >(undefined); 61 | 62 | const [seek, setSeek] = useState(0); 63 | const seekRef: MutableRefObject = useRef(0); 64 | 65 | const initial = useSelector(service, state => state.matches('initial')); 66 | const loading: boolean = useSelector(service, state => 67 | state.matches('loading') 68 | ); 69 | const ready: boolean = useSelector(service, state => state.matches('ready')); 70 | const idle: boolean = useSelector(service, state => 71 | state.matches('ready.idle') 72 | ); 73 | const playing: boolean = useSelector(service, state => 74 | state.matches('ready.playing') 75 | ); 76 | const paused: boolean = useSelector(service, state => 77 | state.matches('ready.paused') 78 | ); 79 | const end: boolean = useSelector(service, state => state.matches('end')); 80 | 81 | const playerContextVolume: number = useSelector( 82 | service, 83 | state => state.context.volume 84 | ); 85 | const playerContextRate: number = useSelector( 86 | service, 87 | state => state.context.rate 88 | ); 89 | const playerContextDuration: number = useSelector( 90 | service, 91 | state => state.context.duration 92 | ); 93 | const playerContextMute: boolean = useSelector( 94 | service, 95 | state => state.context.mute 96 | ); 97 | const playerContextLoop: boolean = useSelector( 98 | service, 99 | state => state.context.loop 100 | ); 101 | const playerContextError: string | null = useSelector( 102 | service, 103 | state => state.context.error 104 | ); 105 | 106 | useEffect(() => { 107 | const animate = () => { 108 | const seek = audio?.currentTime; 109 | setSeek(seek as number); 110 | seekRef.current = raf(animate); 111 | }; 112 | 113 | if (audio && playing) { 114 | seekRef.current = raf(animate); 115 | } 116 | 117 | return () => { 118 | if (seekRef.current) { 119 | raf.cancel(seekRef.current); 120 | } 121 | }; 122 | }, [audio, playing]); 123 | 124 | /** 125 | * Should create new audio element and play it. 126 | * In case audio exists, it will play or pause based on the current state. 127 | * @returns void 128 | */ 129 | const onToggle = (): void => { 130 | if (!audio) { 131 | const newAudio = onLoadAudio(audio, { 132 | src, 133 | preload, 134 | autoplay, 135 | volume, 136 | rate, 137 | mute, 138 | loop, 139 | }); 140 | setAudio(newAudio); 141 | playerRef.current = newAudio; 142 | } else { 143 | if (ready || paused) { 144 | audio.play(); 145 | service.send(EVENTS.PLAY); 146 | } 147 | if (playing) { 148 | audio.pause(); 149 | service.send(EVENTS.PAUSE); 150 | } 151 | } 152 | }; 153 | 154 | /** 155 | * Play the audio. 156 | * @returns void 157 | */ 158 | const onPlay = (): void => { 159 | if (!audio) { 160 | const newAudio = onLoadAudio(audio, { 161 | src, 162 | preload, 163 | autoplay, 164 | volume, 165 | rate, 166 | mute, 167 | loop, 168 | }); 169 | setAudio(newAudio); 170 | playerRef.current = newAudio; 171 | } else { 172 | if (ready || paused) { 173 | audio.play(); 174 | service.send(EVENTS.PLAY); 175 | } 176 | } 177 | }; 178 | 179 | /** 180 | * Pause the audio. 181 | * @returns void 182 | */ 183 | const onPause = (): void => { 184 | if (!audio) return; 185 | service.send(EVENTS.PAUSE); 186 | audio.pause(); 187 | }; 188 | 189 | /** 190 | * Set 'mute' to true or false depending of the current value. 191 | * @returns void 192 | */ 193 | const onMute = (): void => { 194 | if (!audio) return; 195 | service.send(EVENTS.MUTE); 196 | audio.muted = !playerContextMute; 197 | }; 198 | 199 | /** 200 | * Set 'loop' to true or false depending of the current value. 201 | * @returns void 202 | */ 203 | const onLoop = (): void => { 204 | if (!audio) return; 205 | service.send(EVENTS.LOOP); 206 | audio.loop = !playerContextLoop; 207 | }; 208 | 209 | /** 210 | * Changes the volume of the audio. 211 | * @param {number} value - The value of the volume. 212 | * @returns void 213 | */ 214 | const onVolume = (value: number): void => { 215 | if (!audio) return; 216 | service.send({ type: EVENTS.VOLUME, volume: value }); 217 | audio.volume = value; 218 | }; 219 | 220 | /** 221 | * Changes the playback rate of the audio. 222 | * @param {string} value - The value of the volume. 223 | * @returns void 224 | */ 225 | const onRate = (value: string): void => { 226 | if (!audio) return; 227 | const rate: number = parseFloat(value); 228 | service.send({ type: EVENTS.RATE, rate }); 229 | audio.playbackRate = rate; 230 | }; 231 | 232 | /** 233 | * Changes the seek of the audio. 234 | * @param {number} value - The value of the volume. 235 | * @returns void 236 | */ 237 | const onSeek = (value: number): void => { 238 | if (!audio) return; 239 | setSeek(value); 240 | audio.currentTime = value; 241 | }; 242 | 243 | /** 244 | * Forward the seek value of the audio. 245 | * @param {number} value - The value of the volume. 246 | * @returns void 247 | */ 248 | const onForward = (value: number): void => { 249 | if (!audio || audio.ended) return; 250 | const newSeek: number = seek + value; 251 | setSeek(newSeek); 252 | audio.currentTime = newSeek; 253 | }; 254 | 255 | /** 256 | * Backward the seek value of the audio. 257 | * @param {number} value - The value of the volume. 258 | * @returns void 259 | */ 260 | const onBackward = (value: number): void => { 261 | if (!audio || audio.ended) return; 262 | const newSeek: number = seek - value; 263 | setSeek(newSeek); 264 | audio.currentTime = newSeek; 265 | }; 266 | 267 | return { 268 | initial, 269 | loading, 270 | ready, 271 | idle, 272 | playing, 273 | paused, 274 | end, 275 | seek, 276 | volume: playerContextVolume, 277 | rate: playerContextRate, 278 | duration: playerContextDuration, 279 | mute: playerContextMute, 280 | loop: playerContextLoop, 281 | error: playerContextError, 282 | onToggle, 283 | onPlay, 284 | onPause, 285 | onVolume, 286 | onRate, 287 | onMute, 288 | onLoop, 289 | onSeek, 290 | onForward, 291 | onBackward, 292 | }; 293 | }; 294 | 295 | export default useRoover; 296 | -------------------------------------------------------------------------------- /src/hooks/useAudio/useAudio.test.ts: -------------------------------------------------------------------------------- 1 | import { waitFor, act } from '@testing-library/react'; 2 | import { renderHook } from '@testing-library/react-hooks'; 3 | 4 | import useAudio from './useAudio'; 5 | 6 | import { CreateAudioArgs } from './useAudio.types'; 7 | 8 | describe('useAudio', () => { 9 | beforeAll(() => { 10 | window.HTMLMediaElement.prototype.load = jest.fn(); 11 | }); 12 | 13 | describe('onCreateAudio', () => { 14 | test('should create audio element', async () => { 15 | let audio: HTMLAudioElement | undefined = undefined; 16 | const { result } = renderHook(() => useAudio()); 17 | 18 | const args: CreateAudioArgs = { 19 | src: 20 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 21 | preload: 'auto', 22 | autoplay: true, 23 | volume: 1.0, 24 | rate: 1.0, 25 | mute: false, 26 | loop: false, 27 | }; 28 | 29 | await waitFor(async () => { 30 | audio = await result.current.onCreateAudio(args); 31 | }); 32 | 33 | expect(audio).toBeInstanceOf(HTMLAudioElement); 34 | expect(audio).toHaveProperty('preload', args.preload); 35 | expect(audio).toHaveProperty('autoplay', args.autoplay); 36 | expect(audio).toHaveProperty('volume', args.volume); 37 | expect(audio).toHaveProperty('playbackRate', args.rate); 38 | expect(audio).toHaveProperty('muted', args.mute); 39 | expect(audio).toHaveProperty('loop', args.loop); 40 | }); 41 | 42 | test('should create audio element with preload equal "metadata"', async () => { 43 | const { result } = renderHook(() => useAudio()); 44 | 45 | const args: CreateAudioArgs = { 46 | src: 47 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 48 | preload: 'none', 49 | autoplay: true, 50 | volume: 1.0, 51 | rate: 1.0, 52 | mute: false, 53 | loop: false, 54 | }; 55 | 56 | const audio: 57 | | HTMLAudioElement 58 | | undefined = await result.current.onCreateAudio(args); 59 | 60 | expect(audio).toBeInstanceOf(HTMLAudioElement); 61 | expect(audio).toHaveProperty('preload', args.preload); 62 | expect(audio).toHaveProperty('autoplay', args.autoplay); 63 | expect(audio).toHaveProperty('volume', args.volume); 64 | expect(audio).toHaveProperty('playbackRate', args.rate); 65 | expect(audio).toHaveProperty('muted', args.mute); 66 | expect(audio).toHaveProperty('loop', args.loop); 67 | }); 68 | 69 | test('should create audio element with preload equal "none"', async () => { 70 | const { result } = renderHook(() => useAudio()); 71 | 72 | const args: CreateAudioArgs = { 73 | src: 74 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 75 | preload: 'none', 76 | autoplay: true, 77 | volume: 1.0, 78 | rate: 1.0, 79 | mute: false, 80 | loop: false, 81 | }; 82 | 83 | const audio: 84 | | HTMLAudioElement 85 | | undefined = await result.current.onCreateAudio(args); 86 | 87 | expect(audio).toBeInstanceOf(HTMLAudioElement); 88 | expect(audio).toHaveProperty('preload', args.preload); 89 | expect(audio).toHaveProperty('autoplay', args.autoplay); 90 | expect(audio).toHaveProperty('volume', args.volume); 91 | expect(audio).toHaveProperty('playbackRate', args.rate); 92 | expect(audio).toHaveProperty('muted', args.mute); 93 | expect(audio).toHaveProperty('loop', args.loop); 94 | }); 95 | 96 | test('should create audio element with autoplay equal "false"', async () => { 97 | const { result } = renderHook(() => useAudio()); 98 | 99 | const args: CreateAudioArgs = { 100 | src: 101 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 102 | preload: 'auto', 103 | autoplay: false, 104 | volume: 1.0, 105 | rate: 1.0, 106 | mute: false, 107 | loop: false, 108 | }; 109 | 110 | const audio: 111 | | HTMLAudioElement 112 | | undefined = await result.current.onCreateAudio(args); 113 | 114 | expect(audio).toBeInstanceOf(HTMLAudioElement); 115 | expect(audio).toHaveProperty('preload', args.preload); 116 | expect(audio).toHaveProperty('autoplay', args.autoplay); 117 | expect(audio).toHaveProperty('volume', args.volume); 118 | expect(audio).toHaveProperty('playbackRate', args.rate); 119 | expect(audio).toHaveProperty('muted', args.mute); 120 | expect(audio).toHaveProperty('loop', args.loop); 121 | }); 122 | 123 | test('should create audio element with volume equal "0.5"', async () => { 124 | const { result } = renderHook(() => useAudio()); 125 | 126 | const args: CreateAudioArgs = { 127 | src: 128 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 129 | preload: 'auto', 130 | autoplay: true, 131 | volume: 0.5, 132 | rate: 1.0, 133 | mute: false, 134 | loop: false, 135 | }; 136 | 137 | const audio: 138 | | HTMLAudioElement 139 | | undefined = await result.current.onCreateAudio(args); 140 | 141 | expect(audio).toBeInstanceOf(HTMLAudioElement); 142 | expect(audio).toHaveProperty('preload', args.preload); 143 | expect(audio).toHaveProperty('autoplay', args.autoplay); 144 | expect(audio).toHaveProperty('volume', args.volume); 145 | expect(audio).toHaveProperty('playbackRate', args.rate); 146 | expect(audio).toHaveProperty('muted', args.mute); 147 | expect(audio).toHaveProperty('loop', args.loop); 148 | }); 149 | 150 | test('should create audio element with rate equal "0.5"', async () => { 151 | const { result } = renderHook(() => useAudio()); 152 | 153 | const args: CreateAudioArgs = { 154 | src: 155 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 156 | preload: 'auto', 157 | autoplay: true, 158 | volume: 1.0, 159 | rate: 0.5, 160 | mute: false, 161 | loop: false, 162 | }; 163 | 164 | const audio: 165 | | HTMLAudioElement 166 | | undefined = await result.current.onCreateAudio(args); 167 | 168 | expect(audio).toBeInstanceOf(HTMLAudioElement); 169 | expect(audio).toHaveProperty('preload', args.preload); 170 | expect(audio).toHaveProperty('autoplay', args.autoplay); 171 | expect(audio).toHaveProperty('volume', args.volume); 172 | expect(audio).toHaveProperty('playbackRate', args.rate); 173 | expect(audio).toHaveProperty('muted', args.mute); 174 | expect(audio).toHaveProperty('loop', args.loop); 175 | }); 176 | 177 | test('should create audio element with muted equal "true"', async () => { 178 | const { result } = renderHook(() => useAudio()); 179 | 180 | const args: CreateAudioArgs = { 181 | src: 182 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 183 | preload: 'auto', 184 | autoplay: true, 185 | volume: 1.0, 186 | rate: 1.0, 187 | mute: true, 188 | loop: false, 189 | }; 190 | 191 | const audio: 192 | | HTMLAudioElement 193 | | undefined = await result.current.onCreateAudio(args); 194 | 195 | expect(audio).toBeInstanceOf(HTMLAudioElement); 196 | expect(audio).toHaveProperty('preload', args.preload); 197 | expect(audio).toHaveProperty('autoplay', args.autoplay); 198 | expect(audio).toHaveProperty('volume', args.volume); 199 | expect(audio).toHaveProperty('playbackRate', args.rate); 200 | expect(audio).toHaveProperty('muted', args.mute); 201 | expect(audio).toHaveProperty('loop', args.loop); 202 | }); 203 | 204 | test('should create audio element with loop equal "true"', async () => { 205 | const { result } = renderHook(() => useAudio()); 206 | 207 | const args: CreateAudioArgs = { 208 | src: 209 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 210 | preload: 'auto', 211 | autoplay: true, 212 | volume: 1.0, 213 | rate: 1.0, 214 | mute: false, 215 | loop: true, 216 | }; 217 | 218 | const audio: 219 | | HTMLAudioElement 220 | | undefined = await result.current.onCreateAudio(args); 221 | 222 | expect(audio).toBeInstanceOf(HTMLAudioElement); 223 | expect(audio).toHaveProperty('preload', args.preload); 224 | expect(audio).toHaveProperty('autoplay', args.autoplay); 225 | expect(audio).toHaveProperty('volume', args.volume); 226 | expect(audio).toHaveProperty('playbackRate', args.rate); 227 | expect(audio).toHaveProperty('muted', args.mute); 228 | expect(audio).toHaveProperty('loop', args.loop); 229 | }); 230 | }); 231 | 232 | describe('onLoadAudio', () => { 233 | test('should create audio and load it', async () => { 234 | const { result } = renderHook(() => useAudio()); 235 | 236 | const args: CreateAudioArgs = { 237 | src: 238 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 239 | preload: 'auto', 240 | autoplay: true, 241 | volume: 1.0, 242 | rate: 1.0, 243 | mute: false, 244 | loop: true, 245 | }; 246 | 247 | const audio: 248 | | HTMLAudioElement 249 | | undefined = await result.current.onLoadAudio(undefined, args); 250 | 251 | expect(audio).toBeInstanceOf(HTMLAudioElement); 252 | expect(audio).toHaveProperty('preload', args.preload); 253 | expect(audio).toHaveProperty('autoplay', args.autoplay); 254 | expect(audio).toHaveProperty('volume', args.volume); 255 | expect(audio).toHaveProperty('playbackRate', args.rate); 256 | expect(audio).toHaveProperty('muted', args.mute); 257 | expect(audio).toHaveProperty('loop', args.loop); 258 | }); 259 | 260 | test('should change audio src', async () => { 261 | const { result } = renderHook(() => useAudio()); 262 | 263 | const firstArgs: CreateAudioArgs = { 264 | src: 'https://www.theincomparable.com/podcast/batmanuniversity302.mp3', 265 | preload: 'auto', 266 | autoplay: true, 267 | volume: 1.0, 268 | rate: 1.0, 269 | mute: false, 270 | loop: true, 271 | }; 272 | 273 | const secondArgs: CreateAudioArgs = { 274 | src: 275 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 276 | preload: 'auto', 277 | autoplay: true, 278 | volume: 1.0, 279 | rate: 1.0, 280 | mute: false, 281 | loop: true, 282 | }; 283 | 284 | act(() => { 285 | const audio: HTMLAudioElement = result.current.onLoadAudio( 286 | undefined, 287 | firstArgs 288 | ); 289 | 290 | expect(audio).toBeInstanceOf(HTMLAudioElement); 291 | expect(audio).toHaveProperty('preload', firstArgs.preload); 292 | expect(audio).toHaveProperty('autoplay', firstArgs.autoplay); 293 | expect(audio).toHaveProperty('volume', firstArgs.volume); 294 | expect(audio).toHaveProperty('playbackRate', firstArgs.rate); 295 | expect(audio).toHaveProperty('muted', firstArgs.mute); 296 | expect(audio).toHaveProperty('loop', firstArgs.loop); 297 | 298 | result.current.onLoadAudio(audio, secondArgs); 299 | 300 | expect(audio).toBeInstanceOf(HTMLAudioElement); 301 | expect(audio).toHaveProperty('preload', secondArgs.preload); 302 | expect(audio).toHaveProperty('autoplay', secondArgs.autoplay); 303 | expect(audio).toHaveProperty('volume', secondArgs.volume); 304 | expect(audio).toHaveProperty('playbackRate', secondArgs.rate); 305 | expect(audio).toHaveProperty('muted', secondArgs.mute); 306 | expect(audio).toHaveProperty('loop', secondArgs.loop); 307 | }); 308 | }); 309 | }); 310 | 311 | describe('onDestroyAudio', () => { 312 | test('should destroy audio', async () => { 313 | const { result } = renderHook(() => useAudio()); 314 | 315 | const args: CreateAudioArgs = { 316 | src: 317 | 'https://storage.googleapis.com/media-session/elephants-dream/the-wires.mp3', 318 | preload: 'auto', 319 | autoplay: true, 320 | volume: 1.0, 321 | rate: 1.0, 322 | mute: false, 323 | loop: true, 324 | }; 325 | 326 | let audio: 327 | | HTMLAudioElement 328 | | undefined = await result.current.onCreateAudio(args); 329 | 330 | expect(audio).toBeInstanceOf(HTMLAudioElement); 331 | expect(audio).toHaveProperty('preload', args.preload); 332 | expect(audio).toHaveProperty('autoplay', args.autoplay); 333 | expect(audio).toHaveProperty('volume', args.volume); 334 | expect(audio).toHaveProperty('playbackRate', args.rate); 335 | expect(audio).toHaveProperty('muted', args.mute); 336 | expect(audio).toHaveProperty('loop', args.loop); 337 | 338 | audio = await result.current.onDestroyAudio(audio); 339 | 340 | expect(audio).toBeUndefined(); 341 | }); 342 | 343 | test('should not destroy audio and return undefined when there is no audio', async () => { 344 | const { result } = renderHook(() => useAudio()); 345 | 346 | const destroyFn = await result.current.onDestroyAudio(undefined); 347 | 348 | expect(destroyFn).toBeUndefined(); 349 | }); 350 | }); 351 | }); 352 | -------------------------------------------------------------------------------- /docs/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.10.5": 6 | version "7.15.3" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" 8 | integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== 9 | dependencies: 10 | regenerator-runtime "^0.13.4" 11 | 12 | "@mdx-js/loader@^2.0.0-next.8": 13 | version "2.0.0-next.9" 14 | resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-2.0.0-next.9.tgz#46b9cc1db2f51f89ac230e40156edc70a2bbae3f" 15 | integrity sha512-5hFaFs1w1Rq4XnVRg8n2NHn2dBgYfitJHSNZzC9K8YTAxcKAeIGgna8HK/e8SrGr/8HWC8DJ+shoo0k8U1z2ig== 16 | dependencies: 17 | "@mdx-js/mdx" "2.0.0-next.9" 18 | "@mdx-js/react" "2.0.0-next.9" 19 | loader-utils "^2.0.0" 20 | 21 | "@mdx-js/mdx@2.0.0-next.9": 22 | version "2.0.0-next.9" 23 | resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.0.0-next.9.tgz#6af5bf5d975ceccd11d31b4b7f180b2205c7bcfa" 24 | integrity sha512-6i7iLIPApiCdvp4T6n3dI5IqDOvcNx4M3DUJ+AG6xj/NTssJcf5r3Gl4i3Q2tqJp0JAj6bWQ3IOLAefF18Y48g== 25 | dependencies: 26 | "@mdx-js/util" "2.0.0-next.1" 27 | astring "^1.4.0" 28 | detab "^2.0.0" 29 | estree-walker "^2.0.0" 30 | hast-util-to-estree "^1.1.0" 31 | mdast-util-to-hast "^10.1.0" 32 | periscopic "^2.0.0" 33 | rehype-minify-whitespace "^4.0.0" 34 | remark-mdx "2.0.0-next.9" 35 | remark-parse "^9.0.0" 36 | remark-squeeze-paragraphs "^4.0.0" 37 | unified "^9.2.0" 38 | unist-builder "^2.0.0" 39 | 40 | "@mdx-js/react@2.0.0-next.9": 41 | version "2.0.0-next.9" 42 | resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.0.0-next.9.tgz#a269c2e2ecd86490e664fef789ae0d795e6ee509" 43 | integrity sha512-ZHEwW79zXQrII6ZSaIDgxd80IDRB6Zg/2N1IivQ62j4qlAZd78rbbAc0BQKwADYpuFg96g0pFbuZ7/+vl1gR6A== 44 | 45 | "@mdx-js/react@^1.6.16": 46 | version "1.6.22" 47 | resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" 48 | integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== 49 | 50 | "@mdx-js/util@2.0.0-next.1": 51 | version "2.0.0-next.1" 52 | resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-2.0.0-next.1.tgz#b17a046ed5cb1b13e75b29740504ec53a7e0b016" 53 | integrity sha512-F36kWTFdFXrbNIsM77dhVwYZsZonUIKHkYyYgnuw1NWskBfEn1ET5B5Z5mm58ckKNf7SimchnxR9sKCCtH38WA== 54 | 55 | "@next/env@12.1.0": 56 | version "12.1.0" 57 | resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.0.tgz#73713399399b34aa5a01771fb73272b55b22c314" 58 | integrity sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ== 59 | 60 | "@next/swc-android-arm64@12.1.0": 61 | version "12.1.0" 62 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz#865ba3a9afc204ff2bdeea49dd64d58705007a39" 63 | integrity sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA== 64 | 65 | "@next/swc-darwin-arm64@12.1.0": 66 | version "12.1.0" 67 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz#08e8b411b8accd095009ed12efbc2f1d4d547135" 68 | integrity sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg== 69 | 70 | "@next/swc-darwin-x64@12.1.0": 71 | version "12.1.0" 72 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz#fcd684497a76e8feaca88db3c394480ff0b007cd" 73 | integrity sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug== 74 | 75 | "@next/swc-linux-arm-gnueabihf@12.1.0": 76 | version "12.1.0" 77 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz#9ec6380a27938a5799aaa6035c205b3c478468a7" 78 | integrity sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog== 79 | 80 | "@next/swc-linux-arm64-gnu@12.1.0": 81 | version "12.1.0" 82 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz#7f4196dff1049cea479607c75b81033ae2dbd093" 83 | integrity sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q== 84 | 85 | "@next/swc-linux-arm64-musl@12.1.0": 86 | version "12.1.0" 87 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz#b445f767569cdc2dddee785ca495e1a88c025566" 88 | integrity sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA== 89 | 90 | "@next/swc-linux-x64-gnu@12.1.0": 91 | version "12.1.0" 92 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz#67610e9be4fbc987de7535f1bcb17e45fe12f90e" 93 | integrity sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A== 94 | 95 | "@next/swc-linux-x64-musl@12.1.0": 96 | version "12.1.0" 97 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz#ea19a23db08a9f2e34ac30401f774cf7d1669d31" 98 | integrity sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw== 99 | 100 | "@next/swc-win32-arm64-msvc@12.1.0": 101 | version "12.1.0" 102 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz#eadf054fc412085659b98e145435bbba200b5283" 103 | integrity sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw== 104 | 105 | "@next/swc-win32-ia32-msvc@12.1.0": 106 | version "12.1.0" 107 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz#68faeae10c89f698bf9d28759172b74c9c21bda1" 108 | integrity sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q== 109 | 110 | "@next/swc-win32-x64-msvc@12.1.0": 111 | version "12.1.0" 112 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz#d27e7e76c87a460a4da99c5bfdb1618dcd6cd064" 113 | integrity sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg== 114 | 115 | "@reach/skip-nav@^0.11.2": 116 | version "0.11.2" 117 | resolved "https://registry.yarnpkg.com/@reach/skip-nav/-/skip-nav-0.11.2.tgz#015498b2125ad8ef1e48cb8ab33dca93925fcbc8" 118 | integrity sha512-cXGQJodYcyUBLBv59oxB4ywwgFDHnoyt8+W+ZgdR1LR9eDxx6170shP0yPcwf/5KV2tXJtNF2McRUObkUW90+Q== 119 | dependencies: 120 | "@reach/utils" "0.11.2" 121 | tslib "^2.0.0" 122 | 123 | "@reach/utils@0.11.2": 124 | version "0.11.2" 125 | resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.11.2.tgz#be1f03650db56fd67a16d3fc70e5262cdb139cec" 126 | integrity sha512-fBTolYj+rKTROXmf0zHO0rCWSvw7J0ALmYj5QxW4DmITMOH5uyRuWDWOfqohIGFbOtF/sum50WTB3tvx76d+Aw== 127 | dependencies: 128 | "@types/warning" "^3.0.0" 129 | tslib "^2.0.0" 130 | warning "^4.0.3" 131 | 132 | "@researchgate/react-intersection-observer@^1.3.5": 133 | version "1.3.5" 134 | resolved "https://registry.yarnpkg.com/@researchgate/react-intersection-observer/-/react-intersection-observer-1.3.5.tgz#0321d2dd609aaacdb9bace8004d99c72824fb142" 135 | integrity sha512-aYlsex5Dd6BAHMJvJrUoFp8gzgMSL27xFvrxkVYW0bV1RMAapVsO+QeYLtTaSF/QCflktODodvv+wJm49oMnnQ== 136 | 137 | "@sindresorhus/is@^0.7.0": 138 | version "0.7.0" 139 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" 140 | integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== 141 | 142 | "@types/estree@*": 143 | version "0.0.48" 144 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.48.tgz#18dc8091b285df90db2f25aa7d906cfc394b7f74" 145 | integrity sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew== 146 | 147 | "@types/mdast@^3.0.0": 148 | version "3.0.3" 149 | resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" 150 | integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== 151 | dependencies: 152 | "@types/unist" "*" 153 | 154 | "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": 155 | version "2.0.3" 156 | resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" 157 | integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== 158 | 159 | "@types/warning@^3.0.0": 160 | version "3.0.0" 161 | resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" 162 | integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= 163 | 164 | acorn-jsx@^5.0.0: 165 | version "5.3.1" 166 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" 167 | integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== 168 | 169 | acorn@^8.0.0: 170 | version "8.3.0" 171 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.3.0.tgz#1193f9b96c4e8232f00b11a9edff81b2c8b98b88" 172 | integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw== 173 | 174 | ansi-styles@^3.1.0: 175 | version "3.2.1" 176 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 177 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 178 | dependencies: 179 | color-convert "^1.9.0" 180 | 181 | arch@^2.1.0: 182 | version "2.2.0" 183 | resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" 184 | integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== 185 | 186 | archive-type@^4.0.0: 187 | version "4.0.0" 188 | resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" 189 | integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA= 190 | dependencies: 191 | file-type "^4.2.0" 192 | 193 | arg@1.0.0: 194 | version "1.0.0" 195 | resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" 196 | integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== 197 | 198 | argparse@^1.0.7: 199 | version "1.0.10" 200 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 201 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 202 | dependencies: 203 | sprintf-js "~1.0.2" 204 | 205 | astring@^1.4.0: 206 | version "1.7.5" 207 | resolved "https://registry.yarnpkg.com/astring/-/astring-1.7.5.tgz#a7d47fceaf32b052d33a3d07c511efeec67447ca" 208 | integrity sha512-lobf6RWXb8c4uZ7Mdq0U12efYmpD1UFnyOWVJPTa3ukqZrMopav+2hdNu0hgBF0JIBFK9QgrBDfwYvh3DFJDAA== 209 | 210 | bail@^1.0.0: 211 | version "1.0.5" 212 | resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" 213 | integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== 214 | 215 | base64-js@^1.3.1: 216 | version "1.5.1" 217 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 218 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 219 | 220 | big.js@^5.2.2: 221 | version "5.2.2" 222 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" 223 | integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== 224 | 225 | bl@^1.0.0: 226 | version "1.2.3" 227 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" 228 | integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== 229 | dependencies: 230 | readable-stream "^2.3.5" 231 | safe-buffer "^5.1.1" 232 | 233 | buffer-alloc-unsafe@^1.1.0: 234 | version "1.1.0" 235 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 236 | integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== 237 | 238 | buffer-alloc@^1.2.0: 239 | version "1.2.0" 240 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 241 | integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== 242 | dependencies: 243 | buffer-alloc-unsafe "^1.1.0" 244 | buffer-fill "^1.0.0" 245 | 246 | buffer-crc32@~0.2.3: 247 | version "0.2.13" 248 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 249 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 250 | 251 | buffer-fill@^1.0.0: 252 | version "1.0.0" 253 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 254 | integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= 255 | 256 | buffer@^5.2.1: 257 | version "5.7.1" 258 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 259 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 260 | dependencies: 261 | base64-js "^1.3.1" 262 | ieee754 "^1.1.13" 263 | 264 | cacheable-request@^2.1.1: 265 | version "2.1.4" 266 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" 267 | integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= 268 | dependencies: 269 | clone-response "1.0.2" 270 | get-stream "3.0.0" 271 | http-cache-semantics "3.8.1" 272 | keyv "3.0.0" 273 | lowercase-keys "1.0.0" 274 | normalize-url "2.0.1" 275 | responselike "1.0.2" 276 | 277 | caniuse-lite@^1.0.30001283: 278 | version "1.0.30001312" 279 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f" 280 | integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== 281 | 282 | chalk@2.3.0: 283 | version "2.3.0" 284 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 285 | integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== 286 | dependencies: 287 | ansi-styles "^3.1.0" 288 | escape-string-regexp "^1.0.5" 289 | supports-color "^4.0.0" 290 | 291 | character-entities-html4@^1.0.0: 292 | version "1.1.4" 293 | resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" 294 | integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== 295 | 296 | character-entities-legacy@^1.0.0: 297 | version "1.1.4" 298 | resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" 299 | integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== 300 | 301 | character-entities@^1.0.0: 302 | version "1.2.4" 303 | resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" 304 | integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== 305 | 306 | character-reference-invalid@^1.0.0: 307 | version "1.1.4" 308 | resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" 309 | integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== 310 | 311 | classnames@^2.2.6: 312 | version "2.3.1" 313 | resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" 314 | integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== 315 | 316 | clipboardy@1.2.2: 317 | version "1.2.2" 318 | resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2" 319 | integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== 320 | dependencies: 321 | arch "^2.1.0" 322 | execa "^0.8.0" 323 | 324 | clone-response@1.0.2: 325 | version "1.0.2" 326 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 327 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 328 | dependencies: 329 | mimic-response "^1.0.0" 330 | 331 | color-convert@^1.9.0: 332 | version "1.9.3" 333 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 334 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 335 | dependencies: 336 | color-name "1.1.3" 337 | 338 | color-name@1.1.3: 339 | version "1.1.3" 340 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 341 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 342 | 343 | comma-separated-tokens@^1.0.0: 344 | version "1.0.8" 345 | resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" 346 | integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== 347 | 348 | commander@^2.8.1: 349 | version "2.20.3" 350 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 351 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 352 | 353 | content-disposition@^0.5.2: 354 | version "0.5.3" 355 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 356 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 357 | dependencies: 358 | safe-buffer "5.1.2" 359 | 360 | core-util-is@~1.0.0: 361 | version "1.0.2" 362 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 363 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 364 | 365 | cross-spawn@^5.0.1: 366 | version "5.1.0" 367 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 368 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 369 | dependencies: 370 | lru-cache "^4.0.1" 371 | shebang-command "^1.2.0" 372 | which "^1.2.9" 373 | 374 | debug@^4.0.0: 375 | version "4.3.1" 376 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 377 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 378 | dependencies: 379 | ms "2.1.2" 380 | 381 | decode-uri-component@^0.2.0: 382 | version "0.2.2" 383 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" 384 | integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== 385 | 386 | decompress-response@^3.3.0: 387 | version "3.3.0" 388 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 389 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 390 | dependencies: 391 | mimic-response "^1.0.0" 392 | 393 | decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: 394 | version "4.1.1" 395 | resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" 396 | integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== 397 | dependencies: 398 | file-type "^5.2.0" 399 | is-stream "^1.1.0" 400 | tar-stream "^1.5.2" 401 | 402 | decompress-tarbz2@^4.0.0: 403 | version "4.1.1" 404 | resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" 405 | integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== 406 | dependencies: 407 | decompress-tar "^4.1.0" 408 | file-type "^6.1.0" 409 | is-stream "^1.1.0" 410 | seek-bzip "^1.0.5" 411 | unbzip2-stream "^1.0.9" 412 | 413 | decompress-targz@^4.0.0: 414 | version "4.1.1" 415 | resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" 416 | integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== 417 | dependencies: 418 | decompress-tar "^4.1.1" 419 | file-type "^5.2.0" 420 | is-stream "^1.1.0" 421 | 422 | decompress-unzip@^4.0.1: 423 | version "4.0.1" 424 | resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" 425 | integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= 426 | dependencies: 427 | file-type "^3.8.0" 428 | get-stream "^2.2.0" 429 | pify "^2.3.0" 430 | yauzl "^2.4.2" 431 | 432 | decompress@^4.2.1: 433 | version "4.2.1" 434 | resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" 435 | integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== 436 | dependencies: 437 | decompress-tar "^4.0.0" 438 | decompress-tarbz2 "^4.0.0" 439 | decompress-targz "^4.0.0" 440 | decompress-unzip "^4.0.1" 441 | graceful-fs "^4.1.10" 442 | make-dir "^1.0.0" 443 | pify "^2.3.0" 444 | strip-dirs "^2.0.0" 445 | 446 | detab@^2.0.0: 447 | version "2.0.4" 448 | resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" 449 | integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== 450 | dependencies: 451 | repeat-string "^1.5.4" 452 | 453 | download@^8.0.0: 454 | version "8.0.0" 455 | resolved "https://registry.yarnpkg.com/download/-/download-8.0.0.tgz#afc0b309730811731aae9f5371c9f46be73e51b1" 456 | integrity sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA== 457 | dependencies: 458 | archive-type "^4.0.0" 459 | content-disposition "^0.5.2" 460 | decompress "^4.2.1" 461 | ext-name "^5.0.0" 462 | file-type "^11.1.0" 463 | filenamify "^3.0.0" 464 | get-stream "^4.1.0" 465 | got "^8.3.1" 466 | make-dir "^2.1.0" 467 | p-event "^2.1.0" 468 | pify "^4.0.1" 469 | 470 | duplexer3@^0.1.4: 471 | version "0.1.4" 472 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 473 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 474 | 475 | "emoji-regex@>=6.0.0 <=6.1.1": 476 | version "6.1.1" 477 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" 478 | integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= 479 | 480 | emojis-list@^3.0.0: 481 | version "3.0.0" 482 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" 483 | integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== 484 | 485 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 486 | version "1.4.4" 487 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 488 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 489 | dependencies: 490 | once "^1.4.0" 491 | 492 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 493 | version "1.0.5" 494 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 495 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 496 | 497 | esprima@^4.0.0: 498 | version "4.0.1" 499 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 500 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 501 | 502 | estree-util-attach-comments@^1.0.0: 503 | version "1.0.0" 504 | resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-1.0.0.tgz#51d280e458ce85dec0b813bd96d2ce98eae8a3f2" 505 | integrity sha512-sL7dTwFGqzelPlB56lRZY1CC/yDxCe365WQpxNd49ispL40Yv8Tv4SmteGbvZeFwShOOVKfMlo4jrVvwoaMosA== 506 | 507 | estree-util-is-identifier-name@^1.0.0, estree-util-is-identifier-name@^1.1.0: 508 | version "1.1.0" 509 | resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-1.1.0.tgz#2e3488ea06d9ea2face116058864f6370b37456d" 510 | integrity sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ== 511 | 512 | estree-walker@^2.0.0, estree-walker@^2.0.2: 513 | version "2.0.2" 514 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 515 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 516 | 517 | execa@^0.8.0: 518 | version "0.8.0" 519 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" 520 | integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= 521 | dependencies: 522 | cross-spawn "^5.0.1" 523 | get-stream "^3.0.0" 524 | is-stream "^1.1.0" 525 | npm-run-path "^2.0.0" 526 | p-finally "^1.0.0" 527 | signal-exit "^3.0.0" 528 | strip-eof "^1.0.0" 529 | 530 | ext-list@^2.0.0: 531 | version "2.2.2" 532 | resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" 533 | integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== 534 | dependencies: 535 | mime-db "^1.28.0" 536 | 537 | ext-name@^5.0.0: 538 | version "5.0.0" 539 | resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" 540 | integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== 541 | dependencies: 542 | ext-list "^2.0.0" 543 | sort-keys-length "^1.0.0" 544 | 545 | extend-shallow@^2.0.1: 546 | version "2.0.1" 547 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 548 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 549 | dependencies: 550 | is-extendable "^0.1.0" 551 | 552 | extend@^3.0.0: 553 | version "3.0.2" 554 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 555 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 556 | 557 | fd-slicer@~1.1.0: 558 | version "1.1.0" 559 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 560 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 561 | dependencies: 562 | pend "~1.2.0" 563 | 564 | file-type@^11.1.0: 565 | version "11.1.0" 566 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-11.1.0.tgz#93780f3fed98b599755d846b99a1617a2ad063b8" 567 | integrity sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g== 568 | 569 | file-type@^3.8.0: 570 | version "3.9.0" 571 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" 572 | integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= 573 | 574 | file-type@^4.2.0: 575 | version "4.4.0" 576 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" 577 | integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU= 578 | 579 | file-type@^5.2.0: 580 | version "5.2.0" 581 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" 582 | integrity sha1-LdvqfHP/42No365J3DOMBYwritY= 583 | 584 | file-type@^6.1.0: 585 | version "6.2.0" 586 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" 587 | integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== 588 | 589 | filename-reserved-regex@^2.0.0: 590 | version "2.0.0" 591 | resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" 592 | integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= 593 | 594 | filenamify@^3.0.0: 595 | version "3.0.0" 596 | resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-3.0.0.tgz#9603eb688179f8c5d40d828626dcbb92c3a4672c" 597 | integrity sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g== 598 | dependencies: 599 | filename-reserved-regex "^2.0.0" 600 | strip-outer "^1.0.0" 601 | trim-repeated "^1.0.0" 602 | 603 | focus-visible@^5.1.0: 604 | version "5.2.0" 605 | resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" 606 | integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== 607 | 608 | from2@^2.1.1: 609 | version "2.3.0" 610 | resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" 611 | integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= 612 | dependencies: 613 | inherits "^2.0.1" 614 | readable-stream "^2.0.0" 615 | 616 | fs-constants@^1.0.0: 617 | version "1.0.0" 618 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 619 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 620 | 621 | get-stream@3.0.0, get-stream@^3.0.0: 622 | version "3.0.0" 623 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 624 | integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 625 | 626 | get-stream@^2.2.0: 627 | version "2.3.1" 628 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" 629 | integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= 630 | dependencies: 631 | object-assign "^4.0.1" 632 | pinkie-promise "^2.0.0" 633 | 634 | get-stream@^4.1.0: 635 | version "4.1.0" 636 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 637 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 638 | dependencies: 639 | pump "^3.0.0" 640 | 641 | github-slugger@^1.3.0: 642 | version "1.3.0" 643 | resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.3.0.tgz#9bd0a95c5efdfc46005e82a906ef8e2a059124c9" 644 | integrity sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q== 645 | dependencies: 646 | emoji-regex ">=6.0.0 <=6.1.1" 647 | 648 | got@^8.3.1: 649 | version "8.3.2" 650 | resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" 651 | integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== 652 | dependencies: 653 | "@sindresorhus/is" "^0.7.0" 654 | cacheable-request "^2.1.1" 655 | decompress-response "^3.3.0" 656 | duplexer3 "^0.1.4" 657 | get-stream "^3.0.0" 658 | into-stream "^3.1.0" 659 | is-retry-allowed "^1.1.0" 660 | isurl "^1.0.0-alpha5" 661 | lowercase-keys "^1.0.0" 662 | mimic-response "^1.0.0" 663 | p-cancelable "^0.4.0" 664 | p-timeout "^2.0.1" 665 | pify "^3.0.0" 666 | safe-buffer "^5.1.1" 667 | timed-out "^4.0.1" 668 | url-parse-lax "^3.0.0" 669 | url-to-options "^1.0.1" 670 | 671 | graceful-fs@^4.1.10, graceful-fs@^4.2.6: 672 | version "4.2.6" 673 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" 674 | integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== 675 | 676 | grapheme-splitter@^1.0.4: 677 | version "1.0.4" 678 | resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" 679 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== 680 | 681 | gray-matter@^4.0.2: 682 | version "4.0.3" 683 | resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" 684 | integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== 685 | dependencies: 686 | js-yaml "^3.13.1" 687 | kind-of "^6.0.2" 688 | section-matter "^1.0.0" 689 | strip-bom-string "^1.0.0" 690 | 691 | has-flag@^2.0.0: 692 | version "2.0.0" 693 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 694 | integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= 695 | 696 | has-symbol-support-x@^1.4.1: 697 | version "1.4.2" 698 | resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" 699 | integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== 700 | 701 | has-to-string-tag-x@^1.2.0: 702 | version "1.4.1" 703 | resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" 704 | integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== 705 | dependencies: 706 | has-symbol-support-x "^1.4.1" 707 | 708 | hast-util-embedded@^1.0.0: 709 | version "1.0.6" 710 | resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-1.0.6.tgz#ea7007323351cc43e19e1d6256b7cde66ad1aa03" 711 | integrity sha512-JQMW+TJe0UAIXZMjCJ4Wf6ayDV9Yv3PBDPsHD4ExBpAspJ6MOcCX+nzVF+UJVv7OqPcg852WEMSHQPoRA+FVSw== 712 | dependencies: 713 | hast-util-is-element "^1.1.0" 714 | 715 | hast-util-is-element@^1.0.0, hast-util-is-element@^1.1.0: 716 | version "1.1.0" 717 | resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" 718 | integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== 719 | 720 | hast-util-to-estree@^1.1.0: 721 | version "1.4.0" 722 | resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-1.4.0.tgz#896ef9150a3f5cfbaff37334f75f31d6a324bab6" 723 | integrity sha512-CiOAIESUKkSOcYbvTth9+yM28z5ArpsYqxWc7LWJxOx975WRUBDjvVuuzZR2o09BNlkf7bp8G2GlOHepBRKJ8Q== 724 | dependencies: 725 | comma-separated-tokens "^1.0.0" 726 | estree-util-attach-comments "^1.0.0" 727 | estree-util-is-identifier-name "^1.1.0" 728 | hast-util-whitespace "^1.0.0" 729 | property-information "^5.0.0" 730 | space-separated-tokens "^1.0.0" 731 | style-to-object "^0.3.0" 732 | unist-util-position "^3.1.0" 733 | zwitch "^1.0.0" 734 | 735 | hast-util-whitespace@^1.0.0, hast-util-whitespace@^1.0.4: 736 | version "1.0.4" 737 | resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" 738 | integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== 739 | 740 | http-cache-semantics@3.8.1: 741 | version "3.8.1" 742 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" 743 | integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== 744 | 745 | ieee754@^1.1.13: 746 | version "1.2.1" 747 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 748 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 749 | 750 | inherits@^2.0.1, inherits@~2.0.3: 751 | version "2.0.4" 752 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 753 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 754 | 755 | inline-style-parser@0.1.1: 756 | version "0.1.1" 757 | resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" 758 | integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== 759 | 760 | intersection-observer@^0.12.0: 761 | version "0.12.0" 762 | resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.0.tgz#6c84628f67ce8698e5f9ccf857d97718745837aa" 763 | integrity sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ== 764 | 765 | into-stream@^3.1.0: 766 | version "3.1.0" 767 | resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" 768 | integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= 769 | dependencies: 770 | from2 "^2.1.1" 771 | p-is-promise "^1.1.0" 772 | 773 | is-alphabetical@^1.0.0: 774 | version "1.0.4" 775 | resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" 776 | integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== 777 | 778 | is-alphanumerical@^1.0.0: 779 | version "1.0.4" 780 | resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" 781 | integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== 782 | dependencies: 783 | is-alphabetical "^1.0.0" 784 | is-decimal "^1.0.0" 785 | 786 | is-buffer@^2.0.0: 787 | version "2.0.5" 788 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" 789 | integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== 790 | 791 | is-decimal@^1.0.0: 792 | version "1.0.4" 793 | resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" 794 | integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== 795 | 796 | is-extendable@^0.1.0: 797 | version "0.1.1" 798 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 799 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 800 | 801 | is-hexadecimal@^1.0.0: 802 | version "1.0.4" 803 | resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" 804 | integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== 805 | 806 | is-natural-number@^4.0.1: 807 | version "4.0.1" 808 | resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" 809 | integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= 810 | 811 | is-object@^1.0.1: 812 | version "1.0.2" 813 | resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" 814 | integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== 815 | 816 | is-plain-obj@^1.0.0: 817 | version "1.1.0" 818 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 819 | integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= 820 | 821 | is-plain-obj@^2.0.0: 822 | version "2.1.0" 823 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 824 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 825 | 826 | is-reference@^1.1.4: 827 | version "1.2.1" 828 | resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" 829 | integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== 830 | dependencies: 831 | "@types/estree" "*" 832 | 833 | is-retry-allowed@^1.1.0: 834 | version "1.2.0" 835 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" 836 | integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== 837 | 838 | is-stream@^1.1.0: 839 | version "1.1.0" 840 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 841 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 842 | 843 | isarray@~1.0.0: 844 | version "1.0.0" 845 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 846 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 847 | 848 | isexe@^2.0.0: 849 | version "2.0.0" 850 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 851 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 852 | 853 | isurl@^1.0.0-alpha5: 854 | version "1.0.0" 855 | resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" 856 | integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== 857 | dependencies: 858 | has-to-string-tag-x "^1.2.0" 859 | is-object "^1.0.1" 860 | 861 | "js-tokens@^3.0.0 || ^4.0.0": 862 | version "4.0.0" 863 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 864 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 865 | 866 | js-yaml@^3.13.1: 867 | version "3.14.1" 868 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 869 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 870 | dependencies: 871 | argparse "^1.0.7" 872 | esprima "^4.0.0" 873 | 874 | json-buffer@3.0.0: 875 | version "3.0.0" 876 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 877 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 878 | 879 | json5@^2.1.2: 880 | version "2.2.3" 881 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 882 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 883 | 884 | keyv@3.0.0: 885 | version "3.0.0" 886 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" 887 | integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== 888 | dependencies: 889 | json-buffer "3.0.0" 890 | 891 | kind-of@^6.0.0, kind-of@^6.0.2: 892 | version "6.0.3" 893 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 894 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 895 | 896 | loader-utils@^2.0.0: 897 | version "2.0.4" 898 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" 899 | integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== 900 | dependencies: 901 | big.js "^5.2.2" 902 | emojis-list "^3.0.0" 903 | json5 "^2.1.2" 904 | 905 | longest-streak@^2.0.0: 906 | version "2.0.4" 907 | resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" 908 | integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== 909 | 910 | loose-envify@^1.0.0, loose-envify@^1.1.0: 911 | version "1.4.0" 912 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 913 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 914 | dependencies: 915 | js-tokens "^3.0.0 || ^4.0.0" 916 | 917 | lowercase-keys@1.0.0: 918 | version "1.0.0" 919 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 920 | integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= 921 | 922 | lowercase-keys@^1.0.0: 923 | version "1.0.1" 924 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 925 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 926 | 927 | lru-cache@^4.0.1: 928 | version "4.1.5" 929 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 930 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 931 | dependencies: 932 | pseudomap "^1.0.2" 933 | yallist "^2.1.2" 934 | 935 | make-dir@^1.0.0: 936 | version "1.3.0" 937 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 938 | integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== 939 | dependencies: 940 | pify "^3.0.0" 941 | 942 | make-dir@^2.1.0: 943 | version "2.1.0" 944 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" 945 | integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== 946 | dependencies: 947 | pify "^4.0.1" 948 | semver "^5.6.0" 949 | 950 | match-sorter@^4.2.0: 951 | version "4.2.1" 952 | resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-4.2.1.tgz#575b4b3737185ba9518b67612b66877ea0b37358" 953 | integrity sha512-s+3h9TiZU9U1pWhIERHf8/f4LmBN6IXaRgo2CI17+XGByGS1GvG5VvXK9pcGyCjGe3WM3mSYRC3ipGrd5UEVgw== 954 | dependencies: 955 | "@babel/runtime" "^7.10.5" 956 | remove-accents "0.4.2" 957 | 958 | mdast-squeeze-paragraphs@^4.0.0: 959 | version "4.0.0" 960 | resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" 961 | integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== 962 | dependencies: 963 | unist-util-remove "^2.0.0" 964 | 965 | mdast-util-definitions@^4.0.0: 966 | version "4.0.0" 967 | resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" 968 | integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== 969 | dependencies: 970 | unist-util-visit "^2.0.0" 971 | 972 | mdast-util-from-markdown@^0.8.0: 973 | version "0.8.5" 974 | resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" 975 | integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== 976 | dependencies: 977 | "@types/mdast" "^3.0.0" 978 | mdast-util-to-string "^2.0.0" 979 | micromark "~2.11.0" 980 | parse-entities "^2.0.0" 981 | unist-util-stringify-position "^2.0.0" 982 | 983 | mdast-util-mdx-expression@~0.1.0: 984 | version "0.1.1" 985 | resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-0.1.1.tgz#fa1a04a5ea6777b0e8db6c120adf03088595df95" 986 | integrity sha512-SoO8y1B9NjMOYlNdwXMchuTVvqSTlUmXm1P5QvZNPv7OH7aa8qJV+3aA+vl1DHK9Vk1uZAlgwokjvDQhS6bINA== 987 | dependencies: 988 | strip-indent "^3.0.0" 989 | 990 | mdast-util-mdx-jsx@~0.1.0: 991 | version "0.1.4" 992 | resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-0.1.4.tgz#868371b90b17337b4f072a07021f7ce19612cf34" 993 | integrity sha512-67KOAvCmypBSpr+AJEAVQg1Obig5Wnguo4ETTxASe5WVP4TLt57bZjDX/9EW5sWYQsO4gPqLxkUOlypVn5rkhg== 994 | dependencies: 995 | mdast-util-to-markdown "^0.6.0" 996 | parse-entities "^2.0.0" 997 | stringify-entities "^3.1.0" 998 | unist-util-remove-position "^3.0.0" 999 | unist-util-stringify-position "^2.0.0" 1000 | vfile-message "^2.0.0" 1001 | 1002 | mdast-util-mdx@^0.1.1: 1003 | version "0.1.1" 1004 | resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-0.1.1.tgz#16acbc6cabe33f4cebeb63fa9cf8be5da1d56fbf" 1005 | integrity sha512-9nncdnHNYSb4HNxY3AwE6gU632jhbXsDGXe9PkkJoEawYWJ8tTwmEOHGlGa2TCRidtkd6FF5I8ogDU9pTDlQyA== 1006 | dependencies: 1007 | mdast-util-mdx-expression "~0.1.0" 1008 | mdast-util-mdx-jsx "~0.1.0" 1009 | mdast-util-mdxjs-esm "~0.1.0" 1010 | mdast-util-to-markdown "^0.6.1" 1011 | 1012 | mdast-util-mdxjs-esm@~0.1.0: 1013 | version "0.1.1" 1014 | resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-0.1.1.tgz#69134a0dad71a59a9e0e9cfdc0633dde31dff69a" 1015 | integrity sha512-kBiYeashz+nuhfv+712nc4THQhzXIH2gBFUDbuLxuDCqU/fZeg+9FAcdRBx9E13dkpk1p2Xwufzs3wsGJ+mISQ== 1016 | 1017 | mdast-util-to-hast@^10.1.0: 1018 | version "10.2.0" 1019 | resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" 1020 | integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== 1021 | dependencies: 1022 | "@types/mdast" "^3.0.0" 1023 | "@types/unist" "^2.0.0" 1024 | mdast-util-definitions "^4.0.0" 1025 | mdurl "^1.0.0" 1026 | unist-builder "^2.0.0" 1027 | unist-util-generated "^1.0.0" 1028 | unist-util-position "^3.0.0" 1029 | unist-util-visit "^2.0.0" 1030 | 1031 | mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1: 1032 | version "0.6.5" 1033 | resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" 1034 | integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== 1035 | dependencies: 1036 | "@types/unist" "^2.0.0" 1037 | longest-streak "^2.0.0" 1038 | mdast-util-to-string "^2.0.0" 1039 | parse-entities "^2.0.0" 1040 | repeat-string "^1.0.0" 1041 | zwitch "^1.0.0" 1042 | 1043 | mdast-util-to-string@^2.0.0: 1044 | version "2.0.0" 1045 | resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" 1046 | integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== 1047 | 1048 | mdurl@^1.0.0: 1049 | version "1.0.1" 1050 | resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" 1051 | integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= 1052 | 1053 | micromark-extension-mdx-expression@^0.3.0, micromark-extension-mdx-expression@^0.3.2, micromark-extension-mdx-expression@~0.3.0: 1054 | version "0.3.2" 1055 | resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-0.3.2.tgz#827592af50116110dc9ee27201a73c037e61aa27" 1056 | integrity sha512-Sh8YHLSAlbm/7TZkVKEC4wDcJE8XhVpZ9hUXBue1TcAicrrzs/oXu7PHH3NcyMemjGyMkiVS34Y0AHC5KG3y4A== 1057 | dependencies: 1058 | micromark "~2.11.0" 1059 | vfile-message "^2.0.0" 1060 | 1061 | micromark-extension-mdx-jsx@~0.3.0: 1062 | version "0.3.3" 1063 | resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-0.3.3.tgz#68e8e700f2860e32e96ff48e44afb7465d462e21" 1064 | integrity sha512-kG3VwaJlzAPdtIVDznfDfBfNGMTIzsHqKpTmMlew/iPnUCDRNkX+48ElpaOzXAtK5axtpFKE3Hu3VBriZDnRTQ== 1065 | dependencies: 1066 | estree-util-is-identifier-name "^1.0.0" 1067 | micromark "~2.11.0" 1068 | micromark-extension-mdx-expression "^0.3.2" 1069 | vfile-message "^2.0.0" 1070 | 1071 | micromark-extension-mdx-md@~0.1.0: 1072 | version "0.1.1" 1073 | resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-0.1.1.tgz#277b4e82ada37bfdf222f6c3530e20563d73e064" 1074 | integrity sha512-emlFQEyfx/2aPhwyEqeNDfKE6jPH1cvLTb5ANRo4qZBjaUObnzjLRdzK8RJ4Xc8+/dOmKN8TTRxFnOYF5/EAwQ== 1075 | 1076 | micromark-extension-mdx@^0.2.0: 1077 | version "0.2.1" 1078 | resolved "https://registry.yarnpkg.com/micromark-extension-mdx/-/micromark-extension-mdx-0.2.1.tgz#074b85013909481d23f382f17dced7b4cd173c0a" 1079 | integrity sha512-J+nZegf1ExPz1Ft6shxu8M9WfRom1gwRIx6gpJK1SEEqKzY5LjOR1d/WHRtjwV4KoMXrL53+PoN7T1Rw1euJew== 1080 | dependencies: 1081 | micromark "~2.11.0" 1082 | micromark-extension-mdx-expression "~0.3.0" 1083 | micromark-extension-mdx-jsx "~0.3.0" 1084 | micromark-extension-mdx-md "~0.1.0" 1085 | 1086 | micromark-extension-mdxjs-esm@~0.3.0: 1087 | version "0.3.1" 1088 | resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-0.3.1.tgz#40a710fe145b381e39a2930db2813f3efaa014ac" 1089 | integrity sha512-tuLgcELrgY1a5tPxjk+MrI3BdYtwW67UaHZdzKiDYD8loNbxwIscfdagI6A2BKuAkrfeyHF6FW3B8KuDK3ZMXw== 1090 | dependencies: 1091 | micromark "~2.11.0" 1092 | micromark-extension-mdx-expression "^0.3.0" 1093 | vfile-message "^2.0.0" 1094 | 1095 | micromark-extension-mdxjs@^0.3.0: 1096 | version "0.3.0" 1097 | resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-0.3.0.tgz#35ecebaf14b8377b6046b659780fd3111196eccd" 1098 | integrity sha512-NQuiYA0lw+eFDtSG4+c7ao3RG9dM4P0Kx/sn8OLyPhxtIc6k+9n14k5VfLxRKfAxYRTo8c5PLZPaRNmslGWxJw== 1099 | dependencies: 1100 | acorn "^8.0.0" 1101 | acorn-jsx "^5.0.0" 1102 | micromark "~2.11.0" 1103 | micromark-extension-mdx-expression "~0.3.0" 1104 | micromark-extension-mdx-jsx "~0.3.0" 1105 | micromark-extension-mdx-md "~0.1.0" 1106 | micromark-extension-mdxjs-esm "~0.3.0" 1107 | 1108 | micromark@~2.11.0: 1109 | version "2.11.4" 1110 | resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" 1111 | integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== 1112 | dependencies: 1113 | debug "^4.0.0" 1114 | parse-entities "^2.0.0" 1115 | 1116 | mime-db@^1.28.0: 1117 | version "1.48.0" 1118 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" 1119 | integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== 1120 | 1121 | mimic-response@^1.0.0: 1122 | version "1.0.1" 1123 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1124 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 1125 | 1126 | min-indent@^1.0.0: 1127 | version "1.0.1" 1128 | resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" 1129 | integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== 1130 | 1131 | ms@2.1.2: 1132 | version "2.1.2" 1133 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1134 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1135 | 1136 | nanoid@^3.1.30: 1137 | version "3.3.1" 1138 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" 1139 | integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== 1140 | 1141 | next-themes@^0.0.8: 1142 | version "0.0.8" 1143 | resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.0.8.tgz#2a1748317085afbc2509e2c32bd04af4f0f6cb7d" 1144 | integrity sha512-dyrh+/bZW4hkecFEg2rfwOLLzU2UnE7KfiwcV0mIwkPrO+1n1WvwkC8nabgKA5Eoi8stkYfjmA72FxTaWEOHtg== 1145 | 1146 | next@12.1.0: 1147 | version "12.1.0" 1148 | resolved "https://registry.yarnpkg.com/next/-/next-12.1.0.tgz#c33d753b644be92fc58e06e5a214f143da61dd5d" 1149 | integrity sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q== 1150 | dependencies: 1151 | "@next/env" "12.1.0" 1152 | caniuse-lite "^1.0.30001283" 1153 | postcss "8.4.5" 1154 | styled-jsx "5.0.0" 1155 | use-subscription "1.5.1" 1156 | optionalDependencies: 1157 | "@next/swc-android-arm64" "12.1.0" 1158 | "@next/swc-darwin-arm64" "12.1.0" 1159 | "@next/swc-darwin-x64" "12.1.0" 1160 | "@next/swc-linux-arm-gnueabihf" "12.1.0" 1161 | "@next/swc-linux-arm64-gnu" "12.1.0" 1162 | "@next/swc-linux-arm64-musl" "12.1.0" 1163 | "@next/swc-linux-x64-gnu" "12.1.0" 1164 | "@next/swc-linux-x64-musl" "12.1.0" 1165 | "@next/swc-win32-arm64-msvc" "12.1.0" 1166 | "@next/swc-win32-ia32-msvc" "12.1.0" 1167 | "@next/swc-win32-x64-msvc" "12.1.0" 1168 | 1169 | nextra-theme-docs@^1.1.7: 1170 | version "1.1.7" 1171 | resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-1.1.7.tgz#f2da363912213d7a2c90cfc97b8ad0cf4d9f727c" 1172 | integrity sha512-7s/Er3TVS43u//z2DdBOw4NJOtK4dF+s/2K20hf2z/FM2lVajMJG7ZE2LhQF0xNEH8qQTuPw77xGU1YxumsWFA== 1173 | dependencies: 1174 | "@mdx-js/react" "^1.6.16" 1175 | "@reach/skip-nav" "^0.11.2" 1176 | "@researchgate/react-intersection-observer" "^1.3.5" 1177 | classnames "^2.2.6" 1178 | focus-visible "^5.1.0" 1179 | github-slugger "^1.3.0" 1180 | grapheme-splitter "^1.0.4" 1181 | intersection-observer "^0.12.0" 1182 | match-sorter "^4.2.0" 1183 | next-themes "^0.0.8" 1184 | prism-react-renderer "^1.1.1" 1185 | react-innertext "^1.1.5" 1186 | title "^3.4.2" 1187 | 1188 | nextra@^0.4.5: 1189 | version "0.4.5" 1190 | resolved "https://registry.yarnpkg.com/nextra/-/nextra-0.4.5.tgz#3e0b600307ad22ee3cc4d450b6a3840794dc70f4" 1191 | integrity sha512-Hg70ikzfhg9k5IK3RPcIDStAr6lO6+xsT7mm6Wsd++AD6QaQWa0xdv53VI7NYLUlEqbF4VDCkaAwMAQDRR2S2g== 1192 | dependencies: 1193 | "@mdx-js/loader" "^2.0.0-next.8" 1194 | download "^8.0.0" 1195 | graceful-fs "^4.2.6" 1196 | gray-matter "^4.0.2" 1197 | loader-utils "^2.0.0" 1198 | remark "^13.0.0" 1199 | slash "^3.0.0" 1200 | strip-markdown "^4.0.0" 1201 | 1202 | normalize-url@2.0.1: 1203 | version "2.0.1" 1204 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" 1205 | integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== 1206 | dependencies: 1207 | prepend-http "^2.0.0" 1208 | query-string "^5.0.1" 1209 | sort-keys "^2.0.0" 1210 | 1211 | npm-run-path@^2.0.0: 1212 | version "2.0.2" 1213 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1214 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 1215 | dependencies: 1216 | path-key "^2.0.0" 1217 | 1218 | object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 1219 | version "4.1.1" 1220 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1221 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1222 | 1223 | once@^1.3.1, once@^1.4.0: 1224 | version "1.4.0" 1225 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1226 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1227 | dependencies: 1228 | wrappy "1" 1229 | 1230 | p-cancelable@^0.4.0: 1231 | version "0.4.1" 1232 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" 1233 | integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== 1234 | 1235 | p-event@^2.1.0: 1236 | version "2.3.1" 1237 | resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" 1238 | integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== 1239 | dependencies: 1240 | p-timeout "^2.0.1" 1241 | 1242 | p-finally@^1.0.0: 1243 | version "1.0.0" 1244 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1245 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1246 | 1247 | p-is-promise@^1.1.0: 1248 | version "1.1.0" 1249 | resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" 1250 | integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= 1251 | 1252 | p-timeout@^2.0.1: 1253 | version "2.0.1" 1254 | resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" 1255 | integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== 1256 | dependencies: 1257 | p-finally "^1.0.0" 1258 | 1259 | parse-entities@^2.0.0: 1260 | version "2.0.0" 1261 | resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" 1262 | integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== 1263 | dependencies: 1264 | character-entities "^1.0.0" 1265 | character-entities-legacy "^1.0.0" 1266 | character-reference-invalid "^1.0.0" 1267 | is-alphanumerical "^1.0.0" 1268 | is-decimal "^1.0.0" 1269 | is-hexadecimal "^1.0.0" 1270 | 1271 | path-key@^2.0.0: 1272 | version "2.0.1" 1273 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1274 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1275 | 1276 | pend@~1.2.0: 1277 | version "1.2.0" 1278 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 1279 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 1280 | 1281 | periscopic@^2.0.0: 1282 | version "2.0.3" 1283 | resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-2.0.3.tgz#326e16c46068172ca9a9d20af1a684cd0796fa99" 1284 | integrity sha512-FuCZe61mWxQOJAQFEfmt9FjzebRlcpFz8sFPbyaCKtdusPkMEbA9ey0eARnRav5zAhmXznhaQkKGFAPn7X9NUw== 1285 | dependencies: 1286 | estree-walker "^2.0.2" 1287 | is-reference "^1.1.4" 1288 | 1289 | picocolors@^1.0.0: 1290 | version "1.0.0" 1291 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1292 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1293 | 1294 | pify@^2.3.0: 1295 | version "2.3.0" 1296 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1297 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1298 | 1299 | pify@^3.0.0: 1300 | version "3.0.0" 1301 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1302 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 1303 | 1304 | pify@^4.0.1: 1305 | version "4.0.1" 1306 | resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 1307 | integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== 1308 | 1309 | pinkie-promise@^2.0.0: 1310 | version "2.0.1" 1311 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1312 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1313 | dependencies: 1314 | pinkie "^2.0.0" 1315 | 1316 | pinkie@^2.0.0: 1317 | version "2.0.4" 1318 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1319 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1320 | 1321 | postcss@8.4.5: 1322 | version "8.4.5" 1323 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" 1324 | integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== 1325 | dependencies: 1326 | nanoid "^3.1.30" 1327 | picocolors "^1.0.0" 1328 | source-map-js "^1.0.1" 1329 | 1330 | prepend-http@^2.0.0: 1331 | version "2.0.0" 1332 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 1333 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 1334 | 1335 | prism-react-renderer@^1.1.1: 1336 | version "1.2.1" 1337 | resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz#392460acf63540960e5e3caa699d851264e99b89" 1338 | integrity sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg== 1339 | 1340 | process-nextick-args@~2.0.0: 1341 | version "2.0.1" 1342 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1343 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1344 | 1345 | property-information@^5.0.0: 1346 | version "5.6.0" 1347 | resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" 1348 | integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== 1349 | dependencies: 1350 | xtend "^4.0.0" 1351 | 1352 | pseudomap@^1.0.2: 1353 | version "1.0.2" 1354 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1355 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 1356 | 1357 | pump@^3.0.0: 1358 | version "3.0.0" 1359 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1360 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1361 | dependencies: 1362 | end-of-stream "^1.1.0" 1363 | once "^1.3.1" 1364 | 1365 | query-string@^5.0.1: 1366 | version "5.1.1" 1367 | resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" 1368 | integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== 1369 | dependencies: 1370 | decode-uri-component "^0.2.0" 1371 | object-assign "^4.1.0" 1372 | strict-uri-encode "^1.0.0" 1373 | 1374 | react-dom@17.0.2: 1375 | version "17.0.2" 1376 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" 1377 | integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== 1378 | dependencies: 1379 | loose-envify "^1.1.0" 1380 | object-assign "^4.1.1" 1381 | scheduler "^0.20.2" 1382 | 1383 | react-innertext@^1.1.5: 1384 | version "1.1.5" 1385 | resolved "https://registry.yarnpkg.com/react-innertext/-/react-innertext-1.1.5.tgz#8147ac54db3f7067d95f49e2d2c05a720d27d8d0" 1386 | integrity sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q== 1387 | 1388 | react@17.0.2: 1389 | version "17.0.2" 1390 | resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" 1391 | integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== 1392 | dependencies: 1393 | loose-envify "^1.1.0" 1394 | object-assign "^4.1.1" 1395 | 1396 | readable-stream@^2.0.0, readable-stream@^2.3.0, readable-stream@^2.3.5: 1397 | version "2.3.7" 1398 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1399 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1400 | dependencies: 1401 | core-util-is "~1.0.0" 1402 | inherits "~2.0.3" 1403 | isarray "~1.0.0" 1404 | process-nextick-args "~2.0.0" 1405 | safe-buffer "~5.1.1" 1406 | string_decoder "~1.1.1" 1407 | util-deprecate "~1.0.1" 1408 | 1409 | regenerator-runtime@^0.13.4: 1410 | version "0.13.7" 1411 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" 1412 | integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== 1413 | 1414 | rehype-minify-whitespace@^4.0.0: 1415 | version "4.0.5" 1416 | resolved "https://registry.yarnpkg.com/rehype-minify-whitespace/-/rehype-minify-whitespace-4.0.5.tgz#5b4781786116216f6d5d7ceadf84e2489dd7b3cd" 1417 | integrity sha512-QC3Z+bZ5wbv+jGYQewpAAYhXhzuH/TVRx7z08rurBmh9AbG8Nu8oJnvs9LWj43Fd/C7UIhXoQ7Wddgt+ThWK5g== 1418 | dependencies: 1419 | hast-util-embedded "^1.0.0" 1420 | hast-util-is-element "^1.0.0" 1421 | hast-util-whitespace "^1.0.4" 1422 | unist-util-is "^4.0.0" 1423 | 1424 | remark-mdx@2.0.0-next.9: 1425 | version "2.0.0-next.9" 1426 | resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.0.0-next.9.tgz#3e2088550ddd4264ce48bca15fb297569d369e65" 1427 | integrity sha512-I5dCKP5VE18SMd5ycIeeEk8Hl6oaldUY6PIvjrfm65l7d0QRnLqknb62O2g3QEmOxCswcHTtwITtz6rfUIVs+A== 1428 | dependencies: 1429 | mdast-util-mdx "^0.1.1" 1430 | micromark-extension-mdx "^0.2.0" 1431 | micromark-extension-mdxjs "^0.3.0" 1432 | 1433 | remark-parse@^9.0.0: 1434 | version "9.0.0" 1435 | resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" 1436 | integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== 1437 | dependencies: 1438 | mdast-util-from-markdown "^0.8.0" 1439 | 1440 | remark-squeeze-paragraphs@^4.0.0: 1441 | version "4.0.0" 1442 | resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" 1443 | integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== 1444 | dependencies: 1445 | mdast-squeeze-paragraphs "^4.0.0" 1446 | 1447 | remark-stringify@^9.0.0: 1448 | version "9.0.1" 1449 | resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" 1450 | integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== 1451 | dependencies: 1452 | mdast-util-to-markdown "^0.6.0" 1453 | 1454 | remark@^13.0.0: 1455 | version "13.0.0" 1456 | resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" 1457 | integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== 1458 | dependencies: 1459 | remark-parse "^9.0.0" 1460 | remark-stringify "^9.0.0" 1461 | unified "^9.1.0" 1462 | 1463 | remove-accents@0.4.2: 1464 | version "0.4.2" 1465 | resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" 1466 | integrity sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U= 1467 | 1468 | repeat-string@^1.0.0, repeat-string@^1.5.4: 1469 | version "1.6.1" 1470 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1471 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 1472 | 1473 | responselike@1.0.2: 1474 | version "1.0.2" 1475 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1476 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 1477 | dependencies: 1478 | lowercase-keys "^1.0.0" 1479 | 1480 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1481 | version "5.1.2" 1482 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1483 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1484 | 1485 | safe-buffer@^5.1.1: 1486 | version "5.2.1" 1487 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1488 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1489 | 1490 | scheduler@^0.20.2: 1491 | version "0.20.2" 1492 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" 1493 | integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== 1494 | dependencies: 1495 | loose-envify "^1.1.0" 1496 | object-assign "^4.1.1" 1497 | 1498 | section-matter@^1.0.0: 1499 | version "1.0.0" 1500 | resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" 1501 | integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== 1502 | dependencies: 1503 | extend-shallow "^2.0.1" 1504 | kind-of "^6.0.0" 1505 | 1506 | seek-bzip@^1.0.5: 1507 | version "1.0.6" 1508 | resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" 1509 | integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== 1510 | dependencies: 1511 | commander "^2.8.1" 1512 | 1513 | semver@^5.6.0: 1514 | version "5.7.2" 1515 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" 1516 | integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== 1517 | 1518 | shebang-command@^1.2.0: 1519 | version "1.2.0" 1520 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1521 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1522 | dependencies: 1523 | shebang-regex "^1.0.0" 1524 | 1525 | shebang-regex@^1.0.0: 1526 | version "1.0.0" 1527 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1528 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1529 | 1530 | signal-exit@^3.0.0: 1531 | version "3.0.3" 1532 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1533 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1534 | 1535 | slash@^3.0.0: 1536 | version "3.0.0" 1537 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1538 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1539 | 1540 | sort-keys-length@^1.0.0: 1541 | version "1.0.1" 1542 | resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" 1543 | integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= 1544 | dependencies: 1545 | sort-keys "^1.0.0" 1546 | 1547 | sort-keys@^1.0.0: 1548 | version "1.1.2" 1549 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" 1550 | integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= 1551 | dependencies: 1552 | is-plain-obj "^1.0.0" 1553 | 1554 | sort-keys@^2.0.0: 1555 | version "2.0.0" 1556 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" 1557 | integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= 1558 | dependencies: 1559 | is-plain-obj "^1.0.0" 1560 | 1561 | source-map-js@^1.0.1: 1562 | version "1.0.2" 1563 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1564 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1565 | 1566 | space-separated-tokens@^1.0.0: 1567 | version "1.1.5" 1568 | resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" 1569 | integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== 1570 | 1571 | sprintf-js@~1.0.2: 1572 | version "1.0.3" 1573 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1574 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1575 | 1576 | strict-uri-encode@^1.0.0: 1577 | version "1.1.0" 1578 | resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" 1579 | integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= 1580 | 1581 | string_decoder@~1.1.1: 1582 | version "1.1.1" 1583 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1584 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1585 | dependencies: 1586 | safe-buffer "~5.1.0" 1587 | 1588 | stringify-entities@^3.1.0: 1589 | version "3.1.0" 1590 | resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" 1591 | integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== 1592 | dependencies: 1593 | character-entities-html4 "^1.0.0" 1594 | character-entities-legacy "^1.0.0" 1595 | xtend "^4.0.0" 1596 | 1597 | strip-bom-string@^1.0.0: 1598 | version "1.0.0" 1599 | resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" 1600 | integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= 1601 | 1602 | strip-dirs@^2.0.0: 1603 | version "2.1.0" 1604 | resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" 1605 | integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== 1606 | dependencies: 1607 | is-natural-number "^4.0.1" 1608 | 1609 | strip-eof@^1.0.0: 1610 | version "1.0.0" 1611 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1612 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 1613 | 1614 | strip-indent@^3.0.0: 1615 | version "3.0.0" 1616 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" 1617 | integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== 1618 | dependencies: 1619 | min-indent "^1.0.0" 1620 | 1621 | strip-markdown@^4.0.0: 1622 | version "4.0.0" 1623 | resolved "https://registry.yarnpkg.com/strip-markdown/-/strip-markdown-4.0.0.tgz#1f48aeb5ce81b646487d9f8fbdc18f8bf1416ba2" 1624 | integrity sha512-jwoS5zwHNFjergQjg4RFzmdS4n5WOd5DXDIwRY0jye9ALYMscLWfwZVBMt4P/va5aRmm7Dlj6O4NjMuaD7609Q== 1625 | 1626 | strip-outer@^1.0.0: 1627 | version "1.0.1" 1628 | resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" 1629 | integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== 1630 | dependencies: 1631 | escape-string-regexp "^1.0.2" 1632 | 1633 | style-to-object@^0.3.0: 1634 | version "0.3.0" 1635 | resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" 1636 | integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== 1637 | dependencies: 1638 | inline-style-parser "0.1.1" 1639 | 1640 | styled-jsx@5.0.0: 1641 | version "5.0.0" 1642 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.0.tgz#816b4b92e07b1786c6b7111821750e0ba4d26e77" 1643 | integrity sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA== 1644 | 1645 | supports-color@^4.0.0: 1646 | version "4.5.0" 1647 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 1648 | integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= 1649 | dependencies: 1650 | has-flag "^2.0.0" 1651 | 1652 | tar-stream@^1.5.2: 1653 | version "1.6.2" 1654 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" 1655 | integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== 1656 | dependencies: 1657 | bl "^1.0.0" 1658 | buffer-alloc "^1.2.0" 1659 | end-of-stream "^1.0.0" 1660 | fs-constants "^1.0.0" 1661 | readable-stream "^2.3.0" 1662 | to-buffer "^1.1.1" 1663 | xtend "^4.0.0" 1664 | 1665 | through@^2.3.8: 1666 | version "2.3.8" 1667 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1668 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1669 | 1670 | timed-out@^4.0.1: 1671 | version "4.0.1" 1672 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 1673 | integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= 1674 | 1675 | title@^3.4.2: 1676 | version "3.4.3" 1677 | resolved "https://registry.yarnpkg.com/title/-/title-3.4.3.tgz#76ef6b398310a7814120634620e47849481485d3" 1678 | integrity sha512-h7KKI5jNaAjGtym8ukn4IrIF3Uae19rlhGmpMst/mB7Ipi/vkNEJkeNfDJwUXi0h+AdGmldcUYQnO+9XMcunjg== 1679 | dependencies: 1680 | arg "1.0.0" 1681 | chalk "2.3.0" 1682 | clipboardy "1.2.2" 1683 | titleize "1.0.0" 1684 | 1685 | titleize@1.0.0: 1686 | version "1.0.0" 1687 | resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" 1688 | integrity sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo= 1689 | 1690 | to-buffer@^1.1.1: 1691 | version "1.1.1" 1692 | resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" 1693 | integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== 1694 | 1695 | trim-repeated@^1.0.0: 1696 | version "1.0.0" 1697 | resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" 1698 | integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= 1699 | dependencies: 1700 | escape-string-regexp "^1.0.2" 1701 | 1702 | trough@^1.0.0: 1703 | version "1.0.5" 1704 | resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" 1705 | integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== 1706 | 1707 | tslib@^2.0.0: 1708 | version "2.2.0" 1709 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" 1710 | integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== 1711 | 1712 | unbzip2-stream@^1.0.9: 1713 | version "1.4.3" 1714 | resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" 1715 | integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== 1716 | dependencies: 1717 | buffer "^5.2.1" 1718 | through "^2.3.8" 1719 | 1720 | unified@^9.1.0, unified@^9.2.0: 1721 | version "9.2.1" 1722 | resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" 1723 | integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== 1724 | dependencies: 1725 | bail "^1.0.0" 1726 | extend "^3.0.0" 1727 | is-buffer "^2.0.0" 1728 | is-plain-obj "^2.0.0" 1729 | trough "^1.0.0" 1730 | vfile "^4.0.0" 1731 | 1732 | unist-builder@^2.0.0: 1733 | version "2.0.3" 1734 | resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" 1735 | integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== 1736 | 1737 | unist-util-generated@^1.0.0: 1738 | version "1.1.6" 1739 | resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" 1740 | integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== 1741 | 1742 | unist-util-is@^4.0.0: 1743 | version "4.1.0" 1744 | resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" 1745 | integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== 1746 | 1747 | unist-util-position@^3.0.0, unist-util-position@^3.1.0: 1748 | version "3.1.0" 1749 | resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" 1750 | integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== 1751 | 1752 | unist-util-remove-position@^3.0.0: 1753 | version "3.0.0" 1754 | resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-3.0.0.tgz#4cd19e82c8e665f462b6acfcfd0a8353235a88e9" 1755 | integrity sha512-17kIOuolVuK16LMb9KyMJlqdfCtlfQY5FjY3Sdo9iC7F5wqdXhNjMq0PBvMpkVNNnAmHxXssUW+rZ9T2zbP0Rg== 1756 | dependencies: 1757 | unist-util-visit "^2.0.0" 1758 | 1759 | unist-util-remove@^2.0.0: 1760 | version "2.1.0" 1761 | resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" 1762 | integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== 1763 | dependencies: 1764 | unist-util-is "^4.0.0" 1765 | 1766 | unist-util-stringify-position@^2.0.0: 1767 | version "2.0.3" 1768 | resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" 1769 | integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== 1770 | dependencies: 1771 | "@types/unist" "^2.0.2" 1772 | 1773 | unist-util-visit-parents@^3.0.0: 1774 | version "3.1.1" 1775 | resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" 1776 | integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== 1777 | dependencies: 1778 | "@types/unist" "^2.0.0" 1779 | unist-util-is "^4.0.0" 1780 | 1781 | unist-util-visit@^2.0.0: 1782 | version "2.0.3" 1783 | resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" 1784 | integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== 1785 | dependencies: 1786 | "@types/unist" "^2.0.0" 1787 | unist-util-is "^4.0.0" 1788 | unist-util-visit-parents "^3.0.0" 1789 | 1790 | url-parse-lax@^3.0.0: 1791 | version "3.0.0" 1792 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 1793 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 1794 | dependencies: 1795 | prepend-http "^2.0.0" 1796 | 1797 | url-to-options@^1.0.1: 1798 | version "1.0.1" 1799 | resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" 1800 | integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= 1801 | 1802 | use-subscription@1.5.1: 1803 | version "1.5.1" 1804 | resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" 1805 | integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== 1806 | dependencies: 1807 | object-assign "^4.1.1" 1808 | 1809 | util-deprecate@~1.0.1: 1810 | version "1.0.2" 1811 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1812 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1813 | 1814 | vfile-message@^2.0.0: 1815 | version "2.0.4" 1816 | resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" 1817 | integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== 1818 | dependencies: 1819 | "@types/unist" "^2.0.0" 1820 | unist-util-stringify-position "^2.0.0" 1821 | 1822 | vfile@^4.0.0: 1823 | version "4.2.1" 1824 | resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" 1825 | integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== 1826 | dependencies: 1827 | "@types/unist" "^2.0.0" 1828 | is-buffer "^2.0.0" 1829 | unist-util-stringify-position "^2.0.0" 1830 | vfile-message "^2.0.0" 1831 | 1832 | warning@^4.0.3: 1833 | version "4.0.3" 1834 | resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" 1835 | integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== 1836 | dependencies: 1837 | loose-envify "^1.0.0" 1838 | 1839 | which@^1.2.9: 1840 | version "1.3.1" 1841 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1842 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1843 | dependencies: 1844 | isexe "^2.0.0" 1845 | 1846 | wrappy@1: 1847 | version "1.0.2" 1848 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1849 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1850 | 1851 | xtend@^4.0.0: 1852 | version "4.0.2" 1853 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1854 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1855 | 1856 | yallist@^2.1.2: 1857 | version "2.1.2" 1858 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1859 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 1860 | 1861 | yauzl@^2.4.2: 1862 | version "2.10.0" 1863 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 1864 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 1865 | dependencies: 1866 | buffer-crc32 "~0.2.3" 1867 | fd-slicer "~1.1.0" 1868 | 1869 | zwitch@^1.0.0: 1870 | version "1.0.5" 1871 | resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" 1872 | integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== 1873 | --------------------------------------------------------------------------------