├── .eslintrc.cjs ├── .gitignore ├── .prettierrc.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── corporate_contributor_license_agreement.md ├── example ├── App.css ├── App.tsx ├── assets │ └── react.svg ├── env.d.ts ├── index.css ├── main.tsx └── vite-env.d.ts ├── index.html ├── individual_contributor_license_agreement.md ├── lib ├── EventListeners.tsx ├── MountedBox.tsx ├── Session.tsx ├── SessionContext.ts ├── hooks.tsx ├── main.tsx ├── types.ts ├── ui │ ├── Chatbox.tsx │ ├── Inbox.tsx │ └── Popup.tsx └── util.ts ├── package.json ├── tsconfig.json ├── tsconfig.node.json ├── vite.config.ts └── yarn.lock /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | 3 | module.exports = { 4 | root: true, 5 | env: { browser: true, es2020: true }, 6 | extends: [ 7 | //"eslint:recommended", 8 | //"plugin:@typescript-eslint/recommended", 9 | // "plugin:@typescript-eslint/recommended-requiring-type-checking", 10 | "plugin:react-hooks/recommended", 11 | ], 12 | parser: "@typescript-eslint/parser", 13 | parserOptions: { 14 | ecmaVersion: "latest", 15 | sourceType: "module", 16 | project: true, 17 | tsconfigRootDir: __dirname, 18 | }, 19 | //ignorePatterns: ["lib"], 20 | plugins: ["react-refresh"], 21 | rules: { 22 | "react-refresh/only-export-components": [ 23 | "warn", 24 | { allowConstantExport: true }, 25 | ], 26 | "@typescript-eslint/ban-ts-comment": "off", 27 | "@typescript-eslint/no-floating-promises": "off", 28 | "@typescript-eslint/no-non-null-assertion": "off", 29 | }, 30 | }; 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 80, 3 | "tabWidth": 2, 4 | "semi": true, 5 | "bracketSpacing": true, 6 | "bracketSameLine": false, 7 | "singleQuote": false, 8 | "trailingComma": "all", 9 | "arrowParens": "always", 10 | "useTabs": false 11 | } 12 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## v0.1.11 2 | 3 | - Externalize `react/jsx-runtime` dependency ([thanks to @KlotzJesse](https://github.com/talkjs/talkjs-react/pull/15)) 4 | - Removed `react-dom` peer dependency 5 | 6 | ## v0.1.10 7 | 8 | - Allow `null` as a value for the `conversationId` prop 9 | 10 | ## v0.1.9 11 | 12 | - Added `"use client"` banner to build outputs 13 | 14 | ## v0.1.8 15 | 16 | - Added `token` and `tokenFetcher` props to [Session](https://talkjs.com/docs/Reference/React_Native_SDK/Components/Session/). For more details on how to use JSON Web Token (JWT)-based authentication, see the [authentication documentation](https://talkjs.com/docs/Features/Security_Settings/Authentication/). 17 | - Deprecated the `signature` prop on the [Session](https://talkjs.com/docs/Reference/React_Native_SDK/Components/Session/) component. Signature-based authentication continues to be supported indefinitely, but JWT-based authentication is recommended for new projects. 18 | 19 | ## v0.1.7 20 | 21 | - Added `show` prop to `Popup`, that allows you to specify whether the popup should be shown or hidden. 22 | 23 | ## v0.1.6 24 | 25 | - Added `asGuest?: boolean` prop to `Chatbox`, `Inbox` and `Popup`. 26 | 27 | ## v0.1.5 28 | 29 | - Output ES2015. 30 | 31 | ## v0.1.4 32 | 33 | - Added `useUnreads` hook. 34 | 35 | 36 | ## v0.1.3 37 | 38 | - Added `signature?: string` prop to `Session`. 39 | 40 | ## v0.1.2 41 | 42 | - ~~Add `signature?: string` prop to `Session`.~~ 43 | 44 | ## v0.1.1 45 | 46 | - Removed "experimental" label from README. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 TalkJS (Klets B.V.) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React components for TalkJS 2 | 3 | The `@talkjs/react` library makes it easy to use [TalkJS](https://talkjs.com) inside a React web application by providing React components for our pre-built chat UIs. 4 | 5 | `@talkjs/react` encapsulates `talkjs`, the framework-independent [TalkJS JavaScript SDK](https://talkjs.com/docs/Reference/JavaScript_Chat_SDK). For anything related to data manipulation, such as synchronizing user data, or creating and joining conversations, use the JavaScript SDK. 6 | 7 | TypeScript bindings are included. 8 | 9 | If you encounter any problems with `@talkjs/react`, please open an issue. If you have a problem with TalkJS itself, or if you're not sure where the problem lies, it's better to open a [chat for support](https://talkjs.com/?chat). TalkJS support is staffed by engineers. 10 | 11 | ## Prerequisites 12 | 13 | - A [TalkJS account](https://talkjs.com/dashboard/login). TalkJS provides a ready-to-use chat client for your application. Your account gives you access to TalkJS's free development environment. 14 | - A [React app](https://react.dev/learn/start-a-new-react-project) that you will add TalkJS to 15 | 16 | ## Documentation 17 | 18 | - [Getting started guide](https://talkjs.com/docs/Getting_Started/Frameworks/React/) 19 | - [React SDK reference docs](https://talkjs.com/docs/Reference/React_SDK/Installation/) 20 | - [Team chat tutorial](https://talkjs.com/resources/how-to-use-talkjs-to-create-a-team-chat-with-channels/) and [example code](https://github.com/talkjs/talkjs-examples/tree/master/react/remote-work-demo) 21 | 22 | ## Examples 23 | 24 | The following examples use the [`Session`](https://talkjs.com/docs/Reference/React_SDK/Components/Session/) and [`Chatbox`](https://talkjs.com/docs/Reference/React_SDK/Components/Chatbox/) components from the React SDK to create a chatbox UI. 25 | 26 | For both examples, you'll first need to install both `@talkjs/react` and the [`talkjs` JavaScript package](https://www.npmjs.com/package/talkjs): 27 | 28 | ```sh 29 | npm install talkjs @talkjs/react 30 | # or 31 | yarn add talkjs @talkjs/react 32 | ``` 33 | 34 | ### Add an existing user and conversation 35 | 36 | This example demonstrates how to create a TalkJS session with an existing user and view a chatbox UI with an existing conversation. We'll use a sample user and conversation that are already included in your [test environment](https://talkjs.com/docs/Features/Environments/). 37 | 38 | Add the following code to your React app. Replace the `` with your test environment App ID from the **Settings** tab of the TalkJS dashboard: 39 | 40 | ```jsx 41 | import { Session, Chatbox } from "@talkjs/react"; 42 | 43 | function ChatComponent() { 44 | return ( 45 | 46 | 50 | 51 | ); 52 | } 53 | 54 | export default ChatComponent; 55 | ``` 56 | 57 | ### Sync a user and conversation 58 | 59 | This example demonstrates how to sync a user and conversation that you create with the JavaScript SDK. 60 | 61 | Add the following code to your React app: 62 | 63 | ```jsx 64 | import { useCallback } from "react"; 65 | import Talk from "talkjs"; 66 | import { Session, Chatbox } from "@talkjs/react"; 67 | 68 | function ChatComponent() { 69 | const syncUser = useCallback( 70 | () => 71 | return new Talk.User({ 72 | id: "nina", 73 | name: "Nina", 74 | email: "nina@example.com", 75 | photoUrl: "https://talkjs.com/new-web/avatar-7.jpg", 76 | welcomeMessage: "Hi!", 77 | role: "default", 78 | }), 79 | [], 80 | ); 81 | 82 | const syncConversation = useCallback((session) => { 83 | // JavaScript SDK code here 84 | const conversation = session.getOrCreateConversation("welcome"); 85 | 86 | const other = new Talk.User({ 87 | id: "frank", 88 | name: "Frank", 89 | email: "frank@example.com", 90 | photoUrl: "https://talkjs.com/new-web/avatar-8.jpg", 91 | welcomeMessage: "Hey, how can I help?", 92 | role: "default", 93 | }); 94 | conversation.setParticipant(session.me); 95 | conversation.setParticipant(other); 96 | 97 | return conversation; 98 | }, []); 99 | 100 | return ( 101 | 102 | 106 | 107 | ); 108 | } 109 | 110 | export default ChatComponent; 111 | ``` 112 | 113 | For more details and explanation, see our [getting started guide](/Getting_Started/Frameworks/React/). 114 | 115 | ## Contributing 116 | 117 | This library is open-source and permissively licensed (MIT). 118 | 119 | To contribute a PR, we require that you fill out a contributor license agreement (CLA) so that we (TalkJS) retain ownership over this repository. Pick the [Corporate CLA](corporate_contributor_license_agreement.md) or the [individual CLA](individual_contributor_license_agreement.md). Note that you do not need to sign anything to be able to fork this repository and make changes for your own use. 120 | 121 | Should you want to contribute, please take note of the design notes below. 122 | 123 | ## Design notes 124 | 125 | This library has been designed to be maximally forward-compatible with future TalkJS features. The `talkjs` package is a peer dependency, not a direct dependency, which means you can control which TalkJS version you want to be on. It also means you won't need to wait for a new version of `@talkjs/react` to be published before you can get access to new TalkJS features. 126 | 127 | From our (TalkJS) perspective, it means we have a lower maintenance burden: we can ship new JS features without having to update (and test and verify) `@talkjs/react`. 128 | 129 | This works because vanilla TalkJS is fully backward compatible and has a very consistent design: all UI components are instantiated and mutated in the same way. The React components simply treats any prop that looks like an event (name starts with "on") like an event. Also, barring some props unique to the react components (such as `syncConversation`, `style` and `loadingComponent`), all remaining props are simply assumed to be valid options to pass to `createChatbox` and its sister methods. 130 | 131 | This way, if TalkJS eg adds support for a new event or a new option, this will Just Work without updating `@talkjs/react`. Modern TypeScript features (notably, [template literal types](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html)) let us do this in a fully type-safe manner: If you upgrade `talkjs`, then your invocations to `@talkjs/react` components will allow new props. 132 | 133 | Any future changes should follow this same design: they should be maximally forward compatible. 134 | -------------------------------------------------------------------------------- /corporate_contributor_license_agreement.md: -------------------------------------------------------------------------------- 1 | # Corporate contributor license agreement 2 | 3 | You accept and agree to the following terms and conditions for Your present and future Contributions submitted to Klets B.V.. Except for the license granted herein to Klets B.V. and recipients of software distributed by Klets B.V., You reserve all right, title, and interest in and to Your Contributions. 4 | 5 | - **Definitions:** 6 | 7 | "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with Klets B.V.. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 8 | 9 | "Contribution" shall mean the code, documentation or other original works of authorship, including any modifications or additions to an existing work, that is submitted by You to Klets B.V. for inclusion in, or documentation of, any of the products owned or managed by Klets B.V. (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to Klets B.V. or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Klets B.V. for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 10 | 11 | - **Grant of Copyright License:** 12 | 13 | Subject to the terms and conditions of this Agreement, You hereby grant to Klets B.V. and to recipients of software distributed by Klets B.V. a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 14 | 15 | - **Grant of Patent License:** 16 | 17 | Subject to the terms and conditions of this Agreement, You hereby grant to Klets B.V. and to recipients of software distributed by Klets B.V. a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 18 | 19 | You represent that You are legally entitled to grant the above license. You represent further that each of Your employees is authorized to submit Contributions on Your behalf, but excluding employees that are designated in writing by You as "Not authorized to submit Contributions on behalf of (name of Your corporation here)." Such designations of exclusion for unauthorized employees are to be submitted via email to `legal@talkjs.com`. It is Your responsibility to notify Klets B.V. when any change is required to the list of designated employees excluded from submitting Contributions on Your behalf. Such notification should also be sent via email to `legal@talkjs.com`. 20 | 21 | - **Contributions:** 22 | 23 | You represent that each of Your Contributions is Your original creation. 24 | 25 | Should You wish to submit work that is not Your original creation, You may submit it to Klets B.V. separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: (named here)". 26 | 27 | You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 28 | 29 | This text is licensed under the [Creative Commons Attribution 3.0 License](https://creativecommons.org/licenses/by/3.0/) and the original source is the Google Open Source Programs Office. 30 | -------------------------------------------------------------------------------- /example/App.css: -------------------------------------------------------------------------------- 1 | #root { 2 | max-width: 1280px; 3 | margin: 0 auto; 4 | padding: 2rem; 5 | text-align: center; 6 | } 7 | 8 | button { 9 | margin-top: 0.2em; 10 | } 11 | -------------------------------------------------------------------------------- /example/App.tsx: -------------------------------------------------------------------------------- 1 | import "./App.css"; 2 | 3 | import { Session, Chatbox, useUnreads } from "../lib/main"; 4 | import Talk from "talkjs"; 5 | import { ChangeEvent, useCallback, useMemo, useRef, useState, ReactElement } from "react"; 6 | 7 | const convIds = ["talk-react-94872948u429843", "talk-react-194872948u429843"]; 8 | const users = [ 9 | { 10 | id: "talkjs-react-user-1", 11 | name: "Pete", 12 | role: "default", 13 | }, 14 | { 15 | id: "talkjs-react-user-2", 16 | name: "Jack", 17 | role: "default", 18 | }, 19 | ]; 20 | 21 | function App() { 22 | const onBlur = useCallback(() => console.log("blur"), []); 23 | const onFocus = useCallback(() => console.log("focus"), []); 24 | 25 | const [convId, setConvId] = useState(convIds[0]); 26 | 27 | const [me, setMe] = useState(users[0]); 28 | 29 | const otherMe = useCallback(() => { 30 | const index = (users.findIndex((u) => u.id === me.id) + 1) % users.length; 31 | setMe(users[index]); 32 | }, [me]); 33 | 34 | const [blur, setBlur] = useState(false); 35 | const addBlur = useCallback(() => { 36 | setBlur(true); 37 | }, []); 38 | 39 | const onAction = useCallback((event: Talk.MessageActionEvent) => { 40 | console.log(event.action); 41 | }, []); 42 | 43 | const onPerm = useCallback(() => { 44 | alert("permission request coming up!"); 45 | }, []); 46 | 47 | const onUnreads = useCallback((convs: Talk.UnreadConversation[]) => { 48 | console.log("unreads:", convs); 49 | }, []); 50 | 51 | const switchConv = useCallback(() => { 52 | const nextConv = (convIds.indexOf(convId) + 1) % convIds.length; 53 | setConvId(convIds[nextConv]); 54 | }, [convId]); 55 | 56 | const createUser = useCallback(() => { 57 | console.log("createUser"); 58 | return new Talk.User(me); 59 | }, [me]); 60 | 61 | const createConv = useCallback( 62 | (session: Talk.Session) => { 63 | console.log("createConv"); 64 | const conv = session.getOrCreateConversation(convId); 65 | conv.setParticipant(session.me); 66 | return conv; 67 | }, 68 | [convId], 69 | ); 70 | 71 | const onSendMessage = useCallback((event: Talk.SendMessageEvent) => { 72 | const text = event.message.text; 73 | if (text) { 74 | event.override({ custom: { prefix: text.substring(0, 2) } }); 75 | } 76 | }, []); 77 | 78 | // setters become props, eg `setMessageFilter` becomes a `messageFilter` prop: 79 | const [prefix, setPrefix] = useState(""); 80 | const setFilter = useCallback(() => { 81 | const prefix = prompt( 82 | "What 2-character prefix to filter by? (keep empty to disable)", 83 | ); 84 | setPrefix(prefix ?? ""); 85 | }, []); 86 | const filter = useMemo( 87 | () => (prefix ? { custom: { prefix: ["==", prefix] } } : {}), 88 | [prefix], 89 | ); 90 | 91 | // use refs to get access to the underlying TalkJS objects 92 | const chatboxRef = useRef(); 93 | const sessionRef = useRef(); 94 | 95 | const sendMessages = useCallback(() => { 96 | const conv = sessionRef.current?.getOrCreateConversation(convId); 97 | conv?.sendMessage("I'm located here:"); 98 | chatboxRef.current?.sendLocation(); 99 | }, [convId]); 100 | 101 | // session.setDesktopNotificationEnabled becomes a prop, `desktopNotificationEnabled` 102 | const [dn, setDn] = useState(undefined); 103 | const toggleDn = useCallback((event: ChangeEvent) => { 104 | setDn(JSON.parse(event.target!.value)); 105 | }, []); 106 | 107 | if (typeof import.meta.env.VITE_APP_ID !== "string") { 108 | return ( 109 |
110 |

111 | Missing VITE_APP_ID environment variable. Please create 112 | an .env.local file in the project root and define your 113 | App ID there like so: 114 |

115 |
122 |           VITE_APP_ID=my_app_id_here
123 |         
124 |
125 | ); 126 | } 127 | 128 | return ( 129 | <> 130 | 138 | Chatting as {me.name} in conversation {convId} 139 |
140 | LOADING....} 151 | {...(blur ? { onBlur } : {})} 152 | style={{ width: 500, height: 600 }} 153 | /> 154 | 155 |
156 | 157 |
158 | 161 |
162 | 165 |
166 | 169 |
170 | 171 |
172 |
173 | Desktop Notifications 174 | 184 | 194 |
195 | 196 | ); 197 | } 198 | 199 | function UnreadsDisplay() { 200 | const unreads = useUnreads(); 201 | let content: ReactElement | null = null; 202 | 203 | if (unreads === undefined) { 204 | content =

unreads is undefined (no session)

; 205 | } else if (unreads.length === 0) { 206 | content =

No unread messages

207 | } else { 208 | content =
    209 | {unreads.map(u => { 210 | return
  • {u.conversation.id} - {u.lastMessage.sender?.name || "system"}: {u.lastMessage.body}
  • 211 | })} 212 |
213 | } 214 | 215 | return
216 | Unreads rendered with useUnreads 217 | {content} 218 |
219 | } 220 | 221 | export default App; 222 | -------------------------------------------------------------------------------- /example/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /example/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv { 4 | readonly VITE_APP_ID: string; 5 | } 6 | 7 | interface ImportMeta { 8 | readonly env: ImportMetaEnv; 9 | } 10 | -------------------------------------------------------------------------------- /example/index.css: -------------------------------------------------------------------------------- 1 | /* Default Vite css file with minor edits */ 2 | 3 | :root { 4 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 5 | line-height: 1.5; 6 | font-weight: 400; 7 | 8 | color-scheme: light dark; 9 | color: #242424; 10 | background-color: rgba(255, 255, 255, 0.98); 11 | 12 | font-synthesis: none; 13 | text-rendering: optimizeLegibility; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | -webkit-text-size-adjust: 100%; 17 | } 18 | 19 | iframe { 20 | color-scheme: none; 21 | } 22 | a { 23 | font-weight: 500; 24 | color: #646cff; 25 | text-decoration: inherit; 26 | } 27 | a:hover { 28 | color: #535bf2; 29 | } 30 | 31 | body { 32 | margin: 0; 33 | display: flex; 34 | place-items: center; 35 | min-width: 320px; 36 | min-height: 100vh; 37 | } 38 | 39 | h1 { 40 | font-size: 3.2em; 41 | line-height: 1.1; 42 | } 43 | 44 | button { 45 | border-radius: 8px; 46 | border: 1px solid transparent; 47 | padding: 0.6em 1.2em; 48 | font-size: 1em; 49 | font-weight: 500; 50 | font-family: inherit; 51 | background-color: #f9f9f9; 52 | cursor: pointer; 53 | color: #1a1a1a; 54 | border-color: #1a1a1a; 55 | transition: border-color 0.25s, color 0.25s; 56 | } 57 | button:hover { 58 | border-color: #646cff; 59 | color: #646cff; 60 | } 61 | button:focus, 62 | button:focus-visible { 63 | outline: 4px auto -webkit-focus-ring-color; 64 | } 65 | -------------------------------------------------------------------------------- /example/main.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App"; 4 | import "./index.css"; 5 | 6 | ReactDOM.createRoot(document.getElementById("root")!).render( 7 | 8 | 9 | , 10 | ); 11 | -------------------------------------------------------------------------------- /example/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | TalkJS+React example 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /individual_contributor_license_agreement.md: -------------------------------------------------------------------------------- 1 | # Individual contributor license agreement 2 | 3 | You accept and agree to the following terms and conditions for Your present and future Contributions submitted to Klets B.V.. Except for the license granted herein to Klets B.V. and recipients of software distributed by Klets B.V., You reserve all right, title, and interest in and to Your Contributions. 4 | 5 | - **Definitions:** 6 | 7 | "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with Klets B.V.. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 8 | 9 | "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to Klets B.V. for inclusion in, or documentation of, any of the products owned or managed by Klets B.V. (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to Klets B.V. or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Klets B.V. for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 10 | 11 | - **Grant of Copyright License:** 12 | 13 | Subject to the terms and conditions of this Agreement, You hereby grant to Klets B.V. and to recipients of software distributed by Klets B.V. a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 14 | 15 | - **Grant of Patent License:** 16 | 17 | Subject to the terms and conditions of this Agreement, You hereby grant to Klets B.V. and to recipients of software distributed by Klets B.V. a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 18 | 19 | You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to Klets B.V., or that your employer has executed a separate Corporate CLA with Klets B.V.. 20 | 21 | - **Contributions:** 22 | 23 | You represent that each of Your Contributions is Your original creation. You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 24 | 25 | Should You wish to submit work that is not Your original creation, You may submit it to Klets B.V. separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: (insert_name_here)". 26 | 27 | You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 28 | 29 | You agree to notify Klets B.V. of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. 30 | 31 | This text is licensed under the [Creative Commons Attribution 3.0 License](https://creativecommons.org/licenses/by/3.0/) and the original source is the Google Open Source Programs Office. 32 | -------------------------------------------------------------------------------- /lib/EventListeners.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react"; 2 | import type Talk from "talkjs"; 3 | 4 | import { Func } from "./util"; 5 | 6 | interface Props { 7 | target?: Talk.UIBox | Talk.Session; 8 | handlers: Record<`on${string}`, Func>; 9 | } 10 | 11 | /** 12 | * @hack 13 | * React's rules of hooks won't let us put useEffect in a loop, so this 14 | * component is a hacky way of achieving that. It renders a bunch of components 15 | * in a loop which is legal. Those components always render as `null`. Their 16 | * actual purpose is to hold the `useEffect` call inside of them. 17 | */ 18 | export function EventListeners({ target, handlers }: Props) { 19 | if (!target?.isAlive) { 20 | return null; 21 | } 22 | 23 | const events = Object.keys(handlers) as (keyof typeof handlers)[]; 24 | return events 25 | .filter((name) => name.startsWith("on")) 26 | .filter((name) => typeof handlers[name] === "function") 27 | .map((name) => ( 28 | 34 | )); 35 | } 36 | 37 | interface ListenerProps { 38 | target?: Talk.Session | Talk.UIBox; 39 | name: string; 40 | handler: any; 41 | } 42 | 43 | /** 44 | * @hack 45 | * This component always renders as `null` because its actual purpose is to hold 46 | * the `useEffect` inside of it. See {@link EventListeners} for more context. 47 | */ 48 | function EventListener(props: ListenerProps) { 49 | const { handler } = props; 50 | useEffect(() => { 51 | if (!props.target?.isAlive) { 52 | return; 53 | } 54 | 55 | // Special case: Talk.Session doesn't have onUnreadsChange - instead, we 56 | // have a weird `session.unreads` object with a single onChange event. 57 | const { name, target } = 58 | props.name === "onUnreadsChange" 59 | ? { name: "onChange", target: (props.target as any).unreads } 60 | : { name: props.name, target: props.target }; 61 | 62 | if (typeof target[name] !== "function") { 63 | console.warn( 64 | `[@talkjs/react] Trying to handle event ${name} which does not exist on ${target?.constructor?.name}. Did you make a typo?`, 65 | ); 66 | return; 67 | } 68 | const subscription: Talk.Subscription = target[name](handler); 69 | 70 | return () => { 71 | subscription.unsubscribe(); 72 | }; 73 | }, [props.target, props.name, handler]); 74 | return null; 75 | } 76 | -------------------------------------------------------------------------------- /lib/MountedBox.tsx: -------------------------------------------------------------------------------- 1 | import { CSSProperties, ReactNode, useRef } from "react"; 2 | import type Talk from "talkjs"; 3 | import { EventListeners } from "./EventListeners"; 4 | import { useMountBox } from "./hooks"; 5 | import { Func, Mountable } from "./util"; 6 | 7 | interface Props { 8 | box: (Talk.UIBox & Mountable) | undefined; 9 | loadingComponent?: ReactNode; 10 | style?: CSSProperties; 11 | className?: string; 12 | 13 | handlers: Record<`on${string}`, Func>; 14 | } 15 | 16 | /** 17 | * Mounts the given `UIBox` and attaches event handlers to it. Renders a 18 | * `loadingComponent` fallback until the mount is complete. 19 | */ 20 | export function MountedBox(props: Props & { session: Talk.Session }) { 21 | const { box, loadingComponent, className, handlers } = props; 22 | 23 | const ref = useRef(null); 24 | const mounted = useMountBox(box, ref.current); 25 | 26 | const style = mounted ? props.style : { ...props.style, display: "none" }; 27 | 28 | return ( 29 | <> 30 | {!mounted && ( 31 |
32 | {loadingComponent} 33 |
34 | )} 35 | 36 |
37 | 38 | 39 | 40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /lib/Session.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, ReactNode, useState } from "react"; 2 | import Talk from "talkjs"; 3 | import { SessionContext } from "./SessionContext"; 4 | import { SessionEvents } from "./types"; 5 | import { EventListeners } from "./EventListeners"; 6 | import { useMethod } from "./hooks"; 7 | 8 | type UserProps = 9 | | { userId: string; syncUser?: undefined } 10 | | { userId?: undefined; syncUser: Talk.User | (() => Talk.User) }; 11 | 12 | type SessionProps = UserProps & 13 | SessionEvents & 14 | Pick & { 15 | sessionRef?: React.MutableRefObject; 16 | desktopNotificationEnabled?: boolean; 17 | children?: ReactNode; 18 | token?: string; 19 | tokenFetcher?: () => Promise; 20 | signature?: string; 21 | }; 22 | 23 | export function Session(props: SessionProps) { 24 | const [ready, markReady] = useState(false); 25 | const [session, setSession] = useState(); 26 | 27 | const { 28 | userId, 29 | syncUser, 30 | appId, 31 | token, 32 | tokenFetcher, 33 | signature, 34 | sessionRef, 35 | desktopNotificationEnabled, 36 | } = props; 37 | 38 | useEffect(() => { 39 | Talk.ready.then(() => markReady(true)); 40 | }, []); 41 | 42 | useEffect(() => { 43 | if (ready) { 44 | const me = 45 | typeof syncUser === "function" 46 | ? syncUser() 47 | : syncUser ?? new Talk.User(userId); 48 | 49 | const session = new Talk.Session({ appId, me, token, tokenFetcher, signature }); 50 | setSession(session); 51 | if (sessionRef) { 52 | sessionRef.current = session; 53 | } 54 | 55 | return () => { 56 | // if appId or me changed, destroy (and then recreate) the entire 57 | // session. 58 | // 59 | // once the JSSDK supports proper programmatic user mutation, we can 60 | // avoid recreating the session when `syncUser` changes. 61 | session.destroy(); 62 | setSession(undefined); 63 | if (sessionRef) { 64 | sessionRef.current = undefined; 65 | } 66 | }; 67 | } 68 | }, [ready, signature, appId, userId, syncUser, sessionRef]); 69 | 70 | useMethod( 71 | session, 72 | desktopNotificationEnabled, 73 | "setDesktopNotificationEnabled", 74 | ); 75 | 76 | return ( 77 | <> 78 | 79 | {props.children} 80 | 81 | 82 | 83 | ); 84 | } 85 | -------------------------------------------------------------------------------- /lib/SessionContext.ts: -------------------------------------------------------------------------------- 1 | import { createContext, useContext, useEffect, useState } from "react"; 2 | import type Talk from "talkjs"; 3 | 4 | export const SessionContext = createContext( 5 | undefined, 6 | ); 7 | 8 | /** 9 | * Returns the currently active TalkJS Session. 10 | * 11 | * @remarks 12 | * Can only be used in child components of . This hook lets you 13 | * directly access the TalkJS 14 | * {@link https://talkjs.com/docs/Reference/JavaScript_Chat_SDK/Session/ | Session} 15 | * object. 16 | * 17 | * @returns The currently active session, or undefined if there is no current 18 | * session (either because it's still loading, or because it has been destroyed) 19 | * 20 | * Note: If you use the returned session asynchonously (eg inside a useEffect), 21 | * you must check its 22 | * {@link https://talkjs.com/docs/Reference/JavaScript_Chat_SDK/Session/#Session__isAlive | isAlive} 23 | * property just before using it. Trying to use a session that is no longer 24 | * alive will throw an error. 25 | * 26 | * During development in particular, sessions can be destroyed and recreated a 27 | * lot, eg due to React.StrictMode or due to hot-module reloading. Your effect 28 | * may run after a session has been destroyed but before it has been recreated. 29 | */ 30 | export function useSession() { 31 | const session = useContext(SessionContext); 32 | return session?.isAlive ? session : undefined; 33 | } 34 | 35 | /** 36 | * Returns conversations with unread messages. 37 | * 38 | * @remarks 39 | * Can only be used in child components of . 40 | * 41 | * @returns A list of {@link https://talkjs.com/docs/Reference/JavaScript_Chat_SDK/Session/#UnreadConversation | UnreadConversation} objects, 42 | * or undefined if this hook is used outside of the component, or the session is not alive for any other reason. 43 | * During development in particular, sessions can be destroyed and recreated a 44 | * lot, eg due to React.StrictMode or due to hot-module reloading. 45 | */ 46 | export function useUnreads() { 47 | const session = useSession(); 48 | const [unreads, setUnreads] = useState(); 49 | 50 | useEffect(() => { 51 | if (!session || !session.isAlive) { 52 | setUnreads(undefined); 53 | return; 54 | } 55 | 56 | const sub = session.unreads.onChange( unreads => { 57 | setUnreads(unreads); 58 | }); 59 | 60 | return () => sub.unsubscribe(); 61 | }, [session]); 62 | 63 | return unreads; 64 | } 65 | -------------------------------------------------------------------------------- /lib/hooks.tsx: -------------------------------------------------------------------------------- 1 | import deepEqual from "fast-deep-equal"; 2 | import type Talk from "talkjs"; 3 | import { useEffect, useMemo, useRef, useState } from "react"; 4 | import { ConversationProps, FirstParameter } from "./types"; 5 | import { Mountable } from "./util"; 6 | 7 | export type TalkObject = Talk.Session | Talk.UIBox; 8 | 9 | /** 10 | * When `val` is deeply equal to its value the previous time this hook was 11 | * called, returns the previous version instead. This way, react's equality 12 | * checker can see it's unchanged. 13 | * 14 | * This allows users to pass object literals to this prop without causing 15 | * needless re-renders. 16 | */ 17 | export function usePreviousIfDeeplyEqual(val: T) { 18 | const remembered = useRef<{ val: T }>(); 19 | 20 | if (!remembered.current || !deepEqual(val, remembered.current.val)) { 21 | remembered.current = { val }; 22 | } 23 | return remembered.current.val; 24 | } 25 | 26 | /** 27 | * Calls method `method` on `box` with `value`, iff `value` is set & deeply 28 | * different from before (and the box is alive) 29 | */ 30 | export function useMethod< 31 | V, 32 | S extends string, 33 | T extends TalkObject & Record any>, 34 | >(box: T | undefined, value: V | undefined, method: S) { 35 | value = usePreviousIfDeeplyEqual(value); 36 | useEffect(() => { 37 | if (value !== undefined && box?.isAlive) { 38 | box[method](value); 39 | } 40 | }, [method, box, value]); 41 | } 42 | 43 | /** 44 | * Like {@link useMethod}, except `args` is an array that gets spread into 45 | * the method call 46 | */ 47 | export function useSpreadMethod< 48 | V extends any[], 49 | S extends string, 50 | T extends TalkObject & Record any>, 51 | >(box: T | undefined, args: V | undefined, method: S) { 52 | args = usePreviousIfDeeplyEqual(args); 53 | useEffect(() => { 54 | if (args !== undefined && box?.isAlive) { 55 | box[method](...args); 56 | } 57 | }, [method, box, args]); 58 | } 59 | 60 | /** 61 | * Calls `box.select` with either `syncConversation` or `conversationId` 62 | * depending on which is set. If neither is set, which is valid for the Inbox, 63 | * `select` is not called at all. 64 | */ 65 | export function useConversation( 66 | session: Talk.Session, 67 | box: T | undefined, 68 | syncConversation: ConversationProps["syncConversation"], 69 | conversationId: ConversationProps["conversationId"], 70 | asGuest: boolean | undefined, 71 | ) { 72 | const conversation = useMemo(() => { 73 | if (typeof syncConversation === "function") { 74 | return session?.isAlive ? syncConversation(session) : undefined; 75 | } 76 | return syncConversation ?? conversationId; 77 | }, [session, syncConversation, conversationId]); 78 | 79 | const args = ( 80 | conversation !== undefined ? [conversation, { asGuest }] : undefined 81 | ) as any; 82 | 83 | useSpreadMethod(box, args, "select"); 84 | } 85 | 86 | // subset of Session to help TypeScript pick the right overloads 87 | interface BoxFactory { 88 | createChatbox(options: Talk.ChatboxOptions): Talk.Chatbox; 89 | createInbox(options: Talk.InboxOptions): Talk.Inbox; 90 | createPopup(options: Talk.PopupOptions): Talk.Popup; 91 | } 92 | export function useUIBox< 93 | K extends keyof BoxFactory, 94 | O extends FirstParameter, 95 | R extends ReturnType, 96 | >( 97 | session: undefined | (Talk.Session & { [f in K]: (options: O) => R }), 98 | create: K, 99 | options: O, 100 | ref?: React.MutableRefObject, 101 | ) { 102 | const [box, setBox] = useState(); 103 | 104 | options = usePreviousIfDeeplyEqual(options); 105 | 106 | useEffect(() => { 107 | if (session?.isAlive) { 108 | const uibox = session[create](options) as R; 109 | setBox(uibox); 110 | if (ref) { 111 | ref.current = uibox; 112 | } 113 | 114 | return () => { 115 | uibox.destroy(); 116 | setBox(undefined); 117 | }; 118 | } else { 119 | setBox(undefined); 120 | if (ref) { 121 | ref.current = undefined; 122 | } 123 | } 124 | // ESLint can't tell that `ref` is a ref, so disable the rule here 125 | // eslint-disable-next-line react-hooks/exhaustive-deps 126 | }, [session, create, options]); 127 | return box; 128 | } 129 | 130 | /** 131 | * Calls box.mount (if box is alive & has changed), and tracks loading state. 132 | * 133 | * @returns whether the box has successfully been mounted: false if still 134 | * loading (ie mount has not yet been called or completed), and true otherwise 135 | */ 136 | export function useMountBox( 137 | box: T | undefined, 138 | ref: FirstParameter, 139 | ) { 140 | const [mounted, setMounted] = useState(false); 141 | 142 | useEffect(() => { 143 | if (box?.isAlive) { 144 | box.mount(ref).then(() => setMounted(true)); 145 | } 146 | // ESLint can't tell that `ref` is a ref, so disable the rule here 147 | // eslint-disable-next-line react-hooks/exhaustive-deps 148 | }, [box]); 149 | 150 | return mounted; 151 | } 152 | -------------------------------------------------------------------------------- /lib/main.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable react-refresh/only-export-components */ 2 | export { Session } from "./Session"; 3 | export { Chatbox } from "./ui/Chatbox"; 4 | export { Inbox } from "./ui/Inbox"; 5 | export { Popup } from "./ui/Popup"; 6 | export { useSession, useUnreads } from "./SessionContext"; 7 | -------------------------------------------------------------------------------- /lib/types.ts: -------------------------------------------------------------------------------- 1 | import type Talk from "talkjs"; 2 | import { Func } from "./util"; 3 | 4 | export type FirstParameter = Parameters[0]; 5 | 6 | // All properties of T that start with "on", eg `"onBlur" | "onSendMessage" | 7 | // ...`. 8 | // 9 | // Excludes `on` the action events, which have a 2-parameter overload and TS 10 | // doesn't automagically pick the right one, so we special-case them below. 11 | type EventNames = Exclude< 12 | Extract, 13 | "on" | "onCustomConversationAction" | "onCustomMessageAction" 14 | >; 15 | 16 | // name->function map of simple events, eg `{ onBlur: () => void, onSendMessage: 17 | // (event: SendMessageEvent) => void, ...}` 18 | type Events = { 19 | [P in EventNames]?: T[P] extends Func ? FirstParameter : never; 20 | }; 21 | 22 | // all events that a can accept, including special cases 23 | export type UIBoxEvents = Events & { 24 | onCustomMessageAction?: (event: Talk.MessageActionEvent) => void; 25 | onCustomConversationAction?: (event: Talk.ConversationActionEvent) => void; 26 | }; 27 | 28 | // all events that a can accept, including special cases 29 | export type SessionEvents = Events & { 30 | onUnreadsChange?: (messages: Talk.UnreadConversation[]) => void; 31 | }; 32 | 33 | export type ConversationProps = 34 | | { 35 | conversationId: string | null | undefined; 36 | syncConversation?: never; 37 | } 38 | | { 39 | conversationId?: never; 40 | syncConversation: 41 | | Talk.ConversationBuilder 42 | | ((session: Talk.Session) => Talk.ConversationBuilder); 43 | }; 44 | 45 | export type UIBoxProps = UIBoxEvents & 46 | ConversationProps & { asGuest?: boolean }; 47 | 48 | declare const testChatboxEvents: UIBoxEvents; 49 | declare const testInboxEvents: UIBoxEvents; 50 | declare const testSessionEvents: SessionEvents; 51 | -------------------------------------------------------------------------------- /lib/ui/Chatbox.tsx: -------------------------------------------------------------------------------- 1 | import { CSSProperties, ReactNode } from "react"; 2 | import type Talk from "talkjs"; 3 | import { useSession } from "../SessionContext"; 4 | import { getKeyForObject, splitObjectByPrefix } from "../util"; 5 | import { useMethod, useConversation, useUIBox } from "../hooks"; 6 | import { FirstParameter, UIBoxProps } from "../types"; 7 | import { MountedBox } from "../MountedBox"; 8 | 9 | type ChatboxProps = UIBoxProps & 10 | Talk.ChatboxOptions & { 11 | highlightedWords?: FirstParameter; 12 | chatboxRef?: React.MutableRefObject; 13 | loadingComponent?: ReactNode; 14 | style?: CSSProperties; 15 | className?: string; 16 | }; 17 | 18 | export function Chatbox(props: ChatboxProps) { 19 | const session = useSession(); 20 | 21 | if (session) { 22 | const key = getKeyForObject(session); 23 | return ; 24 | } else { 25 | return ( 26 |
27 | {props.loadingComponent} 28 |
29 | ); 30 | } 31 | } 32 | 33 | function ActiveChatbox(props: ChatboxProps & { session: Talk.Session }) { 34 | const { 35 | session, 36 | conversationId, 37 | syncConversation, 38 | asGuest, 39 | chatboxRef, 40 | style, 41 | className, 42 | loadingComponent, 43 | ...optionsAndEvents 44 | } = props; 45 | 46 | const [events, options] = splitObjectByPrefix(optionsAndEvents, "on"); 47 | const { messageFilter, presence, highlightedWords, ...simpleOptions } = 48 | options; 49 | 50 | const box = useUIBox(session, "createChatbox", simpleOptions, chatboxRef); 51 | useMethod(box, messageFilter, "setMessageFilter"); 52 | useMethod(box, presence, "setPresence"); 53 | useMethod(box, highlightedWords, "setHighlightedWords"); 54 | useConversation(session, box, syncConversation, conversationId, asGuest); 55 | 56 | return ( 57 | 65 | ); 66 | } 67 | -------------------------------------------------------------------------------- /lib/ui/Inbox.tsx: -------------------------------------------------------------------------------- 1 | import { CSSProperties, ReactNode } from "react"; 2 | import type Talk from "talkjs"; 3 | import { useSession } from "../SessionContext"; 4 | import { getKeyForObject, splitObjectByPrefix } from "../util"; 5 | import { useMethod, useConversation, useUIBox } from "../hooks"; 6 | import { FirstParameter, UIBoxProps } from "../types"; 7 | import { MountedBox } from "../MountedBox"; 8 | 9 | type InboxProps = Partial> & 10 | Omit & { 11 | highlightedWords?: FirstParameter; 12 | inboxRef?: React.MutableRefObject; 13 | loadingComponent?: ReactNode; 14 | style?: CSSProperties; 15 | className?: string; 16 | }; 17 | 18 | export function Inbox(props: InboxProps) { 19 | const session = useSession(); 20 | 21 | if (session) { 22 | const key = getKeyForObject(session); 23 | return ; 24 | } else { 25 | return ( 26 |
27 | {props.loadingComponent} 28 |
29 | ); 30 | } 31 | } 32 | 33 | function ActiveInbox(props: InboxProps & { session: Talk.Session }) { 34 | const { 35 | session, 36 | conversationId, 37 | syncConversation, 38 | asGuest, 39 | inboxRef, 40 | style, 41 | className, 42 | loadingComponent, 43 | ...optionsAndEvents 44 | } = props; 45 | 46 | const [events, options] = splitObjectByPrefix(optionsAndEvents, "on"); 47 | const { 48 | messageFilter, 49 | feedFilter, 50 | presence, 51 | highlightedWords, 52 | ...simpleOptions 53 | } = options; 54 | 55 | const box = useUIBox(session, "createInbox", simpleOptions, inboxRef); 56 | useMethod(box, messageFilter, "setMessageFilter"); 57 | useMethod(box, feedFilter, "setFeedFilter"); 58 | useMethod(box, presence, "setPresence"); 59 | useMethod(box, highlightedWords, "setHighlightedWords"); 60 | useConversation(session, box, syncConversation, conversationId, asGuest); 61 | 62 | return ( 63 | 71 | ); 72 | } 73 | -------------------------------------------------------------------------------- /lib/ui/Popup.tsx: -------------------------------------------------------------------------------- 1 | import Talk from "talkjs"; 2 | import { useSession } from "../SessionContext"; 3 | import { getKeyForObject, splitObjectByPrefix } from "../util"; 4 | import { useMethod, useConversation, useUIBox, useMountBox } from "../hooks"; 5 | import { EventListeners } from "../EventListeners"; 6 | import { UIBoxProps } from "../types"; 7 | import { useEffect } from "react"; 8 | 9 | type PopupProps = UIBoxProps & 10 | Talk.PopupOptions & { 11 | highlightedWords?: Parameters[0]; 12 | popupRef?: React.MutableRefObject; 13 | show?: boolean; 14 | }; 15 | 16 | export function Popup(props: PopupProps) { 17 | const session = useSession(); 18 | 19 | if (session) { 20 | const key = getKeyForObject(session); 21 | return ; 22 | } 23 | return null; 24 | } 25 | 26 | function ActivePopup(props: PopupProps & { session: Talk.Session }) { 27 | const { 28 | session, 29 | conversationId, 30 | syncConversation, 31 | asGuest, 32 | show, 33 | popupRef, 34 | ...optionsAndEvents 35 | } = props; 36 | 37 | const [events, options] = splitObjectByPrefix(optionsAndEvents, "on"); 38 | const { messageFilter, presence, highlightedWords, ...simpleOptions } = 39 | options; 40 | 41 | const box = useUIBox(session, "createPopup", simpleOptions, popupRef); 42 | useMethod(box, messageFilter, "setMessageFilter"); 43 | useMethod(box, presence, "setPresence"); 44 | useMethod(box, highlightedWords, "setHighlightedWords"); 45 | useConversation(session, box, syncConversation, conversationId, asGuest); 46 | const mounted = useMountBox(box, {show: show ?? true}); 47 | 48 | useEffect(() => { 49 | if(show === undefined || !mounted) { 50 | return; 51 | } 52 | 53 | if(show) { 54 | box?.show(); 55 | } else { 56 | box?.hide(); 57 | } 58 | 59 | }, [show, mounted, box]) 60 | 61 | return ; 62 | } 63 | -------------------------------------------------------------------------------- /lib/util.ts: -------------------------------------------------------------------------------- 1 | export type Func = (...args: any) => any; 2 | 3 | export interface Mountable { 4 | mount: (p: any) => Promise; 5 | } 6 | 7 | /** 8 | * Returns a unique number for the given object. If you pass the same object, 9 | * you get the same number back. Pass a differnt object, get a different number. 10 | * 11 | * Used to generate react keys for stateful objects. 12 | */ 13 | export const getKeyForObject = (() => { 14 | const keyMap = new WeakMap(); 15 | let currentKey = 0; 16 | 17 | return function getKeyForObject(obj: object) { 18 | if (!keyMap.has(obj)) { 19 | keyMap.set(obj, ++currentKey); 20 | } 21 | return keyMap.get(obj)!; 22 | }; 23 | })(); 24 | 25 | /** 26 | * A utility type that eagerly expands types to make them 27 | * easier to read in IntelliSense. 28 | * 29 | * @example 30 | * 31 | * ```ts 32 | * // Turns hard to understand IntelliSense types like this one: 33 | * type Before = Omit, "a"> 34 | * 35 | * // Into this: 36 | * type After = {b: number} 37 | * ``` 38 | */ 39 | type Compute = { [K in keyof T]: T[K] } & {}; 40 | 41 | type Unprefixed = Compute>; 42 | type Prefixed = Compute< 43 | Pick> 44 | >; 45 | 46 | /** 47 | * Splits `obj` into two objects, one with all fields that start with `prefix` 48 | * and one with all fields that don't. 49 | */ 50 | export function splitObjectByPrefix

( 51 | obj: T, 52 | prefix: P, 53 | ): [Prefixed, Unprefixed] { 54 | const prefixed: any = {}; 55 | const unprefixed: any = {}; 56 | 57 | for (const [k, v] of Object.entries(obj)) { 58 | if (k.startsWith(prefix)) { 59 | prefixed[k] = v; 60 | } else { 61 | unprefixed[k] = v; 62 | } 63 | } 64 | return [prefixed, unprefixed]; 65 | } 66 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@talkjs/react", 3 | "description": "Official TalkJS SDK for React", 4 | "license": "MIT", 5 | "keywords": [ 6 | "chat", 7 | "chat api", 8 | "chat sdk", 9 | "react chat", 10 | "react chat api", 11 | "messaging", 12 | "talk", 13 | "talkjs", 14 | "talkjs react", 15 | "real-time messaging", 16 | "real-time chat", 17 | "direct messaging", 18 | "user-to-user chat", 19 | "private messaging", 20 | "group chat", 21 | "react" 22 | ], 23 | "repository": { 24 | "type": "git", 25 | "url": "https://github.com/talkjs/talkjs-react.git" 26 | }, 27 | "bugs": { 28 | "url": "https://github.com/talkjs/talkjs-react/issues" 29 | }, 30 | "homepage": "https://talkjs.com", 31 | "version": "0.1.11", 32 | "type": "module", 33 | "files": [ 34 | "dist" 35 | ], 36 | "main": "./dist/talkjs-react.cjs", 37 | "module": "./dist/talkjs-react.js", 38 | "types": "./dist/talkjs-react.d.ts", 39 | "exports": { 40 | ".": { 41 | "types": "./dist/talkjs-react.d.ts", 42 | "import": "./dist/talkjs-react.js", 43 | "require": "./dist/talkjs-react.umd.cjs" 44 | } 45 | }, 46 | "scripts": { 47 | "dev": "vite", 48 | "build": "tsc && vite build", 49 | "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", 50 | "preview": "vite preview", 51 | "fmt": "prettier --write lib/ example/", 52 | "prepublishOnly": "npm run build" 53 | }, 54 | "dependencies": { 55 | "fast-deep-equal": "^3.1.3" 56 | }, 57 | "peerDependencies": { 58 | "react": ">=17", 59 | "talkjs": ">=0" 60 | }, 61 | "devDependencies": { 62 | "@types/node": "^20.4.5", 63 | "@types/react": "^18.2.14", 64 | "@types/react-dom": "^18.2.6", 65 | "@typescript-eslint/eslint-plugin": "^5.61.0", 66 | "@typescript-eslint/parser": "^5.61.0", 67 | "@vitejs/plugin-react-swc": "^3.3.2", 68 | "eslint": "^8.44.0", 69 | "eslint-plugin-react-hooks": "^4.6.0", 70 | "eslint-plugin-react-refresh": "^0.4.1", 71 | "react": "^18.2.0", 72 | "react-dom": "^18.2.0", 73 | "talkjs": "^0.21.0", 74 | "typescript": "^5.0.2", 75 | "vite": "^4.4.0", 76 | "vite-plugin-dts": "^3.5.1" 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "noEmit": true, 14 | "jsx": "react-jsx", 15 | "declaration": true, 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["example", "lib"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react-swc"; 3 | import dts from "vite-plugin-dts"; 4 | import * as fs from "fs/promises"; 5 | 6 | /** 7 | * `rollup-plugin-dts` really wants to rename `JSX` to `JSX_2`, so we undo that 8 | * here. 9 | */ 10 | async function renameJsx() { 11 | const input = await fs.readFile("./dist/talkjs-react.d.ts", "utf8"); 12 | const output = input 13 | .replace( 14 | `import { JSX as JSX_2 } from 'react/jsx-runtime';`, 15 | `import { JSX } from 'react/jsx-runtime';`, 16 | ) 17 | .replace(/JSX_2/g, "JSX"); 18 | 19 | await fs.writeFile("./dist/talkjs-react.d.ts", output); 20 | } 21 | 22 | // https://vitejs.dev/config/ 23 | export default defineConfig({ 24 | build: { 25 | target: "es2015", 26 | lib: { 27 | entry: "lib/main.tsx", 28 | name: "TalkJSReact", 29 | fileName: "talkjs-react", 30 | formats: ["es", "umd", "cjs"], 31 | }, 32 | rollupOptions: { 33 | external: ["react", "react/jsx-runtime", "talkjs"], 34 | output: { 35 | globals: { 36 | react: "React", 37 | talkjs: "TalkJS", 38 | }, 39 | banner: `"use client";`, 40 | }, 41 | }, 42 | }, 43 | plugins: [ 44 | react(), 45 | dts({ include: "lib", rollupTypes: true, afterBuild: renameJsx }), 46 | ], 47 | }); 48 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@aashutoshrathi/word-wrap@^1.2.3": 6 | version "1.2.6" 7 | resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" 8 | integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== 9 | 10 | "@babel/parser@^7.21.3": 11 | version "7.22.10" 12 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" 13 | integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== 14 | 15 | "@esbuild/android-arm64@0.18.13": 16 | version "0.18.13" 17 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.13.tgz#70ef455455654c7800c31ae55ae295d81712238c" 18 | integrity sha512-j7NhycJUoUAG5kAzGf4fPWfd17N6SM3o1X6MlXVqfHvs2buFraCJzos9vbeWjLxOyBKHyPOnuCuipbhvbYtTAg== 19 | 20 | "@esbuild/android-arm@0.18.13": 21 | version "0.18.13" 22 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.13.tgz#15db83099855fc4193658a40687893ee5c95d7a9" 23 | integrity sha512-KwqFhxRFMKZINHzCqf8eKxE0XqWlAVPRxwy6rc7CbVFxzUWB2sA/s3hbMZeemPdhN3fKBkqOaFhTbS8xJXYIWQ== 24 | 25 | "@esbuild/android-x64@0.18.13": 26 | version "0.18.13" 27 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.13.tgz#473d589219e1c06e305cf61ca77b8f69d9b6ffab" 28 | integrity sha512-M2eZkRxR6WnWfVELHmv6MUoHbOqnzoTVSIxgtsyhm/NsgmL+uTmag/VVzdXvmahak1I6sOb1K/2movco5ikDJg== 29 | 30 | "@esbuild/darwin-arm64@0.18.13": 31 | version "0.18.13" 32 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.13.tgz#0f525b2c1821a0591a06963582e5dc749ba51d45" 33 | integrity sha512-f5goG30YgR1GU+fxtaBRdSW3SBG9pZW834Mmhxa6terzcboz7P2R0k4lDxlkP7NYRIIdBbWp+VgwQbmMH4yV7w== 34 | 35 | "@esbuild/darwin-x64@0.18.13": 36 | version "0.18.13" 37 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.13.tgz#81965b690bae86bf1289b2ce0732506fd41fb545" 38 | integrity sha512-RIrxoKH5Eo+yE5BtaAIMZaiKutPhZjw+j0OCh8WdvKEKJQteacq0myZvBDLU+hOzQOZWJeDnuQ2xgSScKf1Ovw== 39 | 40 | "@esbuild/freebsd-arm64@0.18.13": 41 | version "0.18.13" 42 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.13.tgz#895bb37fdea886db09549119158e044f146861f0" 43 | integrity sha512-AfRPhHWmj9jGyLgW/2FkYERKmYR+IjYxf2rtSLmhOrPGFh0KCETFzSjx/JX/HJnvIqHt/DRQD/KAaVsUKoI3Xg== 44 | 45 | "@esbuild/freebsd-x64@0.18.13": 46 | version "0.18.13" 47 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.13.tgz#0b1dfde3ff1b18f03f71e460f91dc463e6a23903" 48 | integrity sha512-pGzWWZJBInhIgdEwzn8VHUBang8UvFKsvjDkeJ2oyY5gZtAM6BaxK0QLCuZY+qoj/nx/lIaItH425rm/hloETA== 49 | 50 | "@esbuild/linux-arm64@0.18.13": 51 | version "0.18.13" 52 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.13.tgz#350febed5d32d8ec1a424a4c4d7c9ba885604960" 53 | integrity sha512-hCzZbVJEHV7QM77fHPv2qgBcWxgglGFGCxk6KfQx6PsVIdi1u09X7IvgE9QKqm38OpkzaAkPnnPqwRsltvLkIQ== 54 | 55 | "@esbuild/linux-arm@0.18.13": 56 | version "0.18.13" 57 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.13.tgz#47639d73d894026350eaccf7c174f1d26b747d6a" 58 | integrity sha512-4iMxLRMCxGyk7lEvkkvrxw4aJeC93YIIrfbBlUJ062kilUUnAiMb81eEkVvCVoh3ON283ans7+OQkuy1uHW+Hw== 59 | 60 | "@esbuild/linux-ia32@0.18.13": 61 | version "0.18.13" 62 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.13.tgz#a901a16349c58bf6f873bced36bdf46a5f4dac5d" 63 | integrity sha512-I3OKGbynl3AAIO6onXNrup/ttToE6Rv2XYfFgLK/wnr2J+1g+7k4asLrE+n7VMhaqX+BUnyWkCu27rl+62Adug== 64 | 65 | "@esbuild/linux-loong64@0.18.13": 66 | version "0.18.13" 67 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.13.tgz#faa08db402c18e351234719e00aba98867aa34ce" 68 | integrity sha512-8pcKDApAsKc6WW51ZEVidSGwGbebYw2qKnO1VyD8xd6JN0RN6EUXfhXmDk9Vc4/U3Y4AoFTexQewQDJGsBXBpg== 69 | 70 | "@esbuild/linux-mips64el@0.18.13": 71 | version "0.18.13" 72 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.13.tgz#2123a54b49ddc1a1dff057bba8a9a5e9f26e5009" 73 | integrity sha512-6GU+J1PLiVqWx8yoCK4Z0GnfKyCGIH5L2KQipxOtbNPBs+qNDcMJr9euxnyJ6FkRPyMwaSkjejzPSISD9hb+gg== 74 | 75 | "@esbuild/linux-ppc64@0.18.13": 76 | version "0.18.13" 77 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.13.tgz#9a9befd275a6a3f5baeed89aaafb746df7ba735d" 78 | integrity sha512-pfn/OGZ8tyR8YCV7MlLl5hAit2cmS+j/ZZg9DdH0uxdCoJpV7+5DbuXrR+es4ayRVKIcfS9TTMCs60vqQDmh+w== 79 | 80 | "@esbuild/linux-riscv64@0.18.13": 81 | version "0.18.13" 82 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.13.tgz#6644a5b5840fa0c3ffade6f87d943413ece520a8" 83 | integrity sha512-aIbhU3LPg0lOSCfVeGHbmGYIqOtW6+yzO+Nfv57YblEK01oj0mFMtvDJlOaeAZ6z0FZ9D13oahi5aIl9JFphGg== 84 | 85 | "@esbuild/linux-s390x@0.18.13": 86 | version "0.18.13" 87 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.13.tgz#c1367a0a02b37f6b0382e71d9c9d97352ca23013" 88 | integrity sha512-Pct1QwF2sp+5LVi4Iu5Y+6JsGaV2Z2vm4O9Dd7XZ5tKYxEHjFtb140fiMcl5HM1iuv6xXO8O1Vrb1iJxHlv8UA== 89 | 90 | "@esbuild/linux-x64@0.18.13": 91 | version "0.18.13" 92 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.13.tgz#892674f0918ee3f5e523270cf49a69a557fb64c0" 93 | integrity sha512-zTrIP0KzYP7O0+3ZnmzvUKgGtUvf4+piY8PIO3V8/GfmVd3ZyHJGz7Ht0np3P1wz+I8qJ4rjwJKqqEAbIEPngA== 94 | 95 | "@esbuild/netbsd-x64@0.18.13": 96 | version "0.18.13" 97 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.13.tgz#67954292195ecbdae33ab09a9ae6a7f566e49d04" 98 | integrity sha512-I6zs10TZeaHDYoGxENuksxE1sxqZpCp+agYeW039yqFwh3MgVvdmXL5NMveImOC6AtpLvE4xG5ujVic4NWFIDQ== 99 | 100 | "@esbuild/openbsd-x64@0.18.13": 101 | version "0.18.13" 102 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.13.tgz#b3eef873dfab547fbe7bcdb3573e1c59dea676b7" 103 | integrity sha512-W5C5nczhrt1y1xPG5bV+0M12p2vetOGlvs43LH8SopQ3z2AseIROu09VgRqydx5qFN7y9qCbpgHLx0kb0TcW7g== 104 | 105 | "@esbuild/sunos-x64@0.18.13": 106 | version "0.18.13" 107 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.13.tgz#b368080f42dbb5ae926d0567c02bcd68a34c5efd" 108 | integrity sha512-X/xzuw4Hzpo/yq3YsfBbIsipNgmsm8mE/QeWbdGdTTeZ77fjxI2K0KP3AlhZ6gU3zKTw1bKoZTuKLnqcJ537qw== 109 | 110 | "@esbuild/win32-arm64@0.18.13": 111 | version "0.18.13" 112 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.13.tgz#11dedda0e8cfb5f781411ea362b2040304be0fc3" 113 | integrity sha512-4CGYdRQT/ILd+yLLE5i4VApMPfGE0RPc/wFQhlluDQCK09+b4JDbxzzjpgQqTPrdnP7r5KUtGVGZYclYiPuHrw== 114 | 115 | "@esbuild/win32-ia32@0.18.13": 116 | version "0.18.13" 117 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.13.tgz#6b8aa95515c05827b7c24c9db9581943566e0dcb" 118 | integrity sha512-D+wKZaRhQI+MUGMH+DbEr4owC2D7XnF+uyGiZk38QbgzLcofFqIOwFs7ELmIeU45CQgfHNy9Q+LKW3cE8g37Kg== 119 | 120 | "@esbuild/win32-x64@0.18.13": 121 | version "0.18.13" 122 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.13.tgz#031f69b1f4cf62a18c38d502458c0b8b02625461" 123 | integrity sha512-iVl6lehAfJS+VmpF3exKpNQ8b0eucf5VWfzR8S7xFve64NBNz2jPUgx1X93/kfnkfgP737O+i1k54SVQS7uVZA== 124 | 125 | "@eslint-community/eslint-utils@^4.2.0": 126 | version "4.4.0" 127 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 128 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 129 | dependencies: 130 | eslint-visitor-keys "^3.3.0" 131 | 132 | "@eslint-community/regexpp@^4.4.0": 133 | version "4.5.1" 134 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" 135 | integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== 136 | 137 | "@eslint/eslintrc@^2.1.0": 138 | version "2.1.0" 139 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d" 140 | integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== 141 | dependencies: 142 | ajv "^6.12.4" 143 | debug "^4.3.2" 144 | espree "^9.6.0" 145 | globals "^13.19.0" 146 | ignore "^5.2.0" 147 | import-fresh "^3.2.1" 148 | js-yaml "^4.1.0" 149 | minimatch "^3.1.2" 150 | strip-json-comments "^3.1.1" 151 | 152 | "@eslint/js@8.44.0": 153 | version "8.44.0" 154 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" 155 | integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== 156 | 157 | "@humanwhocodes/config-array@^0.11.10": 158 | version "0.11.10" 159 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" 160 | integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== 161 | dependencies: 162 | "@humanwhocodes/object-schema" "^1.2.1" 163 | debug "^4.1.1" 164 | minimatch "^3.0.5" 165 | 166 | "@humanwhocodes/module-importer@^1.0.1": 167 | version "1.0.1" 168 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 169 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 170 | 171 | "@humanwhocodes/object-schema@^1.2.1": 172 | version "1.2.1" 173 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 174 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 175 | 176 | "@microsoft/api-extractor-model@7.27.6": 177 | version "7.27.6" 178 | resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.27.6.tgz#308e44cd595d2fb446c6357759ee0675ec37d26e" 179 | integrity sha512-eiCnlayyum1f7fS2nA9pfIod5VCNR1G+Tq84V/ijDrKrOFVa598BLw145nCsGDMoFenV6ajNi2PR5WCwpAxW6Q== 180 | dependencies: 181 | "@microsoft/tsdoc" "0.14.2" 182 | "@microsoft/tsdoc-config" "~0.16.1" 183 | "@rushstack/node-core-library" "3.59.7" 184 | 185 | "@microsoft/api-extractor@^7.36.3": 186 | version "7.36.4" 187 | resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.36.4.tgz#3bb9fbbbeacaa48eea49150351905a2677a506d9" 188 | integrity sha512-21UECq8C/8CpHT23yiqTBQ10egKUacIpxkPyYR7hdswo/M5yTWdBvbq+77YC9uPKQJOUfOD1FImBQ1DzpsdeQQ== 189 | dependencies: 190 | "@microsoft/api-extractor-model" "7.27.6" 191 | "@microsoft/tsdoc" "0.14.2" 192 | "@microsoft/tsdoc-config" "~0.16.1" 193 | "@rushstack/node-core-library" "3.59.7" 194 | "@rushstack/rig-package" "0.4.1" 195 | "@rushstack/ts-command-line" "4.15.2" 196 | colors "~1.2.1" 197 | lodash "~4.17.15" 198 | resolve "~1.22.1" 199 | semver "~7.5.4" 200 | source-map "~0.6.1" 201 | typescript "~5.0.4" 202 | 203 | "@microsoft/tsdoc-config@~0.16.1": 204 | version "0.16.2" 205 | resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz#b786bb4ead00d54f53839a458ce626c8548d3adf" 206 | integrity sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw== 207 | dependencies: 208 | "@microsoft/tsdoc" "0.14.2" 209 | ajv "~6.12.6" 210 | jju "~1.4.0" 211 | resolve "~1.19.0" 212 | 213 | "@microsoft/tsdoc@0.14.2": 214 | version "0.14.2" 215 | resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" 216 | integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== 217 | 218 | "@nodelib/fs.scandir@2.1.5": 219 | version "2.1.5" 220 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 221 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 222 | dependencies: 223 | "@nodelib/fs.stat" "2.0.5" 224 | run-parallel "^1.1.9" 225 | 226 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 227 | version "2.0.5" 228 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 229 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 230 | 231 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 232 | version "1.2.8" 233 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 234 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 235 | dependencies: 236 | "@nodelib/fs.scandir" "2.1.5" 237 | fastq "^1.6.0" 238 | 239 | "@rollup/pluginutils@^5.0.2": 240 | version "5.0.2" 241 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" 242 | integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== 243 | dependencies: 244 | "@types/estree" "^1.0.0" 245 | estree-walker "^2.0.2" 246 | picomatch "^2.3.1" 247 | 248 | "@rushstack/node-core-library@3.59.7": 249 | version "3.59.7" 250 | resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.59.7.tgz#9dcd62b79263e8a5b68465d4bf9124ec86e14b6c" 251 | integrity sha512-ln1Drq0h+Hwa1JVA65x5mlSgUrBa1uHL+V89FqVWQgXd1vVIMhrtqtWGQrhTnFHxru5ppX+FY39VWELF/FjQCw== 252 | dependencies: 253 | colors "~1.2.1" 254 | fs-extra "~7.0.1" 255 | import-lazy "~4.0.0" 256 | jju "~1.4.0" 257 | resolve "~1.22.1" 258 | semver "~7.5.4" 259 | z-schema "~5.0.2" 260 | 261 | "@rushstack/rig-package@0.4.1": 262 | version "0.4.1" 263 | resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.4.1.tgz#ff11bf67dad46f9b4f09db91cf45739ab411ee9f" 264 | integrity sha512-AGRwpqlXNSp9LhUSz4HKI9xCluqQDt/obsQFdv/NYIekF3pTTPzc+HbQsIsjVjYnJ3DcmxOREVMhvrMEjpiq6g== 265 | dependencies: 266 | resolve "~1.22.1" 267 | strip-json-comments "~3.1.1" 268 | 269 | "@rushstack/ts-command-line@4.15.2": 270 | version "4.15.2" 271 | resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.15.2.tgz#7920e3fa2ab6af129d995ce4424c600da0bf8a93" 272 | integrity sha512-5+C2uoJY8b+odcZD6coEe2XNC4ZjGB4vCMESbqW/8DHRWC/qIHfANdmN9F1wz/lAgxz72i7xRoVtPY2j7e4gpQ== 273 | dependencies: 274 | "@types/argparse" "1.0.38" 275 | argparse "~1.0.9" 276 | colors "~1.2.1" 277 | string-argv "~0.3.1" 278 | 279 | "@swc/core-darwin-arm64@1.3.69": 280 | version "1.3.69" 281 | resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.69.tgz#e22032471244ec80c22bee8efc2100e456bb9488" 282 | integrity sha512-IjZTf12zIPWkV3D7toaLDoJPSkLhQ4fDH8G6/yCJUI27cBFOI3L8LXqptYmISoN5yYdrcnNpdqdapD09JPuNJg== 283 | 284 | "@swc/core-darwin-x64@1.3.69": 285 | version "1.3.69" 286 | resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.69.tgz#4c2034ba409b9e061b9e8ad56a762b8bb7815f18" 287 | integrity sha512-/wBO0Rn5oS5dJI/L9kJRkPAdksVwl5H9nleW/NM3A40N98VV8T7h/i1nO051mxIjq0R6qXVGOWFbBoLrPYucJg== 288 | 289 | "@swc/core-linux-arm-gnueabihf@1.3.69": 290 | version "1.3.69" 291 | resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.69.tgz#3d89053b6de2fd8553ce5c5808251246f2870e1e" 292 | integrity sha512-NShCjMv6Xn8ckMKBRqmprXvUF14+jXY0TcNKXwjYErzoIUFOnG72M36HxT4QEeAtKZ4Eg4CZFE4zlJ27fDp1gg== 293 | 294 | "@swc/core-linux-arm64-gnu@1.3.69": 295 | version "1.3.69" 296 | resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.69.tgz#df12d3befc5e86555ee561202dc9c279d8865bf3" 297 | integrity sha512-VRPOJj4idopSHIj1bOVXX0SgaB18R8yZNunb7eXS5ZcjVxAcdvqyIz3RdQX1zaJFCGzcdPLzBRP32DZWWGE8Ng== 298 | 299 | "@swc/core-linux-arm64-musl@1.3.69": 300 | version "1.3.69" 301 | resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.69.tgz#8372222a3298fdd0bd18da564a3009614a6c0920" 302 | integrity sha512-QxeSiZqo5x1X8vq8oUWLibq+IZJcxl9vy0sLUmzdjF2b/Z+qxKP3gutxnb2tzJaHqPVBbEZaILERIGy1qWdumQ== 303 | 304 | "@swc/core-linux-x64-gnu@1.3.69": 305 | version "1.3.69" 306 | resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.69.tgz#6879057d28f261b051fac52daca6c256f3a7fb7d" 307 | integrity sha512-b+DUlVxYox3BwD3PyTwhLvqtu6TYZtW+S6O0FnttH11o4skHN0XyJ/cUZSI0X2biSmfDsizRDUt1PWPFM+F7SA== 308 | 309 | "@swc/core-linux-x64-musl@1.3.69": 310 | version "1.3.69" 311 | resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.69.tgz#bf4f9a74156524211472bb713d34f0bb7265669f" 312 | integrity sha512-QXjsI+f8n9XPZHUvmGgkABpzN4M9kdSbhqBOZmv3o0AsDGNCA4uVowQqgZoPFAqlJTpwHeDmrv5sQ13HN+LOGw== 313 | 314 | "@swc/core-win32-arm64-msvc@1.3.69": 315 | version "1.3.69" 316 | resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.69.tgz#8242e4a406d11f0e078da39cf9962695e6b73d2d" 317 | integrity sha512-wn7A8Ws1fyviuCUB2Vg6IotiZeuqiO1Mz3d+YDae2EYyNpj1kNHvjBip8GHkfGzZG+jVrvG6NHsDo0KO/pGb8A== 318 | 319 | "@swc/core-win32-ia32-msvc@1.3.69": 320 | version "1.3.69" 321 | resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.69.tgz#68dbd41e200e5db71aa6644d793acff3607862f0" 322 | integrity sha512-LsFBXtXqxEcVaaOGEZ9X3qdMzobVoJqKv8DnksuDsWcBk+9WCeTz2u/iB+7yZ2HGuPXkCqTRqhFo6FX9aC00kQ== 323 | 324 | "@swc/core-win32-x64-msvc@1.3.69": 325 | version "1.3.69" 326 | resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.69.tgz#304e1050d59bae21215a15839b05668d48a92837" 327 | integrity sha512-ieBscU0gUgKjaseFI07tAaGqHvKyweNknPeSYEZOasVZUczhD6fK2GRnVREhv2RB2qdKC/VGFBsgRDMgzq1VLw== 328 | 329 | "@swc/core@^1.3.61": 330 | version "1.3.69" 331 | resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.69.tgz#b4a41e84de11832c233fbe714c6e412d8404bab0" 332 | integrity sha512-Khc/DE9D5+2tYTHgAIp5DZARbs8kldWg3b0Jp6l8FQLjelcLFmlQWSwKhVZrgv4oIbgZydIp8jInsvTalMHqnQ== 333 | optionalDependencies: 334 | "@swc/core-darwin-arm64" "1.3.69" 335 | "@swc/core-darwin-x64" "1.3.69" 336 | "@swc/core-linux-arm-gnueabihf" "1.3.69" 337 | "@swc/core-linux-arm64-gnu" "1.3.69" 338 | "@swc/core-linux-arm64-musl" "1.3.69" 339 | "@swc/core-linux-x64-gnu" "1.3.69" 340 | "@swc/core-linux-x64-musl" "1.3.69" 341 | "@swc/core-win32-arm64-msvc" "1.3.69" 342 | "@swc/core-win32-ia32-msvc" "1.3.69" 343 | "@swc/core-win32-x64-msvc" "1.3.69" 344 | 345 | "@types/argparse@1.0.38": 346 | version "1.0.38" 347 | resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" 348 | integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== 349 | 350 | "@types/estree@^1.0.0": 351 | version "1.0.1" 352 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" 353 | integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== 354 | 355 | "@types/json-schema@^7.0.9": 356 | version "7.0.12" 357 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" 358 | integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== 359 | 360 | "@types/node@^20.4.5": 361 | version "20.4.5" 362 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69" 363 | integrity sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg== 364 | 365 | "@types/prop-types@*": 366 | version "15.7.5" 367 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 368 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 369 | 370 | "@types/react-dom@^18.2.6": 371 | version "18.2.7" 372 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" 373 | integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== 374 | dependencies: 375 | "@types/react" "*" 376 | 377 | "@types/react@*", "@types/react@^18.2.14": 378 | version "18.2.15" 379 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.15.tgz#14792b35df676c20ec3cf595b262f8c615a73066" 380 | integrity sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA== 381 | dependencies: 382 | "@types/prop-types" "*" 383 | "@types/scheduler" "*" 384 | csstype "^3.0.2" 385 | 386 | "@types/scheduler@*": 387 | version "0.16.3" 388 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" 389 | integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== 390 | 391 | "@types/semver@^7.3.12": 392 | version "7.5.0" 393 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" 394 | integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== 395 | 396 | "@typescript-eslint/eslint-plugin@^5.61.0": 397 | version "5.62.0" 398 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" 399 | integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== 400 | dependencies: 401 | "@eslint-community/regexpp" "^4.4.0" 402 | "@typescript-eslint/scope-manager" "5.62.0" 403 | "@typescript-eslint/type-utils" "5.62.0" 404 | "@typescript-eslint/utils" "5.62.0" 405 | debug "^4.3.4" 406 | graphemer "^1.4.0" 407 | ignore "^5.2.0" 408 | natural-compare-lite "^1.4.0" 409 | semver "^7.3.7" 410 | tsutils "^3.21.0" 411 | 412 | "@typescript-eslint/parser@^5.61.0": 413 | version "5.62.0" 414 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" 415 | integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== 416 | dependencies: 417 | "@typescript-eslint/scope-manager" "5.62.0" 418 | "@typescript-eslint/types" "5.62.0" 419 | "@typescript-eslint/typescript-estree" "5.62.0" 420 | debug "^4.3.4" 421 | 422 | "@typescript-eslint/scope-manager@5.62.0": 423 | version "5.62.0" 424 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" 425 | integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== 426 | dependencies: 427 | "@typescript-eslint/types" "5.62.0" 428 | "@typescript-eslint/visitor-keys" "5.62.0" 429 | 430 | "@typescript-eslint/type-utils@5.62.0": 431 | version "5.62.0" 432 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" 433 | integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== 434 | dependencies: 435 | "@typescript-eslint/typescript-estree" "5.62.0" 436 | "@typescript-eslint/utils" "5.62.0" 437 | debug "^4.3.4" 438 | tsutils "^3.21.0" 439 | 440 | "@typescript-eslint/types@5.62.0": 441 | version "5.62.0" 442 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" 443 | integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== 444 | 445 | "@typescript-eslint/typescript-estree@5.62.0": 446 | version "5.62.0" 447 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" 448 | integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== 449 | dependencies: 450 | "@typescript-eslint/types" "5.62.0" 451 | "@typescript-eslint/visitor-keys" "5.62.0" 452 | debug "^4.3.4" 453 | globby "^11.1.0" 454 | is-glob "^4.0.3" 455 | semver "^7.3.7" 456 | tsutils "^3.21.0" 457 | 458 | "@typescript-eslint/utils@5.62.0": 459 | version "5.62.0" 460 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" 461 | integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== 462 | dependencies: 463 | "@eslint-community/eslint-utils" "^4.2.0" 464 | "@types/json-schema" "^7.0.9" 465 | "@types/semver" "^7.3.12" 466 | "@typescript-eslint/scope-manager" "5.62.0" 467 | "@typescript-eslint/types" "5.62.0" 468 | "@typescript-eslint/typescript-estree" "5.62.0" 469 | eslint-scope "^5.1.1" 470 | semver "^7.3.7" 471 | 472 | "@typescript-eslint/visitor-keys@5.62.0": 473 | version "5.62.0" 474 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" 475 | integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== 476 | dependencies: 477 | "@typescript-eslint/types" "5.62.0" 478 | eslint-visitor-keys "^3.3.0" 479 | 480 | "@vitejs/plugin-react-swc@^3.3.2": 481 | version "3.3.2" 482 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz#34a82c1728066f48a86dfecb2f15df60f89207fb" 483 | integrity sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA== 484 | dependencies: 485 | "@swc/core" "^1.3.61" 486 | 487 | "@volar/language-core@1.10.0", "@volar/language-core@~1.10.0": 488 | version "1.10.0" 489 | resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.10.0.tgz#fb6b3ad22e75c53a1ae4d644c4a788b47d411b9d" 490 | integrity sha512-ddyWwSYqcbEZNFHm+Z3NZd6M7Ihjcwl/9B5cZd8kECdimVXUFdFi60XHWD27nrWtUQIsUYIG7Ca1WBwV2u2LSQ== 491 | dependencies: 492 | "@volar/source-map" "1.10.0" 493 | 494 | "@volar/source-map@1.10.0", "@volar/source-map@~1.10.0": 495 | version "1.10.0" 496 | resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.10.0.tgz#2413eb190ce69fc1a382f58524a3f82306668024" 497 | integrity sha512-/ibWdcOzDGiq/GM1JU2eX8fH1bvAhl66hfe8yEgLEzg9txgr6qb5sQ/DEz5PcDL75tF5H5sCRRwn8Eu8ezi9mw== 498 | dependencies: 499 | muggle-string "^0.3.1" 500 | 501 | "@volar/typescript@~1.10.0": 502 | version "1.10.0" 503 | resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.10.0.tgz#3b16cf7c4c1802eac023ba4e57fe52bdb6d3016f" 504 | integrity sha512-OtqGtFbUKYC0pLNIk3mHQp5xWnvL1CJIUc9VE39VdZ/oqpoBh5jKfb9uJ45Y4/oP/WYTrif/Uxl1k8VTPz66Gg== 505 | dependencies: 506 | "@volar/language-core" "1.10.0" 507 | 508 | "@vue/compiler-core@3.3.4": 509 | version "3.3.4" 510 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" 511 | integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== 512 | dependencies: 513 | "@babel/parser" "^7.21.3" 514 | "@vue/shared" "3.3.4" 515 | estree-walker "^2.0.2" 516 | source-map-js "^1.0.2" 517 | 518 | "@vue/compiler-dom@^3.3.0": 519 | version "3.3.4" 520 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" 521 | integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== 522 | dependencies: 523 | "@vue/compiler-core" "3.3.4" 524 | "@vue/shared" "3.3.4" 525 | 526 | "@vue/language-core@1.8.8", "@vue/language-core@^1.8.8": 527 | version "1.8.8" 528 | resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.8.tgz#5a8aa8363f4dfacdfcd7808a9926744d7c310ae6" 529 | integrity sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw== 530 | dependencies: 531 | "@volar/language-core" "~1.10.0" 532 | "@volar/source-map" "~1.10.0" 533 | "@vue/compiler-dom" "^3.3.0" 534 | "@vue/reactivity" "^3.3.0" 535 | "@vue/shared" "^3.3.0" 536 | minimatch "^9.0.0" 537 | muggle-string "^0.3.1" 538 | vue-template-compiler "^2.7.14" 539 | 540 | "@vue/reactivity@^3.3.0": 541 | version "3.3.4" 542 | resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.4.tgz#a27a29c6cd17faba5a0e99fbb86ee951653e2253" 543 | integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ== 544 | dependencies: 545 | "@vue/shared" "3.3.4" 546 | 547 | "@vue/shared@3.3.4", "@vue/shared@^3.3.0": 548 | version "3.3.4" 549 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" 550 | integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== 551 | 552 | "@vue/typescript@1.8.8": 553 | version "1.8.8" 554 | resolved "https://registry.yarnpkg.com/@vue/typescript/-/typescript-1.8.8.tgz#8efb375d448862134492a044f4e96afada547500" 555 | integrity sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow== 556 | dependencies: 557 | "@volar/typescript" "~1.10.0" 558 | "@vue/language-core" "1.8.8" 559 | 560 | acorn-jsx@^5.3.2: 561 | version "5.3.2" 562 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 563 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 564 | 565 | acorn@^8.9.0: 566 | version "8.10.0" 567 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" 568 | integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== 569 | 570 | ajv@^6.10.0, ajv@^6.12.4, ajv@~6.12.6: 571 | version "6.12.6" 572 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 573 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 574 | dependencies: 575 | fast-deep-equal "^3.1.1" 576 | fast-json-stable-stringify "^2.0.0" 577 | json-schema-traverse "^0.4.1" 578 | uri-js "^4.2.2" 579 | 580 | ansi-regex@^5.0.1: 581 | version "5.0.1" 582 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 583 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 584 | 585 | ansi-styles@^4.1.0: 586 | version "4.3.0" 587 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 588 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 589 | dependencies: 590 | color-convert "^2.0.1" 591 | 592 | argparse@^2.0.1: 593 | version "2.0.1" 594 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 595 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 596 | 597 | argparse@~1.0.9: 598 | version "1.0.10" 599 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 600 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 601 | dependencies: 602 | sprintf-js "~1.0.2" 603 | 604 | array-union@^2.1.0: 605 | version "2.1.0" 606 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 607 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 608 | 609 | balanced-match@^1.0.0: 610 | version "1.0.2" 611 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 612 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 613 | 614 | brace-expansion@^1.1.7: 615 | version "1.1.11" 616 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 617 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 618 | dependencies: 619 | balanced-match "^1.0.0" 620 | concat-map "0.0.1" 621 | 622 | brace-expansion@^2.0.1: 623 | version "2.0.1" 624 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 625 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 626 | dependencies: 627 | balanced-match "^1.0.0" 628 | 629 | braces@^3.0.2: 630 | version "3.0.2" 631 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 632 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 633 | dependencies: 634 | fill-range "^7.0.1" 635 | 636 | callsites@^3.0.0: 637 | version "3.1.0" 638 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 639 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 640 | 641 | chalk@^4.0.0: 642 | version "4.1.2" 643 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 644 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 645 | dependencies: 646 | ansi-styles "^4.1.0" 647 | supports-color "^7.1.0" 648 | 649 | color-convert@^2.0.1: 650 | version "2.0.1" 651 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 652 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 653 | dependencies: 654 | color-name "~1.1.4" 655 | 656 | color-name@~1.1.4: 657 | version "1.1.4" 658 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 659 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 660 | 661 | colors@~1.2.1: 662 | version "1.2.5" 663 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" 664 | integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== 665 | 666 | commander@^10.0.0: 667 | version "10.0.1" 668 | resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" 669 | integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== 670 | 671 | concat-map@0.0.1: 672 | version "0.0.1" 673 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 674 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 675 | 676 | cross-spawn@^7.0.2: 677 | version "7.0.3" 678 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 679 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 680 | dependencies: 681 | path-key "^3.1.0" 682 | shebang-command "^2.0.0" 683 | which "^2.0.1" 684 | 685 | csstype@^3.0.2: 686 | version "3.1.2" 687 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" 688 | integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== 689 | 690 | de-indent@^1.0.2: 691 | version "1.0.2" 692 | resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" 693 | integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== 694 | 695 | debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: 696 | version "4.3.4" 697 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 698 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 699 | dependencies: 700 | ms "2.1.2" 701 | 702 | deep-is@^0.1.3: 703 | version "0.1.4" 704 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 705 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 706 | 707 | dir-glob@^3.0.1: 708 | version "3.0.1" 709 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 710 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 711 | dependencies: 712 | path-type "^4.0.0" 713 | 714 | doctrine@^3.0.0: 715 | version "3.0.0" 716 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 717 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 718 | dependencies: 719 | esutils "^2.0.2" 720 | 721 | esbuild@^0.18.10: 722 | version "0.18.13" 723 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.13.tgz#59160add6c3420947fe008238140ed3480baf817" 724 | integrity sha512-vhg/WR/Oiu4oUIkVhmfcc23G6/zWuEQKFS+yiosSHe4aN6+DQRXIfeloYGibIfVhkr4wyfuVsGNLr+sQU1rWWw== 725 | optionalDependencies: 726 | "@esbuild/android-arm" "0.18.13" 727 | "@esbuild/android-arm64" "0.18.13" 728 | "@esbuild/android-x64" "0.18.13" 729 | "@esbuild/darwin-arm64" "0.18.13" 730 | "@esbuild/darwin-x64" "0.18.13" 731 | "@esbuild/freebsd-arm64" "0.18.13" 732 | "@esbuild/freebsd-x64" "0.18.13" 733 | "@esbuild/linux-arm" "0.18.13" 734 | "@esbuild/linux-arm64" "0.18.13" 735 | "@esbuild/linux-ia32" "0.18.13" 736 | "@esbuild/linux-loong64" "0.18.13" 737 | "@esbuild/linux-mips64el" "0.18.13" 738 | "@esbuild/linux-ppc64" "0.18.13" 739 | "@esbuild/linux-riscv64" "0.18.13" 740 | "@esbuild/linux-s390x" "0.18.13" 741 | "@esbuild/linux-x64" "0.18.13" 742 | "@esbuild/netbsd-x64" "0.18.13" 743 | "@esbuild/openbsd-x64" "0.18.13" 744 | "@esbuild/sunos-x64" "0.18.13" 745 | "@esbuild/win32-arm64" "0.18.13" 746 | "@esbuild/win32-ia32" "0.18.13" 747 | "@esbuild/win32-x64" "0.18.13" 748 | 749 | escape-string-regexp@^4.0.0: 750 | version "4.0.0" 751 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 752 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 753 | 754 | eslint-plugin-react-hooks@^4.6.0: 755 | version "4.6.0" 756 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" 757 | integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== 758 | 759 | eslint-plugin-react-refresh@^0.4.1: 760 | version "0.4.3" 761 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz#59dae8c00a119f06ea16b1d3e6891df3775947c7" 762 | integrity sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA== 763 | 764 | eslint-scope@^5.1.1: 765 | version "5.1.1" 766 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 767 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 768 | dependencies: 769 | esrecurse "^4.3.0" 770 | estraverse "^4.1.1" 771 | 772 | eslint-scope@^7.2.0: 773 | version "7.2.1" 774 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.1.tgz#936821d3462675f25a18ac5fd88a67cc15b393bd" 775 | integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== 776 | dependencies: 777 | esrecurse "^4.3.0" 778 | estraverse "^5.2.0" 779 | 780 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: 781 | version "3.4.1" 782 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" 783 | integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== 784 | 785 | eslint@^8.44.0: 786 | version "8.45.0" 787 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" 788 | integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== 789 | dependencies: 790 | "@eslint-community/eslint-utils" "^4.2.0" 791 | "@eslint-community/regexpp" "^4.4.0" 792 | "@eslint/eslintrc" "^2.1.0" 793 | "@eslint/js" "8.44.0" 794 | "@humanwhocodes/config-array" "^0.11.10" 795 | "@humanwhocodes/module-importer" "^1.0.1" 796 | "@nodelib/fs.walk" "^1.2.8" 797 | ajv "^6.10.0" 798 | chalk "^4.0.0" 799 | cross-spawn "^7.0.2" 800 | debug "^4.3.2" 801 | doctrine "^3.0.0" 802 | escape-string-regexp "^4.0.0" 803 | eslint-scope "^7.2.0" 804 | eslint-visitor-keys "^3.4.1" 805 | espree "^9.6.0" 806 | esquery "^1.4.2" 807 | esutils "^2.0.2" 808 | fast-deep-equal "^3.1.3" 809 | file-entry-cache "^6.0.1" 810 | find-up "^5.0.0" 811 | glob-parent "^6.0.2" 812 | globals "^13.19.0" 813 | graphemer "^1.4.0" 814 | ignore "^5.2.0" 815 | imurmurhash "^0.1.4" 816 | is-glob "^4.0.0" 817 | is-path-inside "^3.0.3" 818 | js-yaml "^4.1.0" 819 | json-stable-stringify-without-jsonify "^1.0.1" 820 | levn "^0.4.1" 821 | lodash.merge "^4.6.2" 822 | minimatch "^3.1.2" 823 | natural-compare "^1.4.0" 824 | optionator "^0.9.3" 825 | strip-ansi "^6.0.1" 826 | text-table "^0.2.0" 827 | 828 | espree@^9.6.0: 829 | version "9.6.1" 830 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 831 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 832 | dependencies: 833 | acorn "^8.9.0" 834 | acorn-jsx "^5.3.2" 835 | eslint-visitor-keys "^3.4.1" 836 | 837 | esquery@^1.4.2: 838 | version "1.5.0" 839 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" 840 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 841 | dependencies: 842 | estraverse "^5.1.0" 843 | 844 | esrecurse@^4.3.0: 845 | version "4.3.0" 846 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 847 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 848 | dependencies: 849 | estraverse "^5.2.0" 850 | 851 | estraverse@^4.1.1: 852 | version "4.3.0" 853 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 854 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 855 | 856 | estraverse@^5.1.0, estraverse@^5.2.0: 857 | version "5.3.0" 858 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 859 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 860 | 861 | estree-walker@^2.0.2: 862 | version "2.0.2" 863 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 864 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 865 | 866 | esutils@^2.0.2: 867 | version "2.0.3" 868 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 869 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 870 | 871 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 872 | version "3.1.3" 873 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 874 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 875 | 876 | fast-glob@^3.2.9: 877 | version "3.3.0" 878 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" 879 | integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== 880 | dependencies: 881 | "@nodelib/fs.stat" "^2.0.2" 882 | "@nodelib/fs.walk" "^1.2.3" 883 | glob-parent "^5.1.2" 884 | merge2 "^1.3.0" 885 | micromatch "^4.0.4" 886 | 887 | fast-json-stable-stringify@^2.0.0: 888 | version "2.1.0" 889 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 890 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 891 | 892 | fast-levenshtein@^2.0.6: 893 | version "2.0.6" 894 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 895 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 896 | 897 | fastq@^1.6.0: 898 | version "1.15.0" 899 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 900 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 901 | dependencies: 902 | reusify "^1.0.4" 903 | 904 | file-entry-cache@^6.0.1: 905 | version "6.0.1" 906 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 907 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 908 | dependencies: 909 | flat-cache "^3.0.4" 910 | 911 | fill-range@^7.0.1: 912 | version "7.0.1" 913 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 914 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 915 | dependencies: 916 | to-regex-range "^5.0.1" 917 | 918 | find-up@^5.0.0: 919 | version "5.0.0" 920 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 921 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 922 | dependencies: 923 | locate-path "^6.0.0" 924 | path-exists "^4.0.0" 925 | 926 | flat-cache@^3.0.4: 927 | version "3.0.4" 928 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 929 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 930 | dependencies: 931 | flatted "^3.1.0" 932 | rimraf "^3.0.2" 933 | 934 | flatted@^3.1.0: 935 | version "3.2.7" 936 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" 937 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== 938 | 939 | fs-extra@~7.0.1: 940 | version "7.0.1" 941 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 942 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 943 | dependencies: 944 | graceful-fs "^4.1.2" 945 | jsonfile "^4.0.0" 946 | universalify "^0.1.0" 947 | 948 | fs.realpath@^1.0.0: 949 | version "1.0.0" 950 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 951 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 952 | 953 | fsevents@~2.3.2: 954 | version "2.3.2" 955 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 956 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 957 | 958 | function-bind@^1.1.1: 959 | version "1.1.1" 960 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 961 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 962 | 963 | glob-parent@^5.1.2: 964 | version "5.1.2" 965 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 966 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 967 | dependencies: 968 | is-glob "^4.0.1" 969 | 970 | glob-parent@^6.0.2: 971 | version "6.0.2" 972 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 973 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 974 | dependencies: 975 | is-glob "^4.0.3" 976 | 977 | glob@^7.1.3: 978 | version "7.2.3" 979 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 980 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 981 | dependencies: 982 | fs.realpath "^1.0.0" 983 | inflight "^1.0.4" 984 | inherits "2" 985 | minimatch "^3.1.1" 986 | once "^1.3.0" 987 | path-is-absolute "^1.0.0" 988 | 989 | globals@^13.19.0: 990 | version "13.20.0" 991 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" 992 | integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== 993 | dependencies: 994 | type-fest "^0.20.2" 995 | 996 | globby@^11.1.0: 997 | version "11.1.0" 998 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 999 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1000 | dependencies: 1001 | array-union "^2.1.0" 1002 | dir-glob "^3.0.1" 1003 | fast-glob "^3.2.9" 1004 | ignore "^5.2.0" 1005 | merge2 "^1.4.1" 1006 | slash "^3.0.0" 1007 | 1008 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 1009 | version "4.2.11" 1010 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 1011 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 1012 | 1013 | graphemer@^1.4.0: 1014 | version "1.4.0" 1015 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 1016 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 1017 | 1018 | has-flag@^4.0.0: 1019 | version "4.0.0" 1020 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1021 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1022 | 1023 | has@^1.0.3: 1024 | version "1.0.3" 1025 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1026 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1027 | dependencies: 1028 | function-bind "^1.1.1" 1029 | 1030 | he@^1.2.0: 1031 | version "1.2.0" 1032 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 1033 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 1034 | 1035 | ignore@^5.2.0: 1036 | version "5.2.4" 1037 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" 1038 | integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== 1039 | 1040 | import-fresh@^3.2.1: 1041 | version "3.3.0" 1042 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1043 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1044 | dependencies: 1045 | parent-module "^1.0.0" 1046 | resolve-from "^4.0.0" 1047 | 1048 | import-lazy@~4.0.0: 1049 | version "4.0.0" 1050 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" 1051 | integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== 1052 | 1053 | imurmurhash@^0.1.4: 1054 | version "0.1.4" 1055 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1056 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1057 | 1058 | inflight@^1.0.4: 1059 | version "1.0.6" 1060 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1061 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1062 | dependencies: 1063 | once "^1.3.0" 1064 | wrappy "1" 1065 | 1066 | inherits@2: 1067 | version "2.0.4" 1068 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1069 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1070 | 1071 | is-core-module@^2.1.0, is-core-module@^2.13.0: 1072 | version "2.13.0" 1073 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" 1074 | integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== 1075 | dependencies: 1076 | has "^1.0.3" 1077 | 1078 | is-extglob@^2.1.1: 1079 | version "2.1.1" 1080 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1081 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1082 | 1083 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1084 | version "4.0.3" 1085 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1086 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1087 | dependencies: 1088 | is-extglob "^2.1.1" 1089 | 1090 | is-number@^7.0.0: 1091 | version "7.0.0" 1092 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1093 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1094 | 1095 | is-path-inside@^3.0.3: 1096 | version "3.0.3" 1097 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1098 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1099 | 1100 | isexe@^2.0.0: 1101 | version "2.0.0" 1102 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1103 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1104 | 1105 | jju@~1.4.0: 1106 | version "1.4.0" 1107 | resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" 1108 | integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== 1109 | 1110 | "js-tokens@^3.0.0 || ^4.0.0": 1111 | version "4.0.0" 1112 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1113 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1114 | 1115 | js-yaml@^4.1.0: 1116 | version "4.1.0" 1117 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1118 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1119 | dependencies: 1120 | argparse "^2.0.1" 1121 | 1122 | json-schema-traverse@^0.4.1: 1123 | version "0.4.1" 1124 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1125 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1126 | 1127 | json-stable-stringify-without-jsonify@^1.0.1: 1128 | version "1.0.1" 1129 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1130 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1131 | 1132 | jsonfile@^4.0.0: 1133 | version "4.0.0" 1134 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1135 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 1136 | optionalDependencies: 1137 | graceful-fs "^4.1.6" 1138 | 1139 | kolorist@^1.8.0: 1140 | version "1.8.0" 1141 | resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" 1142 | integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== 1143 | 1144 | levn@^0.4.1: 1145 | version "0.4.1" 1146 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1147 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1148 | dependencies: 1149 | prelude-ls "^1.2.1" 1150 | type-check "~0.4.0" 1151 | 1152 | locate-path@^6.0.0: 1153 | version "6.0.0" 1154 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1155 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1156 | dependencies: 1157 | p-locate "^5.0.0" 1158 | 1159 | lodash.get@^4.4.2: 1160 | version "4.4.2" 1161 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 1162 | integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== 1163 | 1164 | lodash.isequal@^4.5.0: 1165 | version "4.5.0" 1166 | resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" 1167 | integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== 1168 | 1169 | lodash.merge@^4.6.2: 1170 | version "4.6.2" 1171 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1172 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1173 | 1174 | lodash@~4.17.15: 1175 | version "4.17.21" 1176 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1177 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1178 | 1179 | loose-envify@^1.1.0: 1180 | version "1.4.0" 1181 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1182 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1183 | dependencies: 1184 | js-tokens "^3.0.0 || ^4.0.0" 1185 | 1186 | lru-cache@^6.0.0: 1187 | version "6.0.0" 1188 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1189 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1190 | dependencies: 1191 | yallist "^4.0.0" 1192 | 1193 | merge2@^1.3.0, merge2@^1.4.1: 1194 | version "1.4.1" 1195 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1196 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1197 | 1198 | micromatch@^4.0.4: 1199 | version "4.0.5" 1200 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1201 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1202 | dependencies: 1203 | braces "^3.0.2" 1204 | picomatch "^2.3.1" 1205 | 1206 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 1207 | version "3.1.2" 1208 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1209 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1210 | dependencies: 1211 | brace-expansion "^1.1.7" 1212 | 1213 | minimatch@^9.0.0: 1214 | version "9.0.3" 1215 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" 1216 | integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== 1217 | dependencies: 1218 | brace-expansion "^2.0.1" 1219 | 1220 | ms@2.1.2: 1221 | version "2.1.2" 1222 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1223 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1224 | 1225 | muggle-string@^0.3.1: 1226 | version "0.3.1" 1227 | resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.3.1.tgz#e524312eb1728c63dd0b2ac49e3282e6ed85963a" 1228 | integrity sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg== 1229 | 1230 | nanoid@^3.3.6: 1231 | version "3.3.6" 1232 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" 1233 | integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== 1234 | 1235 | natural-compare-lite@^1.4.0: 1236 | version "1.4.0" 1237 | resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" 1238 | integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== 1239 | 1240 | natural-compare@^1.4.0: 1241 | version "1.4.0" 1242 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1243 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1244 | 1245 | once@^1.3.0: 1246 | version "1.4.0" 1247 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1248 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1249 | dependencies: 1250 | wrappy "1" 1251 | 1252 | optionator@^0.9.3: 1253 | version "0.9.3" 1254 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" 1255 | integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== 1256 | dependencies: 1257 | "@aashutoshrathi/word-wrap" "^1.2.3" 1258 | deep-is "^0.1.3" 1259 | fast-levenshtein "^2.0.6" 1260 | levn "^0.4.1" 1261 | prelude-ls "^1.2.1" 1262 | type-check "^0.4.0" 1263 | 1264 | p-limit@^3.0.2: 1265 | version "3.1.0" 1266 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1267 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1268 | dependencies: 1269 | yocto-queue "^0.1.0" 1270 | 1271 | p-locate@^5.0.0: 1272 | version "5.0.0" 1273 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1274 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1275 | dependencies: 1276 | p-limit "^3.0.2" 1277 | 1278 | parent-module@^1.0.0: 1279 | version "1.0.1" 1280 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1281 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1282 | dependencies: 1283 | callsites "^3.0.0" 1284 | 1285 | path-exists@^4.0.0: 1286 | version "4.0.0" 1287 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1288 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1289 | 1290 | path-is-absolute@^1.0.0: 1291 | version "1.0.1" 1292 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1293 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1294 | 1295 | path-key@^3.1.0: 1296 | version "3.1.1" 1297 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1298 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1299 | 1300 | path-parse@^1.0.6, path-parse@^1.0.7: 1301 | version "1.0.7" 1302 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1303 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1304 | 1305 | path-type@^4.0.0: 1306 | version "4.0.0" 1307 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1308 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1309 | 1310 | picocolors@^1.0.0: 1311 | version "1.0.0" 1312 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1313 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1314 | 1315 | picomatch@^2.3.1: 1316 | version "2.3.1" 1317 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1318 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1319 | 1320 | postcss@^8.4.25: 1321 | version "8.4.26" 1322 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" 1323 | integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== 1324 | dependencies: 1325 | nanoid "^3.3.6" 1326 | picocolors "^1.0.0" 1327 | source-map-js "^1.0.2" 1328 | 1329 | prelude-ls@^1.2.1: 1330 | version "1.2.1" 1331 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1332 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1333 | 1334 | punycode@^2.1.0: 1335 | version "2.3.0" 1336 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" 1337 | integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== 1338 | 1339 | queue-microtask@^1.2.2: 1340 | version "1.2.3" 1341 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1342 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1343 | 1344 | react-dom@^18.2.0: 1345 | version "18.2.0" 1346 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 1347 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 1348 | dependencies: 1349 | loose-envify "^1.1.0" 1350 | scheduler "^0.23.0" 1351 | 1352 | react@^18.2.0: 1353 | version "18.2.0" 1354 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 1355 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 1356 | dependencies: 1357 | loose-envify "^1.1.0" 1358 | 1359 | resolve-from@^4.0.0: 1360 | version "4.0.0" 1361 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1362 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1363 | 1364 | resolve@~1.19.0: 1365 | version "1.19.0" 1366 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" 1367 | integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== 1368 | dependencies: 1369 | is-core-module "^2.1.0" 1370 | path-parse "^1.0.6" 1371 | 1372 | resolve@~1.22.1: 1373 | version "1.22.4" 1374 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" 1375 | integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== 1376 | dependencies: 1377 | is-core-module "^2.13.0" 1378 | path-parse "^1.0.7" 1379 | supports-preserve-symlinks-flag "^1.0.0" 1380 | 1381 | reusify@^1.0.4: 1382 | version "1.0.4" 1383 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1384 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1385 | 1386 | rimraf@^3.0.2: 1387 | version "3.0.2" 1388 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1389 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1390 | dependencies: 1391 | glob "^7.1.3" 1392 | 1393 | rollup@^3.25.2: 1394 | version "3.26.3" 1395 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.26.3.tgz#bbc8818cadd0aebca348dbb3d68d296d220967b8" 1396 | integrity sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ== 1397 | optionalDependencies: 1398 | fsevents "~2.3.2" 1399 | 1400 | run-parallel@^1.1.9: 1401 | version "1.2.0" 1402 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1403 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1404 | dependencies: 1405 | queue-microtask "^1.2.2" 1406 | 1407 | scheduler@^0.23.0: 1408 | version "0.23.0" 1409 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 1410 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 1411 | dependencies: 1412 | loose-envify "^1.1.0" 1413 | 1414 | semver@^7.3.7, semver@^7.3.8, semver@~7.5.4: 1415 | version "7.5.4" 1416 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 1417 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 1418 | dependencies: 1419 | lru-cache "^6.0.0" 1420 | 1421 | shebang-command@^2.0.0: 1422 | version "2.0.0" 1423 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1424 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1425 | dependencies: 1426 | shebang-regex "^3.0.0" 1427 | 1428 | shebang-regex@^3.0.0: 1429 | version "3.0.0" 1430 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1431 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1432 | 1433 | slash@^3.0.0: 1434 | version "3.0.0" 1435 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1436 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1437 | 1438 | source-map-js@^1.0.2: 1439 | version "1.0.2" 1440 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1441 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1442 | 1443 | source-map@~0.6.1: 1444 | version "0.6.1" 1445 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1446 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1447 | 1448 | sprintf-js@~1.0.2: 1449 | version "1.0.3" 1450 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1451 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 1452 | 1453 | string-argv@~0.3.1: 1454 | version "0.3.2" 1455 | resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" 1456 | integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== 1457 | 1458 | strip-ansi@^6.0.1: 1459 | version "6.0.1" 1460 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1461 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1462 | dependencies: 1463 | ansi-regex "^5.0.1" 1464 | 1465 | strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: 1466 | version "3.1.1" 1467 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1468 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1469 | 1470 | supports-color@^7.1.0: 1471 | version "7.2.0" 1472 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1473 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1474 | dependencies: 1475 | has-flag "^4.0.0" 1476 | 1477 | supports-preserve-symlinks-flag@^1.0.0: 1478 | version "1.0.0" 1479 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1480 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1481 | 1482 | talkjs@^0.21.0: 1483 | version "0.21.0" 1484 | resolved "https://registry.yarnpkg.com/talkjs/-/talkjs-0.21.0.tgz#8dd2ee2c46b8f203c6264b7d96745421dd594f64" 1485 | integrity sha512-k1fAyYKLKbNVlchsUnaiLgKVF9J6eynalY5AvxhdKpa0wSssIBVsilcbgPoAkSMWFNNCnPHU75jUfP9tdFPlag== 1486 | 1487 | text-table@^0.2.0: 1488 | version "0.2.0" 1489 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1490 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1491 | 1492 | to-regex-range@^5.0.1: 1493 | version "5.0.1" 1494 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1495 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1496 | dependencies: 1497 | is-number "^7.0.0" 1498 | 1499 | tslib@^1.8.1: 1500 | version "1.14.1" 1501 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1502 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1503 | 1504 | tsutils@^3.21.0: 1505 | version "3.21.0" 1506 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 1507 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 1508 | dependencies: 1509 | tslib "^1.8.1" 1510 | 1511 | type-check@^0.4.0, type-check@~0.4.0: 1512 | version "0.4.0" 1513 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1514 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1515 | dependencies: 1516 | prelude-ls "^1.2.1" 1517 | 1518 | type-fest@^0.20.2: 1519 | version "0.20.2" 1520 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1521 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1522 | 1523 | typescript@^5.0.2: 1524 | version "5.1.6" 1525 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" 1526 | integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== 1527 | 1528 | typescript@~5.0.4: 1529 | version "5.0.4" 1530 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" 1531 | integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== 1532 | 1533 | universalify@^0.1.0: 1534 | version "0.1.2" 1535 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1536 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 1537 | 1538 | uri-js@^4.2.2: 1539 | version "4.4.1" 1540 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1541 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1542 | dependencies: 1543 | punycode "^2.1.0" 1544 | 1545 | validator@^13.7.0: 1546 | version "13.11.0" 1547 | resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" 1548 | integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== 1549 | 1550 | vite-plugin-dts@^3.5.1: 1551 | version "3.5.1" 1552 | resolved "https://registry.yarnpkg.com/vite-plugin-dts/-/vite-plugin-dts-3.5.1.tgz#58c225f7ecabff2ed76027e003e1ec8ca964a078" 1553 | integrity sha512-wrrIvRTWq9xL0HKOUvJyJ+wivEoLsZ2GU2I2000v5tAAUtu9gE+5OUmUJ9yNkmyYz3tSPedkkiXHeb5jnnSXhg== 1554 | dependencies: 1555 | "@microsoft/api-extractor" "^7.36.3" 1556 | "@rollup/pluginutils" "^5.0.2" 1557 | "@vue/language-core" "^1.8.8" 1558 | debug "^4.3.4" 1559 | kolorist "^1.8.0" 1560 | vue-tsc "^1.8.8" 1561 | 1562 | vite@^4.4.0: 1563 | version "4.4.4" 1564 | resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.4.tgz#b76e6049c0e080cb54e735ad2d18287753752118" 1565 | integrity sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg== 1566 | dependencies: 1567 | esbuild "^0.18.10" 1568 | postcss "^8.4.25" 1569 | rollup "^3.25.2" 1570 | optionalDependencies: 1571 | fsevents "~2.3.2" 1572 | 1573 | vue-template-compiler@^2.7.14: 1574 | version "2.7.14" 1575 | resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz#4545b7dfb88090744c1577ae5ac3f964e61634b1" 1576 | integrity sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ== 1577 | dependencies: 1578 | de-indent "^1.0.2" 1579 | he "^1.2.0" 1580 | 1581 | vue-tsc@^1.8.8: 1582 | version "1.8.8" 1583 | resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.8.tgz#67317693eb2ef6747e89e6d834eeb6d2deb8871d" 1584 | integrity sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ== 1585 | dependencies: 1586 | "@vue/language-core" "1.8.8" 1587 | "@vue/typescript" "1.8.8" 1588 | semver "^7.3.8" 1589 | 1590 | which@^2.0.1: 1591 | version "2.0.2" 1592 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1593 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1594 | dependencies: 1595 | isexe "^2.0.0" 1596 | 1597 | wrappy@1: 1598 | version "1.0.2" 1599 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1600 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1601 | 1602 | yallist@^4.0.0: 1603 | version "4.0.0" 1604 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1605 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1606 | 1607 | yocto-queue@^0.1.0: 1608 | version "0.1.0" 1609 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1610 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1611 | 1612 | z-schema@~5.0.2: 1613 | version "5.0.6" 1614 | resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.6.tgz#46d6a687b15e4a4369e18d6cb1c7b8618fc256c5" 1615 | integrity sha512-+XR1GhnWklYdfr8YaZv/iu+vY+ux7V5DS5zH1DQf6bO5ufrt/5cgNhVO5qyhsjFXvsqQb/f08DWE9b6uPscyAg== 1616 | dependencies: 1617 | lodash.get "^4.4.2" 1618 | lodash.isequal "^4.5.0" 1619 | validator "^13.7.0" 1620 | optionalDependencies: 1621 | commander "^10.0.0" 1622 | --------------------------------------------------------------------------------