├── .eslintrc ├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── examples └── single-file-sync │ ├── .eslintrc.js │ ├── .gitignore │ ├── README.md │ ├── components │ ├── Editor │ │ ├── Editor.module.css │ │ ├── GitHub.tsx │ │ ├── index.tsx │ │ ├── options.ts │ │ └── theme.ts │ ├── Footer │ │ ├── Footer.module.css │ │ └── index.tsx │ ├── Head │ │ └── index.tsx │ ├── Header │ │ ├── Header.module.css │ │ └── index.tsx │ └── Navbar │ │ ├── Navbar.module.css │ │ └── index.tsx │ ├── lib │ ├── constants.ts │ ├── use-interval.ts │ ├── y-config.ts │ └── y-monaco.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── package.json │ ├── pages │ ├── _app.js │ └── index.tsx │ ├── public │ └── favicon.ico │ ├── styles │ ├── Shared.module.css │ ├── globals.css │ └── yjs.css │ ├── tsconfig.json │ ├── types.d.ts │ └── yarn.lock ├── package.json ├── src ├── cache.ts ├── constants.ts ├── helpers.ts ├── index.ts └── yjs.ts ├── tsconfig.json └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | // next is loading eslintrc from root directory, adding this to avoid eslint rules been overridden 2 | {} 3 | -------------------------------------------------------------------------------- /.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 | .vscode -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .next 3 | build 4 | dist 5 | *.tsbuildinfo 6 | *.gitignore 7 | *.svg 8 | *.lock 9 | *.npmignore 10 | *.sql 11 | *.png 12 | *.jpg 13 | *.jpeg 14 | *.gif 15 | *.ico 16 | *.sh 17 | Dockerfile 18 | Dockerfile.* 19 | .env 20 | .env.* 21 | LICENSE 22 | *.log 23 | .DS_Store 24 | .dockerignore 25 | *.patch 26 | *.toml 27 | *.prisma -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "tabWidth": 2, 5 | "useTabs": false 6 | } 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Motif 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # YFS 2 | 3 | Synchronize text files between the browser and the file system using the 4 | [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API) 5 | and [Yjs](https://yjs.dev/). 6 | 7 | 8 | Blog post explaining the underlying concepts: [Syncing text files between browser and disk using Yjs and the File System Access API](https://motif.land/blog/syncing-text-files-using-yjs-and-the-file-system-access-api). 9 | 10 |
11 |

12 | 13 | 14 | 15 | 16 | 17 | 18 |

