├── .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 |
Play
31 |
Pause
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 |
Play
31 |
Pause
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 |
Play
33 |
Pause
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 |
Play
32 |
Pause
33 |
Loop
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 |
Play
32 |
Pause
33 |
Mute
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 |
Play
32 |
Pause
33 |
onRate('0.5')}>Set rate to 0.5
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 |
Play
36 |
Pause
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 |
Toggle
32 |
Play
33 |
Pause
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 |
Play
33 |
Pause
34 |
onForward(15)}>+15
35 |
onBackward(15)}>-15
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 |
Play
33 |
Pause
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 |
Play
34 |
Pause
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 | Toggle
28 | Play
29 | Pause
30 | onForward(15)}>+15
31 | onBackward(15)}>-15
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 | onRate(e.target.value)}>
69 | 3
70 | 2
71 | 1
72 | 0.5
73 |
74 |
75 |
76 |
77 | Mute
78 | {mute ? "Unmute" : "Mute"}
79 |
80 |
81 |
82 | Loop
83 | {loop ? "Unloop" : "Loop"}
84 |
85 |
86 | )
87 | };
88 |
89 | export default Controls;
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | Manage audio in React with ease
10 |
11 |
12 | [](https://github.com/leonardomso/roover/actions?query=workflow%3ALint)
13 | [](https://bundlephobia.com/result?p=roover)
14 | [](https://www.npmjs.com/package/roover)
15 | [](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 |
Play
61 |
Pause
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 |
--------------------------------------------------------------------------------