├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── package.json ├── pnpm-lock.yaml ├── src ├── composable.ts ├── index.ts ├── mapping.ts ├── models.ts ├── plugin.ts ├── service.ts ├── symbols.ts └── ts-helpers.ts ├── test └── service.ts ├── tsconfig.build.json └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /node_modules 3 | .eslintrc.js -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | const { resolve } = require("path"); 2 | module.exports = { 3 | // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy 4 | // This option interrupts the configuration hierarchy at this file 5 | // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) 6 | root: true, 7 | 8 | env: { 9 | browser: true, 10 | }, 11 | 12 | // Rules order is important, please avoid shuffling them 13 | extends: ["coralloy"], 14 | }; 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": ["signalr"] 3 | } 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2021 Dreamonkey S.r.l. 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 13 | all 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 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vue-signalr 2 | 3 | A Vue3 plugin which wraps SignalR and provider stricter typings. 4 | 5 | ## Installation 6 | 7 | Install this package and SignalR peer dependency 8 | 9 | `$ yarn add @dreamonkey/vue-signalr @microsoft/signalr` 10 | 11 | Apply the plugin providing a `HubConnection` instance 12 | 13 | ```ts 14 | import { VueSignalR } from "@dreamonkey/vue-signalr"; 15 | import { HubConnectionBuilder } from "@microsoft/signalr"; 16 | import { createApp } from "vue"; 17 | import App from "./App.vue"; 18 | 19 | // Create your connection 20 | // See https://docs.microsoft.com/en-us/javascript/api/@microsoft/signalr/hubconnectionbuilder 21 | const connection = new HubConnectionBuilder() 22 | .withUrl("http://localhost:5000/signalr") 23 | .build(); 24 | 25 | createApp(App).use(VueSignalR, { connection }).mount("#app"); 26 | ``` 27 | 28 | ## Usage 29 | 30 | ```ts 31 | import { useSignalR } from "@dreamonkey/vue-signalr"; 32 | import { inject } from "vue"; 33 | 34 | export default { 35 | setup() { 36 | const signalr = useSignalR(); 37 | 38 | signalr.invoke("SendMessage", { message }); 39 | 40 | signalr.on("MessageReceived", ({ message }) => { 41 | /* do stuff */ 42 | }); 43 | }, 44 | }; 45 | ``` 46 | 47 | While SignalR doesn't make a distinction between client side and server side methods, into this package we refer the formers as "Events" and the latters as "Commands". 48 | 49 | Commands can be sent using `signalr.invoke()`, while events can be enabled or disabled using `signalr.on()` and `signalr.off()` 50 | 51 | 52 | 53 | #### Unsubscribing 54 | 55 | All Event you create a listener for using `signalr.on()` must be unsubscribed when not used anymore, to avoid memory leaks and erratic code behavior. 56 | If you call `signalr.on()` within a Vue component `setup` scope, the listener will be unsubscribed automatically into `onBeforeUnmount` hook. 57 | This behavior can be disabled via `autoOffInsideComponentScope` plugin option. 58 | 59 | If you disabled it, or you start a listener outside a component scope, you'll need to unsubscribe it manually using `signal.off()` and providing **the same listener function reference** to it. 60 | Not providing it will remove all listeners from the provided Event 61 | 62 | ```ts 63 | const messageReceivedCallback = (message) => console.log(message.prop); 64 | 65 | signalr.on("MessageReceived", messageReceivedCallback); 66 | 67 | signalr.off("MessageReceived", messageReceivedCallback); // Remove this listener 68 | signalr.off("MessageReceived"); // Remove all listeners on `MessageReceived` event 69 | ``` 70 | 71 | ### Type-safety 72 | 73 | Command and Events names and payloads are registered via type augmentation of dedicated interfaces (`SignalREvents` and `SignalRCommands`) into `@dreamonkey/vue-signalr` scope. 74 | These types are later used to provide you autocompletion. 75 | 76 | **The package works with plain strings too, you're not required to register Commands/Events typings** 77 | 78 | ```ts 79 | import "@dreamonkey/vue-signalr"; 80 | 81 | interface MessageReceivedPayload { 82 | message: string; 83 | } 84 | 85 | interface SendMessagePayload { 86 | message: string; 87 | } 88 | 89 | declare module "@dreamonkey/vue-signalr" { 90 | interface SignalREvents { 91 | // Define an event, its payload is a single parameter of type `MessageReceivedPayload` 92 | MessageReceived: MessageReceivedPayload; 93 | // Define an event, its payload is composed by 0 or more parameters of type `MessageReceivedPayload` 94 | MultipleMessagesReceived: MessageReceivedPayload[]; 95 | // Define an event, its payload is composed by exactly 2 parameters of type `MessageReceivedPayload` 96 | TwoMessagesReceived: [MessageReceivedPayload, MessageReceivedPayload]; 97 | // Define an event with no payload 98 | MainTopicJoined: false; 99 | } 100 | 101 | interface SignalRCommands { 102 | // Define a command and its payload 103 | SendMessage: SendMessagePayload; 104 | // Define a command with no payload 105 | JoinMainTopic: false; 106 | } 107 | } 108 | ``` 109 | 110 | ### Methods remapping 111 | 112 | In case you need to remap a Command or Event name, you could do so using `remapMethod` or `remapMethods` helpers 113 | 114 | ```ts 115 | import { remapMethod } from "@dreamonkey/vue-signalr"; 116 | 117 | remapMethod("receiveMessageWithStrangeMethodName", "MessageReceived"); 118 | 119 | remapMethods([ 120 | ["legacyTopic2Joined", "MainTopicJoined"], 121 | ["createNewMessage", "SendMessage"], 122 | ]); 123 | ``` 124 | 125 | ### Error Handling 126 | 127 | You can react to connection/reconnection errors providing a `failFn` option into the plugin options 128 | 129 | ```ts 130 | import { VueSignalR } from "@dreamonkey/vue-signalr"; 131 | import { createApp } from "vue"; 132 | import App from "./App.vue"; 133 | 134 | const connection = new HubConnectionBuilder() 135 | .withUrl("http://localhost:5000/signalr") 136 | .build(); 137 | 138 | createApp(App) 139 | .use(VueSignalR, { 140 | connection, 141 | failFn: () => { 142 | /* do stuff */ 143 | }, 144 | }) 145 | .mount("#app"); 146 | ``` 147 | 148 | ### Possible next steps 149 | 150 | - take inspiration from other helpers into https://socket.io/docs/v4/listening-to-events/ 151 | - take inspiration from other features at the end of https://socket.io/docs/v4/how-it-works/ 152 | - add rooms join/leave abstractions (?) 153 | 154 | ### Credits 155 | 156 | This package has been inspired by https://github.com/quangdaon/vue-signalr 157 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@dreamonkey/vue-signalr", 3 | "version": "1.2.0", 4 | "description": "SignalR plugin for Vue 3", 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com/dreamonkey/vue-signalr.git" 8 | }, 9 | "homepage": "https://github.com/dreamonkey/vue-signalr/blob/master/README.md", 10 | "bugs": "https://github.com/dreamonkey/vue-signalr/issues", 11 | "main": "dist/index.js", 12 | "types": "dist/index.d.ts", 13 | "files": [ 14 | "dist" 15 | ], 16 | "scripts": { 17 | "lint": "eslint --ext .js,.ts,.vue ./ --fix --report-unused-disable-directives", 18 | "format": "prettier --write \"**/*.{json,md,graphql,vue,js,ts}\" --ignore-path .gitignore", 19 | "build": "rimraf dist && tsc --declaration --project tsconfig.build.json", 20 | "deploy": "pnpm build && pnpm publish --tag latest" 21 | }, 22 | "keywords": [ 23 | "vue", 24 | "signalr", 25 | "websocket" 26 | ], 27 | "author": "Paolo Caleffi (https://github.com/IlCallo)", 28 | "license": "MIT", 29 | "peerDependencies": { 30 | "@microsoft/signalr": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", 31 | "vue": "^3.0.0" 32 | }, 33 | "devDependencies": { 34 | "@babel/types": "^7.25.6", 35 | "@microsoft/signalr": "^8.0.7", 36 | "@types/node": "^20.0.0", 37 | "eslint": "^8.57.0", 38 | "eslint-config-coralloy": "^0.4.0", 39 | "prettier": "^3.3.3", 40 | "rimraf": "^6.0.1", 41 | "typescript": "~5.5.0", 42 | "vue": "^3.5.4" 43 | }, 44 | "publishConfig": { 45 | "access": "public" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@babel/types': 12 | specifier: ^7.25.6 13 | version: 7.25.6 14 | '@microsoft/signalr': 15 | specifier: ^8.0.7 16 | version: 8.0.7 17 | '@types/node': 18 | specifier: ^20.0.0 19 | version: 20.16.5 20 | eslint: 21 | specifier: ^8.57.0 22 | version: 8.57.0 23 | eslint-config-coralloy: 24 | specifier: ^0.4.0 25 | version: 0.4.0(eslint@8.57.0)(prettier@3.3.3)(typescript@5.5.4) 26 | prettier: 27 | specifier: ^3.3.3 28 | version: 3.3.3 29 | rimraf: 30 | specifier: ^6.0.1 31 | version: 6.0.1 32 | typescript: 33 | specifier: ~5.5.0 34 | version: 5.5.4 35 | vue: 36 | specifier: ^3.5.4 37 | version: 3.5.4(typescript@5.5.4) 38 | 39 | packages: 40 | 41 | '@babel/helper-string-parser@7.24.8': 42 | resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} 43 | engines: {node: '>=6.9.0'} 44 | 45 | '@babel/helper-validator-identifier@7.24.7': 46 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} 47 | engines: {node: '>=6.9.0'} 48 | 49 | '@babel/parser@7.25.6': 50 | resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} 51 | engines: {node: '>=6.0.0'} 52 | hasBin: true 53 | 54 | '@babel/types@7.25.6': 55 | resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} 56 | engines: {node: '>=6.9.0'} 57 | 58 | '@eslint-community/eslint-utils@4.4.0': 59 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 60 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 61 | peerDependencies: 62 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 63 | 64 | '@eslint-community/regexpp@4.11.0': 65 | resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} 66 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 67 | 68 | '@eslint/eslintrc@2.1.4': 69 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 70 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 71 | 72 | '@eslint/js@8.57.0': 73 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 74 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 75 | 76 | '@humanwhocodes/config-array@0.11.14': 77 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 78 | engines: {node: '>=10.10.0'} 79 | deprecated: Use @eslint/config-array instead 80 | 81 | '@humanwhocodes/module-importer@1.0.1': 82 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 83 | engines: {node: '>=12.22'} 84 | 85 | '@humanwhocodes/object-schema@2.0.3': 86 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 87 | deprecated: Use @eslint/object-schema instead 88 | 89 | '@isaacs/cliui@8.0.2': 90 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 91 | engines: {node: '>=12'} 92 | 93 | '@jridgewell/sourcemap-codec@1.5.0': 94 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 95 | 96 | '@microsoft/signalr@8.0.7': 97 | resolution: {integrity: sha512-PHcdMv8v5hJlBkRHAuKG5trGViQEkPYee36LnJQx4xHOQ5LL4X0nEWIxOp5cCtZ7tu+30quz5V3k0b1YNuc6lw==} 98 | 99 | '@nodelib/fs.scandir@2.1.5': 100 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 101 | engines: {node: '>= 8'} 102 | 103 | '@nodelib/fs.stat@2.0.5': 104 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 105 | engines: {node: '>= 8'} 106 | 107 | '@nodelib/fs.walk@1.2.8': 108 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 109 | engines: {node: '>= 8'} 110 | 111 | '@nolyfill/is-core-module@1.0.39': 112 | resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} 113 | engines: {node: '>=12.4.0'} 114 | 115 | '@pkgjs/parseargs@0.11.0': 116 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 117 | engines: {node: '>=14'} 118 | 119 | '@types/node@20.16.5': 120 | resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==} 121 | 122 | '@typescript-eslint/eslint-plugin@8.5.0': 123 | resolution: {integrity: sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==} 124 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 125 | peerDependencies: 126 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 127 | eslint: ^8.57.0 || ^9.0.0 128 | typescript: '*' 129 | peerDependenciesMeta: 130 | typescript: 131 | optional: true 132 | 133 | '@typescript-eslint/parser@8.5.0': 134 | resolution: {integrity: sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==} 135 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 136 | peerDependencies: 137 | eslint: ^8.57.0 || ^9.0.0 138 | typescript: '*' 139 | peerDependenciesMeta: 140 | typescript: 141 | optional: true 142 | 143 | '@typescript-eslint/scope-manager@7.18.0': 144 | resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} 145 | engines: {node: ^18.18.0 || >=20.0.0} 146 | 147 | '@typescript-eslint/scope-manager@8.5.0': 148 | resolution: {integrity: sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==} 149 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 150 | 151 | '@typescript-eslint/type-utils@8.5.0': 152 | resolution: {integrity: sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==} 153 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 154 | peerDependencies: 155 | typescript: '*' 156 | peerDependenciesMeta: 157 | typescript: 158 | optional: true 159 | 160 | '@typescript-eslint/types@7.18.0': 161 | resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} 162 | engines: {node: ^18.18.0 || >=20.0.0} 163 | 164 | '@typescript-eslint/types@8.5.0': 165 | resolution: {integrity: sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==} 166 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 167 | 168 | '@typescript-eslint/typescript-estree@7.18.0': 169 | resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} 170 | engines: {node: ^18.18.0 || >=20.0.0} 171 | peerDependencies: 172 | typescript: '*' 173 | peerDependenciesMeta: 174 | typescript: 175 | optional: true 176 | 177 | '@typescript-eslint/typescript-estree@8.5.0': 178 | resolution: {integrity: sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==} 179 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 180 | peerDependencies: 181 | typescript: '*' 182 | peerDependenciesMeta: 183 | typescript: 184 | optional: true 185 | 186 | '@typescript-eslint/utils@7.18.0': 187 | resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} 188 | engines: {node: ^18.18.0 || >=20.0.0} 189 | peerDependencies: 190 | eslint: ^8.56.0 191 | 192 | '@typescript-eslint/utils@8.5.0': 193 | resolution: {integrity: sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==} 194 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 195 | peerDependencies: 196 | eslint: ^8.57.0 || ^9.0.0 197 | 198 | '@typescript-eslint/visitor-keys@7.18.0': 199 | resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} 200 | engines: {node: ^18.18.0 || >=20.0.0} 201 | 202 | '@typescript-eslint/visitor-keys@8.5.0': 203 | resolution: {integrity: sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==} 204 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 205 | 206 | '@ungap/structured-clone@1.2.0': 207 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 208 | 209 | '@vue/compiler-core@3.5.4': 210 | resolution: {integrity: sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ==} 211 | 212 | '@vue/compiler-dom@3.5.4': 213 | resolution: {integrity: sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw==} 214 | 215 | '@vue/compiler-sfc@3.5.4': 216 | resolution: {integrity: sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ==} 217 | 218 | '@vue/compiler-ssr@3.5.4': 219 | resolution: {integrity: sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg==} 220 | 221 | '@vue/reactivity@3.5.4': 222 | resolution: {integrity: sha512-HKKbEuP7tYSGCq4e4nK6ZW6l5hyG66OUetefBp4budUyjvAYsnQDf+bgFzg2RAgnH0CInyqXwD9y47jwJEHrQw==} 223 | 224 | '@vue/runtime-core@3.5.4': 225 | resolution: {integrity: sha512-f3ek2sTA0AFu0n+w+kCtz567Euqqa3eHewvo4klwS7mWfSj/A+UmYTwsnUFo35KeyAFY60JgrCGvEBsu1n/3LA==} 226 | 227 | '@vue/runtime-dom@3.5.4': 228 | resolution: {integrity: sha512-ofyc0w6rbD5KtjhP1i9hGOKdxGpvmuB1jprP7Djlj0X7R5J/oLwuNuE98GJ8WW31Hu2VxQHtk/LYTAlW8xrJdw==} 229 | 230 | '@vue/server-renderer@3.5.4': 231 | resolution: {integrity: sha512-FbjV6DJLgKRetMYFBA1UXCroCiED/Ckr53/ba9wivyd7D/Xw9fpo0T6zXzCnxQwyvkyrL7y6plgYhWhNjGxY5g==} 232 | peerDependencies: 233 | vue: 3.5.4 234 | 235 | '@vue/shared@3.5.4': 236 | resolution: {integrity: sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==} 237 | 238 | abort-controller@3.0.0: 239 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 240 | engines: {node: '>=6.5'} 241 | 242 | acorn-jsx@5.3.2: 243 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 244 | peerDependencies: 245 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 246 | 247 | acorn@8.12.1: 248 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 249 | engines: {node: '>=0.4.0'} 250 | hasBin: true 251 | 252 | ajv@6.12.6: 253 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 254 | 255 | ansi-regex@5.0.1: 256 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 257 | engines: {node: '>=8'} 258 | 259 | ansi-regex@6.1.0: 260 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 261 | engines: {node: '>=12'} 262 | 263 | ansi-styles@4.3.0: 264 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 265 | engines: {node: '>=8'} 266 | 267 | ansi-styles@6.2.1: 268 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 269 | engines: {node: '>=12'} 270 | 271 | argparse@2.0.1: 272 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 273 | 274 | array-union@2.1.0: 275 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 276 | engines: {node: '>=8'} 277 | 278 | balanced-match@1.0.2: 279 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 280 | 281 | boolbase@1.0.0: 282 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 283 | 284 | brace-expansion@1.1.11: 285 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 286 | 287 | brace-expansion@2.0.1: 288 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 289 | 290 | braces@3.0.2: 291 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 292 | engines: {node: '>=8'} 293 | 294 | callsites@3.1.0: 295 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 296 | engines: {node: '>=6'} 297 | 298 | chalk@4.1.2: 299 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 300 | engines: {node: '>=10'} 301 | 302 | color-convert@2.0.1: 303 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 304 | engines: {node: '>=7.0.0'} 305 | 306 | color-name@1.1.4: 307 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 308 | 309 | concat-map@0.0.1: 310 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 311 | 312 | cross-spawn@7.0.3: 313 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 314 | engines: {node: '>= 8'} 315 | 316 | cssesc@3.0.0: 317 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 318 | engines: {node: '>=4'} 319 | hasBin: true 320 | 321 | csstype@3.1.3: 322 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 323 | 324 | debug@3.2.7: 325 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 326 | peerDependencies: 327 | supports-color: '*' 328 | peerDependenciesMeta: 329 | supports-color: 330 | optional: true 331 | 332 | debug@4.3.4: 333 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 334 | engines: {node: '>=6.0'} 335 | peerDependencies: 336 | supports-color: '*' 337 | peerDependenciesMeta: 338 | supports-color: 339 | optional: true 340 | 341 | debug@4.3.7: 342 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 343 | engines: {node: '>=6.0'} 344 | peerDependencies: 345 | supports-color: '*' 346 | peerDependenciesMeta: 347 | supports-color: 348 | optional: true 349 | 350 | deep-is@0.1.4: 351 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 352 | 353 | dir-glob@3.0.1: 354 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 355 | engines: {node: '>=8'} 356 | 357 | doctrine@3.0.0: 358 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 359 | engines: {node: '>=6.0.0'} 360 | 361 | eastasianwidth@0.2.0: 362 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 363 | 364 | emoji-regex@8.0.0: 365 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 366 | 367 | emoji-regex@9.2.2: 368 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 369 | 370 | enhanced-resolve@5.17.1: 371 | resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} 372 | engines: {node: '>=10.13.0'} 373 | 374 | entities@4.5.0: 375 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 376 | engines: {node: '>=0.12'} 377 | 378 | escape-string-regexp@4.0.0: 379 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 380 | engines: {node: '>=10'} 381 | 382 | eslint-config-coralloy@0.4.0: 383 | resolution: {integrity: sha512-nps546Cm+LxC3W1Ve0m6vvG9ERhi6TRgUMyv9HDzpvxZm7d81XMk40r341aIUz85yj8uXTmNyYnwTFcBot1Zhw==} 384 | peerDependencies: 385 | eslint: ^8.0.0 || ^9.0.0 386 | prettier: ^2.7.0 || ^3.0.0 387 | typescript: ^4.7.0 || ^5.0.0 388 | 389 | eslint-config-prettier@9.1.0: 390 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 391 | hasBin: true 392 | peerDependencies: 393 | eslint: '>=7.0.0' 394 | 395 | eslint-import-resolver-node@0.3.9: 396 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 397 | 398 | eslint-import-resolver-typescript@3.6.3: 399 | resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} 400 | engines: {node: ^14.18.0 || >=16.0.0} 401 | peerDependencies: 402 | eslint: '*' 403 | eslint-plugin-import: '*' 404 | eslint-plugin-import-x: '*' 405 | peerDependenciesMeta: 406 | eslint-plugin-import: 407 | optional: true 408 | eslint-plugin-import-x: 409 | optional: true 410 | 411 | eslint-module-utils@2.11.0: 412 | resolution: {integrity: sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==} 413 | engines: {node: '>=4'} 414 | peerDependencies: 415 | '@typescript-eslint/parser': '*' 416 | eslint: '*' 417 | eslint-import-resolver-node: '*' 418 | eslint-import-resolver-typescript: '*' 419 | eslint-import-resolver-webpack: '*' 420 | peerDependenciesMeta: 421 | '@typescript-eslint/parser': 422 | optional: true 423 | eslint: 424 | optional: true 425 | eslint-import-resolver-node: 426 | optional: true 427 | eslint-import-resolver-typescript: 428 | optional: true 429 | eslint-import-resolver-webpack: 430 | optional: true 431 | 432 | eslint-plugin-import-x@3.1.0: 433 | resolution: {integrity: sha512-/UbPA+bYY7nIxcjL3kpcDY3UNdoLHFhyBFzHox2M0ypcUoueTn6woZUUmzzi5et/dXChksasYYFeKE2wshOrhg==} 434 | engines: {node: '>=16'} 435 | peerDependencies: 436 | eslint: ^8.56.0 || ^9.0.0-0 437 | 438 | eslint-plugin-vue@9.28.0: 439 | resolution: {integrity: sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==} 440 | engines: {node: ^14.17.0 || >=16.0.0} 441 | peerDependencies: 442 | eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 443 | 444 | eslint-scope@7.2.2: 445 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 446 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 447 | 448 | eslint-visitor-keys@3.4.0: 449 | resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} 450 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 451 | 452 | eslint-visitor-keys@3.4.3: 453 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 454 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 455 | 456 | eslint@8.57.0: 457 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} 458 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 459 | hasBin: true 460 | 461 | espree@9.6.1: 462 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 463 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 464 | 465 | esquery@1.5.0: 466 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 467 | engines: {node: '>=0.10'} 468 | 469 | esrecurse@4.3.0: 470 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 471 | engines: {node: '>=4.0'} 472 | 473 | estraverse@5.3.0: 474 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 475 | engines: {node: '>=4.0'} 476 | 477 | estree-walker@2.0.2: 478 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 479 | 480 | esutils@2.0.3: 481 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 482 | engines: {node: '>=0.10.0'} 483 | 484 | event-target-shim@5.0.1: 485 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 486 | engines: {node: '>=6'} 487 | 488 | eventsource@2.0.2: 489 | resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} 490 | engines: {node: '>=12.0.0'} 491 | 492 | fast-deep-equal@3.1.3: 493 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 494 | 495 | fast-glob@3.3.2: 496 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 497 | engines: {node: '>=8.6.0'} 498 | 499 | fast-json-stable-stringify@2.1.0: 500 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 501 | 502 | fast-levenshtein@2.0.6: 503 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 504 | 505 | fastq@1.13.0: 506 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 507 | 508 | fetch-cookie@2.1.0: 509 | resolution: {integrity: sha512-39+cZRbWfbibmj22R2Jy6dmTbAWC+oqun1f1FzQaNurkPDUP4C38jpeZbiXCR88RKRVDp8UcDrbFXkNhN+NjYg==} 510 | 511 | file-entry-cache@6.0.1: 512 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 513 | engines: {node: ^10.12.0 || >=12.0.0} 514 | 515 | fill-range@7.0.1: 516 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 517 | engines: {node: '>=8'} 518 | 519 | find-up@5.0.0: 520 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 521 | engines: {node: '>=10'} 522 | 523 | flat-cache@3.2.0: 524 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 525 | engines: {node: ^10.12.0 || >=12.0.0} 526 | 527 | flatted@3.3.1: 528 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 529 | 530 | foreground-child@3.3.0: 531 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 532 | engines: {node: '>=14'} 533 | 534 | fs.realpath@1.0.0: 535 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 536 | 537 | function-bind@1.1.2: 538 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 539 | 540 | get-tsconfig@4.8.0: 541 | resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} 542 | 543 | glob-parent@5.1.2: 544 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 545 | engines: {node: '>= 6'} 546 | 547 | glob-parent@6.0.2: 548 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 549 | engines: {node: '>=10.13.0'} 550 | 551 | glob@11.0.0: 552 | resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} 553 | engines: {node: 20 || >=22} 554 | hasBin: true 555 | 556 | glob@7.2.3: 557 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 558 | deprecated: Glob versions prior to v9 are no longer supported 559 | 560 | globals@13.24.0: 561 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 562 | engines: {node: '>=8'} 563 | 564 | globby@11.1.0: 565 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 566 | engines: {node: '>=10'} 567 | 568 | graceful-fs@4.2.11: 569 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 570 | 571 | graphemer@1.4.0: 572 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 573 | 574 | has-flag@4.0.0: 575 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 576 | engines: {node: '>=8'} 577 | 578 | hasown@2.0.2: 579 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 580 | engines: {node: '>= 0.4'} 581 | 582 | ignore@5.3.2: 583 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 584 | engines: {node: '>= 4'} 585 | 586 | import-fresh@3.3.0: 587 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 588 | engines: {node: '>=6'} 589 | 590 | imurmurhash@0.1.4: 591 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 592 | engines: {node: '>=0.8.19'} 593 | 594 | inflight@1.0.6: 595 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 596 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 597 | 598 | inherits@2.0.4: 599 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 600 | 601 | is-bun-module@1.2.1: 602 | resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==} 603 | 604 | is-core-module@2.15.1: 605 | resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} 606 | engines: {node: '>= 0.4'} 607 | 608 | is-extglob@2.1.1: 609 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 610 | engines: {node: '>=0.10.0'} 611 | 612 | is-fullwidth-code-point@3.0.0: 613 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 614 | engines: {node: '>=8'} 615 | 616 | is-glob@4.0.3: 617 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 618 | engines: {node: '>=0.10.0'} 619 | 620 | is-number@7.0.0: 621 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 622 | engines: {node: '>=0.12.0'} 623 | 624 | is-path-inside@3.0.3: 625 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 626 | engines: {node: '>=8'} 627 | 628 | isexe@2.0.0: 629 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 630 | 631 | jackspeak@4.0.1: 632 | resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} 633 | engines: {node: 20 || >=22} 634 | 635 | js-yaml@4.1.0: 636 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 637 | hasBin: true 638 | 639 | json-buffer@3.0.1: 640 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 641 | 642 | json-schema-traverse@0.4.1: 643 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 644 | 645 | json-stable-stringify-without-jsonify@1.0.1: 646 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 647 | 648 | keyv@4.5.4: 649 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 650 | 651 | levn@0.4.1: 652 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 653 | engines: {node: '>= 0.8.0'} 654 | 655 | locate-path@6.0.0: 656 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 657 | engines: {node: '>=10'} 658 | 659 | lodash.merge@4.6.2: 660 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 661 | 662 | lodash@4.17.21: 663 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 664 | 665 | lru-cache@11.0.1: 666 | resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} 667 | engines: {node: 20 || >=22} 668 | 669 | magic-string@0.30.11: 670 | resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} 671 | 672 | merge2@1.4.1: 673 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 674 | engines: {node: '>= 8'} 675 | 676 | micromatch@4.0.4: 677 | resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 678 | engines: {node: '>=8.6'} 679 | 680 | minimatch@10.0.1: 681 | resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 682 | engines: {node: 20 || >=22} 683 | 684 | minimatch@3.1.2: 685 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 686 | 687 | minimatch@9.0.5: 688 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 689 | engines: {node: '>=16 || 14 >=14.17'} 690 | 691 | minipass@7.1.2: 692 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 693 | engines: {node: '>=16 || 14 >=14.17'} 694 | 695 | ms@2.1.2: 696 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 697 | 698 | ms@2.1.3: 699 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 700 | 701 | nanoid@3.3.7: 702 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 703 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 704 | hasBin: true 705 | 706 | natural-compare@1.4.0: 707 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 708 | 709 | node-fetch@2.6.9: 710 | resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} 711 | engines: {node: 4.x || >=6.0.0} 712 | peerDependencies: 713 | encoding: ^0.1.0 714 | peerDependenciesMeta: 715 | encoding: 716 | optional: true 717 | 718 | nth-check@2.1.1: 719 | resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 720 | 721 | once@1.4.0: 722 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 723 | 724 | optionator@0.9.4: 725 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 726 | engines: {node: '>= 0.8.0'} 727 | 728 | p-limit@3.1.0: 729 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 730 | engines: {node: '>=10'} 731 | 732 | p-locate@5.0.0: 733 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 734 | engines: {node: '>=10'} 735 | 736 | package-json-from-dist@1.0.0: 737 | resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} 738 | 739 | parent-module@1.0.1: 740 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 741 | engines: {node: '>=6'} 742 | 743 | path-exists@4.0.0: 744 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 745 | engines: {node: '>=8'} 746 | 747 | path-is-absolute@1.0.1: 748 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 749 | engines: {node: '>=0.10.0'} 750 | 751 | path-key@3.1.1: 752 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 753 | engines: {node: '>=8'} 754 | 755 | path-parse@1.0.7: 756 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 757 | 758 | path-scurry@2.0.0: 759 | resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 760 | engines: {node: 20 || >=22} 761 | 762 | path-type@4.0.0: 763 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 764 | engines: {node: '>=8'} 765 | 766 | picocolors@1.1.0: 767 | resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} 768 | 769 | picomatch@2.3.1: 770 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 771 | engines: {node: '>=8.6'} 772 | 773 | postcss-selector-parser@6.1.2: 774 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 775 | engines: {node: '>=4'} 776 | 777 | postcss@8.4.45: 778 | resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} 779 | engines: {node: ^10 || ^12 || >=14} 780 | 781 | prelude-ls@1.2.1: 782 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 783 | engines: {node: '>= 0.8.0'} 784 | 785 | prettier@3.3.3: 786 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 787 | engines: {node: '>=14'} 788 | hasBin: true 789 | 790 | psl@1.8.0: 791 | resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} 792 | 793 | punycode@2.1.1: 794 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 795 | engines: {node: '>=6'} 796 | 797 | querystringify@2.2.0: 798 | resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} 799 | 800 | queue-microtask@1.2.3: 801 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 802 | 803 | requires-port@1.0.0: 804 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 805 | 806 | resolve-from@4.0.0: 807 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 808 | engines: {node: '>=4'} 809 | 810 | resolve-pkg-maps@1.0.0: 811 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 812 | 813 | resolve@1.22.8: 814 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 815 | hasBin: true 816 | 817 | reusify@1.0.4: 818 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 819 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 820 | 821 | rimraf@3.0.2: 822 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 823 | deprecated: Rimraf versions prior to v4 are no longer supported 824 | hasBin: true 825 | 826 | rimraf@6.0.1: 827 | resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} 828 | engines: {node: 20 || >=22} 829 | hasBin: true 830 | 831 | run-parallel@1.2.0: 832 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 833 | 834 | semver@7.6.3: 835 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 836 | engines: {node: '>=10'} 837 | hasBin: true 838 | 839 | set-cookie-parser@2.6.0: 840 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 841 | 842 | shebang-command@2.0.0: 843 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 844 | engines: {node: '>=8'} 845 | 846 | shebang-regex@3.0.0: 847 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 848 | engines: {node: '>=8'} 849 | 850 | signal-exit@4.1.0: 851 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 852 | engines: {node: '>=14'} 853 | 854 | slash@3.0.0: 855 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 856 | engines: {node: '>=8'} 857 | 858 | source-map-js@1.2.1: 859 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 860 | engines: {node: '>=0.10.0'} 861 | 862 | stable-hash@0.0.4: 863 | resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} 864 | 865 | string-width@4.2.3: 866 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 867 | engines: {node: '>=8'} 868 | 869 | string-width@5.1.2: 870 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 871 | engines: {node: '>=12'} 872 | 873 | strip-ansi@6.0.1: 874 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 875 | engines: {node: '>=8'} 876 | 877 | strip-ansi@7.1.0: 878 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 879 | engines: {node: '>=12'} 880 | 881 | strip-json-comments@3.1.1: 882 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 883 | engines: {node: '>=8'} 884 | 885 | supports-color@7.2.0: 886 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 887 | engines: {node: '>=8'} 888 | 889 | supports-preserve-symlinks-flag@1.0.0: 890 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 891 | engines: {node: '>= 0.4'} 892 | 893 | tapable@2.2.1: 894 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 895 | engines: {node: '>=6'} 896 | 897 | text-table@0.2.0: 898 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 899 | 900 | to-fast-properties@2.0.0: 901 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 902 | engines: {node: '>=4'} 903 | 904 | to-regex-range@5.0.1: 905 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 906 | engines: {node: '>=8.0'} 907 | 908 | tough-cookie@4.1.2: 909 | resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} 910 | engines: {node: '>=6'} 911 | 912 | tr46@0.0.3: 913 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 914 | 915 | ts-api-utils@1.3.0: 916 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 917 | engines: {node: '>=16'} 918 | peerDependencies: 919 | typescript: '>=4.2.0' 920 | 921 | tslib@2.7.0: 922 | resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} 923 | 924 | type-check@0.4.0: 925 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 926 | engines: {node: '>= 0.8.0'} 927 | 928 | type-fest@0.20.2: 929 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 930 | engines: {node: '>=10'} 931 | 932 | typescript@5.5.4: 933 | resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} 934 | engines: {node: '>=14.17'} 935 | hasBin: true 936 | 937 | undici-types@6.19.8: 938 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 939 | 940 | universalify@0.2.0: 941 | resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} 942 | engines: {node: '>= 4.0.0'} 943 | 944 | uri-js@4.4.1: 945 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 946 | 947 | url-parse@1.5.4: 948 | resolution: {integrity: sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==} 949 | 950 | util-deprecate@1.0.2: 951 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 952 | 953 | vue-eslint-parser@9.4.3: 954 | resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} 955 | engines: {node: ^14.17.0 || >=16.0.0} 956 | peerDependencies: 957 | eslint: '>=6.0.0' 958 | 959 | vue@3.5.4: 960 | resolution: {integrity: sha512-3yAj2gkmiY+i7+22A1PWM+kjOVXjU74UPINcTiN7grIVPyFFI0lpGwHlV/4xydDmobaBn7/xmi+YG8HeSlCTcg==} 961 | peerDependencies: 962 | typescript: '*' 963 | peerDependenciesMeta: 964 | typescript: 965 | optional: true 966 | 967 | webidl-conversions@3.0.1: 968 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 969 | 970 | whatwg-url@5.0.0: 971 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 972 | 973 | which@2.0.2: 974 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 975 | engines: {node: '>= 8'} 976 | hasBin: true 977 | 978 | word-wrap@1.2.5: 979 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 980 | engines: {node: '>=0.10.0'} 981 | 982 | wrap-ansi@7.0.0: 983 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 984 | engines: {node: '>=10'} 985 | 986 | wrap-ansi@8.1.0: 987 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 988 | engines: {node: '>=12'} 989 | 990 | wrappy@1.0.2: 991 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 992 | 993 | ws@7.5.9: 994 | resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} 995 | engines: {node: '>=8.3.0'} 996 | peerDependencies: 997 | bufferutil: ^4.0.1 998 | utf-8-validate: ^5.0.2 999 | peerDependenciesMeta: 1000 | bufferutil: 1001 | optional: true 1002 | utf-8-validate: 1003 | optional: true 1004 | 1005 | xml-name-validator@4.0.0: 1006 | resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} 1007 | engines: {node: '>=12'} 1008 | 1009 | yocto-queue@0.1.0: 1010 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1011 | engines: {node: '>=10'} 1012 | 1013 | snapshots: 1014 | 1015 | '@babel/helper-string-parser@7.24.8': {} 1016 | 1017 | '@babel/helper-validator-identifier@7.24.7': {} 1018 | 1019 | '@babel/parser@7.25.6': 1020 | dependencies: 1021 | '@babel/types': 7.25.6 1022 | 1023 | '@babel/types@7.25.6': 1024 | dependencies: 1025 | '@babel/helper-string-parser': 7.24.8 1026 | '@babel/helper-validator-identifier': 7.24.7 1027 | to-fast-properties: 2.0.0 1028 | 1029 | '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': 1030 | dependencies: 1031 | eslint: 8.57.0 1032 | eslint-visitor-keys: 3.4.0 1033 | 1034 | '@eslint-community/regexpp@4.11.0': {} 1035 | 1036 | '@eslint/eslintrc@2.1.4': 1037 | dependencies: 1038 | ajv: 6.12.6 1039 | debug: 4.3.7 1040 | espree: 9.6.1 1041 | globals: 13.24.0 1042 | ignore: 5.3.2 1043 | import-fresh: 3.3.0 1044 | js-yaml: 4.1.0 1045 | minimatch: 3.1.2 1046 | strip-json-comments: 3.1.1 1047 | transitivePeerDependencies: 1048 | - supports-color 1049 | 1050 | '@eslint/js@8.57.0': {} 1051 | 1052 | '@humanwhocodes/config-array@0.11.14': 1053 | dependencies: 1054 | '@humanwhocodes/object-schema': 2.0.3 1055 | debug: 4.3.7 1056 | minimatch: 3.1.2 1057 | transitivePeerDependencies: 1058 | - supports-color 1059 | 1060 | '@humanwhocodes/module-importer@1.0.1': {} 1061 | 1062 | '@humanwhocodes/object-schema@2.0.3': {} 1063 | 1064 | '@isaacs/cliui@8.0.2': 1065 | dependencies: 1066 | string-width: 5.1.2 1067 | string-width-cjs: string-width@4.2.3 1068 | strip-ansi: 7.1.0 1069 | strip-ansi-cjs: strip-ansi@6.0.1 1070 | wrap-ansi: 8.1.0 1071 | wrap-ansi-cjs: wrap-ansi@7.0.0 1072 | 1073 | '@jridgewell/sourcemap-codec@1.5.0': {} 1074 | 1075 | '@microsoft/signalr@8.0.7': 1076 | dependencies: 1077 | abort-controller: 3.0.0 1078 | eventsource: 2.0.2 1079 | fetch-cookie: 2.1.0 1080 | node-fetch: 2.6.9 1081 | ws: 7.5.9 1082 | transitivePeerDependencies: 1083 | - bufferutil 1084 | - encoding 1085 | - utf-8-validate 1086 | 1087 | '@nodelib/fs.scandir@2.1.5': 1088 | dependencies: 1089 | '@nodelib/fs.stat': 2.0.5 1090 | run-parallel: 1.2.0 1091 | 1092 | '@nodelib/fs.stat@2.0.5': {} 1093 | 1094 | '@nodelib/fs.walk@1.2.8': 1095 | dependencies: 1096 | '@nodelib/fs.scandir': 2.1.5 1097 | fastq: 1.13.0 1098 | 1099 | '@nolyfill/is-core-module@1.0.39': {} 1100 | 1101 | '@pkgjs/parseargs@0.11.0': 1102 | optional: true 1103 | 1104 | '@types/node@20.16.5': 1105 | dependencies: 1106 | undici-types: 6.19.8 1107 | 1108 | '@typescript-eslint/eslint-plugin@8.5.0(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': 1109 | dependencies: 1110 | '@eslint-community/regexpp': 4.11.0 1111 | '@typescript-eslint/parser': 8.5.0(eslint@8.57.0)(typescript@5.5.4) 1112 | '@typescript-eslint/scope-manager': 8.5.0 1113 | '@typescript-eslint/type-utils': 8.5.0(eslint@8.57.0)(typescript@5.5.4) 1114 | '@typescript-eslint/utils': 8.5.0(eslint@8.57.0)(typescript@5.5.4) 1115 | '@typescript-eslint/visitor-keys': 8.5.0 1116 | eslint: 8.57.0 1117 | graphemer: 1.4.0 1118 | ignore: 5.3.2 1119 | natural-compare: 1.4.0 1120 | ts-api-utils: 1.3.0(typescript@5.5.4) 1121 | optionalDependencies: 1122 | typescript: 5.5.4 1123 | transitivePeerDependencies: 1124 | - supports-color 1125 | 1126 | '@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4)': 1127 | dependencies: 1128 | '@typescript-eslint/scope-manager': 8.5.0 1129 | '@typescript-eslint/types': 8.5.0 1130 | '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.5.4) 1131 | '@typescript-eslint/visitor-keys': 8.5.0 1132 | debug: 4.3.4 1133 | eslint: 8.57.0 1134 | optionalDependencies: 1135 | typescript: 5.5.4 1136 | transitivePeerDependencies: 1137 | - supports-color 1138 | 1139 | '@typescript-eslint/scope-manager@7.18.0': 1140 | dependencies: 1141 | '@typescript-eslint/types': 7.18.0 1142 | '@typescript-eslint/visitor-keys': 7.18.0 1143 | 1144 | '@typescript-eslint/scope-manager@8.5.0': 1145 | dependencies: 1146 | '@typescript-eslint/types': 8.5.0 1147 | '@typescript-eslint/visitor-keys': 8.5.0 1148 | 1149 | '@typescript-eslint/type-utils@8.5.0(eslint@8.57.0)(typescript@5.5.4)': 1150 | dependencies: 1151 | '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.5.4) 1152 | '@typescript-eslint/utils': 8.5.0(eslint@8.57.0)(typescript@5.5.4) 1153 | debug: 4.3.4 1154 | ts-api-utils: 1.3.0(typescript@5.5.4) 1155 | optionalDependencies: 1156 | typescript: 5.5.4 1157 | transitivePeerDependencies: 1158 | - eslint 1159 | - supports-color 1160 | 1161 | '@typescript-eslint/types@7.18.0': {} 1162 | 1163 | '@typescript-eslint/types@8.5.0': {} 1164 | 1165 | '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': 1166 | dependencies: 1167 | '@typescript-eslint/types': 7.18.0 1168 | '@typescript-eslint/visitor-keys': 7.18.0 1169 | debug: 4.3.4 1170 | globby: 11.1.0 1171 | is-glob: 4.0.3 1172 | minimatch: 9.0.5 1173 | semver: 7.6.3 1174 | ts-api-utils: 1.3.0(typescript@5.5.4) 1175 | optionalDependencies: 1176 | typescript: 5.5.4 1177 | transitivePeerDependencies: 1178 | - supports-color 1179 | 1180 | '@typescript-eslint/typescript-estree@8.5.0(typescript@5.5.4)': 1181 | dependencies: 1182 | '@typescript-eslint/types': 8.5.0 1183 | '@typescript-eslint/visitor-keys': 8.5.0 1184 | debug: 4.3.4 1185 | fast-glob: 3.3.2 1186 | is-glob: 4.0.3 1187 | minimatch: 9.0.5 1188 | semver: 7.6.3 1189 | ts-api-utils: 1.3.0(typescript@5.5.4) 1190 | optionalDependencies: 1191 | typescript: 5.5.4 1192 | transitivePeerDependencies: 1193 | - supports-color 1194 | 1195 | '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': 1196 | dependencies: 1197 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1198 | '@typescript-eslint/scope-manager': 7.18.0 1199 | '@typescript-eslint/types': 7.18.0 1200 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) 1201 | eslint: 8.57.0 1202 | transitivePeerDependencies: 1203 | - supports-color 1204 | - typescript 1205 | 1206 | '@typescript-eslint/utils@8.5.0(eslint@8.57.0)(typescript@5.5.4)': 1207 | dependencies: 1208 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1209 | '@typescript-eslint/scope-manager': 8.5.0 1210 | '@typescript-eslint/types': 8.5.0 1211 | '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.5.4) 1212 | eslint: 8.57.0 1213 | transitivePeerDependencies: 1214 | - supports-color 1215 | - typescript 1216 | 1217 | '@typescript-eslint/visitor-keys@7.18.0': 1218 | dependencies: 1219 | '@typescript-eslint/types': 7.18.0 1220 | eslint-visitor-keys: 3.4.3 1221 | 1222 | '@typescript-eslint/visitor-keys@8.5.0': 1223 | dependencies: 1224 | '@typescript-eslint/types': 8.5.0 1225 | eslint-visitor-keys: 3.4.3 1226 | 1227 | '@ungap/structured-clone@1.2.0': {} 1228 | 1229 | '@vue/compiler-core@3.5.4': 1230 | dependencies: 1231 | '@babel/parser': 7.25.6 1232 | '@vue/shared': 3.5.4 1233 | entities: 4.5.0 1234 | estree-walker: 2.0.2 1235 | source-map-js: 1.2.1 1236 | 1237 | '@vue/compiler-dom@3.5.4': 1238 | dependencies: 1239 | '@vue/compiler-core': 3.5.4 1240 | '@vue/shared': 3.5.4 1241 | 1242 | '@vue/compiler-sfc@3.5.4': 1243 | dependencies: 1244 | '@babel/parser': 7.25.6 1245 | '@vue/compiler-core': 3.5.4 1246 | '@vue/compiler-dom': 3.5.4 1247 | '@vue/compiler-ssr': 3.5.4 1248 | '@vue/shared': 3.5.4 1249 | estree-walker: 2.0.2 1250 | magic-string: 0.30.11 1251 | postcss: 8.4.45 1252 | source-map-js: 1.2.1 1253 | 1254 | '@vue/compiler-ssr@3.5.4': 1255 | dependencies: 1256 | '@vue/compiler-dom': 3.5.4 1257 | '@vue/shared': 3.5.4 1258 | 1259 | '@vue/reactivity@3.5.4': 1260 | dependencies: 1261 | '@vue/shared': 3.5.4 1262 | 1263 | '@vue/runtime-core@3.5.4': 1264 | dependencies: 1265 | '@vue/reactivity': 3.5.4 1266 | '@vue/shared': 3.5.4 1267 | 1268 | '@vue/runtime-dom@3.5.4': 1269 | dependencies: 1270 | '@vue/reactivity': 3.5.4 1271 | '@vue/runtime-core': 3.5.4 1272 | '@vue/shared': 3.5.4 1273 | csstype: 3.1.3 1274 | 1275 | '@vue/server-renderer@3.5.4(vue@3.5.4(typescript@5.5.4))': 1276 | dependencies: 1277 | '@vue/compiler-ssr': 3.5.4 1278 | '@vue/shared': 3.5.4 1279 | vue: 3.5.4(typescript@5.5.4) 1280 | 1281 | '@vue/shared@3.5.4': {} 1282 | 1283 | abort-controller@3.0.0: 1284 | dependencies: 1285 | event-target-shim: 5.0.1 1286 | 1287 | acorn-jsx@5.3.2(acorn@8.12.1): 1288 | dependencies: 1289 | acorn: 8.12.1 1290 | 1291 | acorn@8.12.1: {} 1292 | 1293 | ajv@6.12.6: 1294 | dependencies: 1295 | fast-deep-equal: 3.1.3 1296 | fast-json-stable-stringify: 2.1.0 1297 | json-schema-traverse: 0.4.1 1298 | uri-js: 4.4.1 1299 | 1300 | ansi-regex@5.0.1: {} 1301 | 1302 | ansi-regex@6.1.0: {} 1303 | 1304 | ansi-styles@4.3.0: 1305 | dependencies: 1306 | color-convert: 2.0.1 1307 | 1308 | ansi-styles@6.2.1: {} 1309 | 1310 | argparse@2.0.1: {} 1311 | 1312 | array-union@2.1.0: {} 1313 | 1314 | balanced-match@1.0.2: {} 1315 | 1316 | boolbase@1.0.0: {} 1317 | 1318 | brace-expansion@1.1.11: 1319 | dependencies: 1320 | balanced-match: 1.0.2 1321 | concat-map: 0.0.1 1322 | 1323 | brace-expansion@2.0.1: 1324 | dependencies: 1325 | balanced-match: 1.0.2 1326 | 1327 | braces@3.0.2: 1328 | dependencies: 1329 | fill-range: 7.0.1 1330 | 1331 | callsites@3.1.0: {} 1332 | 1333 | chalk@4.1.2: 1334 | dependencies: 1335 | ansi-styles: 4.3.0 1336 | supports-color: 7.2.0 1337 | 1338 | color-convert@2.0.1: 1339 | dependencies: 1340 | color-name: 1.1.4 1341 | 1342 | color-name@1.1.4: {} 1343 | 1344 | concat-map@0.0.1: {} 1345 | 1346 | cross-spawn@7.0.3: 1347 | dependencies: 1348 | path-key: 3.1.1 1349 | shebang-command: 2.0.0 1350 | which: 2.0.2 1351 | 1352 | cssesc@3.0.0: {} 1353 | 1354 | csstype@3.1.3: {} 1355 | 1356 | debug@3.2.7: 1357 | dependencies: 1358 | ms: 2.1.2 1359 | 1360 | debug@4.3.4: 1361 | dependencies: 1362 | ms: 2.1.2 1363 | 1364 | debug@4.3.7: 1365 | dependencies: 1366 | ms: 2.1.3 1367 | 1368 | deep-is@0.1.4: {} 1369 | 1370 | dir-glob@3.0.1: 1371 | dependencies: 1372 | path-type: 4.0.0 1373 | 1374 | doctrine@3.0.0: 1375 | dependencies: 1376 | esutils: 2.0.3 1377 | 1378 | eastasianwidth@0.2.0: {} 1379 | 1380 | emoji-regex@8.0.0: {} 1381 | 1382 | emoji-regex@9.2.2: {} 1383 | 1384 | enhanced-resolve@5.17.1: 1385 | dependencies: 1386 | graceful-fs: 4.2.11 1387 | tapable: 2.2.1 1388 | 1389 | entities@4.5.0: {} 1390 | 1391 | escape-string-regexp@4.0.0: {} 1392 | 1393 | eslint-config-coralloy@0.4.0(eslint@8.57.0)(prettier@3.3.3)(typescript@5.5.4): 1394 | dependencies: 1395 | '@typescript-eslint/eslint-plugin': 8.5.0(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) 1396 | '@typescript-eslint/parser': 8.5.0(eslint@8.57.0)(typescript@5.5.4) 1397 | eslint: 8.57.0 1398 | eslint-config-prettier: 9.1.0(eslint@8.57.0) 1399 | eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import-x@3.1.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0) 1400 | eslint-plugin-import-x: 3.1.0(eslint@8.57.0)(typescript@5.5.4) 1401 | eslint-plugin-vue: 9.28.0(eslint@8.57.0) 1402 | prettier: 3.3.3 1403 | typescript: 5.5.4 1404 | transitivePeerDependencies: 1405 | - eslint-import-resolver-node 1406 | - eslint-import-resolver-webpack 1407 | - eslint-plugin-import 1408 | - supports-color 1409 | 1410 | eslint-config-prettier@9.1.0(eslint@8.57.0): 1411 | dependencies: 1412 | eslint: 8.57.0 1413 | 1414 | eslint-import-resolver-node@0.3.9: 1415 | dependencies: 1416 | debug: 3.2.7 1417 | is-core-module: 2.15.1 1418 | resolve: 1.22.8 1419 | transitivePeerDependencies: 1420 | - supports-color 1421 | 1422 | eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import-x@3.1.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0): 1423 | dependencies: 1424 | '@nolyfill/is-core-module': 1.0.39 1425 | debug: 4.3.7 1426 | enhanced-resolve: 5.17.1 1427 | eslint: 8.57.0 1428 | eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import-x@3.1.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0) 1429 | fast-glob: 3.3.2 1430 | get-tsconfig: 4.8.0 1431 | is-bun-module: 1.2.1 1432 | is-glob: 4.0.3 1433 | optionalDependencies: 1434 | eslint-plugin-import-x: 3.1.0(eslint@8.57.0)(typescript@5.5.4) 1435 | transitivePeerDependencies: 1436 | - '@typescript-eslint/parser' 1437 | - eslint-import-resolver-node 1438 | - eslint-import-resolver-webpack 1439 | - supports-color 1440 | 1441 | eslint-module-utils@2.11.0(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import-x@3.1.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0): 1442 | dependencies: 1443 | debug: 3.2.7 1444 | optionalDependencies: 1445 | '@typescript-eslint/parser': 8.5.0(eslint@8.57.0)(typescript@5.5.4) 1446 | eslint: 8.57.0 1447 | eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import-x@3.1.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0) 1448 | transitivePeerDependencies: 1449 | - supports-color 1450 | 1451 | eslint-plugin-import-x@3.1.0(eslint@8.57.0)(typescript@5.5.4): 1452 | dependencies: 1453 | '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 1454 | debug: 4.3.4 1455 | doctrine: 3.0.0 1456 | eslint: 8.57.0 1457 | eslint-import-resolver-node: 0.3.9 1458 | get-tsconfig: 4.8.0 1459 | is-glob: 4.0.3 1460 | minimatch: 9.0.5 1461 | semver: 7.6.3 1462 | stable-hash: 0.0.4 1463 | tslib: 2.7.0 1464 | transitivePeerDependencies: 1465 | - supports-color 1466 | - typescript 1467 | 1468 | eslint-plugin-vue@9.28.0(eslint@8.57.0): 1469 | dependencies: 1470 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1471 | eslint: 8.57.0 1472 | globals: 13.24.0 1473 | natural-compare: 1.4.0 1474 | nth-check: 2.1.1 1475 | postcss-selector-parser: 6.1.2 1476 | semver: 7.6.3 1477 | vue-eslint-parser: 9.4.3(eslint@8.57.0) 1478 | xml-name-validator: 4.0.0 1479 | transitivePeerDependencies: 1480 | - supports-color 1481 | 1482 | eslint-scope@7.2.2: 1483 | dependencies: 1484 | esrecurse: 4.3.0 1485 | estraverse: 5.3.0 1486 | 1487 | eslint-visitor-keys@3.4.0: {} 1488 | 1489 | eslint-visitor-keys@3.4.3: {} 1490 | 1491 | eslint@8.57.0: 1492 | dependencies: 1493 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1494 | '@eslint-community/regexpp': 4.11.0 1495 | '@eslint/eslintrc': 2.1.4 1496 | '@eslint/js': 8.57.0 1497 | '@humanwhocodes/config-array': 0.11.14 1498 | '@humanwhocodes/module-importer': 1.0.1 1499 | '@nodelib/fs.walk': 1.2.8 1500 | '@ungap/structured-clone': 1.2.0 1501 | ajv: 6.12.6 1502 | chalk: 4.1.2 1503 | cross-spawn: 7.0.3 1504 | debug: 4.3.7 1505 | doctrine: 3.0.0 1506 | escape-string-regexp: 4.0.0 1507 | eslint-scope: 7.2.2 1508 | eslint-visitor-keys: 3.4.3 1509 | espree: 9.6.1 1510 | esquery: 1.5.0 1511 | esutils: 2.0.3 1512 | fast-deep-equal: 3.1.3 1513 | file-entry-cache: 6.0.1 1514 | find-up: 5.0.0 1515 | glob-parent: 6.0.2 1516 | globals: 13.24.0 1517 | graphemer: 1.4.0 1518 | ignore: 5.3.2 1519 | imurmurhash: 0.1.4 1520 | is-glob: 4.0.3 1521 | is-path-inside: 3.0.3 1522 | js-yaml: 4.1.0 1523 | json-stable-stringify-without-jsonify: 1.0.1 1524 | levn: 0.4.1 1525 | lodash.merge: 4.6.2 1526 | minimatch: 3.1.2 1527 | natural-compare: 1.4.0 1528 | optionator: 0.9.4 1529 | strip-ansi: 6.0.1 1530 | text-table: 0.2.0 1531 | transitivePeerDependencies: 1532 | - supports-color 1533 | 1534 | espree@9.6.1: 1535 | dependencies: 1536 | acorn: 8.12.1 1537 | acorn-jsx: 5.3.2(acorn@8.12.1) 1538 | eslint-visitor-keys: 3.4.3 1539 | 1540 | esquery@1.5.0: 1541 | dependencies: 1542 | estraverse: 5.3.0 1543 | 1544 | esrecurse@4.3.0: 1545 | dependencies: 1546 | estraverse: 5.3.0 1547 | 1548 | estraverse@5.3.0: {} 1549 | 1550 | estree-walker@2.0.2: {} 1551 | 1552 | esutils@2.0.3: {} 1553 | 1554 | event-target-shim@5.0.1: {} 1555 | 1556 | eventsource@2.0.2: {} 1557 | 1558 | fast-deep-equal@3.1.3: {} 1559 | 1560 | fast-glob@3.3.2: 1561 | dependencies: 1562 | '@nodelib/fs.stat': 2.0.5 1563 | '@nodelib/fs.walk': 1.2.8 1564 | glob-parent: 5.1.2 1565 | merge2: 1.4.1 1566 | micromatch: 4.0.4 1567 | 1568 | fast-json-stable-stringify@2.1.0: {} 1569 | 1570 | fast-levenshtein@2.0.6: {} 1571 | 1572 | fastq@1.13.0: 1573 | dependencies: 1574 | reusify: 1.0.4 1575 | 1576 | fetch-cookie@2.1.0: 1577 | dependencies: 1578 | set-cookie-parser: 2.6.0 1579 | tough-cookie: 4.1.2 1580 | 1581 | file-entry-cache@6.0.1: 1582 | dependencies: 1583 | flat-cache: 3.2.0 1584 | 1585 | fill-range@7.0.1: 1586 | dependencies: 1587 | to-regex-range: 5.0.1 1588 | 1589 | find-up@5.0.0: 1590 | dependencies: 1591 | locate-path: 6.0.0 1592 | path-exists: 4.0.0 1593 | 1594 | flat-cache@3.2.0: 1595 | dependencies: 1596 | flatted: 3.3.1 1597 | keyv: 4.5.4 1598 | rimraf: 3.0.2 1599 | 1600 | flatted@3.3.1: {} 1601 | 1602 | foreground-child@3.3.0: 1603 | dependencies: 1604 | cross-spawn: 7.0.3 1605 | signal-exit: 4.1.0 1606 | 1607 | fs.realpath@1.0.0: {} 1608 | 1609 | function-bind@1.1.2: {} 1610 | 1611 | get-tsconfig@4.8.0: 1612 | dependencies: 1613 | resolve-pkg-maps: 1.0.0 1614 | 1615 | glob-parent@5.1.2: 1616 | dependencies: 1617 | is-glob: 4.0.3 1618 | 1619 | glob-parent@6.0.2: 1620 | dependencies: 1621 | is-glob: 4.0.3 1622 | 1623 | glob@11.0.0: 1624 | dependencies: 1625 | foreground-child: 3.3.0 1626 | jackspeak: 4.0.1 1627 | minimatch: 10.0.1 1628 | minipass: 7.1.2 1629 | package-json-from-dist: 1.0.0 1630 | path-scurry: 2.0.0 1631 | 1632 | glob@7.2.3: 1633 | dependencies: 1634 | fs.realpath: 1.0.0 1635 | inflight: 1.0.6 1636 | inherits: 2.0.4 1637 | minimatch: 3.1.2 1638 | once: 1.4.0 1639 | path-is-absolute: 1.0.1 1640 | 1641 | globals@13.24.0: 1642 | dependencies: 1643 | type-fest: 0.20.2 1644 | 1645 | globby@11.1.0: 1646 | dependencies: 1647 | array-union: 2.1.0 1648 | dir-glob: 3.0.1 1649 | fast-glob: 3.3.2 1650 | ignore: 5.3.2 1651 | merge2: 1.4.1 1652 | slash: 3.0.0 1653 | 1654 | graceful-fs@4.2.11: {} 1655 | 1656 | graphemer@1.4.0: {} 1657 | 1658 | has-flag@4.0.0: {} 1659 | 1660 | hasown@2.0.2: 1661 | dependencies: 1662 | function-bind: 1.1.2 1663 | 1664 | ignore@5.3.2: {} 1665 | 1666 | import-fresh@3.3.0: 1667 | dependencies: 1668 | parent-module: 1.0.1 1669 | resolve-from: 4.0.0 1670 | 1671 | imurmurhash@0.1.4: {} 1672 | 1673 | inflight@1.0.6: 1674 | dependencies: 1675 | once: 1.4.0 1676 | wrappy: 1.0.2 1677 | 1678 | inherits@2.0.4: {} 1679 | 1680 | is-bun-module@1.2.1: 1681 | dependencies: 1682 | semver: 7.6.3 1683 | 1684 | is-core-module@2.15.1: 1685 | dependencies: 1686 | hasown: 2.0.2 1687 | 1688 | is-extglob@2.1.1: {} 1689 | 1690 | is-fullwidth-code-point@3.0.0: {} 1691 | 1692 | is-glob@4.0.3: 1693 | dependencies: 1694 | is-extglob: 2.1.1 1695 | 1696 | is-number@7.0.0: {} 1697 | 1698 | is-path-inside@3.0.3: {} 1699 | 1700 | isexe@2.0.0: {} 1701 | 1702 | jackspeak@4.0.1: 1703 | dependencies: 1704 | '@isaacs/cliui': 8.0.2 1705 | optionalDependencies: 1706 | '@pkgjs/parseargs': 0.11.0 1707 | 1708 | js-yaml@4.1.0: 1709 | dependencies: 1710 | argparse: 2.0.1 1711 | 1712 | json-buffer@3.0.1: {} 1713 | 1714 | json-schema-traverse@0.4.1: {} 1715 | 1716 | json-stable-stringify-without-jsonify@1.0.1: {} 1717 | 1718 | keyv@4.5.4: 1719 | dependencies: 1720 | json-buffer: 3.0.1 1721 | 1722 | levn@0.4.1: 1723 | dependencies: 1724 | prelude-ls: 1.2.1 1725 | type-check: 0.4.0 1726 | 1727 | locate-path@6.0.0: 1728 | dependencies: 1729 | p-locate: 5.0.0 1730 | 1731 | lodash.merge@4.6.2: {} 1732 | 1733 | lodash@4.17.21: {} 1734 | 1735 | lru-cache@11.0.1: {} 1736 | 1737 | magic-string@0.30.11: 1738 | dependencies: 1739 | '@jridgewell/sourcemap-codec': 1.5.0 1740 | 1741 | merge2@1.4.1: {} 1742 | 1743 | micromatch@4.0.4: 1744 | dependencies: 1745 | braces: 3.0.2 1746 | picomatch: 2.3.1 1747 | 1748 | minimatch@10.0.1: 1749 | dependencies: 1750 | brace-expansion: 2.0.1 1751 | 1752 | minimatch@3.1.2: 1753 | dependencies: 1754 | brace-expansion: 1.1.11 1755 | 1756 | minimatch@9.0.5: 1757 | dependencies: 1758 | brace-expansion: 2.0.1 1759 | 1760 | minipass@7.1.2: {} 1761 | 1762 | ms@2.1.2: {} 1763 | 1764 | ms@2.1.3: {} 1765 | 1766 | nanoid@3.3.7: {} 1767 | 1768 | natural-compare@1.4.0: {} 1769 | 1770 | node-fetch@2.6.9: 1771 | dependencies: 1772 | whatwg-url: 5.0.0 1773 | 1774 | nth-check@2.1.1: 1775 | dependencies: 1776 | boolbase: 1.0.0 1777 | 1778 | once@1.4.0: 1779 | dependencies: 1780 | wrappy: 1.0.2 1781 | 1782 | optionator@0.9.4: 1783 | dependencies: 1784 | deep-is: 0.1.4 1785 | fast-levenshtein: 2.0.6 1786 | levn: 0.4.1 1787 | prelude-ls: 1.2.1 1788 | type-check: 0.4.0 1789 | word-wrap: 1.2.5 1790 | 1791 | p-limit@3.1.0: 1792 | dependencies: 1793 | yocto-queue: 0.1.0 1794 | 1795 | p-locate@5.0.0: 1796 | dependencies: 1797 | p-limit: 3.1.0 1798 | 1799 | package-json-from-dist@1.0.0: {} 1800 | 1801 | parent-module@1.0.1: 1802 | dependencies: 1803 | callsites: 3.1.0 1804 | 1805 | path-exists@4.0.0: {} 1806 | 1807 | path-is-absolute@1.0.1: {} 1808 | 1809 | path-key@3.1.1: {} 1810 | 1811 | path-parse@1.0.7: {} 1812 | 1813 | path-scurry@2.0.0: 1814 | dependencies: 1815 | lru-cache: 11.0.1 1816 | minipass: 7.1.2 1817 | 1818 | path-type@4.0.0: {} 1819 | 1820 | picocolors@1.1.0: {} 1821 | 1822 | picomatch@2.3.1: {} 1823 | 1824 | postcss-selector-parser@6.1.2: 1825 | dependencies: 1826 | cssesc: 3.0.0 1827 | util-deprecate: 1.0.2 1828 | 1829 | postcss@8.4.45: 1830 | dependencies: 1831 | nanoid: 3.3.7 1832 | picocolors: 1.1.0 1833 | source-map-js: 1.2.1 1834 | 1835 | prelude-ls@1.2.1: {} 1836 | 1837 | prettier@3.3.3: {} 1838 | 1839 | psl@1.8.0: {} 1840 | 1841 | punycode@2.1.1: {} 1842 | 1843 | querystringify@2.2.0: {} 1844 | 1845 | queue-microtask@1.2.3: {} 1846 | 1847 | requires-port@1.0.0: {} 1848 | 1849 | resolve-from@4.0.0: {} 1850 | 1851 | resolve-pkg-maps@1.0.0: {} 1852 | 1853 | resolve@1.22.8: 1854 | dependencies: 1855 | is-core-module: 2.15.1 1856 | path-parse: 1.0.7 1857 | supports-preserve-symlinks-flag: 1.0.0 1858 | 1859 | reusify@1.0.4: {} 1860 | 1861 | rimraf@3.0.2: 1862 | dependencies: 1863 | glob: 7.2.3 1864 | 1865 | rimraf@6.0.1: 1866 | dependencies: 1867 | glob: 11.0.0 1868 | package-json-from-dist: 1.0.0 1869 | 1870 | run-parallel@1.2.0: 1871 | dependencies: 1872 | queue-microtask: 1.2.3 1873 | 1874 | semver@7.6.3: {} 1875 | 1876 | set-cookie-parser@2.6.0: {} 1877 | 1878 | shebang-command@2.0.0: 1879 | dependencies: 1880 | shebang-regex: 3.0.0 1881 | 1882 | shebang-regex@3.0.0: {} 1883 | 1884 | signal-exit@4.1.0: {} 1885 | 1886 | slash@3.0.0: {} 1887 | 1888 | source-map-js@1.2.1: {} 1889 | 1890 | stable-hash@0.0.4: {} 1891 | 1892 | string-width@4.2.3: 1893 | dependencies: 1894 | emoji-regex: 8.0.0 1895 | is-fullwidth-code-point: 3.0.0 1896 | strip-ansi: 6.0.1 1897 | 1898 | string-width@5.1.2: 1899 | dependencies: 1900 | eastasianwidth: 0.2.0 1901 | emoji-regex: 9.2.2 1902 | strip-ansi: 7.1.0 1903 | 1904 | strip-ansi@6.0.1: 1905 | dependencies: 1906 | ansi-regex: 5.0.1 1907 | 1908 | strip-ansi@7.1.0: 1909 | dependencies: 1910 | ansi-regex: 6.1.0 1911 | 1912 | strip-json-comments@3.1.1: {} 1913 | 1914 | supports-color@7.2.0: 1915 | dependencies: 1916 | has-flag: 4.0.0 1917 | 1918 | supports-preserve-symlinks-flag@1.0.0: {} 1919 | 1920 | tapable@2.2.1: {} 1921 | 1922 | text-table@0.2.0: {} 1923 | 1924 | to-fast-properties@2.0.0: {} 1925 | 1926 | to-regex-range@5.0.1: 1927 | dependencies: 1928 | is-number: 7.0.0 1929 | 1930 | tough-cookie@4.1.2: 1931 | dependencies: 1932 | psl: 1.8.0 1933 | punycode: 2.1.1 1934 | universalify: 0.2.0 1935 | url-parse: 1.5.4 1936 | 1937 | tr46@0.0.3: {} 1938 | 1939 | ts-api-utils@1.3.0(typescript@5.5.4): 1940 | dependencies: 1941 | typescript: 5.5.4 1942 | 1943 | tslib@2.7.0: {} 1944 | 1945 | type-check@0.4.0: 1946 | dependencies: 1947 | prelude-ls: 1.2.1 1948 | 1949 | type-fest@0.20.2: {} 1950 | 1951 | typescript@5.5.4: {} 1952 | 1953 | undici-types@6.19.8: {} 1954 | 1955 | universalify@0.2.0: {} 1956 | 1957 | uri-js@4.4.1: 1958 | dependencies: 1959 | punycode: 2.1.1 1960 | 1961 | url-parse@1.5.4: 1962 | dependencies: 1963 | querystringify: 2.2.0 1964 | requires-port: 1.0.0 1965 | 1966 | util-deprecate@1.0.2: {} 1967 | 1968 | vue-eslint-parser@9.4.3(eslint@8.57.0): 1969 | dependencies: 1970 | debug: 4.3.4 1971 | eslint: 8.57.0 1972 | eslint-scope: 7.2.2 1973 | eslint-visitor-keys: 3.4.3 1974 | espree: 9.6.1 1975 | esquery: 1.5.0 1976 | lodash: 4.17.21 1977 | semver: 7.6.3 1978 | transitivePeerDependencies: 1979 | - supports-color 1980 | 1981 | vue@3.5.4(typescript@5.5.4): 1982 | dependencies: 1983 | '@vue/compiler-dom': 3.5.4 1984 | '@vue/compiler-sfc': 3.5.4 1985 | '@vue/runtime-dom': 3.5.4 1986 | '@vue/server-renderer': 3.5.4(vue@3.5.4(typescript@5.5.4)) 1987 | '@vue/shared': 3.5.4 1988 | optionalDependencies: 1989 | typescript: 5.5.4 1990 | 1991 | webidl-conversions@3.0.1: {} 1992 | 1993 | whatwg-url@5.0.0: 1994 | dependencies: 1995 | tr46: 0.0.3 1996 | webidl-conversions: 3.0.1 1997 | 1998 | which@2.0.2: 1999 | dependencies: 2000 | isexe: 2.0.0 2001 | 2002 | word-wrap@1.2.5: {} 2003 | 2004 | wrap-ansi@7.0.0: 2005 | dependencies: 2006 | ansi-styles: 4.3.0 2007 | string-width: 4.2.3 2008 | strip-ansi: 6.0.1 2009 | 2010 | wrap-ansi@8.1.0: 2011 | dependencies: 2012 | ansi-styles: 6.2.1 2013 | string-width: 5.1.2 2014 | strip-ansi: 7.1.0 2015 | 2016 | wrappy@1.0.2: {} 2017 | 2018 | ws@7.5.9: {} 2019 | 2020 | xml-name-validator@4.0.0: {} 2021 | 2022 | yocto-queue@0.1.0: {} 2023 | -------------------------------------------------------------------------------- /src/composable.ts: -------------------------------------------------------------------------------- 1 | import { inject } from "vue"; 2 | import { SignalRSymbol } from "./symbols"; 3 | 4 | export function useSignalR() { 5 | const signalr = inject(SignalRSymbol); 6 | 7 | if (!signalr) { 8 | throw new Error("Failed to inject SignalR"); 9 | } 10 | 11 | return signalr; 12 | } 13 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./composable"; 2 | export * from "./mapping"; 3 | export * from "./models"; 4 | export * from "./plugin"; 5 | export * from "./service"; 6 | export * from "./symbols"; 7 | 8 | // These interfaces must be here to ease their augmentation 9 | // even if this creates a circular dependency with models file 10 | 11 | /** 12 | * Use this interface to map Commands (aka server methods) names and their payloads 13 | * 14 | * @example 15 | * ```ts 16 | * import '@dreamonkey/vue-signalr'; 17 | * 18 | * interface SendMessagePayload { 19 | * message: string; 20 | * } 21 | * 22 | * declare module '@dreamonkey/vue-signalr' { 23 | * interface SignalRCommands { 24 | * SendMessage: SendMessagePayload, // Define a command and its payload 25 | * JoinMainTopic: false, // Define a command with no payload 26 | * } 27 | * } 28 | * ``` 29 | */ 30 | // eslint-disable-next-line @typescript-eslint/no-empty-object-type 31 | export interface SignalRCommands {} 32 | 33 | /** 34 | * Use this interface to map Events (aka client methods) names and their payloads 35 | * 36 | * @example 37 | * ```ts 38 | * import '@dreamonkey/vue-signalr'; 39 | * 40 | * interface MessageReceivedPayload { 41 | * message: string; 42 | * } 43 | * 44 | * declare module '@dreamonkey/vue-signalr' { 45 | * interface SignalREvents { 46 | * MessageReceived: MessageReceivedPayload, // Define an event and its payload 47 | * MainTopicJoined: false, // Define an event with no payload 48 | * } 49 | * } 50 | * ``` 51 | */ 52 | // eslint-disable-next-line @typescript-eslint/no-empty-object-type 53 | export interface SignalREvents {} 54 | -------------------------------------------------------------------------------- /src/mapping.ts: -------------------------------------------------------------------------------- 1 | const methodNamesMap = new Map(); 2 | 3 | export function remapMethod(name: string, alias: string) { 4 | methodNamesMap.set(alias, name); 5 | } 6 | 7 | export function remapMethods(mappings: [name: string, alias: string][]) { 8 | for (const [name, alias] of mappings) { 9 | remapMethod(name, alias); 10 | } 11 | } 12 | 13 | export function resolveMethodName(nameOrAlias: string) { 14 | // "??" syntax isn't transpiled by TS due to esnext target 15 | // and would break projects using the package 16 | // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing 17 | return methodNamesMap.get(nameOrAlias) || nameOrAlias; 18 | } 19 | -------------------------------------------------------------------------------- /src/models.ts: -------------------------------------------------------------------------------- 1 | import { HubConnection } from "@microsoft/signalr"; 2 | import { LiteralUnion } from "./ts-helpers"; 3 | import { SignalRCommands, SignalREvents } from "./index"; 4 | 5 | export type SignalRCommandKey = LiteralUnion; 6 | export type SignalRCommandPayload< 7 | K extends SignalRCommandKey, 8 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 9 | P = K extends keyof SignalRCommands ? SignalRCommands[K] : any[], 10 | > = P extends false ? never[] : P extends unknown[] ? P : [P]; 11 | 12 | export type SignalREventKey = LiteralUnion; 13 | export type SignalREventPayload< 14 | K extends SignalREventKey, 15 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 16 | P = K extends keyof SignalREvents ? SignalREvents[K] : any[], 17 | > = P extends false ? never[] : P extends unknown[] ? P : [P]; 18 | 19 | export interface VueSignalRConfig { 20 | connection: HubConnection; 21 | autoOffInsideComponentScope: boolean; 22 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 23 | failFn: (error: any) => void; 24 | } 25 | 26 | export interface SignalROnOptions { 27 | skip?: (...payload: Payload) => boolean; 28 | once?: boolean; 29 | } 30 | -------------------------------------------------------------------------------- /src/plugin.ts: -------------------------------------------------------------------------------- 1 | import { App } from "vue"; 2 | import { VueSignalRConfig } from "./models"; 3 | import { createService } from "./service"; 4 | import { SignalRSymbol } from "./symbols"; 5 | 6 | export const VueSignalR = { 7 | install(app: App, options: VueSignalRConfig) { 8 | const service = createService(options); 9 | 10 | app.provide(SignalRSymbol, service); 11 | 12 | void service.init(); 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /src/service.ts: -------------------------------------------------------------------------------- 1 | import { getCurrentInstance, onBeforeUnmount, ref } from "vue"; 2 | import { resolveMethodName } from "./mapping"; 3 | import { 4 | SignalRCommandKey, 5 | SignalRCommandPayload, 6 | SignalREventKey, 7 | SignalREventPayload, 8 | SignalROnOptions, 9 | VueSignalRConfig, 10 | } from "./models"; 11 | 12 | export function createService({ 13 | connection, 14 | // eslint-disable-next-line @typescript-eslint/no-empty-function 15 | failFn = () => {}, 16 | autoOffInsideComponentScope = true, 17 | }: VueSignalRConfig) { 18 | const connected = ref(false); 19 | const invokeQueue: (() => void)[] = []; 20 | const activeListenersSet = new Set(); 21 | 22 | connection.onclose(failFn); 23 | 24 | async function init() { 25 | try { 26 | await connection.start(); 27 | connected.value = true; 28 | while (invokeQueue.length) { 29 | const action = invokeQueue.shift(); 30 | // "action?.()" syntax isn't transpiled by TS due to esnext target 31 | // and would break projects using the package 32 | // eslint-disable-next-line @typescript-eslint/no-unused-expressions 33 | action && action(); 34 | } 35 | } catch (error) { 36 | failFn(error); 37 | } 38 | } 39 | 40 | function invoke( 41 | methodName: Key, 42 | ...payload: SignalRCommandPayload 43 | ) { 44 | return new Promise((resolve, reject) => { 45 | const invokeFn = () => 46 | connection 47 | .invoke(resolveMethodName(methodName), ...payload) 48 | .then(resolve) 49 | // eslint-disable-next-line @typescript-eslint/use-unknown-in-catch-callback-variable 50 | .catch(reject); 51 | 52 | if (connected.value) { 53 | void invokeFn(); 54 | } else { 55 | invokeQueue.push(invokeFn); 56 | } 57 | }); 58 | } 59 | 60 | function on( 61 | methodName: Key, 62 | callback: (...payload: SignalREventPayload) => void, 63 | { skip, once }: SignalROnOptions> = {}, 64 | ) { 65 | const originalMethodName = resolveMethodName(methodName); 66 | 67 | connection.on(originalMethodName, (...payload) => { 68 | // Needed to make TS happy with a cast 69 | const _payload = payload as Parameters; 70 | // "skip?.()" syntax isn't transpiled by TS due to esnext target 71 | // and would break projects using the package 72 | // eslint-disable-next-line @typescript-eslint/prefer-optional-chain 73 | if (skip && skip(..._payload)) { 74 | return; 75 | } 76 | 77 | if (once) { 78 | off(methodName, callback); 79 | } 80 | 81 | callback(..._payload); 82 | }); 83 | 84 | if (autoOffInsideComponentScope) { 85 | // Auto-unregister listener if inside a component 86 | const instance = getCurrentInstance(); 87 | if (instance) { 88 | activeListenersSet.add(callback); 89 | 90 | onBeforeUnmount(() => { 91 | if (activeListenersSet.delete(callback)) { 92 | off(methodName, callback); 93 | } 94 | }); 95 | } 96 | } 97 | } 98 | 99 | function once( 100 | methodName: Key, 101 | callback: (...payload: SignalREventPayload) => void, 102 | options: SignalROnOptions> = {}, 103 | ) { 104 | on(methodName, callback, { ...options, once: true }); 105 | } 106 | 107 | function off( 108 | methodName: Key, 109 | callback?: (...payload: SignalREventPayload) => void, 110 | ) { 111 | const originalMethodName = resolveMethodName(methodName); 112 | 113 | if (callback) { 114 | connection.off(originalMethodName, (...payload) => { 115 | // Needed to make TS happy with a cast 116 | const _payload = payload as Parameters; 117 | callback(..._payload); 118 | }); 119 | } else { 120 | connection.off(originalMethodName); 121 | } 122 | } 123 | 124 | return { 125 | init, 126 | connected, 127 | invoke, 128 | on, 129 | off, 130 | once, 131 | }; 132 | } 133 | -------------------------------------------------------------------------------- /src/symbols.ts: -------------------------------------------------------------------------------- 1 | import { InjectionKey } from "vue"; 2 | import { 3 | SignalRCommandKey, 4 | SignalRCommandPayload, 5 | SignalREventKey, 6 | SignalREventPayload, 7 | SignalROnOptions, 8 | } from "./models"; 9 | import { createService } from "./service"; 10 | 11 | type CreateServiceReturntype = ReturnType; 12 | 13 | // Relying solely on `ReturnType` would collapse SignalRXxxKey to `string` type 14 | // into built types, since it would infer the `keyof Xxx` part as empty, 15 | // due to the holder interfaces being empty at build time 16 | export interface SignalRService { 17 | init: CreateServiceReturntype["init"]; 18 | connected: CreateServiceReturntype["connected"]; 19 | invoke: ( 20 | methodName: Key, 21 | ...payload: SignalRCommandPayload 22 | ) => Promise; 23 | on: ( 24 | methodName: Key, 25 | callback: (...payload: SignalREventPayload) => void, 26 | options?: SignalROnOptions>, 27 | ) => void; 28 | off: ( 29 | methodName: Key, 30 | callback?: (...payload: SignalREventPayload) => void, 31 | ) => void; 32 | } 33 | 34 | export const SignalRSymbol: InjectionKey = 35 | Symbol("SignalRService"); 36 | -------------------------------------------------------------------------------- /src/ts-helpers.ts: -------------------------------------------------------------------------------- 1 | // Needed to prevent TS to collapse `'value1' | 'value2' | string` to `string`, which breaks first parameter autocomplete 2 | // See: https://github.com/microsoft/TypeScript/issues/29729#issuecomment-832522611 3 | export type LiteralUnion = 4 | | T 5 | | (U & Record); 6 | -------------------------------------------------------------------------------- /test/service.ts: -------------------------------------------------------------------------------- 1 | import { useSignalR, remapMethod, remapMethods } from "../src"; 2 | 3 | interface MessageReceivedPayload { 4 | message: string; 5 | } 6 | 7 | interface SendMessagePayload { 8 | message: string; 9 | } 10 | 11 | declare module "../src" { 12 | interface SignalREvents { 13 | MessageReceived: MessageReceivedPayload; 14 | MultipleMessagesReceived: MessageReceivedPayload[]; 15 | TwoMessagesReceived: [MessageReceivedPayload, MessageReceivedPayload]; 16 | MainTopicJoined: false; 17 | } 18 | 19 | interface SignalRCommands { 20 | SendMessage: SendMessagePayload; 21 | JoinMainTopic: false; 22 | } 23 | } 24 | 25 | // Map an old strange method name to an alias 26 | remapMethod("JoinLegacyTopicV2", "MainTopicJoined"); 27 | // Maps the same method name to 2 different aliases 28 | remapMethods([ 29 | ["sendStrangeMessage", "SendMessageFromPageOne"], 30 | ["sendStrangeMessage", "SendMessageFromPageTwo"], 31 | ]); 32 | 33 | const signalr = useSignalR(); 34 | 35 | // The payload have a single parameter of type MessageReceivedPayload 36 | signalr.on("MessageReceived", ({ message }) => { 37 | console.log(message); 38 | }); 39 | // The payload have a 0 or more parameters of type MessageReceivedPayload 40 | signalr.on("MultipleMessagesReceived", (...messages) => { 41 | console.log(messages.length); 42 | }); 43 | // The payload have exactly 2 parameters of type MessageReceivedPayload 44 | signalr.on( 45 | "TwoMessagesReceived", 46 | ({ message: message1 }, { message: message2 }) => { 47 | console.log(message1, message2); 48 | }, 49 | ); 50 | // The payload have no params, type 'never' 51 | signalr.on("MainTopicJoined", (undefinedParam) => { 52 | console.log(undefinedParam); 53 | }); 54 | // Types not provided, fallback to a payload of type 'any[]' 55 | signalr.on("RandomEvent", (...params) => { 56 | console.log(params); 57 | }); 58 | 59 | // @ts-expect-error Error due to the missing payload 60 | void signalr.invoke("SendMessage"); 61 | // Provide correct payload 62 | void signalr.invoke("SendMessage", { message: "Message" }); 63 | // @ts-expect-error Error due to excess payload 64 | void signalr.invoke("JoinMainTopic", {}); 65 | // Don't provide any payload 66 | void signalr.invoke("JoinMainTopic"); 67 | // Types not provided, fallback to a payload of type 'any[]' 68 | void signalr.invoke("RandomCommand", "Data!", "More!"); 69 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src"] 4 | } 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "strict": true, 6 | "moduleResolution": "node", 7 | "sourceMap": true, 8 | "outDir": "dist", 9 | "baseUrl": "." 10 | }, 11 | "exclude": ["node_modules", "dist"] 12 | } 13 | --------------------------------------------------------------------------------