19 | 20 | ## Installation 21 | 22 | To get started, install the `@yfs/react` package via npm or yarn: 23 | 24 | ```shell 25 | # npm 26 | npm install @yfs/react 27 | 28 | # Yarn 29 | yarn add @yfs/react 30 | ``` 31 | 32 | ## Usage 33 | 34 | Example: 35 | 36 | 37 | ```jsx 38 | import React, { useState } from 'react' 39 | import * as Y from 'yjs' 40 | import useYFS from '@yfs/react' 41 | 42 | function Editor () { 43 | const { setRootDirectory, directoryName, syncDoc } = useYFS() 44 | const [doc] = useState(new Y.Doc()) 45 | 46 | return ( 47 |
48 | 59 | {/* Editor code... */} 60 |
61 | ) 62 | } 63 | ``` 64 | 65 | ## Authors 66 | 67 | This library is created by the team behind [Motif](https://motif.land) 68 | ([@motifland](https://twitter.com/motifland)). 69 | 70 | - Michael Fester ([@michaelfester](https://twitter.com/michaelfester)) 71 | 72 | It is based on the great work by [Kevin Jahns](https://twitter.com/kevin_jahns) 73 | on [Yjs](https://yjs.dev/). 74 | 75 | ## License 76 | 77 | MIT 78 | -------------------------------------------------------------------------------- /examples/single-file-sync/.eslintrc.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | module.exports = { 3 | env: { 4 | browser: true, 5 | es2021: true, 6 | node: true, 7 | }, 8 | extends: ['eslint:recommended', 'plugin:react/recommended', 'next'], 9 | ignorePatterns: ['public/**/*'], 10 | parserOptions: { 11 | ecmaVersion: 12, 12 | sourceType: 'module', 13 | }, 14 | plugins: ['react', 'react-hooks'], 15 | rules: { 16 | 'react-hooks/rules-of-hooks': 'error', 17 | 'react-hooks/exhaustive-deps': [ 18 | 'error', 19 | { additionalHooks: '(useDeepCompareEffect)' }, 20 | ], 21 | '@next/next/no-img-element': 'off', 22 | }, 23 | settings: { 24 | react: { 25 | version: 'detect', 26 | }, 27 | }, 28 | overrides: [ 29 | { 30 | files: ['*.ts', '*.tsx'], 31 | parser: '@typescript-eslint/parser', 32 | plugins: ['@typescript-eslint'], 33 | extends: ['plugin:@typescript-eslint/recommended'], 34 | rules: { 35 | '@typescript-eslint/no-unused-vars': 'error', 36 | '@typescript-eslint/no-explicit-any': 'off', 37 | '@typescript-eslint/explicit-module-boundary-types': 'off', 38 | }, 39 | }, 40 | ], 41 | } 42 | -------------------------------------------------------------------------------- /examples/single-file-sync/.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 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | -------------------------------------------------------------------------------- /examples/single-file-sync/README.md: -------------------------------------------------------------------------------- 1 | This is a sample app showcasing a browser-based editor 2 | ([Monaco](https://microsoft.github.io/monaco-editor/)) syncing its content with 3 | the file system. It is using the 4 | [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API), 5 | in conjunction with the [Yjs](https://yjs.dev/) CRDT implementation. 6 | 7 | ## Getting Started 8 | 9 | First, install the dependencies: 10 | 11 | ```bash 12 | yarn 13 | ``` 14 | 15 | Then, run the development server: 16 | 17 | ```bash 18 | yarn dev 19 | ``` 20 | 21 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the 22 | result. 23 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Editor/Editor.module.css: -------------------------------------------------------------------------------- 1 | .editor { 2 | width: 100%; 3 | height: 100%; 4 | } 5 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Editor/GitHub.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react' 2 | 3 | const GitHub = (props: any) => { 4 | return ( 5 | 13 | 19 | 20 | ) 21 | } 22 | 23 | export default GitHub 24 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Editor/index.tsx: -------------------------------------------------------------------------------- 1 | import React, { useCallback } from 'react' 2 | import MonacoEditor from '@monaco-editor/react' 3 | import theme from './theme' 4 | import options from './options' 5 | 6 | export default function Editor ({ 7 | onDidMount, 8 | }: { 9 | onDidMount: (monaco: any, editor: any) => void 10 | }) { 11 | const onEditorDidMount = useCallback( 12 | (editor: any, monaco: any) => { 13 | monaco.editor.defineTheme('custom', theme) 14 | monaco.editor.setTheme('custom') 15 | onDidMount(monaco, editor) 16 | }, 17 | [onDidMount], 18 | ) 19 | 20 | return ( 21 | } 27 | options={options} 28 | /> 29 | ) 30 | } 31 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Editor/options.ts: -------------------------------------------------------------------------------- 1 | const options = { 2 | codeLens: false, 3 | fontSize: 14, 4 | lineHeight: 24, 5 | lineNumbers: 'off', 6 | padding: { 7 | top: 30, 8 | bottom: 30 9 | }, 10 | selectionHighlight: false, 11 | wordWrap: 'on', 12 | folding: false, 13 | fontFamily: 14 | 'Menlo, ui-monospace, SFMono-Regular, Monaco, Consolas, "Liberation Mono", "Courier New", monospace', 15 | hideCursorInOverviewRuler: true, 16 | glyphMargin: false, 17 | lightbulb: { enabled: false }, 18 | lineDecorationsWidth: 20, 19 | minimap: { enabled: false }, 20 | renderLineHighlight: 'none', 21 | roundedSelection: true, 22 | scrollbar: { 23 | alwaysConsumeMouseWheel: false, 24 | horizontal: 'hidden', 25 | vertical: 'hidden', 26 | useShadows: false, 27 | verticalHasArrows: false, 28 | verticalScrollbarSize: 0 29 | }, 30 | scrollBeyondLastLine: false, 31 | smoothScrolling: true, 32 | snippetSuggestions: 'none', 33 | suggest: { 34 | showIcons: false 35 | }, 36 | tabCompletion: 'off', 37 | tabSize: 2, 38 | wordBasedSuggestions: false, 39 | wrappingStrategy: 'advanced' 40 | } 41 | 42 | export default options 43 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Editor/theme.ts: -------------------------------------------------------------------------------- 1 | const theme = { 2 | base: 'vs', 3 | inherit: true, 4 | rules: [ 5 | { token: '', foreground: '0F172A' }, 6 | { token: 'invalid', foreground: '0F172A' }, 7 | { token: 'emphasis', fontStyle: 'italic' }, 8 | { token: 'strong', fontStyle: 'bold' }, 9 | { token: 'variable', foreground: '5c6773' }, 10 | { token: 'variable.predefined', foreground: '5c6773' }, 11 | { token: 'constant', foreground: '854D0E' }, 12 | { token: 'comment', foreground: 'abb0b6', fontStyle: 'italic' }, 13 | { token: 'number', foreground: '854D0E' }, 14 | { token: 'number.hex', foreground: '854D0E' }, 15 | { token: 'regexp', foreground: '4dbf99' }, 16 | { token: 'annotation', foreground: '701A75' }, 17 | { token: 'type', foreground: '701A75' }, 18 | { token: 'delimiter', foreground: '5c6773' }, 19 | { token: 'delimiter.html', foreground: '5c6773' }, 20 | { token: 'delimiter.xml', foreground: '5c6773' }, 21 | { token: 'tag', foreground: '701A75' }, 22 | { token: 'tag.id.jade', foreground: 'C026D3' }, 23 | { token: 'tag.class.jade', foreground: 'C026D3' }, 24 | { token: 'meta.scss', foreground: 'C026D3' }, 25 | { token: 'metatag', foreground: 'C026D3' }, 26 | { token: 'metatag.content.html', foreground: '0E7490' }, 27 | { token: 'metatag.html', foreground: 'C026D3' }, 28 | { token: 'metatag.xml', foreground: 'C026D3' }, 29 | { token: 'metatag.php', fontStyle: 'bold' }, 30 | { token: 'key', foreground: '701A75' }, 31 | { token: 'string.key.json', foreground: '701A75' }, 32 | { token: 'string.value.json', foreground: '0E7490' }, 33 | { token: 'attribute.name', foreground: '854D0E' }, 34 | { token: 'attribute.value', foreground: '0451A5' }, 35 | { token: 'attribute.value.number', foreground: 'abb0b6' }, 36 | { token: 'attribute.value.unit', foreground: '0E7490' }, 37 | { token: 'attribute.value.html', foreground: '0E7490' }, 38 | { token: 'attribute.value.xml', foreground: '0E7490' }, 39 | { token: 'string', foreground: '0F172A' }, 40 | { token: 'string.html', foreground: '0E7490' }, 41 | { token: 'string.sql', foreground: '0E7490' }, 42 | { token: 'string.yaml', foreground: '0E7490' }, 43 | { token: 'string.js', foreground: '0E7490' }, 44 | { token: 'string.mdx', foreground: '0E7490' }, 45 | { token: 'string.link', foreground: '0369A1' }, 46 | { token: 'string.heading', fontStyle: 'bold' }, 47 | { token: 'string.target', foreground: 'A1A1AA' }, 48 | { token: 'string.codedelimiter.mdx', foreground: 'A1A1AA' }, 49 | { token: 'keyword', foreground: '854d0e' }, 50 | { token: 'keyword.json', foreground: '854d0e' }, 51 | { token: 'keyword.flow', foreground: '854d0e' }, 52 | { token: 'keyword.flow.scss', foreground: '854d0e' }, 53 | { token: 'operator.scss', foreground: '666666' }, 54 | { token: 'operator.sql', foreground: '778899' }, 55 | { token: 'operator.swift', foreground: '666666' }, 56 | { token: 'predefined.sql', foreground: 'FF00FF' } 57 | ], 58 | // Cf. https://github.com/Microsoft/monaco-editor/blob/main/test/playground.generated/customizing-the-appearence-exposed-colors.html 59 | colors: { 60 | 'editor.background': '#FFFFFF', 61 | 'editor.foreground': '#1c1917', 62 | 'editorIndentGuide.background': '#E4E4E7', 63 | 'editorIndentGuide.activeBackground': '#A1A1AA', 64 | 'editorCursor.foreground': '#51A7F8', 65 | 'editor.selectionBackground': '#CFDFEC', 66 | 'editor.inactiveSelectionBackground': '#F5F5F5', 67 | 'editorLineNumber.foreground': '#D1D5DB' 68 | } 69 | } 70 | 71 | export default theme 72 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Footer/Footer.module.css: -------------------------------------------------------------------------------- 1 | .syncFooter { 2 | display: flex; 3 | flex-direction: row; 4 | gap: 10px; 5 | align-items: center; 6 | align-self: flex-start; 7 | padding: 0 6px; 8 | font-size: var(--font-size-sm); 9 | color: var(--text-light); 10 | } 11 | 12 | .syncFooter p { 13 | margin: 0; 14 | padding: 0; 15 | } 16 | 17 | .dot { 18 | width: 8px; 19 | height: 8px; 20 | border-radius: 9999px; 21 | } 22 | 23 | .dotBlue { 24 | background-color: #15e3ff; 25 | } 26 | 27 | .dotOrange { 28 | background-color: #f7c444; 29 | } 30 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Footer/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styles from './Footer.module.css' 3 | import sharedStyles from '../../styles/Shared.module.css' 4 | 5 | export default function Footer ({ 6 | directoryName, 7 | isWritePermissionGranted, 8 | unsetRootDirectory, 9 | grantWritePermission, 10 | }: { 11 | directoryName: string | undefined 12 | isWritePermissionGranted: boolean 13 | unsetRootDirectory: () => void 14 | grantWritePermission: () => void 15 | }) { 16 | if (!directoryName) { 17 | return <> 18 | } 19 | 20 | return ( 21 |
22 |
27 | {isWritePermissionGranted && ( 28 | <> 29 |

30 | Syncing with folder{' '} 31 | {directoryName}. 32 |

33 | 34 | Disconnect 35 | 36 | 37 | )} 38 | {!isWritePermissionGranted && ( 39 | <> 40 |

41 | Syncing with folder{' '} 42 | {directoryName} is 43 | paused. 44 |

45 | 46 | Grant permissions 47 | 48 | 49 | )} 50 |
51 | ) 52 | } 53 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Head/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import NextHead from 'next/head' 3 | 4 | export default function Head () { 5 | return ( 6 | 7 | File Sync Demo 8 | 12 | 13 | 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Header/Header.module.css: -------------------------------------------------------------------------------- 1 | .cta { 2 | display: inline-block; 3 | color: white; 4 | background-color: var(--button-dark); 5 | outline: 0 !important; 6 | outline-offset: 2px; 7 | box-shadow: none; 8 | font-weight: 500; 9 | font-size: var(--font-size-base); 10 | padding: 10px 20px; 11 | border-radius: 5px; 12 | cursor: pointer; 13 | -webkit-appearance: button; 14 | border-style: solid; 15 | border-width: 0; 16 | transition-duration: 150ms; 17 | } 18 | 19 | .cta:hover { 20 | opacity: 0.9; 21 | box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); 22 | } 23 | 24 | .warning { 25 | color: var(--text-warning); 26 | text-align: center; 27 | } 28 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Header/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styles from './Header.module.css' 3 | 4 | export default function Header ({ 5 | isFSAPISupported, 6 | directoryName, 7 | setRootDirectory, 8 | }: { 9 | isFSAPISupported: boolean 10 | directoryName: string | undefined 11 | setRootDirectory: (writable: boolean) => void 12 | }) { 13 | return ( 14 |
15 | {isFSAPISupported && !directoryName && ( 16 | 24 | )} 25 | {!isFSAPISupported && ( 26 |

27 | The File System Access API is currently not supported in this browser. 28 |

29 | )} 30 |
31 | ) 32 | } 33 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Navbar/Navbar.module.css: -------------------------------------------------------------------------------- 1 | .nav { 2 | display: flex; 3 | flex-direction: row; 4 | gap: 10px; 5 | align-items: center; 6 | width: 100%; 7 | padding: 1.5rem; 8 | } 9 | 10 | .nav div:first-child { 11 | flex: 1; 12 | display: flex; 13 | gap: 5px; 14 | flex-direction: column; 15 | } 16 | 17 | .nav div:first-child h1, 18 | .nav div:first-child p { 19 | margin: 0; 20 | } 21 | 22 | .nav div:first-child h1 { 23 | font-size: 18px; 24 | color: var(--text-dark); 25 | } 26 | 27 | .nav div:first-child p { 28 | font-size: var(--font-size-sm); 29 | color: var(--text-light); 30 | } 31 | 32 | .nav div:last-child { 33 | display: flex; 34 | gap: 25px; 35 | flex-direction: row; 36 | align-items: center; 37 | } 38 | 39 | .nav div:last-child a { 40 | font-size: var(--font-size-sm); 41 | color: var(--text-dark); 42 | } 43 | -------------------------------------------------------------------------------- /examples/single-file-sync/components/Navbar/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import GitHub from 'components/Editor/GitHub' 3 | import styles from './Navbar.module.css' 4 | import sharedStyles from '../../styles/Shared.module.css' 5 | 6 | export default function Navbar () { 7 | return ( 8 | 49 | ) 50 | } 51 | -------------------------------------------------------------------------------- /examples/single-file-sync/lib/constants.ts: -------------------------------------------------------------------------------- 1 | export const YDOC_UPDATE_ORIGIN_CURRENT_EDITOR = 2 | 'YDOC_UPDATE_ORIGIN_CURRENT_EDITOR' 3 | 4 | export const ROOM_ID = 'yfs-sample-room' 5 | export const TEST_FILE_NAME = 'yfs-test.md' 6 | 7 | export const WEBRTC_SIGNALING_SERVERS = [ 8 | 'wss://motif-signaling.fly.dev/', 9 | ] 10 | -------------------------------------------------------------------------------- /examples/single-file-sync/lib/use-interval.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react' 2 | 3 | export const useInterval = (callback: () => void, delay: number | null) => { 4 | const savedCallback = useRef() 5 | 6 | useEffect(() => { 7 | savedCallback.current = callback 8 | }, [callback]) 9 | 10 | useEffect(() => { 11 | const tick = () => { 12 | savedCallback.current() 13 | } 14 | if (delay !== null) { 15 | const id = setInterval(tick, delay) 16 | return () => clearInterval(id) 17 | } 18 | }, [delay]) 19 | } 20 | -------------------------------------------------------------------------------- /examples/single-file-sync/lib/y-config.ts: -------------------------------------------------------------------------------- 1 | import * as Y from 'yjs' 2 | import * as awarenessProtocol from 'y-protocols/awareness.js' 3 | import { WebrtcProvider } from 'y-webrtc' 4 | import { IndexeddbPersistence } from 'y-indexeddb' 5 | import * as mutex from 'lib0/mutex.js' 6 | import { MonacoBinding } from './y-monaco' 7 | import { ROOM_ID, WEBRTC_SIGNALING_SERVERS } from './constants' 8 | 9 | export const YDOC_UPDATE_ORIGIN_CURRENT_EDITOR = 10 | 'YDOC_UPDATE_ORIGIN_CURRENT_EDITOR' 11 | export const YDOC_UPDATE_ORIGIN_PROGRAMMATIC = 'YDOC_UPDATE_ORIGIN_PROGRAMMATIC' 12 | 13 | export class YConfig { 14 | roomId: string 15 | monaco: any 16 | model: any 17 | editor: any 18 | userId: number 19 | doc: Y.Doc | undefined 20 | initialEncodedYDoc: string | undefined 21 | awareness: awarenessProtocol.Awareness | undefined 22 | webRTCProvider: WebrtcProvider | undefined 23 | indexedDBPersistence: IndexeddbPersistence | undefined 24 | monacoBinding: MonacoBinding | undefined 25 | mux: mutex.mutex 26 | updateTimeoutId: ReturnType | null 27 | 28 | constructor ( 29 | monaco: any, 30 | editor: any, 31 | userId: number 32 | ) { 33 | this.roomId = ROOM_ID 34 | // this.onNonProgrammaticDocUpdateImmediate = onNonProgrammaticDocUpdateImmediate 35 | // this.onLocalEditorUpdateDebounced = onLocalEditorUpdateDebounced 36 | this.monaco = monaco 37 | this.editor = editor 38 | this.model = editor.getModel() 39 | this.userId = userId 40 | this.mux = mutex.createMutex() 41 | this.updateTimeoutId = null 42 | this.initYDoc() 43 | } 44 | 45 | initYDoc (): void { 46 | this.doc = new Y.Doc() 47 | 48 | this.awareness = new awarenessProtocol.Awareness(this.doc) 49 | 50 | this.webRTCProvider = new WebrtcProvider(this.roomId, this.doc, { 51 | signaling: WEBRTC_SIGNALING_SERVERS, 52 | password: null, 53 | awareness: this.awareness, 54 | maxConns: 50 + Math.floor(Math.random() * 15), 55 | filterBcConns: true, 56 | peerOpts: {} 57 | }) 58 | 59 | this.monacoBinding = new MonacoBinding( 60 | this.monaco, 61 | this.doc.getText(), 62 | this.model, 63 | this.editor, 64 | this.awareness, 65 | this.userId 66 | ) 67 | 68 | this.indexedDBPersistence = new IndexeddbPersistence( 69 | 'y-indexeddb', 70 | this.doc 71 | ) 72 | 73 | if (!this.webRTCProvider.connected) { 74 | this.webRTCProvider.connect() 75 | } 76 | } 77 | 78 | destroy (): void { 79 | this.awareness?.destroy() 80 | this.monacoBinding?.destroy() 81 | this.webRTCProvider?.disconnect() 82 | this.webRTCProvider?.destroy() 83 | this.doc?.destroy() 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /examples/single-file-sync/lib/y-monaco.ts: -------------------------------------------------------------------------------- 1 | import * as Y from 'yjs' 2 | import * as error from 'lib0/error.js' 3 | import { createMutex, mutex } from 'lib0/mutex.js' 4 | import * as awarenessProtocol from 'y-protocols/awareness.js' 5 | import { YDOC_UPDATE_ORIGIN_CURRENT_EDITOR } from './constants' 6 | 7 | type Direction = any 8 | type Selection = { 9 | start: Y.RelativePosition 10 | end: Y.RelativePosition 11 | direction: Direction 12 | } 13 | 14 | class RelativeSelection { 15 | start: Y.RelativePosition 16 | end: Y.RelativePosition 17 | direction: Direction 18 | 19 | constructor ( 20 | start: Y.RelativePosition, 21 | end: Y.RelativePosition, 22 | direction: Direction, 23 | ) { 24 | this.start = start 25 | this.end = end 26 | this.direction = direction 27 | } 28 | } 29 | 30 | const createRelativeSelection = ( 31 | editor: any, 32 | monacoModel: any, 33 | type: Y.AbstractType, 34 | ) => { 35 | const sel = editor.getSelection() 36 | if (sel !== null) { 37 | const startPos = sel.getStartPosition() 38 | const endPos = sel.getEndPosition() 39 | const start = Y.createRelativePositionFromTypeIndex( 40 | type, 41 | monacoModel.getOffsetAt(startPos), 42 | ) 43 | const end = Y.createRelativePositionFromTypeIndex( 44 | type, 45 | monacoModel.getOffsetAt(endPos), 46 | ) 47 | return new RelativeSelection(start, end, sel.getDirection()) 48 | } 49 | return null 50 | } 51 | 52 | const createMonacoSelectionFromRelativeSelection = ( 53 | monaco: any, 54 | editor: any, 55 | type: Y.AbstractType, 56 | relSel: Selection, 57 | doc: Y.Doc, 58 | ) => { 59 | const start = Y.createAbsolutePositionFromRelativePosition(relSel.start, doc) 60 | const end = Y.createAbsolutePositionFromRelativePosition(relSel.end, doc) 61 | if ( 62 | start !== null && 63 | end !== null && 64 | start.type === type && 65 | end.type === type 66 | ) { 67 | const model = editor.getModel() 68 | if (!model) { 69 | return null 70 | } 71 | const startPos = model.getPositionAt(start.index) 72 | const endPos = model.getPositionAt(end.index) 73 | return monaco.Selection.createWithDirection( 74 | startPos.lineNumber, 75 | startPos.column, 76 | endPos.lineNumber, 77 | endPos.column, 78 | relSel.direction, 79 | ) 80 | } 81 | return null 82 | } 83 | 84 | export class MonacoBinding { 85 | doc: Y.Doc 86 | ytext: Y.Text 87 | monacoModel: any 88 | editor: any 89 | mux: mutex 90 | color: number 91 | awareness: awarenessProtocol.Awareness | undefined 92 | _savedSelections: Map 93 | _decorations: any 94 | _rerenderDecorations: any 95 | _monacoChangeHandler: any 96 | _beforeTransaction: () => void 97 | _ytextObserver: (event: Y.YTextEvent) => void 98 | 99 | constructor ( 100 | monaco: any, 101 | ytext: Y.Text, 102 | monacoModel: any, 103 | editor: any, 104 | awareness: awarenessProtocol.Awareness, 105 | userId: number, 106 | ) { 107 | this.doc = ytext.doc as Y.Doc 108 | this.ytext = ytext 109 | this.monacoModel = monacoModel 110 | this.editor = editor 111 | this.mux = createMutex() 112 | this._savedSelections = new Map() 113 | this.color = userId % 8 114 | 115 | this._beforeTransaction = () => { 116 | this.mux(() => { 117 | this._savedSelections = new Map() 118 | if (editor.getModel() === monacoModel) { 119 | const rsel = createRelativeSelection(editor, monacoModel, ytext) 120 | if (rsel !== null) { 121 | this._savedSelections.set(editor, rsel) 122 | } 123 | } 124 | }) 125 | } 126 | 127 | this.doc.on('beforeAllTransactions', this._beforeTransaction) 128 | 129 | this._decorations = new Map() 130 | 131 | this._rerenderDecorations = () => { 132 | if (awareness && editor.getModel() === monacoModel) { 133 | // render decorations 134 | const currentDecorations = this._decorations.get(editor) || [] 135 | const newDecorations: any = [] 136 | awareness.getStates().forEach((state, clientID) => { 137 | if ( 138 | clientID !== this.doc.clientID && 139 | state.selection != null && 140 | state.selection.anchor != null && 141 | state.selection.head != null 142 | ) { 143 | const anchorAbs = Y.createAbsolutePositionFromRelativePosition( 144 | state.selection.anchor, 145 | this.doc, 146 | ) 147 | const headAbs = Y.createAbsolutePositionFromRelativePosition( 148 | state.selection.head, 149 | this.doc, 150 | ) 151 | if ( 152 | anchorAbs !== null && 153 | headAbs !== null && 154 | anchorAbs.type === ytext && 155 | headAbs.type === ytext 156 | ) { 157 | let start, end, afterContentClassName, beforeContentClassName 158 | if (anchorAbs.index < headAbs.index) { 159 | start = monacoModel.getPositionAt(anchorAbs.index) 160 | end = monacoModel.getPositionAt(headAbs.index) 161 | afterContentClassName = `ySelectionHead yBorder-${this.color}` 162 | beforeContentClassName = null 163 | } else { 164 | start = monacoModel.getPositionAt(headAbs.index) 165 | end = monacoModel.getPositionAt(anchorAbs.index) 166 | afterContentClassName = null 167 | beforeContentClassName = `ySelectionHead yBorder-${this.color}` 168 | } 169 | newDecorations.push({ 170 | range: new monaco.Range( 171 | start.lineNumber, 172 | start.column, 173 | end.lineNumber, 174 | end.column, 175 | ), 176 | options: { 177 | className: `ySelection-${this.color}`, 178 | afterContentClassName, 179 | beforeContentClassName, 180 | }, 181 | }) 182 | } 183 | } 184 | }) 185 | this._decorations.set( 186 | editor, 187 | editor.deltaDecorations(currentDecorations, newDecorations), 188 | ) 189 | } else { 190 | // ignore decorations 191 | this._decorations.delete(editor) 192 | } 193 | } 194 | 195 | this._ytextObserver = event => { 196 | this.mux(() => { 197 | let index = 0 198 | event.delta.forEach(op => { 199 | if (op.retain !== undefined) { 200 | index += op.retain 201 | } else if (op.insert !== undefined) { 202 | const pos = monacoModel.getPositionAt(index) 203 | const range = new monaco.Selection( 204 | pos.lineNumber, 205 | pos.column, 206 | pos.lineNumber, 207 | pos.column, 208 | ) 209 | monacoModel.applyEdits([{ range, text: op.insert as string }]) 210 | index += (op.insert as any).length 211 | } else if (op.delete !== undefined) { 212 | const pos = monacoModel.getPositionAt(index) 213 | const endPos = monacoModel.getPositionAt(index + op.delete) 214 | const range = new monaco.Selection( 215 | pos.lineNumber, 216 | pos.column, 217 | endPos.lineNumber, 218 | endPos.column, 219 | ) 220 | monacoModel.applyEdits([{ range, text: '' }]) 221 | } else { 222 | throw error.unexpectedCase() 223 | } 224 | }) 225 | this._savedSelections.forEach((rsel, editor) => { 226 | const sel = createMonacoSelectionFromRelativeSelection( 227 | monaco, 228 | editor, 229 | ytext, 230 | rsel, 231 | this.doc, 232 | ) 233 | if (sel !== null) { 234 | editor.setSelection(sel) 235 | } 236 | }) 237 | }) 238 | this._rerenderDecorations() 239 | } 240 | 241 | ytext.observe(this._ytextObserver) 242 | monacoModel.setValue(ytext.toString()) 243 | 244 | this._monacoChangeHandler = monacoModel.onDidChangeContent((event: any) => { 245 | // Apply changes from right to left 246 | this.mux(() => { 247 | this.doc.transact(() => { 248 | event.changes 249 | .sort( 250 | (change1: any, change2: any) => 251 | change2.rangeOffset - change1.rangeOffset, 252 | ) 253 | .forEach((change: any) => { 254 | ytext.delete(change.rangeOffset, change.rangeLength) 255 | ytext.insert(change.rangeOffset, change.text) 256 | }) 257 | }, YDOC_UPDATE_ORIGIN_CURRENT_EDITOR) 258 | }) 259 | }) 260 | 261 | monacoModel.onWillDispose(() => { 262 | this.destroy() 263 | }) 264 | 265 | if (awareness) { 266 | editor.onDidChangeCursorSelection(() => { 267 | if (editor.getModel() === monacoModel) { 268 | const sel = editor.getSelection() 269 | if (sel === null) { 270 | return 271 | } 272 | let anchor = monacoModel.getOffsetAt(sel.getStartPosition()) 273 | let head = monacoModel.getOffsetAt(sel.getEndPosition()) 274 | if (sel.getDirection() === monaco.SelectionDirection.RTL) { 275 | const tmp = anchor 276 | anchor = head 277 | head = tmp 278 | } 279 | awareness.setLocalStateField('selection', { 280 | anchor: Y.createRelativePositionFromTypeIndex(ytext, anchor), 281 | head: Y.createRelativePositionFromTypeIndex(ytext, head), 282 | }) 283 | } 284 | }) 285 | awareness.on('change', this._rerenderDecorations) 286 | this.awareness = awareness 287 | } 288 | } 289 | 290 | destroy (): void { 291 | this._monacoChangeHandler.dispose() 292 | this.ytext.unobserve(this._ytextObserver) 293 | this.doc.off('beforeAllTransactions', this._beforeTransaction) 294 | if (this.awareness) { 295 | this.awareness.off('change', this._rerenderDecorations) 296 | } 297 | } 298 | } 299 | -------------------------------------------------------------------------------- /examples/single-file-sync/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /examples/single-file-sync/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | } 5 | 6 | module.exports = nextConfig 7 | -------------------------------------------------------------------------------- /examples/single-file-sync/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "yfs-single-file-sync-example", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@monaco-editor/react": "^4.4.4", 13 | "@yfs/react": "^0.0.15", 14 | "lib0": "^0.2.51", 15 | "next": "12.1.5", 16 | "react": "18.1.0", 17 | "react-dom": "18.1.0", 18 | "y-indexeddb": "^9.0.7", 19 | "y-webrtc": "^10.2.3", 20 | "yjs": "^13.5.35" 21 | }, 22 | "devDependencies": { 23 | "@types/node": "^17.0.30", 24 | "@types/react": "^18.0.8", 25 | "@typescript-eslint/eslint-plugin": "^5.22.0", 26 | "@typescript-eslint/parser": "^5.22.0", 27 | "eslint": "8.14.0", 28 | "eslint-config-next": "12.1.5", 29 | "typescript": "^4.6.4" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /examples/single-file-sync/pages/_app.js: -------------------------------------------------------------------------------- 1 | import '../styles/globals.css' 2 | import '../styles/yjs.css' 3 | 4 | function MyApp({ Component, pageProps }) { 5 | return 6 | } 7 | 8 | export default MyApp 9 | -------------------------------------------------------------------------------- /examples/single-file-sync/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import React, { useCallback, useRef } from 'react' 2 | import useFileSync from '@yfs/react' 3 | import Editor from 'components/Editor' 4 | import Head from 'components/Head' 5 | import Navbar from 'components/Navbar' 6 | import Footer from 'components/Footer' 7 | import Header from 'components/Header' 8 | import { useInterval } from 'lib/use-interval' 9 | import styles from '../styles/Shared.module.css' 10 | import { YConfig } from 'lib/y-config' 11 | import { TEST_FILE_NAME } from 'lib/constants' 12 | 13 | export default function Home () { 14 | const config = useRef(undefined) 15 | const { 16 | isSupported, 17 | setRootDirectory, 18 | unsetRootDirectory, 19 | grantWritePermission, 20 | directoryName, 21 | isWritePermissionGranted, 22 | syncDoc 23 | } = useFileSync() 24 | 25 | const onEditorDidMount = useCallback((monaco: any, editor: any) => { 26 | config.current?.destroy() 27 | config.current = new YConfig(monaco, editor, Math.floor(Math.random() * 8)) 28 | }, []) 29 | 30 | const sync = useCallback(() => { 31 | if (!config.current?.doc) { 32 | return 33 | } 34 | syncDoc(TEST_FILE_NAME, config.current.doc) 35 | }, [syncDoc]) 36 | 37 | useInterval(sync, isWritePermissionGranted ? 10000 : null) 38 | 39 | return ( 40 |
41 | 42 | 43 |
44 |
49 |
50 | 51 |
52 |
58 |
59 |
60 | ) 61 | } 62 | -------------------------------------------------------------------------------- /examples/single-file-sync/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Motif-Archived/yfs/46248a771784726b0b305b6816e447b57558e776/examples/single-file-sync/public/favicon.ico -------------------------------------------------------------------------------- /examples/single-file-sync/styles/Shared.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100vh; 3 | padding: 2rem 0; 4 | flex: 1; 5 | display: flex; 6 | flex-direction: column; 7 | align-items: center; 8 | color: var(--text-dark); 9 | } 10 | 11 | .container { 12 | padding: 0; 13 | } 14 | 15 | .subtleLink { 16 | text-decoration: underline dotted var(--text-extralight); 17 | cursor: pointer; 18 | } 19 | 20 | .subtleLink:hover { 21 | opacity: 0.9; 22 | } 23 | 24 | .main { 25 | position: relative; 26 | padding: 0 1.5rem 2rem 1.5rem; 27 | width: 100%; 28 | max-width: 980px; 29 | margin-top: 50px; 30 | display: flex; 31 | gap: 10px; 32 | flex-direction: column; 33 | align-items: center; 34 | } 35 | 36 | .editorContainer { 37 | width: 100%; 38 | height: 100vh; 39 | max-height: 480px; 40 | padding: 0 1rem; 41 | border-radius: 5px; 42 | border-width: 1px; 43 | overflow: hidden; 44 | background-color: white; 45 | border-color: var(--border-light); 46 | border-style: solid; 47 | } 48 | -------------------------------------------------------------------------------- /examples/single-file-sync/styles/globals.css: -------------------------------------------------------------------------------- 1 | @import url('https://rsms.me/inter/inter.css'); 2 | 3 | :root { 4 | --background: #eeede9; 5 | --border-light: #e3e3e3; 6 | --text-dark: #1c1917; 7 | --text-light: #78716c; 8 | --text-extralight: #a8a29e; 9 | --text-warning: #f97316; 10 | --font-size-base: 16px; 11 | --font-size-sm: 14px; 12 | --button-dark: #0f172a; 13 | --orange-light: #ffedd5; 14 | --green-light: #dcfce7; 15 | --sky-light: #e0f2fe; 16 | --violet-light: #ede9fe; 17 | --rose-light: #ffe4e6; 18 | --amber-light: #fef3c7; 19 | --lime-light: #ecfccb; 20 | --fuchsia-light: #fae8ff; 21 | --orange: #fb923c; 22 | --green: #4ade80; 23 | --sky: #38bdf8; 24 | --violet: #a78bfa; 25 | --rose: #fb7185; 26 | --amber: #fbbf24; 27 | --lime: #a3e635; 28 | --fuchsia: #e879f9; 29 | } 30 | 31 | html, 32 | body { 33 | padding: 0; 34 | margin: 0; 35 | font-family: 'Inter', -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, 36 | Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 37 | background-color: var(--background); 38 | -webkit-font-smoothing: antialiased; 39 | -moz-osx-font-smoothing: grayscale; 40 | } 41 | 42 | a { 43 | color: inherit; 44 | text-decoration: none; 45 | } 46 | 47 | * { 48 | box-sizing: border-box; 49 | } 50 | -------------------------------------------------------------------------------- /examples/single-file-sync/styles/yjs.css: -------------------------------------------------------------------------------- 1 | /* Selection */ 2 | 3 | .ySelection-0 { 4 | background-color: var(--orange-light); 5 | } 6 | .ySelection-1 { 7 | background-color: var(--green-light); 8 | } 9 | .ySelection-2 { 10 | background-color: var(--sky-light); 11 | } 12 | .ySelection-3 { 13 | background-color: var(--violet-light); 14 | } 15 | .ySelection-4 { 16 | background-color: var(--rose-light); 17 | } 18 | .ySelection-5 { 19 | background-color: var(--amber-light); 20 | } 21 | .ySelection-6 { 22 | background-color: var(--lime-light); 23 | } 24 | .ySelection-7 { 25 | background-color: var(--fuchsia-light); 26 | } 27 | 28 | /* Background */ 29 | 30 | .yBackground-0 { 31 | background-color: var(--orange); 32 | } 33 | .yBackground-1 { 34 | background-color: var(--green); 35 | } 36 | .yBackground-2 { 37 | background-color: var(--sky); 38 | } 39 | .yBackground-3 { 40 | background-color: var(--violet); 41 | } 42 | .yBackground-4 { 43 | background-color: var(--rose); 44 | } 45 | .yBackground-5 { 46 | background-color: var(--amber); 47 | } 48 | .yBackground-6 { 49 | background-color: var(--lime); 50 | } 51 | .yBackground-7 { 52 | background-color: var(--fuchsia); 53 | } 54 | 55 | /* Border */ 56 | 57 | .yBorder-0 { 58 | border-color: var(--orange); 59 | } 60 | .yBorder-1 { 61 | border-color: var(--green); 62 | } 63 | .yBorder-2 { 64 | border-color: var(--sky); 65 | } 66 | .yBorder-3 { 67 | border-color: var(--violet); 68 | } 69 | .yBorder-4 { 70 | border-color: var(--rose); 71 | } 72 | .yBorder-5 { 73 | border-color: var(--amber); 74 | } 75 | .yBorder-6 { 76 | border-color: var(--lime); 77 | } 78 | .yBorder-7 { 79 | border-color: var(--fuchsia); 80 | } 81 | 82 | /* Selection head */ 83 | 84 | .ySelectionHead { 85 | position: absolute; 86 | box-sizing: border-box; 87 | height: 100%; 88 | border-left-width: 2px; 89 | border-top-width: 1px; 90 | border-bottom-width: 1px; 91 | } 92 | -------------------------------------------------------------------------------- /examples/single-file-sync/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "baseUrl": "./", 5 | "target": "esnext", 6 | "lib": [ 7 | "dom", 8 | "dom.iterable", 9 | "esnext", 10 | "webworker" 11 | ], 12 | "allowJs": true, 13 | "skipLibCheck": true, 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "noEmit": true, 17 | "esModuleInterop": true, 18 | "module": "esnext", 19 | "moduleResolution": "node", 20 | "resolveJsonModule": true, 21 | "isolatedModules": true, 22 | "jsx": "preserve", 23 | "downlevelIteration": true, 24 | "incremental": true 25 | }, 26 | "exclude": [ 27 | "node_modules" 28 | ], 29 | "include": [ 30 | "next-env.d.ts", 31 | "**/*.ts", 32 | "**/*.tsx" 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /examples/single-file-sync/types.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'y-monaco' 2 | -------------------------------------------------------------------------------- /examples/single-file-sync/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime-corejs3@^7.10.2": 6 | version "7.17.9" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz#3d02d0161f0fbf3ada8e88159375af97690f4055" 8 | integrity sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw== 9 | dependencies: 10 | core-js-pure "^3.20.2" 11 | regenerator-runtime "^0.13.4" 12 | 13 | "@babel/runtime@^7.10.2", "@babel/runtime@^7.16.3": 14 | version "7.17.9" 15 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" 16 | integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== 17 | dependencies: 18 | regenerator-runtime "^0.13.4" 19 | 20 | "@eslint/eslintrc@^1.2.2": 21 | version "1.2.2" 22 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.2.tgz#4989b9e8c0216747ee7cca314ae73791bb281aae" 23 | integrity sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg== 24 | dependencies: 25 | ajv "^6.12.4" 26 | debug "^4.3.2" 27 | espree "^9.3.1" 28 | globals "^13.9.0" 29 | ignore "^5.2.0" 30 | import-fresh "^3.2.1" 31 | js-yaml "^4.1.0" 32 | minimatch "^3.0.4" 33 | strip-json-comments "^3.1.1" 34 | 35 | "@humanwhocodes/config-array@^0.9.2": 36 | version "0.9.5" 37 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" 38 | integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== 39 | dependencies: 40 | "@humanwhocodes/object-schema" "^1.2.1" 41 | debug "^4.1.1" 42 | minimatch "^3.0.4" 43 | 44 | "@humanwhocodes/object-schema@^1.2.1": 45 | version "1.2.1" 46 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 47 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 48 | 49 | "@monaco-editor/loader@^1.3.1": 50 | version "1.3.1" 51 | resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.3.1.tgz#35d198fb13a983dd49e9e448a172b6a9da309411" 52 | integrity sha512-LfpAO6e54SZQW0nnI1sWKO4XtAlNx3WHXYZixeVy0HhZ4txGPOok4rs2u4dSi2+iRWeL198cZ2FlFQKr8mH+cw== 53 | dependencies: 54 | state-local "^1.0.6" 55 | 56 | "@monaco-editor/react@^4.4.4": 57 | version "4.4.4" 58 | resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.4.4.tgz#8d6b0ac144e2b673f85408e30f1facafff9b7aab" 59 | integrity sha512-yQsYnVkgP5RC5ZMoRVCXSBn4D4hLUOgoQK+AZJpVY57NDXmEb57OVaaYKh8/RTzxkpuLV278hKNw5DnuzlgQwg== 60 | dependencies: 61 | "@monaco-editor/loader" "^1.3.1" 62 | prop-types "^15.7.2" 63 | 64 | "@next/env@12.1.5": 65 | version "12.1.5" 66 | resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.5.tgz#a21ba6708022d630402ca2b340316e69a0296dfc" 67 | integrity sha512-+34yUJslfJi7Lyx6ELuN8nWcOzi27izfYnZIC1Dqv7kmmfiBVxgzR3BXhlvEMTKC2IRJhXVs2FkMY+buQe3k7Q== 68 | 69 | "@next/eslint-plugin-next@12.1.5": 70 | version "12.1.5" 71 | resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.1.5.tgz#273885b35e6bbcd40ff1436d2a8d0ec03fb6f6ef" 72 | integrity sha512-Cnb8ERC5bNKBFrnMH6203sp/b0Y78QRx1XsFu+86oBtDBmQmOFoHu7teQjHm69ER73XKK3aGaeoLiXacHoUFsg== 73 | dependencies: 74 | glob "7.1.7" 75 | 76 | "@next/swc-android-arm-eabi@12.1.5": 77 | version "12.1.5" 78 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.5.tgz#36729ab3dfd7743e82cfe536b43254dcb146620c" 79 | integrity sha512-SKnGTdYcoN04Y2DvE0/Y7/MjkA+ltsmbuH/y/hR7Ob7tsj+8ZdOYuk+YvW1B8dY20nDPHP58XgDTSm2nA8BzzA== 80 | 81 | "@next/swc-android-arm64@12.1.5": 82 | version "12.1.5" 83 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.5.tgz#52578f552305c92d0b9b81d603c9643fb71e0835" 84 | integrity sha512-YXiqgQ/9Rxg1dXp6brXbeQM1JDx9SwUY/36JiE+36FXqYEmDYbxld9qkX6GEzkc5rbwJ+RCitargnzEtwGW0mw== 85 | 86 | "@next/swc-darwin-arm64@12.1.5": 87 | version "12.1.5" 88 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.5.tgz#3d5b53211484c72074f4975ba0ec2b1107db300e" 89 | integrity sha512-y8mhldb/WFZ6lFeowkGfi0cO/lBdiBqDk4T4LZLvCpoQp4Or/NzUN6P5NzBQZ5/b4oUHM/wQICEM+1wKA4qIVw== 90 | 91 | "@next/swc-darwin-x64@12.1.5": 92 | version "12.1.5" 93 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.5.tgz#adcabb732d226453777c0d37d58eaff9328b66fd" 94 | integrity sha512-wqJ3X7WQdTwSGi0kIDEmzw34QHISRIQ5uvC+VXmsIlCPFcMA+zM5723uh8NfuKGquDMiEMS31a83QgkuHMYbwQ== 95 | 96 | "@next/swc-linux-arm-gnueabihf@12.1.5": 97 | version "12.1.5" 98 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.5.tgz#82a7cde67482b756bc65fbebf1dfa8a782074e93" 99 | integrity sha512-WnhdM5duONMvt2CncAl+9pim0wBxDS2lHoo7ub/o/i1bRbs11UTzosKzEXVaTDCUkCX2c32lIDi1WcN2ZPkcdw== 100 | 101 | "@next/swc-linux-arm64-gnu@12.1.5": 102 | version "12.1.5" 103 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.5.tgz#f82ca014504950aab751e81f467492e9be0bad5d" 104 | integrity sha512-Jq2H68yQ4bLUhR/XQnbw3LDW0GMQn355qx6rU36BthDLeGue7YV7MqNPa8GKvrpPocEMW77nWx/1yI6w6J07gw== 105 | 106 | "@next/swc-linux-arm64-musl@12.1.5": 107 | version "12.1.5" 108 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.5.tgz#f811ec9f4b12a978426c284c95ab2f515ddf7f9e" 109 | integrity sha512-KgPjwdbhDqXI7ghNN8V/WAiLquc9Ebe8KBrNNEL0NQr+yd9CyKJ6KqjayVkmX+hbHzbyvbui/5wh/p3CZQ9xcQ== 110 | 111 | "@next/swc-linux-x64-gnu@12.1.5": 112 | version "12.1.5" 113 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.5.tgz#d44857257e6d20dc841998951d584ab1f25772c3" 114 | integrity sha512-O2ErUTvCJ6DkNTSr9pbu1n3tcqykqE/ebty1rwClzIYdOgpB3T2MfEPP+K7GhUR87wmN/hlihO9ch7qpVFDGKw== 115 | 116 | "@next/swc-linux-x64-musl@12.1.5": 117 | version "12.1.5" 118 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.5.tgz#3cc523abadc9a2a6de680593aff06e71cc29ecef" 119 | integrity sha512-1eIlZmlO/VRjxxzUBcVosf54AFU3ltAzHi+BJA+9U/lPxCYIsT+R4uO3QksRzRjKWhVQMRjEnlXyyq5SKJm7BA== 120 | 121 | "@next/swc-win32-arm64-msvc@12.1.5": 122 | version "12.1.5" 123 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.5.tgz#c62232d869f1f9b22e8f24e4e7f05307c20f30ca" 124 | integrity sha512-oromsfokbEuVb0CBLLE7R9qX3KGXucZpsojLpzUh1QJjuy1QkrPJncwr8xmWQnwgtQ6ecMWXgXPB+qtvizT9Tw== 125 | 126 | "@next/swc-win32-ia32-msvc@12.1.5": 127 | version "12.1.5" 128 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.5.tgz#2bd9b28a9ba730d12a493e7d9d18e150fe89d496" 129 | integrity sha512-a/51L5KzBpeZSW9LbekMo3I3Cwul+V+QKwbEIMA+Qwb2qrlcn1L9h3lt8cHqNTFt2y72ce6aTwDTw1lyi5oIRA== 130 | 131 | "@next/swc-win32-x64-msvc@12.1.5": 132 | version "12.1.5" 133 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.5.tgz#02f377e4d41eaaacf265e34bab9bacd8efc4a351" 134 | integrity sha512-/SoXW1Ntpmpw3AXAzfDRaQidnd8kbZ2oSni8u5z0yw6t4RwJvmdZy1eOaAADRThWKV+2oU90++LSnXJIwBRWYQ== 135 | 136 | "@nodelib/fs.scandir@2.1.5": 137 | version "2.1.5" 138 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 139 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 140 | dependencies: 141 | "@nodelib/fs.stat" "2.0.5" 142 | run-parallel "^1.1.9" 143 | 144 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 145 | version "2.0.5" 146 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 147 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 148 | 149 | "@nodelib/fs.walk@^1.2.3": 150 | version "1.2.8" 151 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 152 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 153 | dependencies: 154 | "@nodelib/fs.scandir" "2.1.5" 155 | fastq "^1.6.0" 156 | 157 | "@rushstack/eslint-patch@1.0.8": 158 | version "1.0.8" 159 | resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.0.8.tgz#be3e914e84eacf16dbebd311c0d0b44aa1174c64" 160 | integrity sha512-ZK5v4bJwgXldAUA8r3q9YKfCwOqoHTK/ZqRjSeRXQrBXWouoPnS4MQtgC4AXGiiBuUu5wxrRgTlv0ktmM4P1Aw== 161 | 162 | "@types/json-schema@^7.0.9": 163 | version "7.0.11" 164 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" 165 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 166 | 167 | "@types/json5@^0.0.29": 168 | version "0.0.29" 169 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 170 | integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= 171 | 172 | "@types/node@^17.0.30": 173 | version "17.0.30" 174 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.30.tgz#2c6e8512acac70815e8176aa30c38025067880ef" 175 | integrity sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw== 176 | 177 | "@types/prop-types@*": 178 | version "15.7.5" 179 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 180 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 181 | 182 | "@types/react@^18.0.8": 183 | version "18.0.8" 184 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.8.tgz#a051eb380a9fbcaa404550543c58e1cf5ce4ab87" 185 | integrity sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw== 186 | dependencies: 187 | "@types/prop-types" "*" 188 | "@types/scheduler" "*" 189 | csstype "^3.0.2" 190 | 191 | "@types/scheduler@*": 192 | version "0.16.2" 193 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" 194 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 195 | 196 | "@typescript-eslint/eslint-plugin@^5.22.0": 197 | version "5.22.0" 198 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.22.0.tgz#7b52a0de2e664044f28b36419210aea4ab619e2a" 199 | integrity sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg== 200 | dependencies: 201 | "@typescript-eslint/scope-manager" "5.22.0" 202 | "@typescript-eslint/type-utils" "5.22.0" 203 | "@typescript-eslint/utils" "5.22.0" 204 | debug "^4.3.2" 205 | functional-red-black-tree "^1.0.1" 206 | ignore "^5.1.8" 207 | regexpp "^3.2.0" 208 | semver "^7.3.5" 209 | tsutils "^3.21.0" 210 | 211 | "@typescript-eslint/parser@5.10.1": 212 | version "5.10.1" 213 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.1.tgz#4ce9633cc33fc70bc13786cb793c1a76fe5ad6bd" 214 | integrity sha512-GReo3tjNBwR5RnRO0K2wDIDN31cM3MmDtgyQ85oAxAmC5K3j/g85IjP+cDfcqDsDDBf1HNKQAD0WqOYL8jXqUA== 215 | dependencies: 216 | "@typescript-eslint/scope-manager" "5.10.1" 217 | "@typescript-eslint/types" "5.10.1" 218 | "@typescript-eslint/typescript-estree" "5.10.1" 219 | debug "^4.3.2" 220 | 221 | "@typescript-eslint/parser@^5.22.0": 222 | version "5.22.0" 223 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.22.0.tgz#7bedf8784ef0d5d60567c5ba4ce162460e70c178" 224 | integrity sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ== 225 | dependencies: 226 | "@typescript-eslint/scope-manager" "5.22.0" 227 | "@typescript-eslint/types" "5.22.0" 228 | "@typescript-eslint/typescript-estree" "5.22.0" 229 | debug "^4.3.2" 230 | 231 | "@typescript-eslint/scope-manager@5.10.1": 232 | version "5.10.1" 233 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz#f0539c73804d2423506db2475352a4dec36cd809" 234 | integrity sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg== 235 | dependencies: 236 | "@typescript-eslint/types" "5.10.1" 237 | "@typescript-eslint/visitor-keys" "5.10.1" 238 | 239 | "@typescript-eslint/scope-manager@5.22.0": 240 | version "5.22.0" 241 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz#590865f244ebe6e46dc3e9cab7976fc2afa8af24" 242 | integrity sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA== 243 | dependencies: 244 | "@typescript-eslint/types" "5.22.0" 245 | "@typescript-eslint/visitor-keys" "5.22.0" 246 | 247 | "@typescript-eslint/type-utils@5.22.0": 248 | version "5.22.0" 249 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.22.0.tgz#0c0e93b34210e334fbe1bcb7250c470f4a537c19" 250 | integrity sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA== 251 | dependencies: 252 | "@typescript-eslint/utils" "5.22.0" 253 | debug "^4.3.2" 254 | tsutils "^3.21.0" 255 | 256 | "@typescript-eslint/types@5.10.1": 257 | version "5.10.1" 258 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.1.tgz#dca9bd4cb8c067fc85304a31f38ec4766ba2d1ea" 259 | integrity sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q== 260 | 261 | "@typescript-eslint/types@5.22.0": 262 | version "5.22.0" 263 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.22.0.tgz#50a4266e457a5d4c4b87ac31903b28b06b2c3ed0" 264 | integrity sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw== 265 | 266 | "@typescript-eslint/typescript-estree@5.10.1": 267 | version "5.10.1" 268 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz#b268e67be0553f8790ba3fe87113282977adda15" 269 | integrity sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ== 270 | dependencies: 271 | "@typescript-eslint/types" "5.10.1" 272 | "@typescript-eslint/visitor-keys" "5.10.1" 273 | debug "^4.3.2" 274 | globby "^11.0.4" 275 | is-glob "^4.0.3" 276 | semver "^7.3.5" 277 | tsutils "^3.21.0" 278 | 279 | "@typescript-eslint/typescript-estree@5.22.0": 280 | version "5.22.0" 281 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz#e2116fd644c3e2fda7f4395158cddd38c0c6df97" 282 | integrity sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw== 283 | dependencies: 284 | "@typescript-eslint/types" "5.22.0" 285 | "@typescript-eslint/visitor-keys" "5.22.0" 286 | debug "^4.3.2" 287 | globby "^11.0.4" 288 | is-glob "^4.0.3" 289 | semver "^7.3.5" 290 | tsutils "^3.21.0" 291 | 292 | "@typescript-eslint/utils@5.22.0": 293 | version "5.22.0" 294 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.22.0.tgz#1f2c4897e2cf7e44443c848a13c60407861babd8" 295 | integrity sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ== 296 | dependencies: 297 | "@types/json-schema" "^7.0.9" 298 | "@typescript-eslint/scope-manager" "5.22.0" 299 | "@typescript-eslint/types" "5.22.0" 300 | "@typescript-eslint/typescript-estree" "5.22.0" 301 | eslint-scope "^5.1.1" 302 | eslint-utils "^3.0.0" 303 | 304 | "@typescript-eslint/visitor-keys@5.10.1": 305 | version "5.10.1" 306 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz#29102de692f59d7d34ecc457ed59ab5fc558010b" 307 | integrity sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ== 308 | dependencies: 309 | "@typescript-eslint/types" "5.10.1" 310 | eslint-visitor-keys "^3.0.0" 311 | 312 | "@typescript-eslint/visitor-keys@5.22.0": 313 | version "5.22.0" 314 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz#f49c0ce406944ffa331a1cfabeed451ea4d0909c" 315 | integrity sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg== 316 | dependencies: 317 | "@typescript-eslint/types" "5.22.0" 318 | eslint-visitor-keys "^3.0.0" 319 | 320 | "@yfs/react@^0.0.15": 321 | version "0.0.15" 322 | resolved "https://registry.yarnpkg.com/@yfs/react/-/react-0.0.15.tgz#061564cce2cca3b8e6d83019e69f25e9f5922dc6" 323 | integrity sha512-P/SwdJtvRIrNevoT9Fzpkh9xWTZ6azI9Z+VXWOmM72K+xtr0wSR5XGbtGj5EHAQlLk/csQjmfzqAq2I3K+T17w== 324 | dependencies: 325 | diff "^5.0.0" 326 | idb-keyval "^6.1.0" 327 | react "18.1.0" 328 | yjs "^13.5.35" 329 | 330 | acorn-jsx@^5.3.1: 331 | version "5.3.2" 332 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 333 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 334 | 335 | acorn@^8.7.0: 336 | version "8.7.1" 337 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" 338 | integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== 339 | 340 | ajv@^6.10.0, ajv@^6.12.4: 341 | version "6.12.6" 342 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 343 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 344 | dependencies: 345 | fast-deep-equal "^3.1.1" 346 | fast-json-stable-stringify "^2.0.0" 347 | json-schema-traverse "^0.4.1" 348 | uri-js "^4.2.2" 349 | 350 | ansi-regex@^5.0.1: 351 | version "5.0.1" 352 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 353 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 354 | 355 | ansi-styles@^4.1.0: 356 | version "4.3.0" 357 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 358 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 359 | dependencies: 360 | color-convert "^2.0.1" 361 | 362 | argparse@^2.0.1: 363 | version "2.0.1" 364 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 365 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 366 | 367 | aria-query@^4.2.2: 368 | version "4.2.2" 369 | resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" 370 | integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== 371 | dependencies: 372 | "@babel/runtime" "^7.10.2" 373 | "@babel/runtime-corejs3" "^7.10.2" 374 | 375 | array-includes@^3.1.4: 376 | version "3.1.4" 377 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" 378 | integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== 379 | dependencies: 380 | call-bind "^1.0.2" 381 | define-properties "^1.1.3" 382 | es-abstract "^1.19.1" 383 | get-intrinsic "^1.1.1" 384 | is-string "^1.0.7" 385 | 386 | array-union@^2.1.0: 387 | version "2.1.0" 388 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 389 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 390 | 391 | array.prototype.flat@^1.2.5: 392 | version "1.3.0" 393 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" 394 | integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== 395 | dependencies: 396 | call-bind "^1.0.2" 397 | define-properties "^1.1.3" 398 | es-abstract "^1.19.2" 399 | es-shim-unscopables "^1.0.0" 400 | 401 | array.prototype.flatmap@^1.2.5: 402 | version "1.3.0" 403 | resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" 404 | integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== 405 | dependencies: 406 | call-bind "^1.0.2" 407 | define-properties "^1.1.3" 408 | es-abstract "^1.19.2" 409 | es-shim-unscopables "^1.0.0" 410 | 411 | ast-types-flow@^0.0.7: 412 | version "0.0.7" 413 | resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" 414 | integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= 415 | 416 | axe-core@^4.3.5: 417 | version "4.4.1" 418 | resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413" 419 | integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw== 420 | 421 | axobject-query@^2.2.0: 422 | version "2.2.0" 423 | resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" 424 | integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== 425 | 426 | balanced-match@^1.0.0: 427 | version "1.0.2" 428 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 429 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 430 | 431 | base64-js@^1.3.1: 432 | version "1.5.1" 433 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 434 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 435 | 436 | brace-expansion@^1.1.7: 437 | version "1.1.11" 438 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 439 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 440 | dependencies: 441 | balanced-match "^1.0.0" 442 | concat-map "0.0.1" 443 | 444 | braces@^3.0.2: 445 | version "3.0.2" 446 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 447 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 448 | dependencies: 449 | fill-range "^7.0.1" 450 | 451 | buffer@^6.0.3: 452 | version "6.0.3" 453 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" 454 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 455 | dependencies: 456 | base64-js "^1.3.1" 457 | ieee754 "^1.2.1" 458 | 459 | call-bind@^1.0.0, call-bind@^1.0.2: 460 | version "1.0.2" 461 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 462 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 463 | dependencies: 464 | function-bind "^1.1.1" 465 | get-intrinsic "^1.0.2" 466 | 467 | callsites@^3.0.0: 468 | version "3.1.0" 469 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 470 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 471 | 472 | caniuse-lite@^1.0.30001283: 473 | version "1.0.30001334" 474 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001334.tgz#892e9965b35285033fc2b8a8eff499fe02f13d8b" 475 | integrity sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw== 476 | 477 | chalk@^4.0.0: 478 | version "4.1.2" 479 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 480 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 481 | dependencies: 482 | ansi-styles "^4.1.0" 483 | supports-color "^7.1.0" 484 | 485 | color-convert@^2.0.1: 486 | version "2.0.1" 487 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 488 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 489 | dependencies: 490 | color-name "~1.1.4" 491 | 492 | color-name@~1.1.4: 493 | version "1.1.4" 494 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 495 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 496 | 497 | concat-map@0.0.1: 498 | version "0.0.1" 499 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 500 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 501 | 502 | core-js-pure@^3.20.2: 503 | version "3.22.3" 504 | resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.3.tgz#181d1b6321fb29fe99c16a1f28beb840ab84ad36" 505 | integrity sha512-oN88zz7nmKROMy8GOjs+LN+0LedIvbMdnB5XsTlhcOg1WGARt9l0LFg0zohdoFmCsEZ1h2ZbSQ6azj3M+vhzwQ== 506 | 507 | cross-spawn@^7.0.2: 508 | version "7.0.3" 509 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 510 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 511 | dependencies: 512 | path-key "^3.1.0" 513 | shebang-command "^2.0.0" 514 | which "^2.0.1" 515 | 516 | csstype@^3.0.2: 517 | version "3.0.11" 518 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" 519 | integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== 520 | 521 | damerau-levenshtein@^1.0.7: 522 | version "1.0.8" 523 | resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" 524 | integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== 525 | 526 | debug@^2.6.9: 527 | version "2.6.9" 528 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 529 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 530 | dependencies: 531 | ms "2.0.0" 532 | 533 | debug@^3.2.7: 534 | version "3.2.7" 535 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 536 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 537 | dependencies: 538 | ms "^2.1.1" 539 | 540 | debug@^4.1.1, debug@^4.3.2: 541 | version "4.3.4" 542 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 543 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 544 | dependencies: 545 | ms "2.1.2" 546 | 547 | deep-is@^0.1.3: 548 | version "0.1.4" 549 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 550 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 551 | 552 | define-properties@^1.1.3: 553 | version "1.1.4" 554 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" 555 | integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== 556 | dependencies: 557 | has-property-descriptors "^1.0.0" 558 | object-keys "^1.1.1" 559 | 560 | diff@^5.0.0: 561 | version "5.0.0" 562 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 563 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 564 | 565 | dir-glob@^3.0.1: 566 | version "3.0.1" 567 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 568 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 569 | dependencies: 570 | path-type "^4.0.0" 571 | 572 | doctrine@^2.1.0: 573 | version "2.1.0" 574 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 575 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 576 | dependencies: 577 | esutils "^2.0.2" 578 | 579 | doctrine@^3.0.0: 580 | version "3.0.0" 581 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 582 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 583 | dependencies: 584 | esutils "^2.0.2" 585 | 586 | emoji-regex@^9.2.2: 587 | version "9.2.2" 588 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 589 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 590 | 591 | err-code@^3.0.1: 592 | version "3.0.1" 593 | resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" 594 | integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== 595 | 596 | es-abstract@^1.19.1, es-abstract@^1.19.2: 597 | version "1.19.5" 598 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.5.tgz#a2cb01eb87f724e815b278b0dd0d00f36ca9a7f1" 599 | integrity sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA== 600 | dependencies: 601 | call-bind "^1.0.2" 602 | es-to-primitive "^1.2.1" 603 | function-bind "^1.1.1" 604 | get-intrinsic "^1.1.1" 605 | get-symbol-description "^1.0.0" 606 | has "^1.0.3" 607 | has-symbols "^1.0.3" 608 | internal-slot "^1.0.3" 609 | is-callable "^1.2.4" 610 | is-negative-zero "^2.0.2" 611 | is-regex "^1.1.4" 612 | is-shared-array-buffer "^1.0.2" 613 | is-string "^1.0.7" 614 | is-weakref "^1.0.2" 615 | object-inspect "^1.12.0" 616 | object-keys "^1.1.1" 617 | object.assign "^4.1.2" 618 | string.prototype.trimend "^1.0.4" 619 | string.prototype.trimstart "^1.0.4" 620 | unbox-primitive "^1.0.1" 621 | 622 | es-shim-unscopables@^1.0.0: 623 | version "1.0.0" 624 | resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" 625 | integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== 626 | dependencies: 627 | has "^1.0.3" 628 | 629 | es-to-primitive@^1.2.1: 630 | version "1.2.1" 631 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 632 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 633 | dependencies: 634 | is-callable "^1.1.4" 635 | is-date-object "^1.0.1" 636 | is-symbol "^1.0.2" 637 | 638 | escape-string-regexp@^4.0.0: 639 | version "4.0.0" 640 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 641 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 642 | 643 | eslint-config-next@12.1.5: 644 | version "12.1.5" 645 | resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.1.5.tgz#658cc61194a32dfd917a3db199351396ea5db1d1" 646 | integrity sha512-P+DCt5ti63KhC0qNLzrAmPcwRGq8pYqgcf/NNr1E+WjCrMkWdCAXkIANTquo+kcO1adR2k1lTo5GCrNUtKy4hQ== 647 | dependencies: 648 | "@next/eslint-plugin-next" "12.1.5" 649 | "@rushstack/eslint-patch" "1.0.8" 650 | "@typescript-eslint/parser" "5.10.1" 651 | eslint-import-resolver-node "0.3.4" 652 | eslint-import-resolver-typescript "2.4.0" 653 | eslint-plugin-import "2.25.2" 654 | eslint-plugin-jsx-a11y "6.5.1" 655 | eslint-plugin-react "7.29.1" 656 | eslint-plugin-react-hooks "4.3.0" 657 | 658 | eslint-import-resolver-node@0.3.4: 659 | version "0.3.4" 660 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" 661 | integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== 662 | dependencies: 663 | debug "^2.6.9" 664 | resolve "^1.13.1" 665 | 666 | eslint-import-resolver-node@^0.3.6: 667 | version "0.3.6" 668 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" 669 | integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== 670 | dependencies: 671 | debug "^3.2.7" 672 | resolve "^1.20.0" 673 | 674 | eslint-import-resolver-typescript@2.4.0: 675 | version "2.4.0" 676 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.4.0.tgz#ec1e7063ebe807f0362a7320543aaed6fe1100e1" 677 | integrity sha512-useJKURidCcldRLCNKWemr1fFQL1SzB3G4a0li6lFGvlc5xGe1hY343bvG07cbpCzPuM/lK19FIJB3XGFSkplA== 678 | dependencies: 679 | debug "^4.1.1" 680 | glob "^7.1.6" 681 | is-glob "^4.0.1" 682 | resolve "^1.17.0" 683 | tsconfig-paths "^3.9.0" 684 | 685 | eslint-module-utils@^2.7.0: 686 | version "2.7.3" 687 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" 688 | integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== 689 | dependencies: 690 | debug "^3.2.7" 691 | find-up "^2.1.0" 692 | 693 | eslint-plugin-import@2.25.2: 694 | version "2.25.2" 695 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz#b3b9160efddb702fc1636659e71ba1d10adbe9e9" 696 | integrity sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g== 697 | dependencies: 698 | array-includes "^3.1.4" 699 | array.prototype.flat "^1.2.5" 700 | debug "^2.6.9" 701 | doctrine "^2.1.0" 702 | eslint-import-resolver-node "^0.3.6" 703 | eslint-module-utils "^2.7.0" 704 | has "^1.0.3" 705 | is-core-module "^2.7.0" 706 | is-glob "^4.0.3" 707 | minimatch "^3.0.4" 708 | object.values "^1.1.5" 709 | resolve "^1.20.0" 710 | tsconfig-paths "^3.11.0" 711 | 712 | eslint-plugin-jsx-a11y@6.5.1: 713 | version "6.5.1" 714 | resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" 715 | integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== 716 | dependencies: 717 | "@babel/runtime" "^7.16.3" 718 | aria-query "^4.2.2" 719 | array-includes "^3.1.4" 720 | ast-types-flow "^0.0.7" 721 | axe-core "^4.3.5" 722 | axobject-query "^2.2.0" 723 | damerau-levenshtein "^1.0.7" 724 | emoji-regex "^9.2.2" 725 | has "^1.0.3" 726 | jsx-ast-utils "^3.2.1" 727 | language-tags "^1.0.5" 728 | minimatch "^3.0.4" 729 | 730 | eslint-plugin-react-hooks@4.3.0: 731 | version "4.3.0" 732 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" 733 | integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== 734 | 735 | eslint-plugin-react@7.29.1: 736 | version "7.29.1" 737 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.1.tgz#6c40bc83142bb63d132a1b3565e2ea655411f800" 738 | integrity sha512-WtzRpHMhsOX05ZrkyaaqmLl2uXGqmYooCfBxftJKlkYdsltiufGgfU7uuoHwR2lBam2Kh/EIVID4aU9e3kbCMA== 739 | dependencies: 740 | array-includes "^3.1.4" 741 | array.prototype.flatmap "^1.2.5" 742 | doctrine "^2.1.0" 743 | estraverse "^5.3.0" 744 | jsx-ast-utils "^2.4.1 || ^3.0.0" 745 | minimatch "^3.1.2" 746 | object.entries "^1.1.5" 747 | object.fromentries "^2.0.5" 748 | object.hasown "^1.1.0" 749 | object.values "^1.1.5" 750 | prop-types "^15.8.1" 751 | resolve "^2.0.0-next.3" 752 | semver "^6.3.0" 753 | string.prototype.matchall "^4.0.6" 754 | 755 | eslint-scope@^5.1.1: 756 | version "5.1.1" 757 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 758 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 759 | dependencies: 760 | esrecurse "^4.3.0" 761 | estraverse "^4.1.1" 762 | 763 | eslint-scope@^7.1.1: 764 | version "7.1.1" 765 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" 766 | integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== 767 | dependencies: 768 | esrecurse "^4.3.0" 769 | estraverse "^5.2.0" 770 | 771 | eslint-utils@^3.0.0: 772 | version "3.0.0" 773 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 774 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 775 | dependencies: 776 | eslint-visitor-keys "^2.0.0" 777 | 778 | eslint-visitor-keys@^2.0.0: 779 | version "2.1.0" 780 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 781 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 782 | 783 | eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: 784 | version "3.3.0" 785 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 786 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 787 | 788 | eslint@8.14.0: 789 | version "8.14.0" 790 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.14.0.tgz#62741f159d9eb4a79695b28ec4989fcdec623239" 791 | integrity sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw== 792 | dependencies: 793 | "@eslint/eslintrc" "^1.2.2" 794 | "@humanwhocodes/config-array" "^0.9.2" 795 | ajv "^6.10.0" 796 | chalk "^4.0.0" 797 | cross-spawn "^7.0.2" 798 | debug "^4.3.2" 799 | doctrine "^3.0.0" 800 | escape-string-regexp "^4.0.0" 801 | eslint-scope "^7.1.1" 802 | eslint-utils "^3.0.0" 803 | eslint-visitor-keys "^3.3.0" 804 | espree "^9.3.1" 805 | esquery "^1.4.0" 806 | esutils "^2.0.2" 807 | fast-deep-equal "^3.1.3" 808 | file-entry-cache "^6.0.1" 809 | functional-red-black-tree "^1.0.1" 810 | glob-parent "^6.0.1" 811 | globals "^13.6.0" 812 | ignore "^5.2.0" 813 | import-fresh "^3.0.0" 814 | imurmurhash "^0.1.4" 815 | is-glob "^4.0.0" 816 | js-yaml "^4.1.0" 817 | json-stable-stringify-without-jsonify "^1.0.1" 818 | levn "^0.4.1" 819 | lodash.merge "^4.6.2" 820 | minimatch "^3.0.4" 821 | natural-compare "^1.4.0" 822 | optionator "^0.9.1" 823 | regexpp "^3.2.0" 824 | strip-ansi "^6.0.1" 825 | strip-json-comments "^3.1.0" 826 | text-table "^0.2.0" 827 | v8-compile-cache "^2.0.3" 828 | 829 | espree@^9.3.1: 830 | version "9.3.1" 831 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" 832 | integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== 833 | dependencies: 834 | acorn "^8.7.0" 835 | acorn-jsx "^5.3.1" 836 | eslint-visitor-keys "^3.3.0" 837 | 838 | esquery@^1.4.0: 839 | version "1.4.0" 840 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 841 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 842 | dependencies: 843 | estraverse "^5.1.0" 844 | 845 | esrecurse@^4.3.0: 846 | version "4.3.0" 847 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 848 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 849 | dependencies: 850 | estraverse "^5.2.0" 851 | 852 | estraverse@^4.1.1: 853 | version "4.3.0" 854 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 855 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 856 | 857 | estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: 858 | version "5.3.0" 859 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 860 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 861 | 862 | esutils@^2.0.2: 863 | version "2.0.3" 864 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 865 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 866 | 867 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 868 | version "3.1.3" 869 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 870 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 871 | 872 | fast-glob@^3.2.9: 873 | version "3.2.11" 874 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" 875 | integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 876 | dependencies: 877 | "@nodelib/fs.stat" "^2.0.2" 878 | "@nodelib/fs.walk" "^1.2.3" 879 | glob-parent "^5.1.2" 880 | merge2 "^1.3.0" 881 | micromatch "^4.0.4" 882 | 883 | fast-json-stable-stringify@^2.0.0: 884 | version "2.1.0" 885 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 886 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 887 | 888 | fast-levenshtein@^2.0.6: 889 | version "2.0.6" 890 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 891 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 892 | 893 | fastq@^1.6.0: 894 | version "1.13.0" 895 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 896 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 897 | dependencies: 898 | reusify "^1.0.4" 899 | 900 | file-entry-cache@^6.0.1: 901 | version "6.0.1" 902 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 903 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 904 | dependencies: 905 | flat-cache "^3.0.4" 906 | 907 | fill-range@^7.0.1: 908 | version "7.0.1" 909 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 910 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 911 | dependencies: 912 | to-regex-range "^5.0.1" 913 | 914 | find-up@^2.1.0: 915 | version "2.1.0" 916 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 917 | integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= 918 | dependencies: 919 | locate-path "^2.0.0" 920 | 921 | flat-cache@^3.0.4: 922 | version "3.0.4" 923 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 924 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 925 | dependencies: 926 | flatted "^3.1.0" 927 | rimraf "^3.0.2" 928 | 929 | flatted@^3.1.0: 930 | version "3.2.5" 931 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" 932 | integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== 933 | 934 | fs.realpath@^1.0.0: 935 | version "1.0.0" 936 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 937 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 938 | 939 | function-bind@^1.1.1: 940 | version "1.1.1" 941 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 942 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 943 | 944 | functional-red-black-tree@^1.0.1: 945 | version "1.0.1" 946 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 947 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 948 | 949 | functions-have-names@^1.2.2: 950 | version "1.2.3" 951 | resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" 952 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== 953 | 954 | get-browser-rtc@^1.1.0: 955 | version "1.1.0" 956 | resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz#d1494e299b00f33fc8e9d6d3343ba4ba99711a2c" 957 | integrity sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ== 958 | 959 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: 960 | version "1.1.1" 961 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 962 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 963 | dependencies: 964 | function-bind "^1.1.1" 965 | has "^1.0.3" 966 | has-symbols "^1.0.1" 967 | 968 | get-symbol-description@^1.0.0: 969 | version "1.0.0" 970 | resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" 971 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== 972 | dependencies: 973 | call-bind "^1.0.2" 974 | get-intrinsic "^1.1.1" 975 | 976 | glob-parent@^5.1.2: 977 | version "5.1.2" 978 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 979 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 980 | dependencies: 981 | is-glob "^4.0.1" 982 | 983 | glob-parent@^6.0.1: 984 | version "6.0.2" 985 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 986 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 987 | dependencies: 988 | is-glob "^4.0.3" 989 | 990 | glob@7.1.7: 991 | version "7.1.7" 992 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 993 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 994 | dependencies: 995 | fs.realpath "^1.0.0" 996 | inflight "^1.0.4" 997 | inherits "2" 998 | minimatch "^3.0.4" 999 | once "^1.3.0" 1000 | path-is-absolute "^1.0.0" 1001 | 1002 | glob@^7.1.3, glob@^7.1.6: 1003 | version "7.2.0" 1004 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 1005 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 1006 | dependencies: 1007 | fs.realpath "^1.0.0" 1008 | inflight "^1.0.4" 1009 | inherits "2" 1010 | minimatch "^3.0.4" 1011 | once "^1.3.0" 1012 | path-is-absolute "^1.0.0" 1013 | 1014 | globals@^13.6.0, globals@^13.9.0: 1015 | version "13.13.0" 1016 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" 1017 | integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== 1018 | dependencies: 1019 | type-fest "^0.20.2" 1020 | 1021 | globby@^11.0.4: 1022 | version "11.1.0" 1023 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1024 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1025 | dependencies: 1026 | array-union "^2.1.0" 1027 | dir-glob "^3.0.1" 1028 | fast-glob "^3.2.9" 1029 | ignore "^5.2.0" 1030 | merge2 "^1.4.1" 1031 | slash "^3.0.0" 1032 | 1033 | has-bigints@^1.0.1, has-bigints@^1.0.2: 1034 | version "1.0.2" 1035 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" 1036 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== 1037 | 1038 | has-flag@^4.0.0: 1039 | version "4.0.0" 1040 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1041 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1042 | 1043 | has-property-descriptors@^1.0.0: 1044 | version "1.0.0" 1045 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" 1046 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 1047 | dependencies: 1048 | get-intrinsic "^1.1.1" 1049 | 1050 | has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: 1051 | version "1.0.3" 1052 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1053 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1054 | 1055 | has-tostringtag@^1.0.0: 1056 | version "1.0.0" 1057 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 1058 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 1059 | dependencies: 1060 | has-symbols "^1.0.2" 1061 | 1062 | has@^1.0.3: 1063 | version "1.0.3" 1064 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1065 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1066 | dependencies: 1067 | function-bind "^1.1.1" 1068 | 1069 | idb-keyval@^6.1.0: 1070 | version "6.1.0" 1071 | resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.1.0.tgz#e659cff41188e6097d7fadd69926f6adbbe70041" 1072 | integrity sha512-u/qHZ75rlD3gH+Zah8dAJVJcGW/RfCnfNrFkElC5RpRCnpsCXXhqjVk+6MoVKJ3WhmNbRYdI6IIVP88e+5sxGw== 1073 | dependencies: 1074 | safari-14-idb-fix "^3.0.0" 1075 | 1076 | ieee754@^1.2.1: 1077 | version "1.2.1" 1078 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1079 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1080 | 1081 | ignore@^5.1.8, ignore@^5.2.0: 1082 | version "5.2.0" 1083 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 1084 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 1085 | 1086 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1087 | version "3.3.0" 1088 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1089 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1090 | dependencies: 1091 | parent-module "^1.0.0" 1092 | resolve-from "^4.0.0" 1093 | 1094 | imurmurhash@^0.1.4: 1095 | version "0.1.4" 1096 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1097 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1098 | 1099 | inflight@^1.0.4: 1100 | version "1.0.6" 1101 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1102 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1103 | dependencies: 1104 | once "^1.3.0" 1105 | wrappy "1" 1106 | 1107 | inherits@2, inherits@^2.0.3: 1108 | version "2.0.4" 1109 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1110 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1111 | 1112 | internal-slot@^1.0.3: 1113 | version "1.0.3" 1114 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" 1115 | integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== 1116 | dependencies: 1117 | get-intrinsic "^1.1.0" 1118 | has "^1.0.3" 1119 | side-channel "^1.0.4" 1120 | 1121 | is-bigint@^1.0.1: 1122 | version "1.0.4" 1123 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" 1124 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== 1125 | dependencies: 1126 | has-bigints "^1.0.1" 1127 | 1128 | is-boolean-object@^1.1.0: 1129 | version "1.1.2" 1130 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" 1131 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== 1132 | dependencies: 1133 | call-bind "^1.0.2" 1134 | has-tostringtag "^1.0.0" 1135 | 1136 | is-callable@^1.1.4, is-callable@^1.2.4: 1137 | version "1.2.4" 1138 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" 1139 | integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== 1140 | 1141 | is-core-module@^2.2.0, is-core-module@^2.7.0, is-core-module@^2.8.1: 1142 | version "2.9.0" 1143 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" 1144 | integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== 1145 | dependencies: 1146 | has "^1.0.3" 1147 | 1148 | is-date-object@^1.0.1: 1149 | version "1.0.5" 1150 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" 1151 | integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== 1152 | dependencies: 1153 | has-tostringtag "^1.0.0" 1154 | 1155 | is-extglob@^2.1.1: 1156 | version "2.1.1" 1157 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1158 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1159 | 1160 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1161 | version "4.0.3" 1162 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1163 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1164 | dependencies: 1165 | is-extglob "^2.1.1" 1166 | 1167 | is-negative-zero@^2.0.2: 1168 | version "2.0.2" 1169 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" 1170 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== 1171 | 1172 | is-number-object@^1.0.4: 1173 | version "1.0.7" 1174 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" 1175 | integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== 1176 | dependencies: 1177 | has-tostringtag "^1.0.0" 1178 | 1179 | is-number@^7.0.0: 1180 | version "7.0.0" 1181 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1182 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1183 | 1184 | is-regex@^1.1.4: 1185 | version "1.1.4" 1186 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 1187 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 1188 | dependencies: 1189 | call-bind "^1.0.2" 1190 | has-tostringtag "^1.0.0" 1191 | 1192 | is-shared-array-buffer@^1.0.2: 1193 | version "1.0.2" 1194 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" 1195 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== 1196 | dependencies: 1197 | call-bind "^1.0.2" 1198 | 1199 | is-string@^1.0.5, is-string@^1.0.7: 1200 | version "1.0.7" 1201 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" 1202 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== 1203 | dependencies: 1204 | has-tostringtag "^1.0.0" 1205 | 1206 | is-symbol@^1.0.2, is-symbol@^1.0.3: 1207 | version "1.0.4" 1208 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" 1209 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 1210 | dependencies: 1211 | has-symbols "^1.0.2" 1212 | 1213 | is-weakref@^1.0.2: 1214 | version "1.0.2" 1215 | resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" 1216 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== 1217 | dependencies: 1218 | call-bind "^1.0.2" 1219 | 1220 | isexe@^2.0.0: 1221 | version "2.0.0" 1222 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1223 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1224 | 1225 | isomorphic.js@^0.2.4: 1226 | version "0.2.5" 1227 | resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz#13eecf36f2dba53e85d355e11bf9d4208c6f7f88" 1228 | integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== 1229 | 1230 | "js-tokens@^3.0.0 || ^4.0.0": 1231 | version "4.0.0" 1232 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1233 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1234 | 1235 | js-yaml@^4.1.0: 1236 | version "4.1.0" 1237 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1238 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1239 | dependencies: 1240 | argparse "^2.0.1" 1241 | 1242 | json-schema-traverse@^0.4.1: 1243 | version "0.4.1" 1244 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1245 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1246 | 1247 | json-stable-stringify-without-jsonify@^1.0.1: 1248 | version "1.0.1" 1249 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1250 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1251 | 1252 | json5@^1.0.1: 1253 | version "1.0.1" 1254 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 1255 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 1256 | dependencies: 1257 | minimist "^1.2.0" 1258 | 1259 | "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: 1260 | version "3.3.0" 1261 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" 1262 | integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== 1263 | dependencies: 1264 | array-includes "^3.1.4" 1265 | object.assign "^4.1.2" 1266 | 1267 | language-subtag-registry@~0.3.2: 1268 | version "0.3.21" 1269 | resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" 1270 | integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== 1271 | 1272 | language-tags@^1.0.5: 1273 | version "1.0.5" 1274 | resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" 1275 | integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= 1276 | dependencies: 1277 | language-subtag-registry "~0.3.2" 1278 | 1279 | levn@^0.4.1: 1280 | version "0.4.1" 1281 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1282 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1283 | dependencies: 1284 | prelude-ls "^1.2.1" 1285 | type-check "~0.4.0" 1286 | 1287 | lib0@^0.2.35, lib0@^0.2.42, lib0@^0.2.49, lib0@^0.2.51: 1288 | version "0.2.51" 1289 | resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.51.tgz#23b1271a26f39120a4d0f86b9dfb44577f5ce98c" 1290 | integrity sha512-05Erb3465CxJa38LQlMz4EbetNvRna1S3BzqEjC0/pmp5cQuQSfNNmeS0722Wev1dRlMUp2Cql0gQ55krSXf2Q== 1291 | dependencies: 1292 | isomorphic.js "^0.2.4" 1293 | 1294 | locate-path@^2.0.0: 1295 | version "2.0.0" 1296 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1297 | integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= 1298 | dependencies: 1299 | p-locate "^2.0.0" 1300 | path-exists "^3.0.0" 1301 | 1302 | lodash.merge@^4.6.2: 1303 | version "4.6.2" 1304 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1305 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1306 | 1307 | loose-envify@^1.1.0, loose-envify@^1.4.0: 1308 | version "1.4.0" 1309 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1310 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1311 | dependencies: 1312 | js-tokens "^3.0.0 || ^4.0.0" 1313 | 1314 | lru-cache@^6.0.0: 1315 | version "6.0.0" 1316 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1317 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1318 | dependencies: 1319 | yallist "^4.0.0" 1320 | 1321 | merge2@^1.3.0, merge2@^1.4.1: 1322 | version "1.4.1" 1323 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1324 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1325 | 1326 | micromatch@^4.0.4: 1327 | version "4.0.5" 1328 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1329 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1330 | dependencies: 1331 | braces "^3.0.2" 1332 | picomatch "^2.3.1" 1333 | 1334 | minimatch@^3.0.4, minimatch@^3.1.2: 1335 | version "3.1.2" 1336 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1337 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1338 | dependencies: 1339 | brace-expansion "^1.1.7" 1340 | 1341 | minimist@^1.2.0, minimist@^1.2.6: 1342 | version "1.2.6" 1343 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 1344 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 1345 | 1346 | ms@2.0.0: 1347 | version "2.0.0" 1348 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1349 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1350 | 1351 | ms@2.1.2: 1352 | version "2.1.2" 1353 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1354 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1355 | 1356 | ms@^2.1.1: 1357 | version "2.1.3" 1358 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1359 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1360 | 1361 | nanoid@^3.1.30: 1362 | version "3.3.3" 1363 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" 1364 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 1365 | 1366 | natural-compare@^1.4.0: 1367 | version "1.4.0" 1368 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1369 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1370 | 1371 | next@12.1.5: 1372 | version "12.1.5" 1373 | resolved "https://registry.yarnpkg.com/next/-/next-12.1.5.tgz#7a07687579ddce61ee519493e1c178d83abac063" 1374 | integrity sha512-YGHDpyfgCfnT5GZObsKepmRnne7Kzp7nGrac07dikhutWQug7hHg85/+sPJ4ZW5Q2pDkb+n0FnmLkmd44htIJQ== 1375 | dependencies: 1376 | "@next/env" "12.1.5" 1377 | caniuse-lite "^1.0.30001283" 1378 | postcss "8.4.5" 1379 | styled-jsx "5.0.1" 1380 | optionalDependencies: 1381 | "@next/swc-android-arm-eabi" "12.1.5" 1382 | "@next/swc-android-arm64" "12.1.5" 1383 | "@next/swc-darwin-arm64" "12.1.5" 1384 | "@next/swc-darwin-x64" "12.1.5" 1385 | "@next/swc-linux-arm-gnueabihf" "12.1.5" 1386 | "@next/swc-linux-arm64-gnu" "12.1.5" 1387 | "@next/swc-linux-arm64-musl" "12.1.5" 1388 | "@next/swc-linux-x64-gnu" "12.1.5" 1389 | "@next/swc-linux-x64-musl" "12.1.5" 1390 | "@next/swc-win32-arm64-msvc" "12.1.5" 1391 | "@next/swc-win32-ia32-msvc" "12.1.5" 1392 | "@next/swc-win32-x64-msvc" "12.1.5" 1393 | 1394 | object-assign@^4.1.1: 1395 | version "4.1.1" 1396 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1397 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1398 | 1399 | object-inspect@^1.12.0, object-inspect@^1.9.0: 1400 | version "1.12.0" 1401 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" 1402 | integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== 1403 | 1404 | object-keys@^1.1.1: 1405 | version "1.1.1" 1406 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1407 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1408 | 1409 | object.assign@^4.1.2: 1410 | version "4.1.2" 1411 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" 1412 | integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== 1413 | dependencies: 1414 | call-bind "^1.0.0" 1415 | define-properties "^1.1.3" 1416 | has-symbols "^1.0.1" 1417 | object-keys "^1.1.1" 1418 | 1419 | object.entries@^1.1.5: 1420 | version "1.1.5" 1421 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" 1422 | integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== 1423 | dependencies: 1424 | call-bind "^1.0.2" 1425 | define-properties "^1.1.3" 1426 | es-abstract "^1.19.1" 1427 | 1428 | object.fromentries@^2.0.5: 1429 | version "2.0.5" 1430 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" 1431 | integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== 1432 | dependencies: 1433 | call-bind "^1.0.2" 1434 | define-properties "^1.1.3" 1435 | es-abstract "^1.19.1" 1436 | 1437 | object.hasown@^1.1.0: 1438 | version "1.1.0" 1439 | resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" 1440 | integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== 1441 | dependencies: 1442 | define-properties "^1.1.3" 1443 | es-abstract "^1.19.1" 1444 | 1445 | object.values@^1.1.5: 1446 | version "1.1.5" 1447 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" 1448 | integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== 1449 | dependencies: 1450 | call-bind "^1.0.2" 1451 | define-properties "^1.1.3" 1452 | es-abstract "^1.19.1" 1453 | 1454 | once@^1.3.0: 1455 | version "1.4.0" 1456 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1457 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1458 | dependencies: 1459 | wrappy "1" 1460 | 1461 | optionator@^0.9.1: 1462 | version "0.9.1" 1463 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1464 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1465 | dependencies: 1466 | deep-is "^0.1.3" 1467 | fast-levenshtein "^2.0.6" 1468 | levn "^0.4.1" 1469 | prelude-ls "^1.2.1" 1470 | type-check "^0.4.0" 1471 | word-wrap "^1.2.3" 1472 | 1473 | p-limit@^1.1.0: 1474 | version "1.3.0" 1475 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1476 | integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== 1477 | dependencies: 1478 | p-try "^1.0.0" 1479 | 1480 | p-locate@^2.0.0: 1481 | version "2.0.0" 1482 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1483 | integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 1484 | dependencies: 1485 | p-limit "^1.1.0" 1486 | 1487 | p-try@^1.0.0: 1488 | version "1.0.0" 1489 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1490 | integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= 1491 | 1492 | parent-module@^1.0.0: 1493 | version "1.0.1" 1494 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1495 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1496 | dependencies: 1497 | callsites "^3.0.0" 1498 | 1499 | path-exists@^3.0.0: 1500 | version "3.0.0" 1501 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1502 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1503 | 1504 | path-is-absolute@^1.0.0: 1505 | version "1.0.1" 1506 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1507 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1508 | 1509 | path-key@^3.1.0: 1510 | version "3.1.1" 1511 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1512 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1513 | 1514 | path-parse@^1.0.6, path-parse@^1.0.7: 1515 | version "1.0.7" 1516 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1517 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1518 | 1519 | path-type@^4.0.0: 1520 | version "4.0.0" 1521 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1522 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1523 | 1524 | picocolors@^1.0.0: 1525 | version "1.0.0" 1526 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1527 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1528 | 1529 | picomatch@^2.3.1: 1530 | version "2.3.1" 1531 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1532 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1533 | 1534 | postcss@8.4.5: 1535 | version "8.4.5" 1536 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" 1537 | integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== 1538 | dependencies: 1539 | nanoid "^3.1.30" 1540 | picocolors "^1.0.0" 1541 | source-map-js "^1.0.1" 1542 | 1543 | prelude-ls@^1.2.1: 1544 | version "1.2.1" 1545 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1546 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1547 | 1548 | prop-types@^15.7.2, prop-types@^15.8.1: 1549 | version "15.8.1" 1550 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" 1551 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== 1552 | dependencies: 1553 | loose-envify "^1.4.0" 1554 | object-assign "^4.1.1" 1555 | react-is "^16.13.1" 1556 | 1557 | punycode@^2.1.0: 1558 | version "2.1.1" 1559 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1560 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1561 | 1562 | queue-microtask@^1.2.2, queue-microtask@^1.2.3: 1563 | version "1.2.3" 1564 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1565 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1566 | 1567 | randombytes@^2.1.0: 1568 | version "2.1.0" 1569 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1570 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1571 | dependencies: 1572 | safe-buffer "^5.1.0" 1573 | 1574 | react-dom@18.1.0: 1575 | version "18.1.0" 1576 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f" 1577 | integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== 1578 | dependencies: 1579 | loose-envify "^1.1.0" 1580 | scheduler "^0.22.0" 1581 | 1582 | react-is@^16.13.1: 1583 | version "16.13.1" 1584 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 1585 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 1586 | 1587 | react@18.1.0: 1588 | version "18.1.0" 1589 | resolved "https://registry.yarnpkg.com/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" 1590 | integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== 1591 | dependencies: 1592 | loose-envify "^1.1.0" 1593 | 1594 | readable-stream@^3.6.0: 1595 | version "3.6.0" 1596 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1597 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1598 | dependencies: 1599 | inherits "^2.0.3" 1600 | string_decoder "^1.1.1" 1601 | util-deprecate "^1.0.1" 1602 | 1603 | regenerator-runtime@^0.13.4: 1604 | version "0.13.9" 1605 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" 1606 | integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== 1607 | 1608 | regexp.prototype.flags@^1.4.1: 1609 | version "1.4.3" 1610 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" 1611 | integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== 1612 | dependencies: 1613 | call-bind "^1.0.2" 1614 | define-properties "^1.1.3" 1615 | functions-have-names "^1.2.2" 1616 | 1617 | regexpp@^3.2.0: 1618 | version "3.2.0" 1619 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 1620 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 1621 | 1622 | resolve-from@^4.0.0: 1623 | version "4.0.0" 1624 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1625 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1626 | 1627 | resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0: 1628 | version "1.22.0" 1629 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" 1630 | integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== 1631 | dependencies: 1632 | is-core-module "^2.8.1" 1633 | path-parse "^1.0.7" 1634 | supports-preserve-symlinks-flag "^1.0.0" 1635 | 1636 | resolve@^2.0.0-next.3: 1637 | version "2.0.0-next.3" 1638 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" 1639 | integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== 1640 | dependencies: 1641 | is-core-module "^2.2.0" 1642 | path-parse "^1.0.6" 1643 | 1644 | reusify@^1.0.4: 1645 | version "1.0.4" 1646 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1647 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1648 | 1649 | rimraf@^3.0.2: 1650 | version "3.0.2" 1651 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1652 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1653 | dependencies: 1654 | glob "^7.1.3" 1655 | 1656 | run-parallel@^1.1.9: 1657 | version "1.2.0" 1658 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1659 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1660 | dependencies: 1661 | queue-microtask "^1.2.2" 1662 | 1663 | safari-14-idb-fix@^3.0.0: 1664 | version "3.0.0" 1665 | resolved "https://registry.yarnpkg.com/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz#450fc049b996ec7f3fd9ca2f89d32e0761583440" 1666 | integrity sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog== 1667 | 1668 | safe-buffer@^5.1.0, safe-buffer@~5.2.0: 1669 | version "5.2.1" 1670 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1671 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1672 | 1673 | scheduler@^0.22.0: 1674 | version "0.22.0" 1675 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" 1676 | integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== 1677 | dependencies: 1678 | loose-envify "^1.1.0" 1679 | 1680 | semver@^6.3.0: 1681 | version "6.3.0" 1682 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1683 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1684 | 1685 | semver@^7.3.5: 1686 | version "7.3.7" 1687 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" 1688 | integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== 1689 | dependencies: 1690 | lru-cache "^6.0.0" 1691 | 1692 | shebang-command@^2.0.0: 1693 | version "2.0.0" 1694 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1695 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1696 | dependencies: 1697 | shebang-regex "^3.0.0" 1698 | 1699 | shebang-regex@^3.0.0: 1700 | version "3.0.0" 1701 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1702 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1703 | 1704 | side-channel@^1.0.4: 1705 | version "1.0.4" 1706 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1707 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1708 | dependencies: 1709 | call-bind "^1.0.0" 1710 | get-intrinsic "^1.0.2" 1711 | object-inspect "^1.9.0" 1712 | 1713 | simple-peer@^9.11.0: 1714 | version "9.11.1" 1715 | resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.11.1.tgz#9814d5723f821b778b7fb011bdefcbd1e788e6cc" 1716 | integrity sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw== 1717 | dependencies: 1718 | buffer "^6.0.3" 1719 | debug "^4.3.2" 1720 | err-code "^3.0.1" 1721 | get-browser-rtc "^1.1.0" 1722 | queue-microtask "^1.2.3" 1723 | randombytes "^2.1.0" 1724 | readable-stream "^3.6.0" 1725 | 1726 | slash@^3.0.0: 1727 | version "3.0.0" 1728 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1729 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1730 | 1731 | source-map-js@^1.0.1: 1732 | version "1.0.2" 1733 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1734 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1735 | 1736 | state-local@^1.0.6: 1737 | version "1.0.7" 1738 | resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" 1739 | integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== 1740 | 1741 | string.prototype.matchall@^4.0.6: 1742 | version "4.0.7" 1743 | resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" 1744 | integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== 1745 | dependencies: 1746 | call-bind "^1.0.2" 1747 | define-properties "^1.1.3" 1748 | es-abstract "^1.19.1" 1749 | get-intrinsic "^1.1.1" 1750 | has-symbols "^1.0.3" 1751 | internal-slot "^1.0.3" 1752 | regexp.prototype.flags "^1.4.1" 1753 | side-channel "^1.0.4" 1754 | 1755 | string.prototype.trimend@^1.0.4: 1756 | version "1.0.4" 1757 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" 1758 | integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== 1759 | dependencies: 1760 | call-bind "^1.0.2" 1761 | define-properties "^1.1.3" 1762 | 1763 | string.prototype.trimstart@^1.0.4: 1764 | version "1.0.4" 1765 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" 1766 | integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== 1767 | dependencies: 1768 | call-bind "^1.0.2" 1769 | define-properties "^1.1.3" 1770 | 1771 | string_decoder@^1.1.1: 1772 | version "1.3.0" 1773 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1774 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1775 | dependencies: 1776 | safe-buffer "~5.2.0" 1777 | 1778 | strip-ansi@^6.0.1: 1779 | version "6.0.1" 1780 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1781 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1782 | dependencies: 1783 | ansi-regex "^5.0.1" 1784 | 1785 | strip-bom@^3.0.0: 1786 | version "3.0.0" 1787 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1788 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1789 | 1790 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 1791 | version "3.1.1" 1792 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1793 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1794 | 1795 | styled-jsx@5.0.1: 1796 | version "5.0.1" 1797 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.1.tgz#78fecbbad2bf95ce6cd981a08918ce4696f5fc80" 1798 | integrity sha512-+PIZ/6Uk40mphiQJJI1202b+/dYeTVd9ZnMPR80pgiWbjIwvN2zIp4r9et0BgqBuShh48I0gttPlAXA7WVvBxw== 1799 | 1800 | supports-color@^7.1.0: 1801 | version "7.2.0" 1802 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1803 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1804 | dependencies: 1805 | has-flag "^4.0.0" 1806 | 1807 | supports-preserve-symlinks-flag@^1.0.0: 1808 | version "1.0.0" 1809 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1810 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1811 | 1812 | text-table@^0.2.0: 1813 | version "0.2.0" 1814 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1815 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1816 | 1817 | to-regex-range@^5.0.1: 1818 | version "5.0.1" 1819 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1820 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1821 | dependencies: 1822 | is-number "^7.0.0" 1823 | 1824 | tsconfig-paths@^3.11.0, tsconfig-paths@^3.9.0: 1825 | version "3.14.1" 1826 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" 1827 | integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== 1828 | dependencies: 1829 | "@types/json5" "^0.0.29" 1830 | json5 "^1.0.1" 1831 | minimist "^1.2.6" 1832 | strip-bom "^3.0.0" 1833 | 1834 | tslib@^1.8.1: 1835 | version "1.14.1" 1836 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1837 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1838 | 1839 | tsutils@^3.21.0: 1840 | version "3.21.0" 1841 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 1842 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 1843 | dependencies: 1844 | tslib "^1.8.1" 1845 | 1846 | type-check@^0.4.0, type-check@~0.4.0: 1847 | version "0.4.0" 1848 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1849 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1850 | dependencies: 1851 | prelude-ls "^1.2.1" 1852 | 1853 | type-fest@^0.20.2: 1854 | version "0.20.2" 1855 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1856 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1857 | 1858 | typescript@^4.6.4: 1859 | version "4.6.4" 1860 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" 1861 | integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== 1862 | 1863 | unbox-primitive@^1.0.1: 1864 | version "1.0.2" 1865 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" 1866 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== 1867 | dependencies: 1868 | call-bind "^1.0.2" 1869 | has-bigints "^1.0.2" 1870 | has-symbols "^1.0.3" 1871 | which-boxed-primitive "^1.0.2" 1872 | 1873 | uri-js@^4.2.2: 1874 | version "4.4.1" 1875 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1876 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1877 | dependencies: 1878 | punycode "^2.1.0" 1879 | 1880 | util-deprecate@^1.0.1: 1881 | version "1.0.2" 1882 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1883 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1884 | 1885 | v8-compile-cache@^2.0.3: 1886 | version "2.3.0" 1887 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" 1888 | integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 1889 | 1890 | which-boxed-primitive@^1.0.2: 1891 | version "1.0.2" 1892 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 1893 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 1894 | dependencies: 1895 | is-bigint "^1.0.1" 1896 | is-boolean-object "^1.1.0" 1897 | is-number-object "^1.0.4" 1898 | is-string "^1.0.5" 1899 | is-symbol "^1.0.3" 1900 | 1901 | which@^2.0.1: 1902 | version "2.0.2" 1903 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1904 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1905 | dependencies: 1906 | isexe "^2.0.0" 1907 | 1908 | word-wrap@^1.2.3: 1909 | version "1.2.3" 1910 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1911 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1912 | 1913 | wrappy@1: 1914 | version "1.0.2" 1915 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1916 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1917 | 1918 | ws@^7.2.0: 1919 | version "7.5.7" 1920 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" 1921 | integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== 1922 | 1923 | y-indexeddb@^9.0.7: 1924 | version "9.0.7" 1925 | resolved "https://registry.yarnpkg.com/y-indexeddb/-/y-indexeddb-9.0.7.tgz#516f6a9dc2ca68a0cc280030141faecaae699ea9" 1926 | integrity sha512-58rDlwtRgXucgR9Kxc49AepAR6uGNGfcvPPAMrmMfSvRBQ/tPnx6NoHNyrRkhbALEAjV9tPEAIP0a/KkVqAIyA== 1927 | dependencies: 1928 | lib0 "^0.2.35" 1929 | 1930 | y-protocols@^1.0.5: 1931 | version "1.0.5" 1932 | resolved "https://registry.yarnpkg.com/y-protocols/-/y-protocols-1.0.5.tgz#91d574250060b29fcac8f8eb5e276fbad594245e" 1933 | integrity sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A== 1934 | dependencies: 1935 | lib0 "^0.2.42" 1936 | 1937 | y-webrtc@^10.2.3: 1938 | version "10.2.3" 1939 | resolved "https://registry.yarnpkg.com/y-webrtc/-/y-webrtc-10.2.3.tgz#cb0d3194c18c999ac45a78a182042a305528dd41" 1940 | integrity sha512-X7a6c56/jWhEI8LHLmT3LgzwbPA4r8h46pdVvV+55EQJhi+K6RfmisWgj7h6/2gkB0yveq7iDxlmyrYGnAKW/Q== 1941 | dependencies: 1942 | lib0 "^0.2.42" 1943 | simple-peer "^9.11.0" 1944 | y-protocols "^1.0.5" 1945 | optionalDependencies: 1946 | ws "^7.2.0" 1947 | 1948 | yallist@^4.0.0: 1949 | version "4.0.0" 1950 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1951 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1952 | 1953 | yjs@^13.5.35: 1954 | version "13.5.35" 1955 | resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.5.35.tgz#9af7981da3005821304bf87aa949cedea1b69294" 1956 | integrity sha512-vsqGmvZLiVwFcI4RlIZJeX59lGXDLXw37QrrbKVWXQJGbhMKgwAhZI4ZUVANUO54waoE1jta/NWb6gLSqNZ82Q== 1957 | dependencies: 1958 | lib0 "^0.2.49" 1959 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@yfs/react", 3 | "version": "0.1.0", 4 | "description": "Synchronize text files between the browser and the file system", 5 | "license": "MIT", 6 | "repository": "git@github.com:motifland/yfs.git", 7 | "author": { 8 | "name": "Michael Fester", 9 | "email": "michael.fester@gmail.com", 10 | "url": "https://motif.land" 11 | }, 12 | "sideEffects": false, 13 | "type": "module", 14 | "module": "./dist/index.js", 15 | "types": "./dist/index.d.ts", 16 | "files": ["dist"], 17 | "scripts": { 18 | "build": "rimraf ./dist && tsc", 19 | "prepublish": "npm run tsc", 20 | "clean": "rimraf ./dist" 21 | }, 22 | "dependencies": { 23 | "diff": "^5.0.0", 24 | "idb-keyval": "^6.1.0", 25 | "react": "18.1.0", 26 | "yjs": "^13.5.35" 27 | }, 28 | "devDependencies": { 29 | "@types/diff": "^5.0.2", 30 | "@types/node": "^17.0.30", 31 | "@types/react": "^18.0.8", 32 | "typescript": "^4.6.4" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/cache.ts: -------------------------------------------------------------------------------- 1 | import { set as idbSet, get as idbGet } from 'idb-keyval' 2 | import { STORE_KEY_CACHED_FS_FILE } from './constants' 3 | 4 | type LastWriteCacheData = { 5 | name: string 6 | content: string 7 | lastModified: number 8 | } 9 | 10 | const getLastWriteCacheKey = (name: string) => { 11 | return `${STORE_KEY_CACHED_FS_FILE}-${name}` 12 | } 13 | 14 | export const setLastWriteCacheData = async ( 15 | name: string, 16 | content: string, 17 | lastModified: number 18 | ) => { 19 | await idbSet( 20 | getLastWriteCacheKey(name), 21 | JSON.stringify({ 22 | name, 23 | content, 24 | lastModified 25 | }) 26 | ) 27 | } 28 | 29 | export const getLastWriteCacheData = async ( 30 | name: string 31 | ): Promise => { 32 | const jsonFile = await idbGet(getLastWriteCacheKey(name)) 33 | if (jsonFile) { 34 | return JSON.parse(jsonFile) 35 | } 36 | return undefined 37 | } 38 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const STORE_KEY_DIRECTORY_HANDLE = 'STORE_KEY_DIRECTORY_HANDLE' 2 | export const STORE_KEY_CACHED_FS_FILE = 'STORE_KEY_CACHED_FS_FILE' 3 | -------------------------------------------------------------------------------- /src/helpers.ts: -------------------------------------------------------------------------------- 1 | export type HandleWithPath = { 2 | handle: FileSystemHandle 3 | path: string[] 4 | type: 'file' | 'directory' 5 | } 6 | 7 | const readWriteOptions = { mode: 'readwrite' } 8 | 9 | export const isReadWritePermissionGranted = async ( 10 | handle: FileSystemFileHandle | FileSystemDirectoryHandle 11 | ) => { 12 | return (await (handle as any).queryPermission(readWriteOptions)) === 'granted' 13 | } 14 | 15 | export const askReadWritePermissionsIfNeeded = async ( 16 | handle: FileSystemFileHandle | FileSystemDirectoryHandle 17 | ) => { 18 | if (await isReadWritePermissionGranted(handle)) { 19 | return true 20 | } 21 | 22 | const permission = await (handle as any).requestPermission(readWriteOptions) 23 | return permission === 'granted' 24 | } 25 | 26 | const createEmptyFileInFolder = async ( 27 | parentDirectoryHandle: FileSystemDirectoryHandle, 28 | name: string 29 | ): Promise => { 30 | return await parentDirectoryHandle.getFileHandle(name, { create: true }) 31 | } 32 | 33 | export const createFolderInFolder = async ( 34 | parentDirectoryHandle: FileSystemDirectoryHandle, 35 | name: string 36 | ): Promise => { 37 | return await parentDirectoryHandle.getDirectoryHandle(name, { create: true }) 38 | } 39 | 40 | const writeContentToFile = async ( 41 | fileHandle: FileSystemFileHandle, 42 | content: string 43 | ) => { 44 | const writable = await (fileHandle as any).createWritable() 45 | await writable.write(content) 46 | await writable.close() 47 | } 48 | 49 | export const writeContentToFileIfChanged = async ( 50 | fsFile: globalThis.File, 51 | fileHandle: FileSystemFileHandle, 52 | content: string 53 | ) => { 54 | const fsFileContent = await fsFile.text() 55 | if (fsFileContent === content) { 56 | return 57 | } 58 | await writeContentToFile(fileHandle, content) 59 | } 60 | 61 | export const renameFile = async ( 62 | fsFile: globalThis.File, 63 | parentDirectoryHandle: FileSystemDirectoryHandle, 64 | name: string 65 | ) => { 66 | // Move and rename is not currently supported by the FileSystem 67 | // Access API so we need to do this they manual way by creating 68 | // a new file and deleting the old one. 69 | const content = await fsFile.text() 70 | await createFile(parentDirectoryHandle, name, content) 71 | await deleteFile(parentDirectoryHandle, fsFile.name) 72 | } 73 | 74 | export const moveFile = async ( 75 | fsFile: globalThis.File, 76 | sourceDirectoryHandle: FileSystemDirectoryHandle, 77 | destinationDirectoryHandle: FileSystemDirectoryHandle 78 | ) => { 79 | // Same comment as renameFile 80 | const content = await fsFile.text() 81 | await createFile(destinationDirectoryHandle, fsFile.name, content) 82 | await deleteFile(sourceDirectoryHandle, fsFile.name) 83 | } 84 | 85 | export const moveFolderContent = async ( 86 | sourceFolderHandle: FileSystemDirectoryHandle, 87 | destinationFolderHandle: FileSystemDirectoryHandle 88 | ) => { 89 | for await (const handle of (sourceFolderHandle as any).values()) { 90 | if (handle.kind === 'file') { 91 | const fsFile = await (handle as FileSystemFileHandle).getFile() 92 | await moveFile(fsFile, sourceFolderHandle, destinationFolderHandle) 93 | } else if (handle.kind === 'directory') { 94 | await moveFolder(handle, sourceFolderHandle, destinationFolderHandle) 95 | } 96 | } 97 | } 98 | 99 | export const moveFolder = async ( 100 | folderHandle: FileSystemDirectoryHandle, 101 | parentDirectoryHandle: FileSystemDirectoryHandle, 102 | destinationFolderHandle: FileSystemDirectoryHandle 103 | ) => { 104 | const newFolderHandle = await createFolderInFolder( 105 | destinationFolderHandle, 106 | folderHandle.name 107 | ) 108 | await moveFolderContent(folderHandle, newFolderHandle) 109 | await deleteFolder(folderHandle.name, parentDirectoryHandle) 110 | } 111 | 112 | export const renameFolder = async ( 113 | folderHandle: FileSystemDirectoryHandle, 114 | parentDirectoryHandle: FileSystemDirectoryHandle, 115 | newName: string 116 | ) => { 117 | const newFolderHandle = await createFolderInFolder( 118 | parentDirectoryHandle, 119 | newName 120 | ) 121 | try { 122 | await moveFolderContent(folderHandle, newFolderHandle) 123 | await deleteFolder(folderHandle.name, parentDirectoryHandle) 124 | } catch { 125 | // Do nothing 126 | } 127 | } 128 | 129 | export const createFile = async ( 130 | parentDirectoryHandle: FileSystemDirectoryHandle, 131 | name: string, 132 | content: string 133 | ): Promise => { 134 | const newFileHandle = await createEmptyFileInFolder( 135 | parentDirectoryHandle, 136 | name 137 | ) 138 | await writeContentToFile(newFileHandle, content) 139 | return newFileHandle 140 | } 141 | 142 | export const deleteFile = async ( 143 | parentDirectoryHandle: FileSystemDirectoryHandle, 144 | name: string 145 | ) => { 146 | await parentDirectoryHandle.removeEntry(name) 147 | } 148 | 149 | export const deleteFolder = async ( 150 | name: string, 151 | parentDirectoryHandle: FileSystemDirectoryHandle 152 | ) => { 153 | await parentDirectoryHandle.removeEntry(name, { 154 | recursive: true 155 | }) 156 | } 157 | 158 | export const getFSFileHandle = async ( 159 | name: string, 160 | directoryHandle: FileSystemDirectoryHandle 161 | ): Promise => { 162 | for await (const handle of (directoryHandle as any).values()) { 163 | const relativePath = (await directoryHandle.resolve(handle)) || [] 164 | if (relativePath?.length === 1 && relativePath[0] === name) { 165 | return handle 166 | } 167 | } 168 | return undefined 169 | } 170 | 171 | export const isHandlesEqual = async ( 172 | handle: FileSystemHandle | undefined, 173 | otherHandle: FileSystemHandle | undefined 174 | ) => { 175 | if (!handle && !otherHandle) { 176 | return true 177 | } 178 | 179 | if (handle && otherHandle) { 180 | return await (handle as any)?.isSameEntry(otherHandle) 181 | } 182 | 183 | return false 184 | } 185 | 186 | export const isIgnoredPath = (path: string[]): boolean => { 187 | // Return true if the file at the given path should be ignored for 188 | // syncing. This is the case currently if the path contains a component 189 | // that starts with a period, e.g. ".git" or ".DS_Store". 190 | return !!path.find(p => p.startsWith('.') || p.endsWith('.crswap')) 191 | } 192 | 193 | export const isTextMimeType = (file: globalThis.File) => { 194 | // Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types 195 | return file.type.startsWith('text/') || !file.type 196 | } 197 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { useCallback, useEffect, useMemo, useState } from 'react' 2 | import { set as idbSet, get as idbGet, del as idbDel } from 'idb-keyval' 3 | import * as Y from 'yjs' 4 | import { STORE_KEY_DIRECTORY_HANDLE } from './constants' 5 | import { 6 | askReadWritePermissionsIfNeeded, 7 | createFile, 8 | getFSFileHandle, 9 | writeContentToFileIfChanged 10 | } from './helpers' 11 | import { getLastWriteCacheData, setLastWriteCacheData } from './cache' 12 | import { getDeltaOperations } from './yjs' 13 | 14 | const useFileSync = () => { 15 | const [isSupported, setSupported] = useState(false) 16 | const [isWritePermissionGranted, setWritePermissionGranted] = useState(false) 17 | const [directoryHandle, setDirectoryHandle] = useState< 18 | FileSystemDirectoryHandle | undefined 19 | >(undefined) 20 | 21 | useEffect(() => { 22 | setSupported(typeof (window as any).showDirectoryPicker === 'function') 23 | }, []) 24 | 25 | useEffect(() => { 26 | const loadHandle = async () => { 27 | const handle = await idbGet(STORE_KEY_DIRECTORY_HANDLE) 28 | if (handle) { 29 | setDirectoryHandle(handle) 30 | } 31 | } 32 | loadHandle() 33 | }, []) 34 | 35 | useEffect(() => { 36 | if (directoryHandle) { 37 | idbSet(STORE_KEY_DIRECTORY_HANDLE, directoryHandle) 38 | } 39 | }, [directoryHandle]) 40 | 41 | const grantWritePermission = useCallback(async () => { 42 | if (!isSupported || !directoryHandle) { 43 | return 44 | } 45 | try { 46 | const granted = await askReadWritePermissionsIfNeeded(directoryHandle) 47 | setWritePermissionGranted(granted) 48 | } catch {} 49 | }, [isSupported, directoryHandle]) 50 | 51 | const setRootDirectory = useCallback( 52 | async (withWritePermission: boolean) => { 53 | if (!isSupported) { 54 | return 55 | } 56 | try { 57 | const handle = await (window as any).showDirectoryPicker() 58 | if (handle) { 59 | setDirectoryHandle(handle) 60 | if (withWritePermission) { 61 | const granted = await askReadWritePermissionsIfNeeded(handle) 62 | setWritePermissionGranted(granted) 63 | } 64 | } 65 | } catch {} 66 | }, 67 | [isSupported, grantWritePermission] 68 | ) 69 | 70 | const unsetRootDirectory = useCallback(async () => { 71 | setDirectoryHandle(undefined) 72 | idbDel(STORE_KEY_DIRECTORY_HANDLE) 73 | }, []) 74 | 75 | const syncDoc = useCallback( 76 | async (name: string, doc: Y.Doc) => { 77 | if (!directoryHandle) { 78 | return 79 | } 80 | 81 | const updateFileContent = async ( 82 | file: globalThis.File, 83 | fileHandle: FileSystemFileHandle, 84 | newContent: string 85 | ) => { 86 | // When we write to the file system, we also save a version 87 | // in cache in order to be able to watch for subsequent changes 88 | // to the file. 89 | await writeContentToFileIfChanged(file, fileHandle, newContent) 90 | await setLastWriteCacheData(name, newContent, file.lastModified) 91 | } 92 | 93 | let fileHandle = await getFSFileHandle(name, directoryHandle) 94 | const docContent = doc.getText().toString() 95 | 96 | if (!fileHandle) { 97 | // File is not present in the file system, so create it. 98 | const newFileHandle = await createFile(directoryHandle, name, '') 99 | const newFile = await newFileHandle.getFile() 100 | await updateFileContent(newFile, newFileHandle, docContent) 101 | return 102 | } 103 | 104 | const file = await fileHandle.getFile() 105 | 106 | // File exists, so compare it with the last-write-cache. 107 | const lastWriteCacheData = await getLastWriteCacheData(name) 108 | 109 | if (!lastWriteCacheData) { 110 | // Cached version does not exist. This should never happen. Indeed, 111 | // even if the user clears the app data, the directory handle will 112 | // be cleared as well, so the user will be asked to select a directory 113 | // again, in which case a hard overwrite will happen, and the 114 | // last-write-cache will be populated. So in case `lastWriteCacheData` 115 | // does not exist, we can consider this situation as similar to the 116 | // initial file dump situation and simply overwrite the FS file. 117 | await updateFileContent(file, fileHandle, docContent) 118 | return 119 | } 120 | 121 | // Cached version exists. This allows us to see the changes in the 122 | // local file, and compute the diff which in turn gives us as 123 | // state update vector for our CRDT. We can then apply it 124 | // to the app file for a seamless merging of the two versions. 125 | 126 | if (file.lastModified === lastWriteCacheData.lastModified) { 127 | // File has not changed in the file system. Since the FS file cache 128 | // is only set when a project file is synced, this means that the 129 | // only option is that the app file has changed, in which 130 | // case it should be written to the FS file. 131 | await updateFileContent(file, fileHandle, docContent) 132 | return 133 | } 134 | 135 | // File has changed in the file system. 136 | 137 | const fileContent = await file.text() 138 | const lastWriteFileContent = lastWriteCacheData.content 139 | const deltas = getDeltaOperations(lastWriteFileContent, fileContent) 140 | 141 | if (deltas.length === 0) { 142 | // Same comment as above: no difference between FS file and 143 | // and last-write-cache, so just write the app file to FS. 144 | await updateFileContent(file, fileHandle, docContent) 145 | return 146 | } 147 | 148 | // A change has happened in the file, since it differs 149 | // from the cached version. So we merge it with the app doc. 150 | doc.getText().applyDelta(deltas) 151 | 152 | const mergedContent = doc.getText().toString() 153 | await updateFileContent(file, fileHandle, mergedContent) 154 | }, 155 | [directoryHandle] 156 | ) 157 | 158 | const directoryName = useMemo(() => { 159 | return directoryHandle?.name 160 | }, [directoryHandle]) 161 | 162 | return { 163 | isSupported, 164 | setRootDirectory, 165 | unsetRootDirectory, 166 | grantWritePermission, 167 | isWritePermissionGranted, 168 | directoryName, 169 | syncDoc 170 | } 171 | } 172 | 173 | export default useFileSync 174 | -------------------------------------------------------------------------------- /src/yjs.ts: -------------------------------------------------------------------------------- 1 | import * as Diff from 'diff' 2 | 3 | type YDelta = { retain: number } | { delete: number } | { insert: string } 4 | 5 | // Compute the set of Yjs delta operations (that is, `insert` and 6 | // `delete`) required to go from initialText to finalText. 7 | // Based on https://github.com/kpdecker/jsdiff. 8 | export const getDeltaOperations = ( 9 | initialText: string, 10 | finalText: string 11 | ): YDelta[] => { 12 | if (initialText === finalText) { 13 | return [] 14 | } 15 | 16 | const edits = Diff.diffChars(initialText, finalText) 17 | let prevOffset = 0 18 | let deltas: YDelta[] = [] 19 | 20 | for (const edit of edits) { 21 | if (edit.removed && edit.value) { 22 | deltas = [ 23 | ...deltas, 24 | ...[ 25 | ...(prevOffset > 0 ? [{ retain: prevOffset }] : []), 26 | { delete: edit.value.length } 27 | ] 28 | ] 29 | prevOffset = 0 30 | } else if (edit.added && edit.value) { 31 | deltas = [...deltas, ...[{ retain: prevOffset }, { insert: edit.value }]] 32 | prevOffset = edit.value.length 33 | } else { 34 | prevOffset = edit.value.length 35 | } 36 | } 37 | return deltas 38 | } 39 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "esModuleInterop": true, 5 | "forceConsistentCasingInFileNames": true, 6 | "module": "ES2020", 7 | "moduleResolution": "node", 8 | "outDir": "./dist", 9 | "strict": true, 10 | "target": "ES2020" 11 | }, 12 | "include": ["./src"] 13 | } 14 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/diff@^5.0.2": 6 | version "5.0.2" 7 | resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.2.tgz#dd565e0086ccf8bc6522c6ebafd8a3125c91c12b" 8 | integrity sha512-uw8eYMIReOwstQ0QKF0sICefSy8cNO/v7gOTiIy9SbwuHyEecJUm7qlgueOO5S1udZ5I/irVydHVwMchgzbKTg== 9 | 10 | "@types/node@^17.0.30": 11 | version "17.0.31" 12 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" 13 | integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== 14 | 15 | "@types/prop-types@*": 16 | version "15.7.5" 17 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 18 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 19 | 20 | "@types/react@^18.0.8": 21 | version "18.0.8" 22 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.8.tgz#a051eb380a9fbcaa404550543c58e1cf5ce4ab87" 23 | integrity sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw== 24 | dependencies: 25 | "@types/prop-types" "*" 26 | "@types/scheduler" "*" 27 | csstype "^3.0.2" 28 | 29 | "@types/scheduler@*": 30 | version "0.16.2" 31 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" 32 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 33 | 34 | csstype@^3.0.2: 35 | version "3.0.11" 36 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" 37 | integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== 38 | 39 | diff@^5.0.0: 40 | version "5.0.0" 41 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 42 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 43 | 44 | idb-keyval@^6.1.0: 45 | version "6.1.0" 46 | resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.1.0.tgz#e659cff41188e6097d7fadd69926f6adbbe70041" 47 | integrity sha512-u/qHZ75rlD3gH+Zah8dAJVJcGW/RfCnfNrFkElC5RpRCnpsCXXhqjVk+6MoVKJ3WhmNbRYdI6IIVP88e+5sxGw== 48 | dependencies: 49 | safari-14-idb-fix "^3.0.0" 50 | 51 | isomorphic.js@^0.2.4: 52 | version "0.2.5" 53 | resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz#13eecf36f2dba53e85d355e11bf9d4208c6f7f88" 54 | integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== 55 | 56 | "js-tokens@^3.0.0 || ^4.0.0": 57 | version "4.0.0" 58 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 59 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 60 | 61 | lib0@^0.2.49: 62 | version "0.2.51" 63 | resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.51.tgz#23b1271a26f39120a4d0f86b9dfb44577f5ce98c" 64 | integrity sha512-05Erb3465CxJa38LQlMz4EbetNvRna1S3BzqEjC0/pmp5cQuQSfNNmeS0722Wev1dRlMUp2Cql0gQ55krSXf2Q== 65 | dependencies: 66 | isomorphic.js "^0.2.4" 67 | 68 | loose-envify@^1.1.0: 69 | version "1.4.0" 70 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 71 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 72 | dependencies: 73 | js-tokens "^3.0.0 || ^4.0.0" 74 | 75 | react@18.1.0: 76 | version "18.1.0" 77 | resolved "https://registry.yarnpkg.com/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" 78 | integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== 79 | dependencies: 80 | loose-envify "^1.1.0" 81 | 82 | safari-14-idb-fix@^3.0.0: 83 | version "3.0.0" 84 | resolved "https://registry.yarnpkg.com/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz#450fc049b996ec7f3fd9ca2f89d32e0761583440" 85 | integrity sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog== 86 | 87 | typescript@^4.6.4: 88 | version "4.6.4" 89 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" 90 | integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== 91 | 92 | yjs@^13.5.35: 93 | version "13.5.35" 94 | resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.5.35.tgz#9af7981da3005821304bf87aa949cedea1b69294" 95 | integrity sha512-vsqGmvZLiVwFcI4RlIZJeX59lGXDLXw37QrrbKVWXQJGbhMKgwAhZI4ZUVANUO54waoE1jta/NWb6gLSqNZ82Q== 96 | dependencies: 97 | lib0 "^0.2.49" 98 | --------------------------------------------------------------------------------