├── .eslintrc.js ├── .github └── FUNDING.yml ├── .gitignore ├── .prettierrc.js ├── FUNDING.json ├── LICENSE.md ├── README.md ├── package.json ├── pnpm-lock.yaml ├── server-only.d.ts ├── src ├── api.ts ├── client │ ├── index.tsx │ └── video-player-client.tsx ├── components │ ├── cast-images.tsx │ ├── cast-videos.tsx │ ├── cast.tsx │ ├── icons.tsx │ └── video-player.tsx ├── index.tsx ├── options.ts ├── styles.css └── types.ts ├── tsconfig.json └── tsup.config.ts /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | }; 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: pugson 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | dist 3 | 4 | 5 | # dependencies 6 | node_modules 7 | .pnp 8 | .pnp.js 9 | 10 | # testing 11 | coverage 12 | 13 | # next.js 14 | .next/ 15 | out/ 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 | .env.development.local 31 | .env.test.local 32 | .env.production.local 33 | 34 | # turbo 35 | .turbo 36 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | semi: true, 3 | singleQuote: false, 4 | tabWidth: 2, 5 | trailingComma: "all", 6 | printWidth: 120, 7 | }; 8 | -------------------------------------------------------------------------------- /FUNDING.json: -------------------------------------------------------------------------------- 1 | { 2 | "drips": { 3 | "ethereum": { 4 | "ownedBy": "0x96a77560146501eAEB5e6D5B7d8DD1eD23DEfa23" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![react-farcaster-embed](https://wojtek.im/farcaster/react-farcaster-embed-v2.png) 2 | 3 | # react-farcaster-embed 4 | 5 | Display an embedded cast from Farcaster in your React app. Works with Next.js SSR. 6 | 7 | ## Examples 8 | 9 | [Live Demo](https://wojtek.im/journal/react-farcaster-embed-casts-in-your-react-app) 10 | 11 |
12 | Regular casts 13 | 14 |
15 | 16 |
17 | Quoted casts 18 | 19 |
20 | 21 |
22 | With images 23 | 24 |
25 | 26 |
27 | With video 28 | 29 |
30 | 31 |
32 | With link previews 33 | 34 |
35 | 36 | ## Features 37 | 38 | - [x] Supports server components and client components 39 | - [x] Shows the cast's author, their avatar and username, date when the cast was posted 40 | - [x] Renders the cast's content with links 41 | - [x] Shows the channel name and avatar 42 | - [x] Shows counts for replies, likes, recasts + quotes, watches 43 | - [x] Adds a link to the cast on Farcaster 44 | - [x] Renders images inline 45 | - [x] Renders videos inline 46 | - [x] Renders rich embeds for links 47 | - [x] Renders quoted casts with images and videos 48 | - [ ] Renders a frame preview with buttons 49 | 50 | ## Installation 51 | 52 | ```shell 53 | npm i react-farcaster-embed 54 | # or 55 | yarn add react-farcaster-embed 56 | # or 57 | pnpm add react-farcaster-embed 58 | ``` 59 | 60 | ## Usage 61 | 62 | ### React Server Components / Next.js App Router 63 | 64 | Add these imports inside your server component: 65 | 66 | ```jsx 67 | import { FarcasterEmbed } from "react-farcaster-embed"; 68 | import "react-farcaster-embed/dist/styles.css"; // include default styles or write your own 69 | 70 | 71 | // use farcaster url 72 | 73 | 74 | // or username and hash of the cast 75 | 76 | ``` 77 | 78 | ### Client Components / Next.js Pages Router 79 | 80 | Add the CSS import inside `_app.tsx` if you are using Next.js Pages Router: 81 | 82 | ```tsx 83 | import "@/styles/globals.css"; 84 | import "react-farcaster-embed/dist/styles.css"; 85 | import type { AppProps } from "next/app"; 86 | 87 | export default function App({ Component, pageProps }: AppProps) { 88 | return ; 89 | } 90 | ``` 91 | 92 | And then use the component in your client component using a special import: 93 | 94 | ```jsx 95 | import { FarcasterEmbed } from "react-farcaster-embed/dist/client"; 96 | 97 | // use farcaster url 98 | 99 | 100 | // or username and hash of the cast 101 | 102 | ``` 103 | 104 | ## Styling 105 | 106 | The embed will inherit your body color by default when you import the default stylesheet. 107 | 108 | You can change the color of the component by changing its parent's color or adding custom CSS: 109 | 110 | ```css 111 | .farcaster-embed-container { 112 | color: purple; 113 | } 114 | ``` 115 | 116 | ## Custom Endpoint 117 | 118 | In case you need to self host the Farcaster Client API proxy, you can [fork this repo](https://github.com/pugson/farcaster-api-proxy) and set the `customEndpoint` option in the `FarcasterEmbed` component. 119 | 120 | Easiest way to do this is to make a wrapper component with that option applied. Example: 121 | 122 | ```jsx 123 | import { FarcasterEmbed as FCEmbed } from "react-farcaster-embed"; 124 | 125 | export const FarcasterEmbed = (props) => ( 126 | 132 | ); 133 | ``` 134 | 135 | Casts will be fetched from your custom proxy instead of the default one using this URL structure. Make sure your proxy supports it. 136 | 137 | ```jsx 138 | await fetch(`${options?.customEndpoint}/${username}/${hash}`); 139 | ``` 140 | 141 | ## Feeding your own cast JSON into the component 142 | 143 | Farcaster's API will not return anything when the cast has been deleted, so this is useful if you want to display deleted casts from archival data using your own indexer. Use the `castData` prop to pass in the cast's JSON into the component to render. 144 | 145 | ```jsx 146 | const data = { 147 | /* cast data coming from your own indexer or Neynar */ 148 | }; 149 | 150 | ; 151 | ``` 152 | 153 | ## Prevent errors for deleted casts 154 | 155 | You can use the `silentError` option to prevent errors from being thrown when the cast is deleted or unable to be fetched. 156 | 157 | Easiest way to do this is to make a wrapper component with that option applied. Example: 158 | 159 | ```jsx 160 | import { FarcasterEmbed as FCEmbed } from "react-farcaster-embed"; 161 | 162 | export const FarcasterEmbed = (props) => ( 163 | 169 | ); 170 | ``` 171 | 172 | ## Found it useful? 173 | 174 | Follow me on [Farcaster](https://farcaster.xyz/pugson) or [Twitter](https://twitter.com/pugson). 175 | 176 | Send me a tip in ETH or $DEGEN to 177 | 178 | - `pugson.eth` 179 | - `0x96a77560146501eAEB5e6D5B7d8DD1eD23DEfa23` 180 | 181 | ### Other projects 182 | 183 | You might also like [ENS Data](https://ensdata.net) for getting ENS records and avatars or [ABI Data](https://abidata.net) for grabbing smart contract ABIs remotely. 184 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-farcaster-embed", 3 | "version": "1.9.0", 4 | "description": "Embed casts from Farcaster in your React app.", 5 | "main": "dist/index.js", 6 | "module": "dist/index.mjs", 7 | "types": "dist/index.d.ts", 8 | "files": [ 9 | "dist" 10 | ], 11 | "scripts": { 12 | "build": "cp src/styles.css dist && tsup src/index.tsx && tsup src/client/index.tsx -d dist/client", 13 | "watch:ts:client": "tsup src/client/index.tsx -d dist/client --watch", 14 | "watch:ts": "tsup src/index.tsx --watch", 15 | "watch:css": "nodemon --watch src/styles.css --exec 'cp src/styles.css dist/'", 16 | "watch:yalc": "pnpm nodemon -w src -x 'yalc push' --ext 'tsx,ts,css,js,json'", 17 | "dev": "concurrently 'pnpm:watch:*'", 18 | "format": "prettier --write ." 19 | }, 20 | "keywords": [ 21 | "react", 22 | "farcaster", 23 | "embed" 24 | ], 25 | "author": "pugson ", 26 | "license": "The Unlicense", 27 | "homepage": "https://wojtek.im/journal/react-farcaster-embed-casts-in-your-react-app", 28 | "repository": { 29 | "type": "git", 30 | "url": "https://github.com/pugson/react-farcaster-embed.git" 31 | }, 32 | "bugs": { 33 | "url": "https://github.com/pugson/react-farcaster-embed/issues" 34 | }, 35 | "devDependencies": { 36 | "@types/react": "^18.2.67", 37 | "@types/react-dom": "^18.2.22", 38 | "concurrently": "^8.2.2", 39 | "eslint": "^7.32.0", 40 | "nodemon": "^3.1.0", 41 | "prettier": "^2.8.8", 42 | "tsup": "^6.7.0", 43 | "typescript": "^5.4.3" 44 | }, 45 | "peerDependencies": { 46 | "react": "^16.8 || ^17.0 || ^18.0", 47 | "react-dom": "^16.8 || ^17.0 || ^18.0" 48 | }, 49 | "packageManager": "pnpm@8.12.1", 50 | "dependencies": { 51 | "linkify-react": "^4.1.3", 52 | "linkifyjs": "^4.1.3", 53 | "server-only": "^0.0.1" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | linkify-react: 12 | specifier: ^4.1.3 13 | version: 4.1.3(linkifyjs@4.1.3)(react@18.2.0) 14 | linkifyjs: 15 | specifier: ^4.1.3 16 | version: 4.1.3 17 | react: 18 | specifier: ^16.8 || ^17.0 || ^18.0 19 | version: 18.2.0 20 | react-dom: 21 | specifier: ^16.8 || ^17.0 || ^18.0 22 | version: 18.2.0(react@18.2.0) 23 | server-only: 24 | specifier: ^0.0.1 25 | version: 0.0.1 26 | devDependencies: 27 | '@types/react': 28 | specifier: ^18.2.67 29 | version: 18.2.67 30 | '@types/react-dom': 31 | specifier: ^18.2.22 32 | version: 18.2.22 33 | concurrently: 34 | specifier: ^8.2.2 35 | version: 8.2.2 36 | eslint: 37 | specifier: ^7.32.0 38 | version: 7.32.0 39 | nodemon: 40 | specifier: ^3.1.0 41 | version: 3.1.0 42 | prettier: 43 | specifier: ^2.8.8 44 | version: 2.8.8 45 | tsup: 46 | specifier: ^6.7.0 47 | version: 6.7.0(typescript@5.4.3) 48 | typescript: 49 | specifier: ^5.4.3 50 | version: 5.4.3 51 | 52 | packages: 53 | 54 | '@aashutoshrathi/word-wrap@1.2.6': 55 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 56 | engines: {node: '>=0.10.0'} 57 | 58 | '@babel/code-frame@7.12.11': 59 | resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} 60 | 61 | '@babel/helper-validator-identifier@7.22.20': 62 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 63 | engines: {node: '>=6.9.0'} 64 | 65 | '@babel/highlight@7.23.4': 66 | resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} 67 | engines: {node: '>=6.9.0'} 68 | 69 | '@babel/runtime@7.23.7': 70 | resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} 71 | engines: {node: '>=6.9.0'} 72 | 73 | '@esbuild/android-arm64@0.17.19': 74 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} 75 | engines: {node: '>=12'} 76 | cpu: [arm64] 77 | os: [android] 78 | 79 | '@esbuild/android-arm@0.17.19': 80 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} 81 | engines: {node: '>=12'} 82 | cpu: [arm] 83 | os: [android] 84 | 85 | '@esbuild/android-x64@0.17.19': 86 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} 87 | engines: {node: '>=12'} 88 | cpu: [x64] 89 | os: [android] 90 | 91 | '@esbuild/darwin-arm64@0.17.19': 92 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} 93 | engines: {node: '>=12'} 94 | cpu: [arm64] 95 | os: [darwin] 96 | 97 | '@esbuild/darwin-x64@0.17.19': 98 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} 99 | engines: {node: '>=12'} 100 | cpu: [x64] 101 | os: [darwin] 102 | 103 | '@esbuild/freebsd-arm64@0.17.19': 104 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} 105 | engines: {node: '>=12'} 106 | cpu: [arm64] 107 | os: [freebsd] 108 | 109 | '@esbuild/freebsd-x64@0.17.19': 110 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} 111 | engines: {node: '>=12'} 112 | cpu: [x64] 113 | os: [freebsd] 114 | 115 | '@esbuild/linux-arm64@0.17.19': 116 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} 117 | engines: {node: '>=12'} 118 | cpu: [arm64] 119 | os: [linux] 120 | 121 | '@esbuild/linux-arm@0.17.19': 122 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} 123 | engines: {node: '>=12'} 124 | cpu: [arm] 125 | os: [linux] 126 | 127 | '@esbuild/linux-ia32@0.17.19': 128 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} 129 | engines: {node: '>=12'} 130 | cpu: [ia32] 131 | os: [linux] 132 | 133 | '@esbuild/linux-loong64@0.17.19': 134 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} 135 | engines: {node: '>=12'} 136 | cpu: [loong64] 137 | os: [linux] 138 | 139 | '@esbuild/linux-mips64el@0.17.19': 140 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} 141 | engines: {node: '>=12'} 142 | cpu: [mips64el] 143 | os: [linux] 144 | 145 | '@esbuild/linux-ppc64@0.17.19': 146 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} 147 | engines: {node: '>=12'} 148 | cpu: [ppc64] 149 | os: [linux] 150 | 151 | '@esbuild/linux-riscv64@0.17.19': 152 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} 153 | engines: {node: '>=12'} 154 | cpu: [riscv64] 155 | os: [linux] 156 | 157 | '@esbuild/linux-s390x@0.17.19': 158 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} 159 | engines: {node: '>=12'} 160 | cpu: [s390x] 161 | os: [linux] 162 | 163 | '@esbuild/linux-x64@0.17.19': 164 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} 165 | engines: {node: '>=12'} 166 | cpu: [x64] 167 | os: [linux] 168 | 169 | '@esbuild/netbsd-x64@0.17.19': 170 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} 171 | engines: {node: '>=12'} 172 | cpu: [x64] 173 | os: [netbsd] 174 | 175 | '@esbuild/openbsd-x64@0.17.19': 176 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} 177 | engines: {node: '>=12'} 178 | cpu: [x64] 179 | os: [openbsd] 180 | 181 | '@esbuild/sunos-x64@0.17.19': 182 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} 183 | engines: {node: '>=12'} 184 | cpu: [x64] 185 | os: [sunos] 186 | 187 | '@esbuild/win32-arm64@0.17.19': 188 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} 189 | engines: {node: '>=12'} 190 | cpu: [arm64] 191 | os: [win32] 192 | 193 | '@esbuild/win32-ia32@0.17.19': 194 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} 195 | engines: {node: '>=12'} 196 | cpu: [ia32] 197 | os: [win32] 198 | 199 | '@esbuild/win32-x64@0.17.19': 200 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} 201 | engines: {node: '>=12'} 202 | cpu: [x64] 203 | os: [win32] 204 | 205 | '@eslint/eslintrc@0.4.3': 206 | resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} 207 | engines: {node: ^10.12.0 || >=12.0.0} 208 | 209 | '@humanwhocodes/config-array@0.5.0': 210 | resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} 211 | engines: {node: '>=10.10.0'} 212 | 213 | '@humanwhocodes/object-schema@1.2.1': 214 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 215 | 216 | '@isaacs/cliui@8.0.2': 217 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 218 | engines: {node: '>=12'} 219 | 220 | '@jridgewell/gen-mapping@0.3.3': 221 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 222 | engines: {node: '>=6.0.0'} 223 | 224 | '@jridgewell/resolve-uri@3.1.1': 225 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 226 | engines: {node: '>=6.0.0'} 227 | 228 | '@jridgewell/set-array@1.1.2': 229 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 230 | engines: {node: '>=6.0.0'} 231 | 232 | '@jridgewell/sourcemap-codec@1.4.15': 233 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 234 | 235 | '@jridgewell/trace-mapping@0.3.20': 236 | resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} 237 | 238 | '@nodelib/fs.scandir@2.1.5': 239 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 240 | engines: {node: '>= 8'} 241 | 242 | '@nodelib/fs.stat@2.0.5': 243 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 244 | engines: {node: '>= 8'} 245 | 246 | '@nodelib/fs.walk@1.2.8': 247 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 248 | engines: {node: '>= 8'} 249 | 250 | '@pkgjs/parseargs@0.11.0': 251 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 252 | engines: {node: '>=14'} 253 | 254 | '@types/prop-types@15.7.11': 255 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 256 | 257 | '@types/react-dom@18.2.22': 258 | resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} 259 | 260 | '@types/react@18.2.67': 261 | resolution: {integrity: sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw==} 262 | 263 | '@types/scheduler@0.16.8': 264 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} 265 | 266 | abbrev@1.1.1: 267 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 268 | 269 | acorn-jsx@5.3.2: 270 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 271 | peerDependencies: 272 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 273 | 274 | acorn@7.4.1: 275 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 276 | engines: {node: '>=0.4.0'} 277 | hasBin: true 278 | 279 | ajv@6.12.6: 280 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 281 | 282 | ajv@8.12.0: 283 | resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} 284 | 285 | ansi-colors@4.1.3: 286 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 287 | engines: {node: '>=6'} 288 | 289 | ansi-regex@5.0.1: 290 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 291 | engines: {node: '>=8'} 292 | 293 | ansi-regex@6.0.1: 294 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 295 | engines: {node: '>=12'} 296 | 297 | ansi-styles@3.2.1: 298 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 299 | engines: {node: '>=4'} 300 | 301 | ansi-styles@4.3.0: 302 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 303 | engines: {node: '>=8'} 304 | 305 | ansi-styles@6.2.1: 306 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 307 | engines: {node: '>=12'} 308 | 309 | any-promise@1.3.0: 310 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 311 | 312 | anymatch@3.1.3: 313 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 314 | engines: {node: '>= 8'} 315 | 316 | argparse@1.0.10: 317 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 318 | 319 | array-union@2.1.0: 320 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 321 | engines: {node: '>=8'} 322 | 323 | astral-regex@2.0.0: 324 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} 325 | engines: {node: '>=8'} 326 | 327 | balanced-match@1.0.2: 328 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 329 | 330 | binary-extensions@2.2.0: 331 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 332 | engines: {node: '>=8'} 333 | 334 | brace-expansion@1.1.11: 335 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 336 | 337 | brace-expansion@2.0.1: 338 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 339 | 340 | braces@3.0.2: 341 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 342 | engines: {node: '>=8'} 343 | 344 | bundle-require@4.0.2: 345 | resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} 346 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 347 | peerDependencies: 348 | esbuild: '>=0.17' 349 | 350 | cac@6.7.14: 351 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 352 | engines: {node: '>=8'} 353 | 354 | callsites@3.1.0: 355 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 356 | engines: {node: '>=6'} 357 | 358 | chalk@2.4.2: 359 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 360 | engines: {node: '>=4'} 361 | 362 | chalk@4.1.2: 363 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 364 | engines: {node: '>=10'} 365 | 366 | chokidar@3.5.3: 367 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 368 | engines: {node: '>= 8.10.0'} 369 | 370 | cliui@8.0.1: 371 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 372 | engines: {node: '>=12'} 373 | 374 | color-convert@1.9.3: 375 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 376 | 377 | color-convert@2.0.1: 378 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 379 | engines: {node: '>=7.0.0'} 380 | 381 | color-name@1.1.3: 382 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 383 | 384 | color-name@1.1.4: 385 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 386 | 387 | commander@4.1.1: 388 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 389 | engines: {node: '>= 6'} 390 | 391 | concat-map@0.0.1: 392 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 393 | 394 | concurrently@8.2.2: 395 | resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} 396 | engines: {node: ^14.13.0 || >=16.0.0} 397 | hasBin: true 398 | 399 | cross-spawn@7.0.3: 400 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 401 | engines: {node: '>= 8'} 402 | 403 | csstype@3.1.3: 404 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 405 | 406 | date-fns@2.30.0: 407 | resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} 408 | engines: {node: '>=0.11'} 409 | 410 | debug@4.3.4: 411 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 412 | engines: {node: '>=6.0'} 413 | peerDependencies: 414 | supports-color: '*' 415 | peerDependenciesMeta: 416 | supports-color: 417 | optional: true 418 | 419 | deep-is@0.1.4: 420 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 421 | 422 | dir-glob@3.0.1: 423 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 424 | engines: {node: '>=8'} 425 | 426 | doctrine@3.0.0: 427 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 428 | engines: {node: '>=6.0.0'} 429 | 430 | eastasianwidth@0.2.0: 431 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 432 | 433 | emoji-regex@8.0.0: 434 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 435 | 436 | emoji-regex@9.2.2: 437 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 438 | 439 | enquirer@2.4.1: 440 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 441 | engines: {node: '>=8.6'} 442 | 443 | esbuild@0.17.19: 444 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} 445 | engines: {node: '>=12'} 446 | hasBin: true 447 | 448 | escalade@3.1.1: 449 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 450 | engines: {node: '>=6'} 451 | 452 | escape-string-regexp@1.0.5: 453 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 454 | engines: {node: '>=0.8.0'} 455 | 456 | escape-string-regexp@4.0.0: 457 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 458 | engines: {node: '>=10'} 459 | 460 | eslint-scope@5.1.1: 461 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 462 | engines: {node: '>=8.0.0'} 463 | 464 | eslint-utils@2.1.0: 465 | resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} 466 | engines: {node: '>=6'} 467 | 468 | eslint-visitor-keys@1.3.0: 469 | resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} 470 | engines: {node: '>=4'} 471 | 472 | eslint-visitor-keys@2.1.0: 473 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 474 | engines: {node: '>=10'} 475 | 476 | eslint@7.32.0: 477 | resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} 478 | engines: {node: ^10.12.0 || >=12.0.0} 479 | hasBin: true 480 | 481 | espree@7.3.1: 482 | resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} 483 | engines: {node: ^10.12.0 || >=12.0.0} 484 | 485 | esprima@4.0.1: 486 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 487 | engines: {node: '>=4'} 488 | hasBin: true 489 | 490 | esquery@1.5.0: 491 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 492 | engines: {node: '>=0.10'} 493 | 494 | esrecurse@4.3.0: 495 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 496 | engines: {node: '>=4.0'} 497 | 498 | estraverse@4.3.0: 499 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 500 | engines: {node: '>=4.0'} 501 | 502 | estraverse@5.3.0: 503 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 504 | engines: {node: '>=4.0'} 505 | 506 | esutils@2.0.3: 507 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 508 | engines: {node: '>=0.10.0'} 509 | 510 | execa@5.1.1: 511 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 512 | engines: {node: '>=10'} 513 | 514 | fast-deep-equal@3.1.3: 515 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 516 | 517 | fast-glob@3.3.2: 518 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 519 | engines: {node: '>=8.6.0'} 520 | 521 | fast-json-stable-stringify@2.1.0: 522 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 523 | 524 | fast-levenshtein@2.0.6: 525 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 526 | 527 | fastq@1.16.0: 528 | resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} 529 | 530 | file-entry-cache@6.0.1: 531 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 532 | engines: {node: ^10.12.0 || >=12.0.0} 533 | 534 | fill-range@7.0.1: 535 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 536 | engines: {node: '>=8'} 537 | 538 | flat-cache@3.2.0: 539 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 540 | engines: {node: ^10.12.0 || >=12.0.0} 541 | 542 | flatted@3.2.9: 543 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 544 | 545 | foreground-child@3.1.1: 546 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 547 | engines: {node: '>=14'} 548 | 549 | fs.realpath@1.0.0: 550 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 551 | 552 | fsevents@2.3.3: 553 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 554 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 555 | os: [darwin] 556 | 557 | functional-red-black-tree@1.0.1: 558 | resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} 559 | 560 | get-caller-file@2.0.5: 561 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 562 | engines: {node: 6.* || 8.* || >= 10.*} 563 | 564 | get-stream@6.0.1: 565 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 566 | engines: {node: '>=10'} 567 | 568 | glob-parent@5.1.2: 569 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 570 | engines: {node: '>= 6'} 571 | 572 | glob@10.3.10: 573 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 574 | engines: {node: '>=16 || 14 >=14.17'} 575 | hasBin: true 576 | 577 | glob@7.2.3: 578 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 579 | 580 | globals@13.24.0: 581 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 582 | engines: {node: '>=8'} 583 | 584 | globby@11.1.0: 585 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 586 | engines: {node: '>=10'} 587 | 588 | has-flag@3.0.0: 589 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 590 | engines: {node: '>=4'} 591 | 592 | has-flag@4.0.0: 593 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 594 | engines: {node: '>=8'} 595 | 596 | human-signals@2.1.0: 597 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 598 | engines: {node: '>=10.17.0'} 599 | 600 | ignore-by-default@1.0.1: 601 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 602 | 603 | ignore@4.0.6: 604 | resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} 605 | engines: {node: '>= 4'} 606 | 607 | ignore@5.3.0: 608 | resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} 609 | engines: {node: '>= 4'} 610 | 611 | import-fresh@3.3.0: 612 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 613 | engines: {node: '>=6'} 614 | 615 | imurmurhash@0.1.4: 616 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 617 | engines: {node: '>=0.8.19'} 618 | 619 | inflight@1.0.6: 620 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 621 | 622 | inherits@2.0.4: 623 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 624 | 625 | is-binary-path@2.1.0: 626 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 627 | engines: {node: '>=8'} 628 | 629 | is-extglob@2.1.1: 630 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 631 | engines: {node: '>=0.10.0'} 632 | 633 | is-fullwidth-code-point@3.0.0: 634 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 635 | engines: {node: '>=8'} 636 | 637 | is-glob@4.0.3: 638 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 639 | engines: {node: '>=0.10.0'} 640 | 641 | is-number@7.0.0: 642 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 643 | engines: {node: '>=0.12.0'} 644 | 645 | is-stream@2.0.1: 646 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 647 | engines: {node: '>=8'} 648 | 649 | isexe@2.0.0: 650 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 651 | 652 | jackspeak@2.3.6: 653 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 654 | engines: {node: '>=14'} 655 | 656 | joycon@3.1.1: 657 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 658 | engines: {node: '>=10'} 659 | 660 | js-tokens@4.0.0: 661 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 662 | 663 | js-yaml@3.14.1: 664 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 665 | hasBin: true 666 | 667 | json-buffer@3.0.1: 668 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 669 | 670 | json-schema-traverse@0.4.1: 671 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 672 | 673 | json-schema-traverse@1.0.0: 674 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 675 | 676 | json-stable-stringify-without-jsonify@1.0.1: 677 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 678 | 679 | keyv@4.5.4: 680 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 681 | 682 | levn@0.4.1: 683 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 684 | engines: {node: '>= 0.8.0'} 685 | 686 | lilconfig@2.1.0: 687 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 688 | engines: {node: '>=10'} 689 | 690 | lines-and-columns@1.2.4: 691 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 692 | 693 | linkify-react@4.1.3: 694 | resolution: {integrity: sha512-rhI3zM/fxn5BfRPHfi4r9N7zgac4vOIxub1wHIWXLA5ENTMs+BGaIaFO1D1PhmxgwhIKmJz3H7uCP0Dg5JwSlA==} 695 | peerDependencies: 696 | linkifyjs: ^4.0.0 697 | react: '>= 15.0.0' 698 | 699 | linkifyjs@4.1.3: 700 | resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==} 701 | 702 | load-tsconfig@0.2.5: 703 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 704 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 705 | 706 | lodash.merge@4.6.2: 707 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 708 | 709 | lodash.sortby@4.7.0: 710 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 711 | 712 | lodash.truncate@4.4.2: 713 | resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} 714 | 715 | lodash@4.17.21: 716 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 717 | 718 | loose-envify@1.4.0: 719 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 720 | hasBin: true 721 | 722 | lru-cache@10.1.0: 723 | resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} 724 | engines: {node: 14 || >=16.14} 725 | 726 | lru-cache@6.0.0: 727 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 728 | engines: {node: '>=10'} 729 | 730 | merge-stream@2.0.0: 731 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 732 | 733 | merge2@1.4.1: 734 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 735 | engines: {node: '>= 8'} 736 | 737 | micromatch@4.0.5: 738 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 739 | engines: {node: '>=8.6'} 740 | 741 | mimic-fn@2.1.0: 742 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 743 | engines: {node: '>=6'} 744 | 745 | minimatch@3.1.2: 746 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 747 | 748 | minimatch@9.0.3: 749 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 750 | engines: {node: '>=16 || 14 >=14.17'} 751 | 752 | minipass@7.0.4: 753 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 754 | engines: {node: '>=16 || 14 >=14.17'} 755 | 756 | ms@2.1.2: 757 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 758 | 759 | mz@2.7.0: 760 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 761 | 762 | natural-compare@1.4.0: 763 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 764 | 765 | nodemon@3.1.0: 766 | resolution: {integrity: sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==} 767 | engines: {node: '>=10'} 768 | hasBin: true 769 | 770 | nopt@1.0.10: 771 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} 772 | hasBin: true 773 | 774 | normalize-path@3.0.0: 775 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 776 | engines: {node: '>=0.10.0'} 777 | 778 | npm-run-path@4.0.1: 779 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 780 | engines: {node: '>=8'} 781 | 782 | object-assign@4.1.1: 783 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 784 | engines: {node: '>=0.10.0'} 785 | 786 | once@1.4.0: 787 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 788 | 789 | onetime@5.1.2: 790 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 791 | engines: {node: '>=6'} 792 | 793 | optionator@0.9.3: 794 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 795 | engines: {node: '>= 0.8.0'} 796 | 797 | parent-module@1.0.1: 798 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 799 | engines: {node: '>=6'} 800 | 801 | path-is-absolute@1.0.1: 802 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 803 | engines: {node: '>=0.10.0'} 804 | 805 | path-key@3.1.1: 806 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 807 | engines: {node: '>=8'} 808 | 809 | path-scurry@1.10.1: 810 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 811 | engines: {node: '>=16 || 14 >=14.17'} 812 | 813 | path-type@4.0.0: 814 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 815 | engines: {node: '>=8'} 816 | 817 | picomatch@2.3.1: 818 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 819 | engines: {node: '>=8.6'} 820 | 821 | pirates@4.0.6: 822 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 823 | engines: {node: '>= 6'} 824 | 825 | postcss-load-config@3.1.4: 826 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 827 | engines: {node: '>= 10'} 828 | peerDependencies: 829 | postcss: '>=8.0.9' 830 | ts-node: '>=9.0.0' 831 | peerDependenciesMeta: 832 | postcss: 833 | optional: true 834 | ts-node: 835 | optional: true 836 | 837 | prelude-ls@1.2.1: 838 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 839 | engines: {node: '>= 0.8.0'} 840 | 841 | prettier@2.8.8: 842 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 843 | engines: {node: '>=10.13.0'} 844 | hasBin: true 845 | 846 | progress@2.0.3: 847 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 848 | engines: {node: '>=0.4.0'} 849 | 850 | pstree.remy@1.1.8: 851 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 852 | 853 | punycode@2.3.1: 854 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 855 | engines: {node: '>=6'} 856 | 857 | queue-microtask@1.2.3: 858 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 859 | 860 | react-dom@18.2.0: 861 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 862 | peerDependencies: 863 | react: ^18.2.0 864 | 865 | react@18.2.0: 866 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 867 | engines: {node: '>=0.10.0'} 868 | 869 | readdirp@3.6.0: 870 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 871 | engines: {node: '>=8.10.0'} 872 | 873 | regenerator-runtime@0.14.1: 874 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 875 | 876 | regexpp@3.2.0: 877 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 878 | engines: {node: '>=8'} 879 | 880 | require-directory@2.1.1: 881 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 882 | engines: {node: '>=0.10.0'} 883 | 884 | require-from-string@2.0.2: 885 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 886 | engines: {node: '>=0.10.0'} 887 | 888 | resolve-from@4.0.0: 889 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 890 | engines: {node: '>=4'} 891 | 892 | resolve-from@5.0.0: 893 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 894 | engines: {node: '>=8'} 895 | 896 | reusify@1.0.4: 897 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 898 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 899 | 900 | rimraf@3.0.2: 901 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 902 | hasBin: true 903 | 904 | rollup@3.29.4: 905 | resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} 906 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 907 | hasBin: true 908 | 909 | run-parallel@1.2.0: 910 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 911 | 912 | rxjs@7.8.1: 913 | resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} 914 | 915 | scheduler@0.23.0: 916 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 917 | 918 | semver@7.5.4: 919 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 920 | engines: {node: '>=10'} 921 | hasBin: true 922 | 923 | server-only@0.0.1: 924 | resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} 925 | 926 | shebang-command@2.0.0: 927 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 928 | engines: {node: '>=8'} 929 | 930 | shebang-regex@3.0.0: 931 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 932 | engines: {node: '>=8'} 933 | 934 | shell-quote@1.8.1: 935 | resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} 936 | 937 | signal-exit@3.0.7: 938 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 939 | 940 | signal-exit@4.1.0: 941 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 942 | engines: {node: '>=14'} 943 | 944 | simple-update-notifier@2.0.0: 945 | resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} 946 | engines: {node: '>=10'} 947 | 948 | slash@3.0.0: 949 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 950 | engines: {node: '>=8'} 951 | 952 | slice-ansi@4.0.0: 953 | resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} 954 | engines: {node: '>=10'} 955 | 956 | source-map@0.8.0-beta.0: 957 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 958 | engines: {node: '>= 8'} 959 | 960 | spawn-command@0.0.2: 961 | resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} 962 | 963 | sprintf-js@1.0.3: 964 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 965 | 966 | string-width@4.2.3: 967 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 968 | engines: {node: '>=8'} 969 | 970 | string-width@5.1.2: 971 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 972 | engines: {node: '>=12'} 973 | 974 | strip-ansi@6.0.1: 975 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 976 | engines: {node: '>=8'} 977 | 978 | strip-ansi@7.1.0: 979 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 980 | engines: {node: '>=12'} 981 | 982 | strip-final-newline@2.0.0: 983 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 984 | engines: {node: '>=6'} 985 | 986 | strip-json-comments@3.1.1: 987 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 988 | engines: {node: '>=8'} 989 | 990 | sucrase@3.35.0: 991 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 992 | engines: {node: '>=16 || 14 >=14.17'} 993 | hasBin: true 994 | 995 | supports-color@5.5.0: 996 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 997 | engines: {node: '>=4'} 998 | 999 | supports-color@7.2.0: 1000 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1001 | engines: {node: '>=8'} 1002 | 1003 | supports-color@8.1.1: 1004 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1005 | engines: {node: '>=10'} 1006 | 1007 | table@6.8.1: 1008 | resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} 1009 | engines: {node: '>=10.0.0'} 1010 | 1011 | text-table@0.2.0: 1012 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1013 | 1014 | thenify-all@1.6.0: 1015 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1016 | engines: {node: '>=0.8'} 1017 | 1018 | thenify@3.3.1: 1019 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1020 | 1021 | to-regex-range@5.0.1: 1022 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1023 | engines: {node: '>=8.0'} 1024 | 1025 | touch@3.1.0: 1026 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 1027 | hasBin: true 1028 | 1029 | tr46@1.0.1: 1030 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1031 | 1032 | tree-kill@1.2.2: 1033 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1034 | hasBin: true 1035 | 1036 | ts-interface-checker@0.1.13: 1037 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1038 | 1039 | tslib@2.6.2: 1040 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 1041 | 1042 | tsup@6.7.0: 1043 | resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} 1044 | engines: {node: '>=14.18'} 1045 | hasBin: true 1046 | peerDependencies: 1047 | '@swc/core': ^1 1048 | postcss: ^8.4.12 1049 | typescript: '>=4.1.0' 1050 | peerDependenciesMeta: 1051 | '@swc/core': 1052 | optional: true 1053 | postcss: 1054 | optional: true 1055 | typescript: 1056 | optional: true 1057 | 1058 | type-check@0.4.0: 1059 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1060 | engines: {node: '>= 0.8.0'} 1061 | 1062 | type-fest@0.20.2: 1063 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1064 | engines: {node: '>=10'} 1065 | 1066 | typescript@5.4.3: 1067 | resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} 1068 | engines: {node: '>=14.17'} 1069 | hasBin: true 1070 | 1071 | undefsafe@2.0.5: 1072 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 1073 | 1074 | uri-js@4.4.1: 1075 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1076 | 1077 | v8-compile-cache@2.4.0: 1078 | resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} 1079 | 1080 | webidl-conversions@4.0.2: 1081 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1082 | 1083 | whatwg-url@7.1.0: 1084 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1085 | 1086 | which@2.0.2: 1087 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1088 | engines: {node: '>= 8'} 1089 | hasBin: true 1090 | 1091 | wrap-ansi@7.0.0: 1092 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1093 | engines: {node: '>=10'} 1094 | 1095 | wrap-ansi@8.1.0: 1096 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1097 | engines: {node: '>=12'} 1098 | 1099 | wrappy@1.0.2: 1100 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1101 | 1102 | y18n@5.0.8: 1103 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1104 | engines: {node: '>=10'} 1105 | 1106 | yallist@4.0.0: 1107 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1108 | 1109 | yaml@1.10.2: 1110 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1111 | engines: {node: '>= 6'} 1112 | 1113 | yargs-parser@21.1.1: 1114 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1115 | engines: {node: '>=12'} 1116 | 1117 | yargs@17.7.2: 1118 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1119 | engines: {node: '>=12'} 1120 | 1121 | snapshots: 1122 | 1123 | '@aashutoshrathi/word-wrap@1.2.6': {} 1124 | 1125 | '@babel/code-frame@7.12.11': 1126 | dependencies: 1127 | '@babel/highlight': 7.23.4 1128 | 1129 | '@babel/helper-validator-identifier@7.22.20': {} 1130 | 1131 | '@babel/highlight@7.23.4': 1132 | dependencies: 1133 | '@babel/helper-validator-identifier': 7.22.20 1134 | chalk: 2.4.2 1135 | js-tokens: 4.0.0 1136 | 1137 | '@babel/runtime@7.23.7': 1138 | dependencies: 1139 | regenerator-runtime: 0.14.1 1140 | 1141 | '@esbuild/android-arm64@0.17.19': 1142 | optional: true 1143 | 1144 | '@esbuild/android-arm@0.17.19': 1145 | optional: true 1146 | 1147 | '@esbuild/android-x64@0.17.19': 1148 | optional: true 1149 | 1150 | '@esbuild/darwin-arm64@0.17.19': 1151 | optional: true 1152 | 1153 | '@esbuild/darwin-x64@0.17.19': 1154 | optional: true 1155 | 1156 | '@esbuild/freebsd-arm64@0.17.19': 1157 | optional: true 1158 | 1159 | '@esbuild/freebsd-x64@0.17.19': 1160 | optional: true 1161 | 1162 | '@esbuild/linux-arm64@0.17.19': 1163 | optional: true 1164 | 1165 | '@esbuild/linux-arm@0.17.19': 1166 | optional: true 1167 | 1168 | '@esbuild/linux-ia32@0.17.19': 1169 | optional: true 1170 | 1171 | '@esbuild/linux-loong64@0.17.19': 1172 | optional: true 1173 | 1174 | '@esbuild/linux-mips64el@0.17.19': 1175 | optional: true 1176 | 1177 | '@esbuild/linux-ppc64@0.17.19': 1178 | optional: true 1179 | 1180 | '@esbuild/linux-riscv64@0.17.19': 1181 | optional: true 1182 | 1183 | '@esbuild/linux-s390x@0.17.19': 1184 | optional: true 1185 | 1186 | '@esbuild/linux-x64@0.17.19': 1187 | optional: true 1188 | 1189 | '@esbuild/netbsd-x64@0.17.19': 1190 | optional: true 1191 | 1192 | '@esbuild/openbsd-x64@0.17.19': 1193 | optional: true 1194 | 1195 | '@esbuild/sunos-x64@0.17.19': 1196 | optional: true 1197 | 1198 | '@esbuild/win32-arm64@0.17.19': 1199 | optional: true 1200 | 1201 | '@esbuild/win32-ia32@0.17.19': 1202 | optional: true 1203 | 1204 | '@esbuild/win32-x64@0.17.19': 1205 | optional: true 1206 | 1207 | '@eslint/eslintrc@0.4.3': 1208 | dependencies: 1209 | ajv: 6.12.6 1210 | debug: 4.3.4(supports-color@5.5.0) 1211 | espree: 7.3.1 1212 | globals: 13.24.0 1213 | ignore: 4.0.6 1214 | import-fresh: 3.3.0 1215 | js-yaml: 3.14.1 1216 | minimatch: 3.1.2 1217 | strip-json-comments: 3.1.1 1218 | transitivePeerDependencies: 1219 | - supports-color 1220 | 1221 | '@humanwhocodes/config-array@0.5.0': 1222 | dependencies: 1223 | '@humanwhocodes/object-schema': 1.2.1 1224 | debug: 4.3.4(supports-color@5.5.0) 1225 | minimatch: 3.1.2 1226 | transitivePeerDependencies: 1227 | - supports-color 1228 | 1229 | '@humanwhocodes/object-schema@1.2.1': {} 1230 | 1231 | '@isaacs/cliui@8.0.2': 1232 | dependencies: 1233 | string-width: 5.1.2 1234 | string-width-cjs: string-width@4.2.3 1235 | strip-ansi: 7.1.0 1236 | strip-ansi-cjs: strip-ansi@6.0.1 1237 | wrap-ansi: 8.1.0 1238 | wrap-ansi-cjs: wrap-ansi@7.0.0 1239 | 1240 | '@jridgewell/gen-mapping@0.3.3': 1241 | dependencies: 1242 | '@jridgewell/set-array': 1.1.2 1243 | '@jridgewell/sourcemap-codec': 1.4.15 1244 | '@jridgewell/trace-mapping': 0.3.20 1245 | 1246 | '@jridgewell/resolve-uri@3.1.1': {} 1247 | 1248 | '@jridgewell/set-array@1.1.2': {} 1249 | 1250 | '@jridgewell/sourcemap-codec@1.4.15': {} 1251 | 1252 | '@jridgewell/trace-mapping@0.3.20': 1253 | dependencies: 1254 | '@jridgewell/resolve-uri': 3.1.1 1255 | '@jridgewell/sourcemap-codec': 1.4.15 1256 | 1257 | '@nodelib/fs.scandir@2.1.5': 1258 | dependencies: 1259 | '@nodelib/fs.stat': 2.0.5 1260 | run-parallel: 1.2.0 1261 | 1262 | '@nodelib/fs.stat@2.0.5': {} 1263 | 1264 | '@nodelib/fs.walk@1.2.8': 1265 | dependencies: 1266 | '@nodelib/fs.scandir': 2.1.5 1267 | fastq: 1.16.0 1268 | 1269 | '@pkgjs/parseargs@0.11.0': 1270 | optional: true 1271 | 1272 | '@types/prop-types@15.7.11': {} 1273 | 1274 | '@types/react-dom@18.2.22': 1275 | dependencies: 1276 | '@types/react': 18.2.67 1277 | 1278 | '@types/react@18.2.67': 1279 | dependencies: 1280 | '@types/prop-types': 15.7.11 1281 | '@types/scheduler': 0.16.8 1282 | csstype: 3.1.3 1283 | 1284 | '@types/scheduler@0.16.8': {} 1285 | 1286 | abbrev@1.1.1: {} 1287 | 1288 | acorn-jsx@5.3.2(acorn@7.4.1): 1289 | dependencies: 1290 | acorn: 7.4.1 1291 | 1292 | acorn@7.4.1: {} 1293 | 1294 | ajv@6.12.6: 1295 | dependencies: 1296 | fast-deep-equal: 3.1.3 1297 | fast-json-stable-stringify: 2.1.0 1298 | json-schema-traverse: 0.4.1 1299 | uri-js: 4.4.1 1300 | 1301 | ajv@8.12.0: 1302 | dependencies: 1303 | fast-deep-equal: 3.1.3 1304 | json-schema-traverse: 1.0.0 1305 | require-from-string: 2.0.2 1306 | uri-js: 4.4.1 1307 | 1308 | ansi-colors@4.1.3: {} 1309 | 1310 | ansi-regex@5.0.1: {} 1311 | 1312 | ansi-regex@6.0.1: {} 1313 | 1314 | ansi-styles@3.2.1: 1315 | dependencies: 1316 | color-convert: 1.9.3 1317 | 1318 | ansi-styles@4.3.0: 1319 | dependencies: 1320 | color-convert: 2.0.1 1321 | 1322 | ansi-styles@6.2.1: {} 1323 | 1324 | any-promise@1.3.0: {} 1325 | 1326 | anymatch@3.1.3: 1327 | dependencies: 1328 | normalize-path: 3.0.0 1329 | picomatch: 2.3.1 1330 | 1331 | argparse@1.0.10: 1332 | dependencies: 1333 | sprintf-js: 1.0.3 1334 | 1335 | array-union@2.1.0: {} 1336 | 1337 | astral-regex@2.0.0: {} 1338 | 1339 | balanced-match@1.0.2: {} 1340 | 1341 | binary-extensions@2.2.0: {} 1342 | 1343 | brace-expansion@1.1.11: 1344 | dependencies: 1345 | balanced-match: 1.0.2 1346 | concat-map: 0.0.1 1347 | 1348 | brace-expansion@2.0.1: 1349 | dependencies: 1350 | balanced-match: 1.0.2 1351 | 1352 | braces@3.0.2: 1353 | dependencies: 1354 | fill-range: 7.0.1 1355 | 1356 | bundle-require@4.0.2(esbuild@0.17.19): 1357 | dependencies: 1358 | esbuild: 0.17.19 1359 | load-tsconfig: 0.2.5 1360 | 1361 | cac@6.7.14: {} 1362 | 1363 | callsites@3.1.0: {} 1364 | 1365 | chalk@2.4.2: 1366 | dependencies: 1367 | ansi-styles: 3.2.1 1368 | escape-string-regexp: 1.0.5 1369 | supports-color: 5.5.0 1370 | 1371 | chalk@4.1.2: 1372 | dependencies: 1373 | ansi-styles: 4.3.0 1374 | supports-color: 7.2.0 1375 | 1376 | chokidar@3.5.3: 1377 | dependencies: 1378 | anymatch: 3.1.3 1379 | braces: 3.0.2 1380 | glob-parent: 5.1.2 1381 | is-binary-path: 2.1.0 1382 | is-glob: 4.0.3 1383 | normalize-path: 3.0.0 1384 | readdirp: 3.6.0 1385 | optionalDependencies: 1386 | fsevents: 2.3.3 1387 | 1388 | cliui@8.0.1: 1389 | dependencies: 1390 | string-width: 4.2.3 1391 | strip-ansi: 6.0.1 1392 | wrap-ansi: 7.0.0 1393 | 1394 | color-convert@1.9.3: 1395 | dependencies: 1396 | color-name: 1.1.3 1397 | 1398 | color-convert@2.0.1: 1399 | dependencies: 1400 | color-name: 1.1.4 1401 | 1402 | color-name@1.1.3: {} 1403 | 1404 | color-name@1.1.4: {} 1405 | 1406 | commander@4.1.1: {} 1407 | 1408 | concat-map@0.0.1: {} 1409 | 1410 | concurrently@8.2.2: 1411 | dependencies: 1412 | chalk: 4.1.2 1413 | date-fns: 2.30.0 1414 | lodash: 4.17.21 1415 | rxjs: 7.8.1 1416 | shell-quote: 1.8.1 1417 | spawn-command: 0.0.2 1418 | supports-color: 8.1.1 1419 | tree-kill: 1.2.2 1420 | yargs: 17.7.2 1421 | 1422 | cross-spawn@7.0.3: 1423 | dependencies: 1424 | path-key: 3.1.1 1425 | shebang-command: 2.0.0 1426 | which: 2.0.2 1427 | 1428 | csstype@3.1.3: {} 1429 | 1430 | date-fns@2.30.0: 1431 | dependencies: 1432 | '@babel/runtime': 7.23.7 1433 | 1434 | debug@4.3.4(supports-color@5.5.0): 1435 | dependencies: 1436 | ms: 2.1.2 1437 | supports-color: 5.5.0 1438 | 1439 | deep-is@0.1.4: {} 1440 | 1441 | dir-glob@3.0.1: 1442 | dependencies: 1443 | path-type: 4.0.0 1444 | 1445 | doctrine@3.0.0: 1446 | dependencies: 1447 | esutils: 2.0.3 1448 | 1449 | eastasianwidth@0.2.0: {} 1450 | 1451 | emoji-regex@8.0.0: {} 1452 | 1453 | emoji-regex@9.2.2: {} 1454 | 1455 | enquirer@2.4.1: 1456 | dependencies: 1457 | ansi-colors: 4.1.3 1458 | strip-ansi: 6.0.1 1459 | 1460 | esbuild@0.17.19: 1461 | optionalDependencies: 1462 | '@esbuild/android-arm': 0.17.19 1463 | '@esbuild/android-arm64': 0.17.19 1464 | '@esbuild/android-x64': 0.17.19 1465 | '@esbuild/darwin-arm64': 0.17.19 1466 | '@esbuild/darwin-x64': 0.17.19 1467 | '@esbuild/freebsd-arm64': 0.17.19 1468 | '@esbuild/freebsd-x64': 0.17.19 1469 | '@esbuild/linux-arm': 0.17.19 1470 | '@esbuild/linux-arm64': 0.17.19 1471 | '@esbuild/linux-ia32': 0.17.19 1472 | '@esbuild/linux-loong64': 0.17.19 1473 | '@esbuild/linux-mips64el': 0.17.19 1474 | '@esbuild/linux-ppc64': 0.17.19 1475 | '@esbuild/linux-riscv64': 0.17.19 1476 | '@esbuild/linux-s390x': 0.17.19 1477 | '@esbuild/linux-x64': 0.17.19 1478 | '@esbuild/netbsd-x64': 0.17.19 1479 | '@esbuild/openbsd-x64': 0.17.19 1480 | '@esbuild/sunos-x64': 0.17.19 1481 | '@esbuild/win32-arm64': 0.17.19 1482 | '@esbuild/win32-ia32': 0.17.19 1483 | '@esbuild/win32-x64': 0.17.19 1484 | 1485 | escalade@3.1.1: {} 1486 | 1487 | escape-string-regexp@1.0.5: {} 1488 | 1489 | escape-string-regexp@4.0.0: {} 1490 | 1491 | eslint-scope@5.1.1: 1492 | dependencies: 1493 | esrecurse: 4.3.0 1494 | estraverse: 4.3.0 1495 | 1496 | eslint-utils@2.1.0: 1497 | dependencies: 1498 | eslint-visitor-keys: 1.3.0 1499 | 1500 | eslint-visitor-keys@1.3.0: {} 1501 | 1502 | eslint-visitor-keys@2.1.0: {} 1503 | 1504 | eslint@7.32.0: 1505 | dependencies: 1506 | '@babel/code-frame': 7.12.11 1507 | '@eslint/eslintrc': 0.4.3 1508 | '@humanwhocodes/config-array': 0.5.0 1509 | ajv: 6.12.6 1510 | chalk: 4.1.2 1511 | cross-spawn: 7.0.3 1512 | debug: 4.3.4(supports-color@5.5.0) 1513 | doctrine: 3.0.0 1514 | enquirer: 2.4.1 1515 | escape-string-regexp: 4.0.0 1516 | eslint-scope: 5.1.1 1517 | eslint-utils: 2.1.0 1518 | eslint-visitor-keys: 2.1.0 1519 | espree: 7.3.1 1520 | esquery: 1.5.0 1521 | esutils: 2.0.3 1522 | fast-deep-equal: 3.1.3 1523 | file-entry-cache: 6.0.1 1524 | functional-red-black-tree: 1.0.1 1525 | glob-parent: 5.1.2 1526 | globals: 13.24.0 1527 | ignore: 4.0.6 1528 | import-fresh: 3.3.0 1529 | imurmurhash: 0.1.4 1530 | is-glob: 4.0.3 1531 | js-yaml: 3.14.1 1532 | json-stable-stringify-without-jsonify: 1.0.1 1533 | levn: 0.4.1 1534 | lodash.merge: 4.6.2 1535 | minimatch: 3.1.2 1536 | natural-compare: 1.4.0 1537 | optionator: 0.9.3 1538 | progress: 2.0.3 1539 | regexpp: 3.2.0 1540 | semver: 7.5.4 1541 | strip-ansi: 6.0.1 1542 | strip-json-comments: 3.1.1 1543 | table: 6.8.1 1544 | text-table: 0.2.0 1545 | v8-compile-cache: 2.4.0 1546 | transitivePeerDependencies: 1547 | - supports-color 1548 | 1549 | espree@7.3.1: 1550 | dependencies: 1551 | acorn: 7.4.1 1552 | acorn-jsx: 5.3.2(acorn@7.4.1) 1553 | eslint-visitor-keys: 1.3.0 1554 | 1555 | esprima@4.0.1: {} 1556 | 1557 | esquery@1.5.0: 1558 | dependencies: 1559 | estraverse: 5.3.0 1560 | 1561 | esrecurse@4.3.0: 1562 | dependencies: 1563 | estraverse: 5.3.0 1564 | 1565 | estraverse@4.3.0: {} 1566 | 1567 | estraverse@5.3.0: {} 1568 | 1569 | esutils@2.0.3: {} 1570 | 1571 | execa@5.1.1: 1572 | dependencies: 1573 | cross-spawn: 7.0.3 1574 | get-stream: 6.0.1 1575 | human-signals: 2.1.0 1576 | is-stream: 2.0.1 1577 | merge-stream: 2.0.0 1578 | npm-run-path: 4.0.1 1579 | onetime: 5.1.2 1580 | signal-exit: 3.0.7 1581 | strip-final-newline: 2.0.0 1582 | 1583 | fast-deep-equal@3.1.3: {} 1584 | 1585 | fast-glob@3.3.2: 1586 | dependencies: 1587 | '@nodelib/fs.stat': 2.0.5 1588 | '@nodelib/fs.walk': 1.2.8 1589 | glob-parent: 5.1.2 1590 | merge2: 1.4.1 1591 | micromatch: 4.0.5 1592 | 1593 | fast-json-stable-stringify@2.1.0: {} 1594 | 1595 | fast-levenshtein@2.0.6: {} 1596 | 1597 | fastq@1.16.0: 1598 | dependencies: 1599 | reusify: 1.0.4 1600 | 1601 | file-entry-cache@6.0.1: 1602 | dependencies: 1603 | flat-cache: 3.2.0 1604 | 1605 | fill-range@7.0.1: 1606 | dependencies: 1607 | to-regex-range: 5.0.1 1608 | 1609 | flat-cache@3.2.0: 1610 | dependencies: 1611 | flatted: 3.2.9 1612 | keyv: 4.5.4 1613 | rimraf: 3.0.2 1614 | 1615 | flatted@3.2.9: {} 1616 | 1617 | foreground-child@3.1.1: 1618 | dependencies: 1619 | cross-spawn: 7.0.3 1620 | signal-exit: 4.1.0 1621 | 1622 | fs.realpath@1.0.0: {} 1623 | 1624 | fsevents@2.3.3: 1625 | optional: true 1626 | 1627 | functional-red-black-tree@1.0.1: {} 1628 | 1629 | get-caller-file@2.0.5: {} 1630 | 1631 | get-stream@6.0.1: {} 1632 | 1633 | glob-parent@5.1.2: 1634 | dependencies: 1635 | is-glob: 4.0.3 1636 | 1637 | glob@10.3.10: 1638 | dependencies: 1639 | foreground-child: 3.1.1 1640 | jackspeak: 2.3.6 1641 | minimatch: 9.0.3 1642 | minipass: 7.0.4 1643 | path-scurry: 1.10.1 1644 | 1645 | glob@7.2.3: 1646 | dependencies: 1647 | fs.realpath: 1.0.0 1648 | inflight: 1.0.6 1649 | inherits: 2.0.4 1650 | minimatch: 3.1.2 1651 | once: 1.4.0 1652 | path-is-absolute: 1.0.1 1653 | 1654 | globals@13.24.0: 1655 | dependencies: 1656 | type-fest: 0.20.2 1657 | 1658 | globby@11.1.0: 1659 | dependencies: 1660 | array-union: 2.1.0 1661 | dir-glob: 3.0.1 1662 | fast-glob: 3.3.2 1663 | ignore: 5.3.0 1664 | merge2: 1.4.1 1665 | slash: 3.0.0 1666 | 1667 | has-flag@3.0.0: {} 1668 | 1669 | has-flag@4.0.0: {} 1670 | 1671 | human-signals@2.1.0: {} 1672 | 1673 | ignore-by-default@1.0.1: {} 1674 | 1675 | ignore@4.0.6: {} 1676 | 1677 | ignore@5.3.0: {} 1678 | 1679 | import-fresh@3.3.0: 1680 | dependencies: 1681 | parent-module: 1.0.1 1682 | resolve-from: 4.0.0 1683 | 1684 | imurmurhash@0.1.4: {} 1685 | 1686 | inflight@1.0.6: 1687 | dependencies: 1688 | once: 1.4.0 1689 | wrappy: 1.0.2 1690 | 1691 | inherits@2.0.4: {} 1692 | 1693 | is-binary-path@2.1.0: 1694 | dependencies: 1695 | binary-extensions: 2.2.0 1696 | 1697 | is-extglob@2.1.1: {} 1698 | 1699 | is-fullwidth-code-point@3.0.0: {} 1700 | 1701 | is-glob@4.0.3: 1702 | dependencies: 1703 | is-extglob: 2.1.1 1704 | 1705 | is-number@7.0.0: {} 1706 | 1707 | is-stream@2.0.1: {} 1708 | 1709 | isexe@2.0.0: {} 1710 | 1711 | jackspeak@2.3.6: 1712 | dependencies: 1713 | '@isaacs/cliui': 8.0.2 1714 | optionalDependencies: 1715 | '@pkgjs/parseargs': 0.11.0 1716 | 1717 | joycon@3.1.1: {} 1718 | 1719 | js-tokens@4.0.0: {} 1720 | 1721 | js-yaml@3.14.1: 1722 | dependencies: 1723 | argparse: 1.0.10 1724 | esprima: 4.0.1 1725 | 1726 | json-buffer@3.0.1: {} 1727 | 1728 | json-schema-traverse@0.4.1: {} 1729 | 1730 | json-schema-traverse@1.0.0: {} 1731 | 1732 | json-stable-stringify-without-jsonify@1.0.1: {} 1733 | 1734 | keyv@4.5.4: 1735 | dependencies: 1736 | json-buffer: 3.0.1 1737 | 1738 | levn@0.4.1: 1739 | dependencies: 1740 | prelude-ls: 1.2.1 1741 | type-check: 0.4.0 1742 | 1743 | lilconfig@2.1.0: {} 1744 | 1745 | lines-and-columns@1.2.4: {} 1746 | 1747 | linkify-react@4.1.3(linkifyjs@4.1.3)(react@18.2.0): 1748 | dependencies: 1749 | linkifyjs: 4.1.3 1750 | react: 18.2.0 1751 | 1752 | linkifyjs@4.1.3: {} 1753 | 1754 | load-tsconfig@0.2.5: {} 1755 | 1756 | lodash.merge@4.6.2: {} 1757 | 1758 | lodash.sortby@4.7.0: {} 1759 | 1760 | lodash.truncate@4.4.2: {} 1761 | 1762 | lodash@4.17.21: {} 1763 | 1764 | loose-envify@1.4.0: 1765 | dependencies: 1766 | js-tokens: 4.0.0 1767 | 1768 | lru-cache@10.1.0: {} 1769 | 1770 | lru-cache@6.0.0: 1771 | dependencies: 1772 | yallist: 4.0.0 1773 | 1774 | merge-stream@2.0.0: {} 1775 | 1776 | merge2@1.4.1: {} 1777 | 1778 | micromatch@4.0.5: 1779 | dependencies: 1780 | braces: 3.0.2 1781 | picomatch: 2.3.1 1782 | 1783 | mimic-fn@2.1.0: {} 1784 | 1785 | minimatch@3.1.2: 1786 | dependencies: 1787 | brace-expansion: 1.1.11 1788 | 1789 | minimatch@9.0.3: 1790 | dependencies: 1791 | brace-expansion: 2.0.1 1792 | 1793 | minipass@7.0.4: {} 1794 | 1795 | ms@2.1.2: {} 1796 | 1797 | mz@2.7.0: 1798 | dependencies: 1799 | any-promise: 1.3.0 1800 | object-assign: 4.1.1 1801 | thenify-all: 1.6.0 1802 | 1803 | natural-compare@1.4.0: {} 1804 | 1805 | nodemon@3.1.0: 1806 | dependencies: 1807 | chokidar: 3.5.3 1808 | debug: 4.3.4(supports-color@5.5.0) 1809 | ignore-by-default: 1.0.1 1810 | minimatch: 3.1.2 1811 | pstree.remy: 1.1.8 1812 | semver: 7.5.4 1813 | simple-update-notifier: 2.0.0 1814 | supports-color: 5.5.0 1815 | touch: 3.1.0 1816 | undefsafe: 2.0.5 1817 | 1818 | nopt@1.0.10: 1819 | dependencies: 1820 | abbrev: 1.1.1 1821 | 1822 | normalize-path@3.0.0: {} 1823 | 1824 | npm-run-path@4.0.1: 1825 | dependencies: 1826 | path-key: 3.1.1 1827 | 1828 | object-assign@4.1.1: {} 1829 | 1830 | once@1.4.0: 1831 | dependencies: 1832 | wrappy: 1.0.2 1833 | 1834 | onetime@5.1.2: 1835 | dependencies: 1836 | mimic-fn: 2.1.0 1837 | 1838 | optionator@0.9.3: 1839 | dependencies: 1840 | '@aashutoshrathi/word-wrap': 1.2.6 1841 | deep-is: 0.1.4 1842 | fast-levenshtein: 2.0.6 1843 | levn: 0.4.1 1844 | prelude-ls: 1.2.1 1845 | type-check: 0.4.0 1846 | 1847 | parent-module@1.0.1: 1848 | dependencies: 1849 | callsites: 3.1.0 1850 | 1851 | path-is-absolute@1.0.1: {} 1852 | 1853 | path-key@3.1.1: {} 1854 | 1855 | path-scurry@1.10.1: 1856 | dependencies: 1857 | lru-cache: 10.1.0 1858 | minipass: 7.0.4 1859 | 1860 | path-type@4.0.0: {} 1861 | 1862 | picomatch@2.3.1: {} 1863 | 1864 | pirates@4.0.6: {} 1865 | 1866 | postcss-load-config@3.1.4: 1867 | dependencies: 1868 | lilconfig: 2.1.0 1869 | yaml: 1.10.2 1870 | 1871 | prelude-ls@1.2.1: {} 1872 | 1873 | prettier@2.8.8: {} 1874 | 1875 | progress@2.0.3: {} 1876 | 1877 | pstree.remy@1.1.8: {} 1878 | 1879 | punycode@2.3.1: {} 1880 | 1881 | queue-microtask@1.2.3: {} 1882 | 1883 | react-dom@18.2.0(react@18.2.0): 1884 | dependencies: 1885 | loose-envify: 1.4.0 1886 | react: 18.2.0 1887 | scheduler: 0.23.0 1888 | 1889 | react@18.2.0: 1890 | dependencies: 1891 | loose-envify: 1.4.0 1892 | 1893 | readdirp@3.6.0: 1894 | dependencies: 1895 | picomatch: 2.3.1 1896 | 1897 | regenerator-runtime@0.14.1: {} 1898 | 1899 | regexpp@3.2.0: {} 1900 | 1901 | require-directory@2.1.1: {} 1902 | 1903 | require-from-string@2.0.2: {} 1904 | 1905 | resolve-from@4.0.0: {} 1906 | 1907 | resolve-from@5.0.0: {} 1908 | 1909 | reusify@1.0.4: {} 1910 | 1911 | rimraf@3.0.2: 1912 | dependencies: 1913 | glob: 7.2.3 1914 | 1915 | rollup@3.29.4: 1916 | optionalDependencies: 1917 | fsevents: 2.3.3 1918 | 1919 | run-parallel@1.2.0: 1920 | dependencies: 1921 | queue-microtask: 1.2.3 1922 | 1923 | rxjs@7.8.1: 1924 | dependencies: 1925 | tslib: 2.6.2 1926 | 1927 | scheduler@0.23.0: 1928 | dependencies: 1929 | loose-envify: 1.4.0 1930 | 1931 | semver@7.5.4: 1932 | dependencies: 1933 | lru-cache: 6.0.0 1934 | 1935 | server-only@0.0.1: {} 1936 | 1937 | shebang-command@2.0.0: 1938 | dependencies: 1939 | shebang-regex: 3.0.0 1940 | 1941 | shebang-regex@3.0.0: {} 1942 | 1943 | shell-quote@1.8.1: {} 1944 | 1945 | signal-exit@3.0.7: {} 1946 | 1947 | signal-exit@4.1.0: {} 1948 | 1949 | simple-update-notifier@2.0.0: 1950 | dependencies: 1951 | semver: 7.5.4 1952 | 1953 | slash@3.0.0: {} 1954 | 1955 | slice-ansi@4.0.0: 1956 | dependencies: 1957 | ansi-styles: 4.3.0 1958 | astral-regex: 2.0.0 1959 | is-fullwidth-code-point: 3.0.0 1960 | 1961 | source-map@0.8.0-beta.0: 1962 | dependencies: 1963 | whatwg-url: 7.1.0 1964 | 1965 | spawn-command@0.0.2: {} 1966 | 1967 | sprintf-js@1.0.3: {} 1968 | 1969 | string-width@4.2.3: 1970 | dependencies: 1971 | emoji-regex: 8.0.0 1972 | is-fullwidth-code-point: 3.0.0 1973 | strip-ansi: 6.0.1 1974 | 1975 | string-width@5.1.2: 1976 | dependencies: 1977 | eastasianwidth: 0.2.0 1978 | emoji-regex: 9.2.2 1979 | strip-ansi: 7.1.0 1980 | 1981 | strip-ansi@6.0.1: 1982 | dependencies: 1983 | ansi-regex: 5.0.1 1984 | 1985 | strip-ansi@7.1.0: 1986 | dependencies: 1987 | ansi-regex: 6.0.1 1988 | 1989 | strip-final-newline@2.0.0: {} 1990 | 1991 | strip-json-comments@3.1.1: {} 1992 | 1993 | sucrase@3.35.0: 1994 | dependencies: 1995 | '@jridgewell/gen-mapping': 0.3.3 1996 | commander: 4.1.1 1997 | glob: 10.3.10 1998 | lines-and-columns: 1.2.4 1999 | mz: 2.7.0 2000 | pirates: 4.0.6 2001 | ts-interface-checker: 0.1.13 2002 | 2003 | supports-color@5.5.0: 2004 | dependencies: 2005 | has-flag: 3.0.0 2006 | 2007 | supports-color@7.2.0: 2008 | dependencies: 2009 | has-flag: 4.0.0 2010 | 2011 | supports-color@8.1.1: 2012 | dependencies: 2013 | has-flag: 4.0.0 2014 | 2015 | table@6.8.1: 2016 | dependencies: 2017 | ajv: 8.12.0 2018 | lodash.truncate: 4.4.2 2019 | slice-ansi: 4.0.0 2020 | string-width: 4.2.3 2021 | strip-ansi: 6.0.1 2022 | 2023 | text-table@0.2.0: {} 2024 | 2025 | thenify-all@1.6.0: 2026 | dependencies: 2027 | thenify: 3.3.1 2028 | 2029 | thenify@3.3.1: 2030 | dependencies: 2031 | any-promise: 1.3.0 2032 | 2033 | to-regex-range@5.0.1: 2034 | dependencies: 2035 | is-number: 7.0.0 2036 | 2037 | touch@3.1.0: 2038 | dependencies: 2039 | nopt: 1.0.10 2040 | 2041 | tr46@1.0.1: 2042 | dependencies: 2043 | punycode: 2.3.1 2044 | 2045 | tree-kill@1.2.2: {} 2046 | 2047 | ts-interface-checker@0.1.13: {} 2048 | 2049 | tslib@2.6.2: {} 2050 | 2051 | tsup@6.7.0(typescript@5.4.3): 2052 | dependencies: 2053 | bundle-require: 4.0.2(esbuild@0.17.19) 2054 | cac: 6.7.14 2055 | chokidar: 3.5.3 2056 | debug: 4.3.4(supports-color@5.5.0) 2057 | esbuild: 0.17.19 2058 | execa: 5.1.1 2059 | globby: 11.1.0 2060 | joycon: 3.1.1 2061 | postcss-load-config: 3.1.4 2062 | resolve-from: 5.0.0 2063 | rollup: 3.29.4 2064 | source-map: 0.8.0-beta.0 2065 | sucrase: 3.35.0 2066 | tree-kill: 1.2.2 2067 | typescript: 5.4.3 2068 | transitivePeerDependencies: 2069 | - supports-color 2070 | - ts-node 2071 | 2072 | type-check@0.4.0: 2073 | dependencies: 2074 | prelude-ls: 1.2.1 2075 | 2076 | type-fest@0.20.2: {} 2077 | 2078 | typescript@5.4.3: {} 2079 | 2080 | undefsafe@2.0.5: {} 2081 | 2082 | uri-js@4.4.1: 2083 | dependencies: 2084 | punycode: 2.3.1 2085 | 2086 | v8-compile-cache@2.4.0: {} 2087 | 2088 | webidl-conversions@4.0.2: {} 2089 | 2090 | whatwg-url@7.1.0: 2091 | dependencies: 2092 | lodash.sortby: 4.7.0 2093 | tr46: 1.0.1 2094 | webidl-conversions: 4.0.2 2095 | 2096 | which@2.0.2: 2097 | dependencies: 2098 | isexe: 2.0.0 2099 | 2100 | wrap-ansi@7.0.0: 2101 | dependencies: 2102 | ansi-styles: 4.3.0 2103 | string-width: 4.2.3 2104 | strip-ansi: 6.0.1 2105 | 2106 | wrap-ansi@8.1.0: 2107 | dependencies: 2108 | ansi-styles: 6.2.1 2109 | string-width: 5.1.2 2110 | strip-ansi: 7.1.0 2111 | 2112 | wrappy@1.0.2: {} 2113 | 2114 | y18n@5.0.8: {} 2115 | 2116 | yallist@4.0.0: {} 2117 | 2118 | yaml@1.10.2: {} 2119 | 2120 | yargs-parser@21.1.1: {} 2121 | 2122 | yargs@17.7.2: 2123 | dependencies: 2124 | cliui: 8.0.1 2125 | escalade: 3.1.1 2126 | get-caller-file: 2.0.5 2127 | require-directory: 2.1.1 2128 | string-width: 4.2.3 2129 | y18n: 5.0.8 2130 | yargs-parser: 21.1.1 2131 | -------------------------------------------------------------------------------- /server-only.d.ts: -------------------------------------------------------------------------------- 1 | declare module "server-only"; 2 | -------------------------------------------------------------------------------- /src/api.ts: -------------------------------------------------------------------------------- 1 | import type { FarcasterEmbedOptions } from "./options"; 2 | 3 | export const getCast = async (username: string, hash: string, options?: FarcasterEmbedOptions) => { 4 | try { 5 | const res = await fetch( 6 | options?.customEndpoint 7 | ? `${options?.customEndpoint}/${username}/${hash}` 8 | : `https://farcaster.tv/${username}/${hash}`, 9 | ); 10 | const cast = await res.json(); 11 | 12 | if (cast.result.casts[0].hash === "0x0000000000000000000000000000000000000000") { 13 | throw new Error("Root cast has been deleted."); 14 | } 15 | 16 | return cast.result.casts.findLast(cast => cast.hash.includes(hash)) 17 | } catch (e) { 18 | console.error(e); 19 | 20 | if (!options?.silentError) { 21 | throw new Error( 22 | `Unable to fetch cast ${hash} by ${username} as it most likely does not exist anymore.${ 23 | options?.customEndpoint 24 | ? " You are using a custom endpoint (" + 25 | options?.customEndpoint + 26 | "). Make sure it is correct and the server is running. For more info about the proxy server check the README." 27 | : "" 28 | }`, 29 | ); 30 | } 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /src/client/index.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import React from "react"; 3 | import { CastEmbed } from "../components/cast"; 4 | import { getCast } from "../api"; 5 | import { FarcasterEmbedOptions, defaultOptions } from "../options"; 6 | import { CastData } from "../types"; 7 | 8 | /** 9 | * Renders a Farcaster embed for a cast. You can use two methods to render a Farcaster embed: 10 | * 1. Providing a Farcaster URL to a cast (url) 11 | * 2. Providing a username and hash of a cast (username, hash) 12 | * @param url Farcaster URL for the cast. 13 | * @param username Username of the cast author. 14 | * @param hash Hash of the cast. 15 | * @param castData Optional cast data. If provided, the API call to fetch the cast data will be skipped. 16 | * @param options Custom overrides. See FarcasterEmbedOptions type for available options. 17 | * @returns React JSX Component 18 | */ 19 | export function FarcasterEmbed({ 20 | url, 21 | username, 22 | hash, 23 | castData, 24 | options, 25 | }: { 26 | url?: string; 27 | username?: string; 28 | hash?: string; 29 | castData?: CastData; 30 | options?: FarcasterEmbedOptions; 31 | }) { 32 | const [castJson, setCastJson] = React.useState(null); 33 | // If a URL is provided, parse the username and hash from it. 34 | if (url) { 35 | const urlParts = url.split("/"); 36 | username = urlParts[3]; 37 | hash = urlParts[4]; 38 | } 39 | 40 | if (!castData && (!username || !hash)) { 41 | throw new Error( 42 | "You must provide a Farcaster URL or username and hash to embed a cast. Or provide your own castData to render the component.", 43 | ); 44 | } 45 | 46 | React.useEffect(() => { 47 | if (castData) { 48 | setCastJson(castData); 49 | return; 50 | } else { 51 | const fetchCast = async () => { 52 | const cast = await getCast(username, hash, { ...defaultOptions, ...options }); 53 | setCastJson(cast); 54 | }; 55 | 56 | fetchCast(); 57 | } 58 | }, [username, hash, castData]); 59 | 60 | if (!castJson) return null; 61 | 62 | return ; 63 | } 64 | -------------------------------------------------------------------------------- /src/client/video-player-client.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import React from "react"; 3 | 4 | export function VideoPlayerClient({ 5 | source, 6 | poster, 7 | aspectRatio, 8 | }: { 9 | source: string; 10 | poster: string; 11 | aspectRatio: number; 12 | }) { 13 | const [isMediaChromeLoaded, setIsMediaChromeLoaded] = React.useState(false); 14 | const [isHlsVideoElementLoaded, setIsHlsVideoElementLoaded] = React.useState(false); 15 | 16 | if (!source) { 17 | return null; 18 | } 19 | 20 | const loadScript = (src: string) => { 21 | return new Promise((resolve, reject) => { 22 | const script = document.createElement("script"); 23 | script.src = src; 24 | script.type = "module"; 25 | script.onload = () => resolve(script); 26 | script.onerror = () => reject(new Error(`[react-farcaster-embed] Script load error for ${src}`)); 27 | document.head.appendChild(script); 28 | }); 29 | }; 30 | 31 | React.useEffect(() => { 32 | const mediaChrome = "https://cdn.jsdelivr.net/npm/media-chrome@1/+esm"; 33 | const hlsVideoElement = "https://cdn.jsdelivr.net/npm/hls-video-element@1.0/+esm"; 34 | 35 | loadScript(mediaChrome) 36 | .then(() => { 37 | setIsMediaChromeLoaded(true); 38 | }) 39 | .catch((error) => { 40 | console.error("Media Chrome loading failed", error); 41 | }); 42 | 43 | loadScript(hlsVideoElement) 44 | .then(() => { 45 | setIsHlsVideoElementLoaded(true); 46 | }) 47 | .catch((error) => { 48 | console.error("HLS Video Element loading failed", error); 49 | }); 50 | 51 | return () => { 52 | document.head.removeChild(document.head.querySelector(`script[src="${mediaChrome}"]`)); 53 | document.head.removeChild(document.head.querySelector(`script[src="${hlsVideoElement}"]`)); 54 | }; 55 | }, [source, poster, aspectRatio]); 56 | 57 | return ( 58 |
63 | {isMediaChromeLoaded && isHlsVideoElementLoaded && ( 64 |
68 | 75 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | `, 87 | }} 88 | >
89 | )} 90 |
91 | ); 92 | } 93 | -------------------------------------------------------------------------------- /src/components/cast-images.tsx: -------------------------------------------------------------------------------- 1 | import type { CastImage } from "../types"; 2 | 3 | export function CastImages({ images }: { images: CastImage[] }) { 4 | return ( 5 |
6 | {images.map((image: CastImage) => { 7 | return ( 8 | 9 | {image.alt} 10 | 11 | ); 12 | })} 13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/components/cast-videos.tsx: -------------------------------------------------------------------------------- 1 | import { VideoPlayerClient } from "../client/video-player-client"; 2 | import type { CastVideo } from "../types"; 3 | import { VideoPlayer } from "./video-player"; 4 | 5 | export function CastVideos({ videos, client }: { videos: CastVideo[]; client?: boolean }) { 6 | return ( 7 |
8 | {videos.map((video: CastVideo) => { 9 | return client ? ( 10 | 16 | ) : ( 17 | 23 | ); 24 | })} 25 |
26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /src/components/cast.tsx: -------------------------------------------------------------------------------- 1 | import Linkify from "linkify-react"; 2 | import type { FarcasterEmbedOptions } from "../options"; 3 | import type { CastData } from "../types"; 4 | import { CastImages } from "./cast-images"; 5 | import { CastVideos } from "./cast-videos"; 6 | import { LikeIcon, RecastIcon, ReplyIcon, FarcasterIcon } from "./icons"; 7 | 8 | const linkifyOptions = { 9 | className: "farcaster-embed-body-link", 10 | target: "_blank", 11 | }; 12 | 13 | function stripLastEmbedUrlFromCastBody(source: string, target: string) { 14 | // Check if the target string is at the end of the source string 15 | if (source.endsWith(target)) { 16 | // Calculate the start position of the target string 17 | let startIndex = source.lastIndexOf(target); 18 | // Replace the target string with an empty space 19 | let sourceWithoutTarget = source.substring(0, startIndex); 20 | // Trim the last newline 21 | let lastNewLineIndex = sourceWithoutTarget.lastIndexOf("\n"); 22 | if (lastNewLineIndex !== -1) { 23 | sourceWithoutTarget = 24 | sourceWithoutTarget.substring(0, lastNewLineIndex) + sourceWithoutTarget.substring(lastNewLineIndex + 1); 25 | } 26 | return sourceWithoutTarget + source.substring(startIndex + target.length); 27 | } else { 28 | // Return the original source string if the target is not at the end 29 | return source; 30 | } 31 | } 32 | 33 | export function CastEmbed({ 34 | cast, 35 | client, 36 | options, 37 | }: { 38 | cast: CastData; 39 | client?: boolean; 40 | options: FarcasterEmbedOptions; 41 | }) { 42 | if (!cast) return null; 43 | 44 | const author = cast.author; 45 | const profileUrl = `https://farcaster.xyz/~/profiles/${author.fid}`; 46 | const publishedAt = new Date(cast.timestamp); 47 | const timestamp = publishedAt.toLocaleString(options.timestampLocale, options.timestampFormat); 48 | const fullTimestamp = publishedAt.toLocaleString("en-US", { 49 | year: "numeric", 50 | month: "short", 51 | day: "numeric", 52 | hour: "numeric", 53 | minute: "2-digit", 54 | second: "2-digit", 55 | hour12: true, 56 | }); 57 | const farcasterUrl = `https://farcaster.xyz/${author.username}/${cast.hash}`; 58 | const replies = cast.replies && cast.replies.count; 59 | const likes = cast.reactions && cast.reactions.count; 60 | const recasts = cast.combinedRecastCount ? cast.combinedRecastCount : cast.recasts.count; 61 | const images = cast.embeds && cast.embeds.images; 62 | const hasImages = images && images.length > 0; 63 | const hasVideos = cast.embeds && cast.embeds.videos && cast.embeds.videos.length > 0; 64 | const videos = cast.embeds && cast.embeds.videos; 65 | const hasUrls = cast.embeds && cast.embeds.urls && cast.embeds.urls.length > 0; 66 | const urls = cast.embeds && cast.embeds.urls; 67 | const lastUrl = (urls && urls[urls.length - 1]?.openGraph?.url) || ""; 68 | const hasCastEmbeds = cast.embeds && cast.embeds.casts; 69 | const quoteCasts = cast.embeds && cast.embeds.casts; 70 | 71 | return ( 72 |
73 |
74 |
75 | 76 |
77 | {`@${author.username}`} 84 |
85 |
86 |
87 |

{author.displayName}

88 |

@{author.username}

89 |
90 |
91 |

{timestamp}

92 |
93 |
94 |
95 | 96 | {stripLastEmbedUrlFromCastBody(cast.text, lastUrl)} 97 | 98 | {hasImages && } 99 | {hasVideos && } 100 | {hasUrls && ( 101 |
102 | {urls.map((item, index) => { 103 | const { description, domain, image, title, url, useLargeImage } = item.openGraph || {}; 104 | const isTwitter = domain === "twitter.com" || domain === "t.co" || domain === "x.com"; 105 | 106 | if (domain === "farcaster.xyz") return null; 107 | if (domain === "warpcast.com") return null; 108 | 109 | if (useLargeImage) { 110 | return ( 111 | 112 | {image && {title}} 113 | 114 | {title} 115 | {description && {description}} 116 | {domain && {domain}} 117 | 118 | 119 | ); 120 | } 121 | 122 | return ( 123 | 129 | {image && !isTwitter && {title}} 130 | 131 | {title} 132 | {description && {description}} 133 | {domain && {domain}} 134 | 135 | 136 | ); 137 | })} 138 |
139 | )} 140 | {hasCastEmbeds && ( 141 |
142 | {quoteCasts.map((quoteCast: CastData) => { 143 | const qcPublishedAt = new Date(quoteCast.timestamp); 144 | const qcTimestamp = qcPublishedAt.toLocaleString(options.timestampLocale, options.timestampFormat); 145 | const qcHasImages = quoteCast.embeds && quoteCast.embeds.images && quoteCast.embeds.images.length > 0; 146 | const qcImages = quoteCast.embeds && quoteCast.embeds.images; 147 | const qcHasVideos = quoteCast.embeds && quoteCast.embeds.videos && quoteCast.embeds.videos.length > 0; 148 | const qcVideos = quoteCast.embeds && quoteCast.embeds.videos; 149 | 150 | return ( 151 |
152 |
153 |
154 |
155 | {`@${quoteCast.author.username}`} 162 |
163 |
164 |
165 |

{quoteCast.author.displayName}

166 |

@{quoteCast.author.username}

167 |
168 |
169 |

{qcTimestamp}

170 |
171 |
172 |
173 | 174 | {quoteCast.text} 175 | 176 | {qcHasImages && } 177 | {qcHasVideos && } 178 |
179 |
180 | ); 181 | })} 182 |
183 | )} 184 |
185 | {cast.tags.length > 0 && ( 186 |
187 |
188 | {cast.tags[0].imageUrl && ( 189 |
190 | {cast.tags[0].name} 197 |
198 | )} 199 | {cast.tags[0].name &&

{cast.tags[0].name}

} 200 |
201 |
202 | )} 203 |
204 | 231 |
232 | ); 233 | } 234 | -------------------------------------------------------------------------------- /src/components/icons.tsx: -------------------------------------------------------------------------------- 1 | export const ReplyIcon = () => ( 2 | 13 | 14 | 15 | ); 16 | 17 | export const RecastIcon = () => ( 18 | 29 | 30 | 31 | 32 | 33 | ); 34 | 35 | export const LikeIcon = () => ( 36 | 47 | 48 | 49 | ); 50 | 51 | export const FarcasterIcon = () => ( 52 | 53 | 54 | 55 | 59 | 60 | 61 | ); 62 | -------------------------------------------------------------------------------- /src/components/video-player.tsx: -------------------------------------------------------------------------------- 1 | export function VideoPlayer({ source, poster, aspectRatio }: { source: string; poster: string; aspectRatio: number }) { 2 | if (!source) { 3 | return null; 4 | } 5 | 6 | return ( 7 |
12 |
17 | 24 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | `, 36 | }} 37 | >
38 |
39 | ); 40 | } 41 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import "server-only"; 2 | import { getCast } from "./api"; 3 | import { CastEmbed } from "./components/cast"; 4 | import { FarcasterEmbedOptions, defaultOptions } from "./options"; 5 | import { CastData } from "./types"; 6 | 7 | /** 8 | * Renders a Farcaster embed for a cast. You can use two methods to render a Farcaster embed: 9 | * 1. Providing a Farcaster URL to a cast (url) 10 | * 2. Providing a username and hash of a cast (username, hash) 11 | * @param url Farcaster URL for the cast. 12 | * @param username Username of the cast author. 13 | * @param hash Hash of the cast. 14 | * @param castData Optional cast data. If provided, the API call to fetch the cast data will be skipped. 15 | * @param options Custom overrides. See FarcasterEmbedOptions type for available options. 16 | * @returns React JSX Component 17 | */ 18 | export async function FarcasterEmbed({ 19 | url, 20 | username, 21 | hash, 22 | castData, 23 | options, 24 | }: { 25 | url?: string; 26 | username?: string; 27 | hash?: string; 28 | castData?: CastData; 29 | options?: FarcasterEmbedOptions; 30 | }) { 31 | // If a URL is provided, parse the username and hash from it. 32 | if (url) { 33 | const urlParts = url.split("/"); 34 | username = urlParts[3]; 35 | hash = urlParts[4]; 36 | } 37 | 38 | if (!castData && (!username || !hash)) { 39 | throw new Error( 40 | "You must provide a Farcaster URL or username and hash to embed a cast. Or provide your own castData to render the component.", 41 | ); 42 | } 43 | 44 | const cast = castData ?? (await getCast(username, hash, { ...defaultOptions, ...options })); 45 | 46 | return ; 47 | } 48 | -------------------------------------------------------------------------------- /src/options.ts: -------------------------------------------------------------------------------- 1 | export type FarcasterEmbedOptions = { 2 | timestampFormat?: Intl.DateTimeFormatOptions; 3 | timestampLocale?: string; 4 | customEndpoint?: string; 5 | silentError?: boolean; 6 | }; 7 | 8 | export const defaultOptions: FarcasterEmbedOptions = { 9 | timestampFormat: { 10 | year: "numeric", 11 | month: "short", 12 | day: "numeric", 13 | }, 14 | timestampLocale: "en-US", 15 | silentError: false, 16 | }; 17 | -------------------------------------------------------------------------------- /src/styles.css: -------------------------------------------------------------------------------- 1 | .farcaster-embed-container * { 2 | box-sizing: border-box; 3 | margin: 0 !important; 4 | padding: 0 !important; 5 | } 6 | 7 | .farcaster-embed-container { 8 | position: relative; 9 | padding: 1.5rem !important; 10 | display: flex; 11 | flex-direction: column; 12 | justify-content: space-between; 13 | height: 100%; 14 | } 15 | 16 | .farcaster-embed-container::before { 17 | content: ""; 18 | position: absolute; 19 | width: 100%; 20 | height: 100%; 21 | left: 0; 22 | top: 0; 23 | border: 1px solid currentColor; 24 | border-radius: 1rem; 25 | opacity: 0.25; 26 | z-index: -1; 27 | pointer-events: none; 28 | } 29 | 30 | .farcaster-embed-container > div { 31 | color: inherit; 32 | } 33 | 34 | .farcaster-embed-metadata { 35 | display: grid; 36 | grid-template-columns: 48px 1fr; 37 | grid-gap: 0.75rem; 38 | align-items: center; 39 | line-height: 1.2; 40 | container: metadata / inline-size; 41 | } 42 | 43 | .farcaster-embed-timestamp { 44 | grid-column: 1 / -1; 45 | opacity: 0.5; 46 | font-size: 0.875rem; 47 | line-height: 1.25rem; 48 | } 49 | 50 | @container metadata (min-width: 260px) { 51 | .farcaster-embed-metadata { 52 | grid-template-columns: 48px 1.5fr 1fr; 53 | } 54 | 55 | .farcaster-embed-timestamp { 56 | grid-column: 3; 57 | text-align: right; 58 | } 59 | } 60 | 61 | .farcaster-embed-author-avatar-container { 62 | width: 48px; 63 | height: 48px; 64 | border-radius: 100%; 65 | overflow: hidden; 66 | } 67 | 68 | .farcaster-embed-quote-cast-author-avatar-container { 69 | width: 20px; 70 | height: 20px; 71 | border-radius: 100%; 72 | overflow: hidden; 73 | } 74 | 75 | .farcaster-embed-author-avatar { 76 | width: 100%; 77 | height: 100%; 78 | object-fit: cover; 79 | } 80 | 81 | .farcaster-embed-author p { 82 | font-size: 0.875rem; 83 | line-height: 1.25rem; 84 | } 85 | 86 | .farcaster-embed-author-username { 87 | opacity: 0.5; 88 | } 89 | 90 | .farcaster-embed-body { 91 | margin-top: 1rem !important; 92 | } 93 | 94 | .farcaster-embed-body p { 95 | font-size: 1.125rem; 96 | line-height: 1.75rem; 97 | overflow-wrap: break-word; 98 | white-space: pre-wrap; 99 | } 100 | 101 | .farcaster-embed-image-container:not(:empty) { 102 | display: flex; 103 | gap: 0.75rem; 104 | margin-top: 0.75rem !important; 105 | } 106 | 107 | .farcaster-embed-image-link { 108 | display: flex; 109 | justify-content: center; 110 | align-items: center; 111 | border-radius: 0.375rem; 112 | overflow: hidden; 113 | position: relative; 114 | } 115 | 116 | .farcaster-embed-image-link::before { 117 | content: ""; 118 | position: absolute; 119 | width: 100%; 120 | height: 100%; 121 | left: 0; 122 | top: 0; 123 | box-shadow: inset 0 0 0 1px currentColor; 124 | border-radius: 0.375rem; 125 | opacity: 0.25; 126 | z-index: 1; 127 | pointer-events: none; 128 | transition: 0.15s ease opacity; 129 | } 130 | 131 | .farcaster-embed-image-link::after { 132 | content: ""; 133 | position: absolute; 134 | width: 100%; 135 | height: 100%; 136 | left: 0; 137 | top: 0; 138 | border-radius: 0.375rem; 139 | opacity: 0.12; 140 | z-index: -1; 141 | pointer-events: none; 142 | background-color: currentColor; 143 | } 144 | 145 | .farcaster-embed-image { 146 | display: block; 147 | width: 100%; 148 | height: 100%; 149 | object-fit: contain; 150 | transition: 0.25s ease-out transform; 151 | } 152 | 153 | .farcaster-embed-image-link:hover::before { 154 | opacity: 0.35; 155 | } 156 | 157 | .farcaster-embed-image-link:hover .farcaster-embed-image { 158 | transform: scale(1.05); 159 | } 160 | 161 | .farcaster-embed-urls-container:not(:empty) { 162 | position: relative; 163 | display: grid; 164 | gap: 0.75rem; 165 | width: 100%; 166 | margin-top: 0.75rem !important; 167 | } 168 | 169 | .farcaster-embed-url-link { 170 | display: flex; 171 | flex-direction: column; 172 | border-radius: 0.375rem; 173 | overflow: hidden; 174 | position: relative; 175 | } 176 | 177 | .farcaster-embed-url-link-compact { 178 | flex-direction: row; 179 | align-items: center; 180 | } 181 | 182 | .farcaster-embed-url-link-compact .farcaster-embed-url-image { 183 | width: 128px; 184 | height: 100%; 185 | object-fit: cover; 186 | aspect-ratio: 1; 187 | } 188 | 189 | .farcaster-embed-url-image { 190 | display: inline-block; 191 | width: 100%; 192 | height: auto; 193 | aspect-ratio: 1200 / 630; 194 | object-fit: cover; 195 | } 196 | 197 | .farcaster-embed-url-metadata { 198 | display: flex; 199 | flex-direction: column; 200 | padding: 0.75rem !important; 201 | } 202 | 203 | .farcaster-embed-url-title { 204 | font-weight: bold; 205 | } 206 | 207 | .farcaster-embed-url-description { 208 | opacity: 0.75; 209 | text-wrap: pretty; 210 | line-height: 1.375; 211 | font-size: 0.875rem; 212 | padding-top: 0.35em !important; 213 | } 214 | 215 | .farcaster-embed-url-domain { 216 | font-size: 0.675rem; 217 | letter-spacing: 0.05em; 218 | opacity: 0.5; 219 | text-transform: uppercase; 220 | padding-top: 0.5em !important; 221 | transition: 0.15s ease opacity; 222 | } 223 | 224 | .farcaster-embed-channel:not(:empty) { 225 | display: inline-flex; 226 | align-items: center; 227 | gap: 0.25rem; 228 | padding: 0.25rem !important; 229 | padding-left: calc(0.25rem + 3px) !important; 230 | margin-top: 0.75rem !important; 231 | position: relative; 232 | } 233 | 234 | .farcaster-embed-channel::before, 235 | .farcaster-embed-url-link::before, 236 | .farcaster-embed-quote-cast::before { 237 | content: ""; 238 | position: absolute; 239 | left: 0; 240 | bottom: 0; 241 | display: block; 242 | width: 100%; 243 | height: 100%; 244 | border: 1px solid currentColor; 245 | border-radius: 0.375rem; 246 | opacity: 0.3; 247 | z-index: -1; 248 | pointer-events: none; 249 | transition: 0.15s ease opacity; 250 | } 251 | 252 | .farcaster-embed-channel::before { 253 | left: 0; 254 | bottom: -1px; 255 | } 256 | 257 | .farcaster-embed-url-link::before, 258 | .farcaster-embed-quote-cast::before { 259 | width: calc(100% - 2px); 260 | height: calc(100% - 2px); 261 | z-index: 3; 262 | } 263 | 264 | .farcaster-embed-url-link:hover::before { 265 | opacity: 0.5; 266 | } 267 | 268 | .farcaster-embed-url-link:hover .farcaster-embed-url-domain { 269 | opacity: 1; 270 | } 271 | 272 | .farcaster-embed-channel-avatar-container { 273 | width: 16px; 274 | height: 16px; 275 | border-radius: 3px; 276 | overflow: hidden; 277 | } 278 | 279 | .farcaster-embed-channel-avatar { 280 | width: 100%; 281 | height: 100%; 282 | object-fit: cover; 283 | } 284 | 285 | .farcaster-embed-channel-name { 286 | font-size: 0.875rem; 287 | line-height: 1.25rem; 288 | opacity: 0.5; 289 | } 290 | 291 | .farcaster-embed-stats { 292 | margin-top: 1rem !important; 293 | margin-bottom: -0.375rem !important; 294 | display: flex; 295 | align-items: center; 296 | justify-content: space-between; 297 | container: stats / inline-size; 298 | } 299 | 300 | .farcaster-embed-stats ul { 301 | display: flex; 302 | gap: 1.5rem; 303 | list-style-type: none; 304 | } 305 | 306 | @container stats (min-width: 340px) { 307 | .farcaster-embed-stats ul { 308 | gap: 2rem; 309 | } 310 | } 311 | 312 | .farcaster-embed-stats-link { 313 | display: flex; 314 | align-items: center; 315 | gap: 0.25rem; 316 | font-size: 0.875rem; 317 | line-height: 1.25rem; 318 | opacity: 0.5; 319 | } 320 | 321 | .farcaster-embed-farcaster-icon { 322 | display: flex; 323 | } 324 | 325 | .farcaster-embed-farcaster-link { 326 | display: inline-block; 327 | transition: transform 0.15s ease-out; 328 | } 329 | 330 | .farcaster-embed-farcaster-link:hover { 331 | transform: scale(1.1); 332 | } 333 | 334 | .farcaster-embed-farcaster-link:active { 335 | transform: scale(0.95); 336 | } 337 | 338 | .farcaster-embed-video-container:not(:empty) { 339 | display: grid; 340 | gap: 0.75rem; 341 | margin-top: 0.75rem !important; 342 | } 343 | 344 | .farcaster-embed-container media-control-bar *, 345 | .farcaster-embed-container media-control-bar *::before, 346 | .farcaster-embed-container media-control-bar *::after { 347 | padding: 0.5rem !important; 348 | background: transparent !important; 349 | } 350 | 351 | .farcaster-embed-video-player, 352 | .farcaster-embed-video-player media-controller { 353 | width: 100%; 354 | height: 100%; 355 | } 356 | 357 | .farcaster-embed-quote-cast-container:not(:empty) { 358 | display: grid; 359 | gap: 0.75rem; 360 | margin-top: 0.75rem !important; 361 | } 362 | 363 | .farcaster-embed-quote-cast { 364 | position: relative; 365 | } 366 | 367 | .farcaster-embed-quote-cast .farcaster-embed-avatar-link { 368 | display: flex; 369 | align-items: center; 370 | } 371 | 372 | .farcaster-embed-quote-cast .farcaster-embed-author { 373 | display: flex; 374 | flex-direction: row; 375 | column-gap: 0.125em; 376 | flex-wrap: wrap; 377 | } 378 | 379 | .farcaster-embed-quote-cast .farcaster-embed-author p { 380 | font-size: 0.875rem; 381 | } 382 | 383 | .farcaster-embed-quote-cast .farcaster-embed-metadata { 384 | grid-template-columns: 20px 1fr; 385 | gap: 0.5rem; 386 | align-items: center; 387 | padding: 0.5rem 0.75rem 0.125rem 0.75rem !important; 388 | } 389 | 390 | .farcaster-embed-quote-cast .farcaster-embed-timestamp p { 391 | font-size: 0.75rem; 392 | } 393 | 394 | .farcaster-embed-quote-cast .farcaster-embed-body { 395 | padding: 0.75rem !important; 396 | padding-top: 0 !important; 397 | margin-top: 0 !important; 398 | opacity: 0.75; 399 | } 400 | 401 | .farcaster-embed-quote-cast .farcaster-embed-body p { 402 | font-size: 0.875rem; 403 | line-height: 1.5; 404 | } 405 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type CastImage = { 2 | type: string; 3 | url: string; 4 | sourceUrl: string; 5 | alt: string; 6 | }; 7 | 8 | export type CastVideo = { 9 | type: string; 10 | url: string; 11 | sourceUrl: string; 12 | width: number; 13 | height: number; 14 | duration: number; 15 | thumbnailUrl: string; 16 | }; 17 | 18 | export type CastUrl = { 19 | type: string; 20 | openGraph?: { 21 | url?: string; 22 | sourceUrl?: string; 23 | title?: string; 24 | description?: string; 25 | domain?: string; 26 | image?: string; 27 | useLargeImage?: boolean; 28 | }; 29 | }; 30 | 31 | export type CastTags = { 32 | type?: string; 33 | id?: string; 34 | name?: string; 35 | imageUrl?: string; 36 | }[]; 37 | 38 | export type AuthorProfileBio = { 39 | text?: string; 40 | mentions?: string[]; 41 | channelMentions?: any[]; 42 | }; 43 | 44 | export type AuthorProfileLocation = { 45 | placeId?: string; 46 | description?: string; 47 | }; 48 | 49 | export type AuthorProfile = { 50 | bio?: AuthorProfileBio; 51 | location?: AuthorProfileLocation; 52 | }; 53 | 54 | export type AuthorPfp = { 55 | url?: string; 56 | verified?: boolean; 57 | }; 58 | 59 | export type Author = { 60 | fid?: number; 61 | username?: string; 62 | displayName?: string; 63 | pfp?: AuthorPfp; 64 | profile?: AuthorProfile; 65 | followerCount?: number; 66 | followingCount?: number; 67 | activeOnFcNetwork?: boolean; 68 | viewerContext?: { 69 | following?: boolean; 70 | }; 71 | }; 72 | 73 | export type CastData = { 74 | hash?: string; 75 | threadHash?: string; 76 | parentSource?: { 77 | type?: string; 78 | url?: string; 79 | }; 80 | author?: Author; 81 | text?: string; 82 | timestamp?: number; 83 | mentions?: any[]; 84 | attachments?: any; 85 | embeds?: { 86 | casts?: CastData[]; 87 | images?: CastImage[]; 88 | urls?: CastUrl[]; 89 | videos?: CastVideo[]; 90 | unknowns?: any[]; 91 | processedCastText?: string; 92 | }; 93 | ancestors?: { 94 | count?: number; 95 | casts?: CastData[]; 96 | }; 97 | replies?: { 98 | count?: number; 99 | casts?: CastData[]; 100 | }; 101 | reactions?: { 102 | count?: number; 103 | }; 104 | recasts?: { 105 | count?: number; 106 | }; 107 | watches?: { 108 | count?: number; 109 | }; 110 | tags?: CastTags; 111 | viewCount?: number; 112 | quoteCount?: number; 113 | combinedRecastCount?: number; 114 | warpsTipped?: number; 115 | viewerContext?: { 116 | reacted?: boolean; 117 | recast?: boolean; 118 | bookmarked?: boolean; 119 | watched?: boolean; 120 | }; 121 | }; 122 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "react-jsx", 4 | "moduleResolution": "node", 5 | "esModuleInterop": true, 6 | "lib": ["es2015", "dom"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | minify: true, 5 | target: "esnext", 6 | external: ["react"], 7 | sourcemap: true, 8 | dts: true, 9 | format: ["esm", "cjs"], 10 | }); 11 | --------------------------------------------------------------------------------